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 作业会与自身混淆,并认为它在第一个插入完成后就完成了。只是想我会分享知识,因为我的问题已经解决了。
基本上我使用 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 作业会与自身混淆,并认为它在第一个插入完成后就完成了。只是想我会分享知识,因为我的问题已经解决了。