Comment puis-je insérer des valeurs NULL à l'aide de PDO?
Je suis en utilisant ce code et je suis au-delà de la frustration:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); //--> Here's the problem
PDO::PARAM_NULL, null, '',
tous échouer et de se débarrasser de cette erreur:
Erreur fatale: Impossible de passer le paramètre 2 par référence dans /opt/...
Vous devez vous connecter pour publier un commentaire.
Je suis en train d'apprendre PDO, mais je pense que vous devez utiliser
bindValue
, pasbindParam
bindParam
prend une variable de référence, et de ne pas tirer une valeur au moment de l'appelbindParam
. J'ai trouvé ça dans un commentaire sur le php docs:EDIT: P. S. Vous pourriez être tenté de faire ce
bindValue(':param', null, PDO::PARAM_NULL);
mais il ne fonctionne pas pour tout le monde (merci à vous de Rasoir pour les rapports.)bindValue()
surbindParam()
; pour tout, pas seulement pour leNULL
valeur. Je ne peux pas penser à un seul cas où vous auriez besoin de lier le paramètre de référence d'une variable PHP - mais qu'est ce quebindParam()
n'.Lors de l'utilisation de
bindParam()
vous devez passer une variable, pas une constante. Donc, avant de cette ligne, vous devez créer une variable et fixé ànull
Vous obtenez le message d'erreur même si vous avez essayé:
Lors de l'utilisation de
INTEGER
colonnes (qui peut êtreNULL
) dans MySQL, PDO a certains (pour moi) un comportement inattendu.Si vous utilisez
$stmt->execute(Array)
, vous devez spécifier le littéralNULL
et ne peut pas donnerNULL
par référence à une variable.Si cela ne fonctionne pas:
Mais cela va fonctionner:
Essayé ce MySQL 5.5.15 avec PHP 5.4.1
isset()
correspond mieux àNULL
. Une chaîne vide est aussi une valeur.Pour ceux qui ont encore des problèmes (Impossible de passer le paramètre 2 par référence), définir une variable avec la valeur null, et pas seulement passer la valeur null à PDO:
Espère que cette aide.
J'ai eu le même problème et j'ai trouvé cette solution de travail avec bindParam :
Si vous souhaitez insérer
NULL
uniquement lorsque levalue
estempty
ou''
, mais insérer levalue
quand il est disponible.A) Reçoit les données du formulaire à l'aide de la méthode POST, et appelle la fonction insert avec ces valeurs.
B) Évalue si un champ n'a pas été rempli par l'utilisateur, et insère
NULL
si c'est le cas.Par exemple, si l'utilisateur n'a pas à quoi que ce soit entrée sur le
productName
champ de formulaire, puis$productName
seraSET
maisEMPTY
. Donc, vous devez vérifier si il estempty()
, et si elle l'est, puis insérezNULL
.Testé sur PHP 5.5.17
Bonne chance,
IFNULL()
fonction dans la chaîne de requête. Comme ceci:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
De L'Essayer.
Dans mon cas, je suis en utilisant:
SQLite,
préparées avec des espaces réservés pour gérer inconnu nombre de champs,
Requête AJAX envoyé par l'utilisateur où tout est une chaîne de caractères et il n'y a pas une telle chose comme
NULL
valeur etJ'ai désespérément besoin d'insérer
NULL
s qui ne viole clé étrangère contraint (valeur acceptable).Supposons maintenant que l'utilisateur envoie à la poste:
$_POST[field1]
avec la valeurvalue1
qui peut être la chaîne vide""
ou"null"
ou"NULL"
.J'ai d'abord faire la déclaration:
où
{$sColumns}
est qqch commefield1, field2, ...
et{$sValues}
sont mes espaces réservés?, ?, ...
.Puis-je récupérer ma
$_POST
données en rapport avec les noms de colonnes dans un tableau$values
et remplacer avecNULL
s:Maintenant, je peux les exécuter:
et entre autres de dérivation de clé étrangère contraint.
Si, d'autre part, une chaîne vide n'a plus de sens, alors vous devez vérifier si ce champ est une partie d'une clé étrangère ou pas (plus compliqué).