不要通过查看构建查询的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', '[email protected]' WHERE `mem_id` = 123
这不会是有效的UPDATE语法。您需要SET子句中指定的每个列。
UPDATE `members` SET col1=123, col2='abc', col3='[email protected]' WHERE `mem_id` = 123
如果$更新是一个关联数组,你所期望的数组键是列名,你应该知道,破灭()将不会自动变成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]);
}
}
+1使用反引号来分隔列名! – 2013-03-02 01:47:00
你可以告诉我们'$ session_mem_id'的价值 – asifsid88 2013-03-02 01:47:12
@ asifsid88它是11.错误清楚地告诉你。 – 2013-03-02 01:47:56