J'utilise 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 échouent et lancent cette erreur:
Erreur fatale : impossible de passer le paramètre 2 par référence dans / opt / ...
bindValue()
overbindParam()
; pour tout, pas seulement pour laNULL
valeur. Je ne peux pas penser à un seul cas où vous auriez besoin de lier le paramètre à une référence d'une variable PHP - mais c'est ce quebindParam()
fait.Lors de l'utilisation,
bindParam()
vous devez passer une variable, pas une constante. Donc, avant cette ligne, vous devez créer une variable et la définir surnull
Vous obtiendrez le même message d'erreur si vous essayiez:
la source
Lors de l'utilisation de
INTEGER
colonnes (cela peut êtreNULL
) dans MySQL, PDO a un comportement (pour moi) inattendu.Si vous utilisez
$stmt->execute(Array)
, vous devez spécifier le littéralNULL
et ne pouvez pas donnerNULL
par référence de variable. Donc cela ne fonctionnera pas:Mais cela fonctionnera:
J'ai essayé ceci sur MySQL 5.5.15 avec PHP 5.4.1
la source
isset()
correspond mieux àNULL
. Une chaîne vide est également une valeur.Pour ceux qui ont encore des problèmes (Impossible de passer le paramètre 2 par référence), définissez une variable avec une valeur nulle, et pas simplement passer null à PDO:
J'espère que cela t'aides.
la source
J'ai eu le même problème et j'ai trouvé cette solution fonctionnant avec bindParam:
la source
Si vous souhaitez insérer
NULL
uniquement lorsque levalue
estempty
ou''
, mais insérez levalue
lorsqu'il est disponible.A) Reçoit les données du formulaire à l'aide de la méthode POST et appelle l'insertion de fonction 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 ne saisit rien dans le
productName
champ du formulaire, alors ce$productName
seraSET
maisEMPTY
. Donc, vous devez vérifier si c'est leempty()
cas et si c'est le cas, insérez-leNULL
.Testé sur PHP 5.5.17
Bonne chance,
la source
IFNULL()
fonction de MySQL dans la chaîne de requête. Comme ça:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Essaye ça.
la source
Sur la base des autres réponses mais avec un peu plus de clarté sur la manière d'utiliser réellement cette solution.
Si, par exemple, vous avez une chaîne vide pour une valeur de temps mais que vous souhaitez l'enregistrer sous forme de null:
Notez que pour les valeurs de temps, vous utiliserez PARAM_STR, car les heures sont stockées sous forme de chaînes.
la source
Dans mon cas, j'utilise:
SQLite,
des instructions préparées avec des espaces réservés pour gérer un nombre inconnu de champs,
Demande AJAX envoyée par l'utilisateur où tout est une chaîne et il n'y a rien de tel que
NULL
valeur etJ'ai désespérément besoin d'insérer des
NULL
s car cela ne viole pas les contraintes de clé étrangère (valeur acceptable).Supposons que maintenant l'utilisateur envoie avec post:
$_POST[field1]
avec une valeurvalue1
qui peut être la chaîne vide""
ou"null"
ou"NULL"
.Je fais d'abord la déclaration:
où
{$sColumns}
est qc commefield1, field2, ...
et{$sValues}
sont mes espaces réservés?, ?, ...
.Ensuite, je collecte mes
$_POST
données liées aux noms de colonnes dans un tableau$values
et les remplace parNULL
s:Maintenant, je peux exécuter:
et entre autres contourner les contraintes de clé étrangère.
Si par contre, une chaîne vide a plus de sens, vous devez vérifier si ce champ fait partie d'une clé étrangère ou non (plus compliqué).
la source