2013-03-02 179 views
2

我试图通过更新查询更新用户设置,但是数据库中的字段未被更新。我运行了一个mysql错误,发现错误,但我仍然无法找到它。我的查询如下:更新查询的SQL语法错误

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使用反引号来分隔列名! – 2013-03-02 01:47:00

+0

你可以告诉我们'$ session_mem_id'的价值 – asifsid88 2013-03-02 01:47:12

+0

@ asifsid88它是11.错误清楚地告诉你。 – 2013-03-02 01:47:56

回答

0

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

+2

SO提示:如果在代码块中有反引号,请使用多个反引号。 – 2013-03-02 01:46:18

+0

@Kolink谢谢!TIL – 2013-03-02 01:47:03

1

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

UPDATE `members` SET WHERE `mem_id` = 11 

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

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', '[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]); 
    } 
} 
+0

我在原始文章中包含了我的函数的其余部分,所以这与我如何声明我的$更新有关? – jhetheringt7 2013-03-02 01:56:37

+0

好的,我已经读过你的函数,但是你仍然没有检查$ update_data是否有零个元素,并且在所有动态插值将它们放在一起之后,你并没有检查结果SQL字符串。 – 2013-03-02 02:02:34