我必须在这里做傻事。我已经对此进行了3天的故障排除而没有运气。
这是发送到mysql_query()的PHP字符串:
insert into post_replies (postID, fromID, toID, status) values ($id, $userID, $toID, ".g_unread.")
在你说之前,"啊啊,在SQL"中一定有错误,请注意以下两点:
我尝试的另一件事是从文本中加载查询 back 然后将其发送到mysql_query() - 但这会产生相同的奇怪行为 - 它返回成功(1),但没有新的实际插入行。
我向其他程序员展示了这一点,他抱怨我的PHP编码风格。他说INT应该被包裹成字符串,我应该使用大括号(例如' {$ id}')。然而,当然没有任何修复,行为完全相同。如果字符串生成出现问题,那么在发送到mysql_query()之前,问题将出现在导出到文本文件的查询中。他还抱怨我使用过时的mysql函数(我应该使用mysqli函数)。但是,这并不能解释为什么我通过mysql_query()发送的数百个其他查询工作正常,包括这一个下面几行。如果我将导出的文本文件直接粘贴到mysql_query()中,它无法解释为什么查询工作正常。
非常感谢你。我完全迷失在这里。
更新#1:根据请求,这是声明周围的代码:
$q = "insert into post_replies (postID, fromID, toID, status) values ($id, $userID, $toID, ".g_unread.")";
$result = mysql_query($q);
if ($result == true) {
z($q);
} else {
z('failure');
}
z()是我用来轻松导出到文本文件的函数。顺便说一下,查询总是被发送到z(),'失败'永远不会发送。
以下是发送到文本文件的示例:
insert into post_replies (postID, fromID, toID, status) values (2039, 8, 1, 1)
请注意,如果我将该文本粘贴到phpMyAdmin或上面的mysql_query()函数中,则会插入该行。
更新#2:由于一些人的担忧,我更新了这部分代码以使用mysql [i]
$mysqli = new mysqli(g_db_server, g_db_user, g_db_pass, g_db);
$result = $mysqli->query($q);
我现在只为这个单一查询建立一个单独的连接。但是,行为完全相同。它返回true,但不创建新闻行。但是,如果我将$ q导出到文本文件,然后将该文本粘贴到上面的$ mysqli-> query()中,它就可以正常工作,并按预期创建新行。
由于每个人似乎已经放弃了,我现在正致力于将问题隔离到单个MySQL表/ PHP文件,任何人都可以下载并自行尝试。
更新#3:解决了!有点。这似乎是周围代码的问题,导致插入后删除行。但是,这仍然无法解释为什么mysql_insert_id()返回0.也许mysql_insert_id()在复合键上中断。无论如何,我不在乎 - 因为它已经修好了。我会把支票给@ user1231958,因为他的答案是最接近的。非常感谢大家的帮助,抱歉被mysql_insert_id()
欺骗了答案 0 :(得分:3)
在指定表格和行时尝试使用严重重音
$q = "INSERT INTO `post_replies` (`postID`, `fromID`, `toID`, `status`) VALUES ('$id', '$userID', '$toID', '".g_unread."')";
$result = mysql_query($q);
if ($result == true) {
z($q);
} else {
z('failure');
}
告诉我是否有效。
答案 1 :(得分:0)
mysql_error()
会返回任何内容吗?这可能很蹩脚,但是在执行插入时是否连接到正确的数据库?
您还可以在mysql中启用查询日志记录来记录所有查询。 Howtogeek有article启用此功能。重新启动服务器后,您应该开始查看登录到指定文件的所有查询。我看起来像这样。
/opt/local/libexec/mysqld, Version: 5.1.61-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /opt/local/var/run/mysql5/mysqld.sock
Time Id Command Argument
120727 8:57:09 1 Connect root@localhost on foo
1 Query /* test comment */ insert into test(foo) values(NOW())
1 Quit
现在您可以监视所有进入mysql服务器的查询,在查询前添加注释以在日志中标识它。我使用以下PDO代码生成上面的日志。
$dbh = new PDO("mysql:host=localhost;dbname=foo",'root','');
$dbh->exec("/* test comment */ insert into test(foo) values(NOW())");
答案 2 :(得分:0)
我遇到了这样的问题。我发现问题是字段没有默认值....我最近从Linux服务器转到Windows服务器,在使用Linux时一定有点懒。
问题是,当使用我的Linux服务器时,我不必将每个字段放入INSERT查询,由于某种原因(我不知道为什么)它似乎默认为我,但是,Windows服务器我正在使用,所以mysqli错误函数说某些字段没有默认值,添加这些字段并且它对我来说很好。
我知道这个问题已得到解答,但这可能有助于其他人遇到同样的问题,毕竟我不想让别人拉头发3天。
答案 3 :(得分:0)
你必须检查是否有东西阻止你提交命令, 执行查询后尝试此命令: mysql_query(" COMMIT;");
答案 4 :(得分:0)
我刚遇到这个问题,就发现了问题。
如果以某种方式,您的表的主键没有正确的自动增量,它将返回true,但实际上并未插入新行。