-1
votes

PHP - MySQL par défaut à NULL lors de l'insertion de données

J'essaie d'insérer des données dans une base de données mysql avec la requête ci-dessous. XXX

I Obtenir cette erreur

valeur DateTime incorrecte: '' Pour la fonction str_to_date ()

Comment puis-je par défaut A et B à null lorsque les valeurs de variable sont manquantes.


8 commentaires

Vous êtes grand ouvert à Injection SQL . Vous devez utiliser des déclarations préparées plutôt que de concaténer des variables dans votre requête. S'échapper simplement vos variables ne suffit pas. Voir Comment puis-je empêcher l'injection SQL chez PHP? .


Sont ces champs nullables? Vous pouvez définir les valeurs par défaut de A et b à null dans mysql, puis fournit uniquement ces champs lors de l'exécution de la requête en PHP.


merci @edcottrell que vous avez suggéré à juste titre, je suis fondamentalement friand d'ormes comme hibernate et sql-alchimy mais très nouveau à php


@Qirel Oui Les champs sont par défaut NULL, mais j'ai plusieurs colonnes et devront vérifier en utilisant des conditions distinctes pour seulement exécuter la requête lorsqu'elles ne sont pas nuls, je préférerais y avoir une interrogation.


Compte tenu de votre expérience passée avec hibernate, etc., jetez un coup d'œil à Doctrine


En outre, la chaîne compatible de base MySQL Date est du format 'AAAA-MM-DD'. Si vous passez vos chaînes dans ce format, il n'est pas nécessaire d'exécuter des fonctions de conversion MySQL. Avec cela - pour PHP, si vous n'allez pas utiliser de doctrine, utilisez PDO et lisez @edcottrell Link. C'est mauvais codant de ne pas le faire. De plus, la réponse d'Esnkrimi est pertinente car Set = est le format que vous utilisez pour les mises à jour, pas insérer.


Aussi, avant que les gens se plaignent, oui, vous pouvez utiliser ensemble =, mais comme beaucoup de choses spécifiques MySQL, juste parce que vous ne pouvez pas dire que vous devriez. Utilisez la forme standard ANSI.


:) Je vous comprends, je prends toutes ces suggestions et je les utiliserais pour de nouveaux scripts, pour l'instant, je dois faire une solution de bogues sale rapide: P et ce code de format est partout


4 Réponses :


-1
votes

Ne donnez pas à MySQL au format de la date. Faites-le par votre code PHP.

$a = !empty($_POST['var1']) ? $_POST['var1'] : null;
$b = !empty($_POST['var2']) ? date('d/m/Y', strtotime($_POST['var2'])) : null;
$sqlQuery = "Insert into abc(a,b) values('$a','$b')";


1 commentaires

Veuillez ajouter une autre explication à votre code - et ne donnez pas à MySQL une chance d'effectuer des injections SQL ....



-1
votes

Vous devez utiliser le format

mois / jour / année: xxx


3 commentaires

Toujours inclure une explication avec votre réponse. Pourquoi ce code fonctionnerait-il? Qu'avez-vous changé et pourquoi l'avez-vous changé?


Le format standard de la date SQL est jour-mois-mois . Avoir la journée au centre est non psychitaire.


Ma question est différente, je ne cherche pas de formats de date, mais je fixe null



1
votes

Si les colonnes sont NULL par défaut, vous pouvez les omettre dans la requête Insérer si les valeurs sont vides. Générez la requête de manière dynamique à l'aide d'un tableau et implosez-le dans votre requête. Les clés représentent les noms de colonne, la valeur de l'élément dans la matrice est la valeur à insérer. xxx

Si vous pouvez dire quelle base de données-API utilisez-vous (MySQLI ou PDO), je peux vous montrer comment créer de manière dynamique la déclaration préparée à la place, que vous devriez vraiment utiliser ! Voir Comment puis-je empêcher l'injection SQL dans PHP?

Mise à jour: Utilisation de déclarations préparées avec mysqli
Les liaisons MySQLI sont commandées et utilisent des espaces réservés comme ? . Vous générez toujours les valeurs dans $ colonnes comme avant, mais la génération de la requête est légèrement différente.

  • Utilisez Garniture (Str_Repeat ("?,", Count ($ colonnes)), ",") pour générer les espaces réservés.
  • Utilisez str_repeat ("s", comptez ($ colonnes)) pour générer les types.
  • Utilisez "Opérateur de déballage" ... pour déballer toutes les valeurs.

    Le code ci-dessous suppose que l'objet de connexion est appelé $ mysqli . xxx


2 commentaires

J'utilise mysqli


J'ai révisé ma réponse pour montrer comment créer de manière dynamique la requête en utilisant une déclaration préparée avec MySQLI.



0
votes

Définissez la valeur par défaut de ces colonnes dans votre base de données en tant que null ainsi lorsque ces valeurs sont absentes, alors NULL avec automatiquement enregistré par défaut.


2 commentaires

ils sont déjà défectueux à NULL, mais si la valeur est manquante, elle fait l'erreur.


Alors utilisez une déclaration conditionnelle comme: $ var1? $ var1: null;