4

我一定在这里做的很愚蠢。我已经解决了 3 天的问题,但没有运气。

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

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

在你说“啊哈哈,SQL肯定有错误”之前,请注意以下两点:

  1. mysql_query() 返回真 (1)
  2. 我在发送到 mysql_query() 之前将字符串导出到文本文件(见下文) - 如果我将导出的文本粘贴到相同的 mysql_query() 语句中,它工作正常(出现新行) - 如果将导出的文本粘贴到 phpMyAdmin,它工作正常(出现新行)
  3. 精确的(我的意思是精确的,因为我只是复制并粘贴它)相同的查询被使用了几行,它总是工作正常

我尝试的另一件事是从文本中加载查询然后将其发送到 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() 欺骗了

4

5 回答 5

2

在指定表格和行时尝试使用重音,

$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');
    }

告诉我这是否有效。

于 2012-07-27T03:31:46.373 回答
0

有什么mysql_error()回报吗?这可能很糟糕,但是您在执行插入时是否连接到正确的数据库?

您还可以在 mysql 中启用查询日志记录以记录所有查询。Howtogeek 有一篇关于启用此功能的文章。服务器重新启动后,您应该开始看到所有查询都记录到您指定的文件中。我的看起来像这样。

/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())");
于 2012-07-27T03:34:44.663 回答
0

我遇到了这样的问题。我发现问题出在没有默认值的字段上……我最近从 Linux 服务器转到 Windows 服务器,在使用 Linux 时一定有点懒惰。

问题是,当使用我的 Linux 服务器时,我不必将每个字段都放入 INSERT 查询中,由于某种原因(我不确定为什么),它似乎为我默认了它们,但是,我的 Windows 服务器使用确实如此,mysqli错误函数说某些字段没有默认值,添加这些字段对我来说效果很好。

我知道这个问题已经得到解答,但这可能会帮助其他有同样问题的人,毕竟我不希望别人把头发拉出来 3 天。

于 2013-03-19T15:49:08.833 回答
0

你必须检查是否有东西阻止你提交你的命令,在执行查询后尝试这个命令:mysql_query("COMMIT;");

于 2017-02-11T13:47:52.207 回答
0

我刚刚遇到这个问题并发现了问题。

如果不知何故,您的表没有正确的主键自动增量,它将返回 true 但实际上不会插入新行。

于 2018-12-20T22:37:53.040 回答