MySQL无法从mysql_insert_id()中可靠地返回主键

时间:2014-05-02 20:00:29

标签: php mysql insert primary-key

十多年来,我一直在开发PHP和mySQL解决方案,我从未见过这种奇怪的行为,它几乎看起来像是一个bug,但我想我会看到有没有人经历过这个。

我们最近迁移到运行PHP 5.3.3的全新网络服务器(mysql服务器在不同的服务器上运行,未更改)。

我们有一个订单页面使用了与我们一直使用的相同代码和一些小编辑,但没有任何与此错误有关的内容,因为mysql查询尚未编辑。

当尝试从“customers”表上的INSERT检索主键时,它在大约60%的时间内返回“0”,尽管记录实际插入到表中。

60%的时间它没有返回插入记录的主键,也没有返回错误。

IE:
//schema id (primary, auto inc), name (varchar 100)
mysql_query("insert into customers set name='john doe'");
echo mysql_error(); //never outputs an error, record above is inserted 100% of the time without problem and is properly assigned a auto incremented ID so it is not a parse error
$id = mysql_insert_id(); 
echo mysql_error(); //never outputs an error
echo $id; //60% of the time this is returned as "0" instead of the primary key that was just entered

PHP 5.3.3 Mysql 5.0.95

起初我认为它可能与使用SSL进行查询有关(因为我们是同一个colo中的两个不同的服务器,所以打开了)因此我将其关闭进行测试,它似乎首先解决了问题,但随后它又开始做了。

我能想到的唯一另一件事可能就是它失去了与mysql服务器的连接,但我认为它会返回“false”并输出一个mysql错误,如果是这样的话。

有人对此有任何想法吗?该表完好无损,我已经运行修复/优化以确保。我对这种随机事件感到茫然。

由于代码与旧服务器上的代码几乎相同,我怀疑它可能是错误和/或服务器设置问题。在旧服务器上,我们使用FCGID和php 5.1运行Worker MPM。在这台服务器上,我们使用FastGCI PHP-FPM和PHP 5.3.3运行Worker MPM。

1 个答案:

答案 0 :(得分:1)

我可以在这里找到两个可能的原因:

  1. 您的表可能没有任何AUTO_INCREMENT字段!但你提到你有这个。

  2. 也可能因为您同时拥有两个或更多mysql连接而发生。在这种情况下,您应该使用链接标识符。恩。

    $ link = mysql_connect(...);
    mysql_select_db(' mydb',$ link);
    mysql_query("插入客户设置名称=' john doe'",$ link);
    $ inserted_id = mysql_insert_id($ link);

相关问题