不要通過查看構建查詢的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