web-dev-qa-db-ja.com

PHP / MySQLはnull値を挿入します

PHP/MySQLコードに苦労しています。私は1つのテーブルから読み取り、いくつかのフィールドを変更してから別のテーブルに書き込みます。データベースにnullを挿入したいときに挿入し、配列値の1つがnullの場合は何も起こりません(フィールドにはnull値が許可されています)。次のようになります。

$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']});
}

すべての行にnull値があるわけではなく、クエリにはnullの場合とそうでない場合があるフィールドと2つの列があります

28
MattP

これは、準備されたステートメントを使用すると、実際にいくつかのトラブルが軽減される1つの例です。

MySQLでは、null値を挿入するために、INSERTの時点で指定するか、追加の分岐を必要とするフィールドを除外する必要があります。

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

ただし、そのフィールドに値を挿入する場合は、コードを分岐して一重引用符を追加する必要があります。

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

準備されたステートメントが自動的にそれを行います。彼らはstring(0) ""nullの違いを知っており、クエリを適切に記述します。

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

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

$stmt->execute();
_

フィールドをエスケープして、パラメータのバインドを忘れないようにします。 mysql拡張機能を使用する理由はありません。代わりにmysqliを使用してください。 準備済みステートメント です。あなたは自分自身の苦痛の世界を救うでしょう。

59
Andrew Moore

_{$row['null_field']}_を引用符で囲む必要があると思うので、_'{$row['null_field']}'_

引用符がない場合は、次のようなinsertステートメントで終わることがあります。insert into table2 (f1, f2) values ('val1',)これは構文エラーです。

それが数値フィールドの場合、その上でいくつかのテストを行う必要があり、null_fieldに値がない場合は、明示的にnullに設定します。

5
mooreds

NULLが許容されるフィールドの場合、var_export($var, true)を使用して、stringinteger、またはNULLリテラルを出力できます。出力は自動的に追加または省略されるため、引用符で囲まないことに注意してください。

例えば:

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