INSERT语句mystery - mysql_query返回true,但数据库中没有出现新行

时间:2012-07-27 02:35:53

标签: php mysql insert

我必须在这里做傻事。我已经对此进行了3天的故障排除而没有运气。

这是发送到mysql_query()的PHP字符串:

insert into post_replies (postID, fromID, toID, status) values ($id, $userID, $toID, ".g_unread.")

在你说之前,"啊啊,在SQL"中一定有错误,请注意以下两点:

  1. mysql_query()返回true(1)
  2. 我将字符串导出到文本文件(见下文)之前发送到mysql_query() - 如果我将导出的文本粘贴到相同的mysql_query()语句中,它可以正常工作(出现新行) - 如果粘贴导出的文本进入phpMyAdmin,它工作正常(出现新行)
  3. 完全(我的意思是完全,就像我只是复制并粘贴它一样)相同的查询使用了几行,它总能正常工作
  4. 我尝试的另一件事是从文本中加载查询 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()

    欺骗了

5 个答案:

答案 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,但实际上并未插入新行。