Insert into select 仅在初始 运行 上插入一行,但之后每次都可以

Insert into select only inserts one row on initial run but is fine each time afterwards

基本上我使用 php 和 mysql 来扩展邮件客户端的功能,数据使用 curl 发送到我的服务器,然后输入到我的 table A数据库,然后我 select 来自 table A 的所有数据,当它与今天的日期匹配时,如果日期匹配,则将其插入 table B,如下所示:

$date = $_POST['dateAdded'];
        $today = date("Y-m-d");

        if ($date === $today) {

            $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql="INSERT INTO `$tableB` (`$fields`) SELECT * FROM $tableA WHERE date_Added='$today'";
            $link->exec($sql);

此 IF 语句中还有其他代码 运行,但我认为它与问题无关。我知道此代码还有其他问题,例如不转义 post 值等,但这是我将在不久的将来解决的问题。问题是,每当此代码作为 cron 作业的一部分 运行 时,它只会将一行插入 $tableB 但是当我清除 tableB 和一个匹配 $today 的值时 tableA 并重新 运行 它每次都有效的代码(即,如果我手动 运行 它),它唯一不起作用的时间是通过 cron 作业。如果需要更多代码,我很乐意提供,欢迎任何帮助。

cron 作业 运行 使用 curl,因为数据位于不同的服务器上。

这可能与 curl 最初通过 cron 发送数据的方式有关吗? 还是SQL语句本身的问题?

谢谢。

注意,date_Added 是日期字段还是时间戳?在 MySQL 中是不一样的,因为你的日期 ("Y-m-d") 与时间戳会被搞砸,并且可能存在你的问题

尝试改变

$today = date("Y-m-d")

$today = date("Y-m-d H:i:s");

根据您提供的信息,这是我唯一想到的

此语句的问题确实在于我使用 $today 的方式,但不是上述方式。通过更改将数据插入数据库的 MySQL 语句解决了该问题:

这个:

$sql="INSERT INTO$tableB($fields) SELECT * FROM $tableA WHERE date_Added='$today'";

需要改成这样:

$sql="INSERT INTO$tableB($fields) SELECT * FROM $table WHERE date_Added between '$date_24_hours' AND '$today'";

其中 $date_24_hours 是这样的:$date_24_hours = date('Y-m-d', strtotime($today . ' -1 day'));

这里需要比较两个日期,否则 cron 作业会与自身混淆,并认为它在第一个插入完成后就完成了。只是想我会分享知识,因为我的问题已经解决了。