web-dev-qa-db-fra.com

PHP / MySQL Insérer des valeurs nulles

Je me bats avec du code PHP/MySQL. Je lis depuis 1 table, je change certains champs puis j'écris dans une autre table, rien ne se passe si l'insertion et l'une des valeurs du tableau est nulle alors que je voudrais qu'elle insère null dans la base de données (les valeurs nulles sont autorisées pour le champ). Cela ressemble un peu à ceci:

$results = mysql_query("select * from mytable");
while ($row = mysql_fetch_assoc($results) {
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']});
}

Toutes les lignes n'ont pas une valeur nulle et dans ma requête, il y a plus de champs et 2 colonnes qui peuvent ou non être nuls

28
MattP

C'est un exemple où l'utilisation d'instructions préparées vous évite vraiment des ennuis.

Dans MySQL, afin d'insérer une valeur nulle, vous devez la spécifier au moment de INSERT ou laisser le champ en dehors qui nécessite un branchement supplémentaire:

INSERT INTO table2 (f1, f2)
  VALUES ('String Value', NULL);

Cependant, si vous souhaitez insérer une valeur dans ce champ, vous devez maintenant brancher votre code pour ajouter les guillemets simples:

INSERT INTO table2 (f1, f2)
  VALUES ('String Value', 'String Value');

Les relevés préparés le font automatiquement pour vous. Ils connaissent la différence entre string(0) "" et null et écrivent votre requête de manière appropriée:

$stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)");
$stmt->bind_param('ss', $field1, $field2);

$field1 = "String Value";
$field2 = null;

$stmt->execute();

Il échappe à vos champs pour vous, veille à ne pas oublier de lier un paramètre. Il n'y a aucune raison de rester avec l'extension mysql. Utilisez mysqli et c'est instructions préparées à la place. Vous vous épargnerez un monde de douleur.

59
Andrew Moore

Je pense que vous avez besoin de devis autour de votre {$row['null_field']}, Donc '{$row['null_field']}'

Si vous n'avez pas les guillemets, vous vous retrouverez parfois avec une instruction d'insertion qui ressemble à ceci: insert into table2 (f1, f2) values ('val1',) qui est une erreur de syntaxe.

S'il s'agit d'un champ numérique, vous devrez effectuer des tests au-dessus et s'il n'y a pas de valeur dans null_field, définissez-le explicitement sur null.

5
mooreds

Pour les champs où NULL est acceptable, vous pouvez utiliser var_export($var, true) pour afficher le littéral string, integer ou NULL. Notez que vous n'entourez pas la sortie de guillemets car ils seront automatiquement ajoutés ou omis.

Par exemple:

mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")");
4
Micah Fagre