【问题标题】:Insert into select only inserts one row on initial run but is fine each time afterwardsInsert into select 仅在初始运行时插入一行,但之后每次都可以
【发布时间】:2015-09-30 16:49:58
【问题描述】:

基本上我使用 php 和 mysql 来扩展邮件客户端的功能,使用 curl 将数据发送到我的服务器,然后输入到我数据库中的表 A 中,然后我选择表 A 中的所有数据匹配今天的日期,如果日期匹配,则将其插入表 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 语句中还运行了其他代码,但我认为它与问题无关。我知道此代码还有其他问题,例如不转义帖子值等,但这是我将在不久的将来解决的问题。问题是,每当此代码作为 cron 作业的一部分运行时,它只会将一行插入 $tableB 但是当我从 tableA 清除 tableB 和一个匹配 $today 的值并重新运行它每次都有效的代码时(即,如果我运行手动),唯一一次它不起作用是通过 cron 作业。如果需要更多代码,我很乐意提供,欢迎提供任何帮助。

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

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

谢谢。

【问题讨论】:

    标签: php mysql curl cron


    【解决方案1】:

    小心,de date_Added 是日期字段还是时间戳?在 MySQL 中,是不一样的,因为你的 date("Y-m-d") 与时间戳会被搞砸,很可能是你的问题

    尝试改变

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

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

    你提供的信息是唯一想到的东西

    【讨论】:

    • 这是一个日期字段,手动运行时可以正常工作,所以我怀疑这会改变任何功能。
    • 如果出现一些信息,您是否尝试查看日志?我在你这里的小代码中没有看到任何问题,也许你试图在错误的地方看到错误 :)
    • 我可以访问的唯一日志是服务器错误日志,但遗憾的是,里面没有任何与此问题相关的内容。
    【解决方案2】:

    这句话的问题确实在于我使用$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 作业会与自身混淆,并在第一次插入完成后感觉它已经完成。只是想我会分享知识,因为我的问题已经解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2013-06-26
      • 2022-07-06
      • 1970-01-01
      相关资源
      最近更新 更多