2008-12-24 47 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 - >准备()