Comment insérer des valeurs nulles en utilisant PDO?
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/...
7 réponses
je viens d'apprendre L'AOP, mais je pense que vous devez utiliser bindValue
, pas bindParam
bindParam
prend une variable, pour référence, et ne tire pas une valeur au moment de l'appel bindParam
. J'ai trouvé ceci dans un commentaire sur les docs php:
bindValue(':param', null, PDO::PARAM_INT);
EDIT: P.S. vous pouvez être tenté de faire cela bindValue(':param', null, PDO::PARAM_NULL);
mais cela n'a pas fonctionné pour tout le monde (merci Will Shaver pour le reportage.)
en utilisant bindParam()
vous devez passer dans une variable, pas une constante. Donc avant cette ligne vous devez créer une variable et la mettre à null
$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);
vous obtiendriez le même message d'erreur si vous essayiez:
$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);
Lorsqu'on utilise les colonnes INTEGER
(qui peuvent être NULL
) dans MySQL, AOP a un comportement (pour moi) inattendu.
si vous utilisez $stmt->execute(Array)
, vous devez spécifier la lettre NULL
et ne pouvez pas donner NULL
par référence variable.
Donc ça ne marchera pas:
// $val is sometimes null, but sometimes an integer
$stmt->execute(array(
':param' => $val
));
// will cause the error 'incorrect integer value' when $val == null
Mais cela va fonctionner:
// $val again is sometimes null, but sometimes an integer
$stmt->execute(array(
':param' => isset($val) ? $val : null
));
// no errors, inserts NULL when $val == null, inserts the integer otherwise
essayé sur MySQL 5.5.15 avec PHP 5.4.1
j'ai eu le même problème et j'ai trouvé cette solution en travaillant avec bindParam:
bindParam(':param', $myvar = NULL, PDO::PARAM_INT);
pour ceux qui ont encore des problèmes (ne peut pas passer le paramètre 2 par référence), définissez une variable avec une valeur nulle, pas seulement passer null à AOP:
bindValue(':param', $n = null, PDO::PARAM_INT);
Espérons que cette aide.
si vous voulez insérer NULL
seulement lorsque value
est empty
ou ''
, mais insérez le value
quand il est disponible.
A) reçoit les données du formulaire en utilisant la méthode POST, et appelle la fonction insert avec ces valeurs.
insert( $_POST['productId'], // Will be set to NULL if empty
$_POST['productName'] ); // Will be to NULL if empty
B) évalue si un champ n'a pas été rempli par l'utilisateur, et insère NULL
si c'est le cas.
public function insert( $productId, $productName )
{
$sql = "INSERT INTO products ( productId, productName )
VALUES ( :productId, :productName )";
//IMPORTANT: Repace $db with your PDO instance
$query = $db->prepare($sql);
//Works with INT, FLOAT, ETC.
$query->bindValue(':productId', !empty($productId) ? $productId : NULL, PDO::PARAM_INT);
//Works with strings.
$query->bindValue(':productName',!empty($productName) ? $productName : NULL, PDO::PARAM_STR);
$query->execute();
}
Par exemple, si l'utilisateur n'entre rien dans le champ productName
du formulaire, alors $productName
sera SET
mais EMPTY
. Donc, vous devez vérifier si il est empty()
, et si c'est le cas, insérer NULL
.
testé sur PHP 5.5.17
bonne chance", 1519150920"
Essayez Ceci.
$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null