2

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

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

错误是说:

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

实际功能如下所示:

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至少有一个元素。

于 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 回答