不要通过查看构建查询的 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]);
}
}