2

更新クエリを使用してユーザー設定を更新しようとしていますが、データベースのフィールドが更新されていません。mysql エラーを実行し、エラーを見つけましたが、まだ見つけられません。私のクエリは次のとおりです。

mysql_query("UPDATE `members` SET " . implode(', ', $update) . " WHERE `mem_id` = $session_mem_id") or die(mysql_error());

そして、エラーは言っています:

SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、WHERE `mem_id` = 111 行目の ' '付近で使用する正しい構文を確認してください。

実際の関数は次のようになります。

function update_user($mem_id, $update_data) {
$update = array();
array_walk($update_data, 'array_sanitize');

foreach ($update_data as $field=>$data) {
    $update[] = '`' . $field . '` = \'' . $data . '\'';
}

mysql_query("UPDATE `members` SET " . implode(', ', $update) . " WHERE `mem_id` = $mem_id") or die(mysql_error());
}
4

3 に答える 3

1

エラーは、$update配列が空であることを示しています。その結果、生成されたクエリは次のようになります。

UPDATE `members` SET  WHERE `mem_id` = 11

ご覧のとおり、これは明らかに無効です。$updateクエリを実行する前に、少なくとも 1 つの要素があることを確認する必要があります。

于 2013-03-02T01:45:34.353 に答える
1

クエリを作成する 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]);
  }
}
于 2013-03-02T01:50:18.840 に答える
0

試す" WHERE `mem_id` = {$session_mem_id}"

于 2013-03-02T01:45:30.093 に答える