2010-04-08 101 views
0

我有一個SQL更新語句,我從PHP程序中運行。它準備好然後執行。當我在PHP中運行它時,它報告違反約束。當我從命令行運行完全相同的語句時(我通過dBug()獲取),它的工作原理沒有錯誤。這聽起來不可能,所以我一直在尋找這些陳述之間的差異。我能看到的唯一的事情是,當我用一系列參數執行它時,它們都顯示爲字符,當有些應該是整數時。在代碼中運行的SQL與MySQL命令行有什麼區別嗎?

任何建議去哪裏看?

這裏是PHP版本(我調整了一點,以使其更清晰):

$st =& $db->prepare("update tbl set uid=?, frequency=? other_id=? where id=$id"); 
$values = array($uid, $freq, $other_id); 
$res =& $db->execute($st, $values); 
new dBug ($res); 
+0

瞭解如何在PHP代碼中構建SQL字符串可能有助於發現問題。 – webbiedave 2010-04-08 16:57:38

+0

你用什麼來準備SQL?根據你的參數編寫聲明時可能會有差異。 – 2010-04-08 17:00:34

回答

0

嘛,討厭這樣說,但問題是我的複製和粘貼。我正在使用dBug來顯示數值和睡眠狀態,以便在閱讀它們時暫停,但由於無法複製和粘貼,我必須重新輸入查詢。我錯寫了其中一個值。感謝您的努力,但像往常一樣:操作員錯誤。

1

也許PHP客戶端和客戶端MySQL使用不同的字符集。

不具有在客戶端的字符表中對應的用戶輸入的數據可能會轉換成?????這可能違反約束:

SELECT CAST('абвгд' AS CHAR CHARSET LATIN1) 

--- 
????? 

'абвгд'這裏是西裏爾字母。

您能否提供一些您試圖插入表格定義的數據樣本?

1

聲音不太可能 - 變量綁定後正在運行的SQL可能存在一些差異。啓用通用查詢日誌並比較兩種情況下執行的語句版本。

C.

+0

我無法啓用一般查詢日誌而無需重新啓動,我可以嗎?現在,我無法重新啓動。如果我沒有成功,我會稍後嘗試。 – MJB 2010-04-08 17:17:43

相關問題