我正在尝试通过更新查询更新用户设置,但是数据库上的字段没有更新。我运行了一个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());
}
答案 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}"