クエリを作成する PHP コードを見てデバッグしないでください。生成されたクエリを見てデバッグします。
$sql = "UPDATE `members` SET " . implode(', ', $update) . " WHERE `mem_id` = $session_mem_id";
// here you can error_log() the $sql string or inspect it in your IDE or whatever
mysql_query($sql) or die(mysql_error());
$update 変数に有効な構文が含まれていないと思われます。@Kolinkが示唆するように要素がゼロであるか、column = value
ペアではなく単なる値のリストです。したがって、結果の SQL は次のようになります。
UPDATE `members` SET 123, 'abc', 'me@example.com' WHERE `mem_id` = 123
それは有効な UPDATE 構文ではありません。SET 句で指定された各列が必要です。
UPDATE `members` SET col1=123, col2='abc', col3='me@example.com' WHERE `mem_id` = 123
$update が連想配列で、配列のキーが列名であると予想される場合、implode() は自動的にそれをkey = value
フォーマットに変換しないことを知っておく必要があります。array_map()などを使用して自分で行う必要があります。
おそらくこれについては既に読んだことがあると思いますが、mysql_* 関数は現在非推奨であり、新しいコードを作成する場合は mysqli または PDO の使用に慣れる必要があります。これにより、クエリ パラメーターを使用する機会も得られます。これにより、動的な値を SQL クエリに簡単、安全、迅速に追加できます。
これを PDO で記述し、エラー チェック、クエリ パラメーター、ホワイトリストの列名を適切に使用する方法を次に示します。
$members_columns = array("col1", "col2", "col3");
$update = array_intersect_key($update, array_flip($members_columns));
$columns = array_keys($update);
if ($columns) {
$sql = "UPDATE `members` SET "
. array_map(function ($col) { return "`$col` = :$col"; }, $columns)
. " WHERE `mem_id` = :where_mem_id";
$stmt = $pdo->prepare($sql);
if ($stmt === false) {
$err = $pdo->errorInfo();
error_log($err[2]);
}
$params = array_merge($update, array("where_mem_id"=>$session_mem_id));
$status = $stmt->execute($params);
if ($status === false) {
$err = $stmt->errorInfo();
error_log($err[2]);
}
}