更新查询的SQL语法错误

时间:2013-03-02 01:42:51

标签: php html sql

我正在尝试通过更新查询更新用户设置,但是数据库上的字段没有更新。我运行了一个mysql错误,发现错误,但我仍然无法发现它。我的查询如下:

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

错误在于:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“WHERE `mem_id` = 11”附近使用正确的语法

实际功能如下:

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());
}

3 个答案:

答案 0 :(得分:1)

错误告诉我$update数组为空。因此,生成的查询为:

UPDATE `members` SET  WHERE `mem_id` = 11

如您所见,这显然无效。在运行查询之前,您应该检查以确保$update至少有一个元素。

答案 1 :(得分: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]);
  }
}

答案 2 :(得分:0)

尝试" WHERE `mem_id` = {$session_mem_id}"