Php 从数据库中检索到的值不正确

Php 从数据库中检索到的值不正确,php,mysql,cron,Php,Mysql,Cron,情境:我创建了一个cron作业。它是将客户输入的订单添加到API中。我把它设定为每一分钟运行一次 问题:有时,当有太多的待定订单时,第二个cron作业在第一个作业结束之前被调用。这导致了通过API发送的重复订单 解决方案:我在数据库中创建了一个名为cron_jobs的表。它有两列,ID和status。当cron作业运行时,它会检查状态是否为0。如果状态为0,则会将状态更新为1。它完成其进程并再次将状态标记为0。如果作业的状态为1(表示它已在运行),并且再次命中该作业,则操作将终止 意外问题:此解

情境:我创建了一个cron作业。它是将客户输入的订单添加到API中。我把它设定为每一分钟运行一次

问题:有时,当有太多的待定订单时,第二个cron作业在第一个作业结束之前被调用。这导致了通过API发送的重复订单

解决方案:我在数据库中创建了一个名为cron_jobs的表。它有两列,ID和status。当cron作业运行时,它会检查状态是否为0。如果状态为0,则会将状态更新为1。它完成其进程并再次将状态标记为0。如果作业的状态为1(表示它已在运行),并且再次命中该作业,则操作将终止

意外问题:此解决方案在逻辑上似乎是正确的。但当我实施它时,结果令人震惊。作业运行时,其状态将更新。但当再次调用它时,数据库仍然返回状态0并继续执行。我还使用了睡眠法,这样我就有足够的时间调查这个问题。但是数据库总是返回比我使用phpmyadmin看到的值不正确的值

请不要认为我可能犯了一些愚蠢的错误在完全调用第一个实例之前,文件的第二个实例总是获取不正确的值。 看看我的代码:

<?php
$Output = mysql_fetch_assoc(mysql_query("select status from jobs where ID='1'"));
if($Output['status'] == '0')
{
    mysql_fetch_assoc(mysql_query("update jobs set status='1' where ID = '1'"));
    mysql_fetch_assoc(mysql_query("update jobs set invoked = invoked+1 where ID = '1'"));
    echo 'Executed';
}
else
{
    echo 'Error: Another cron job already in process. Operation terminated!';
    die();
}

/*I perform some lengthy tasks here*/

    /*Sleep function called to check whether another instance of the program works while this one is in progress */
    sleep(60);

    /*Task is complete. We are marking 0 as status so that another instance is allowed to work on.*/

    mysql_fetch_assoc(mysql_query("update jobs set status='0' where ID = '1'"));
?>

您的
选择
查询使用表
cron\u作业
。每隔一次查询都使用
作业
。我相信您的
SELECT
查询失败,导致
mysql\u query()
返回
false

$Output = mysql_fetch_assoc(mysql_query("select status from cron_jobs where ID='1'"));
if($Output['status'] == '0')
因为这里
mysql\u query()
返回
false
mysql\u fetch\u assoc()
也返回
false

$Output = mysql_fetch_assoc(mysql_query("select status from cron_jobs where ID='1'"));
if($Output['status'] == '0')
$Output
false
。在PHP中,当使用
==
时,可以进行类型转换。在这种情况下,
$Output['status']='0'
的计算结果为
true
。(请注意,
$Output['status']
null
,但
null='0'
的计算结果为
false
。和的乐趣。)

将您的查询替换为

SELECT `status` FROM jobs WHERE ID = '1'
它应该运行正常

我确实建议在
mysql_*()
函数的返回值中添加更多的错误检查(使用
$returnValue===false
),或者更好地切换到


在评论中经过讨论后更新

问题似乎是您正在从浏览器进行测试。至少Firefox23.0.1(我用于测试)在第一个请求完成之前不会发送第二个请求。这可以解释你看到的所有行为。新的浏览器或计算机将无法重新使用该连接,因此在这种情况下它可以正常工作

如果我从命令行启动脚本两次(相隔五秒),它就会正常工作:第二次运行输出
错误:另一个cron作业已经在处理中。行动结束

请注意,PHP确实抱怨在每个
mysql\u查询(“更新…”)中都有无效的
mysql\u fetch\u assoc()
函数调用:

警告:mysql_fetch_assoc()希望参数1是第7行/test/test.php中给定的资源布尔值


那只是一个印刷错误。原始程序中没有语法错误。如果我终止程序的执行,然后检查值,它将返回正确的值。它不断返回过时的值,直到执行完成。我想知道为什么。我发现了另一件事。如果我在另一个浏览器中打开第二个实例,效果会非常好。但是如果我在同一个浏览器中打开所有实例,它就不起作用了。既然你已经更正了输入错误,我在代码中没有看到任何错误。我缺少与您相同的东西,或者错误不在您在此显示的代码中。Tomas,如果它有错误,它如何能够在不同的浏览器中完美工作?它应该始终工作,或者永远不工作。为什么是在某些特定条件下工作:(代码不太长,可能会有大量错误。只有几行在你面前。尝试一次,我希望你会面临同样的问题。你能发布你的
作业
的表方案吗?然后我可以试着复制它。1 ID int(11)2 status int(11)3 invoked int(11)