2013-03-02 201 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