2008-12-24 50 views
0

我有下面的代碼:mysqli的編制報表和REPLACE INTO

http://www.nomorepasting.com/getpaste.php?pasteid=22987

如果PHPSESSID是不是已經在表中的REPLACE INTO查詢工作得很好,但是如果PHPSESSID存在調用執行成功,但sqlstate被設置爲'HY000',這不是非常有用,$ _mysqli_session_write-> errno和$ _mysqli_session_write->錯誤都是空的,數據列不會更新。

我相當肯定,問題是在我的腳本某處,因爲手動執行REPLACE INTO從MySQL工作正常,無論PHPSESSID是否在表中。

回答

0

所以事實證明還有其他問題,使用REPLACE,我是不知道的:

Bug #10795: REPLACE reallocates new AUTO_INCREMENT(根據意見。它實際上不是一個bug,但「預期」的行爲)

結果我的id字段不斷得到增加,從而更好的解決方案是使用沿着線的東西:

INSERT INTO會話(PHPSESSID,數據)VALUES( '{$ ID}',「{$數據}')在DUPLICATE KEY UPDATE data ='{$ data}'

這也可以防止任何外鍵約束破裂和潛在的數據完整性問題。

1

你爲什麼要在會話開放函數中做好準備?我不相信寫作功能在一次會話中多被調用一次,所以在開放時準備它並不會對你有太大的幫助,你也可以在寫會話時做這些事情。

無論如何,我相信你需要在表名和列列表之前有一些空格。如果沒有空格,我相信mysql會像在試圖調用名爲session()的不存在的函數那樣。

REPLACE INTO session (phpsessid, data) VALUES(?, ?) 

的MySQL認爲 之間無差異 'COUNT()' 和 'COUNT()'

有趣的是,當我在mysql命令行運行下面我似乎得到不同的結果。

mysql> select count (*); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)' at line 1 
mysql> select count(*); 
+----------+ 
| count(*) | 
+----------+ 
|  1 | 
+----------+ 
1 row in set (0.00 sec) 
+0

MySQL認爲'COUNT(*)'和'COUNT(*)'沒有區別,所以如果空白是問題,那麼將無法解決它。另外'REPLACE'在執行'INSERT'時工作,但在執行'UPDATE'時失敗,所以如果是這種情況,查詢總是失敗。 – 2008-12-24 16:30:15

1

「REPLACE INTO」執行2個查詢:首先是「DELETE」,然後是「INSERT INTO」。我也使用「REPLACE INTO」作爲我的數據庫會話,但是我將MySQLi-> query()與MySQLI-> real_escape_string()組合使用, ()代替MySQL - >準備()