gpt4 book ai didi

php - 使用 PDO 运行查询并根据条件执行大量操作

转载 作者:行者123 更新时间:2023-11-29 02:42:14 28 4
gpt4 key购买 nike

我正在尝试重构脚本并将 PDO 放到适当的位置,但我对它并不是非常熟悉。

我得到了一些相当简单的查询,但我试图在顶部建立我的基本 SELECT 查询,然后使用循环和条件根据所选值执行大量操作。我现在的问题是根据 2 个条件删除记录。

我的选择返回正确的记录,如果我回显符合条件的记录,它们就会打印出来。但是当我运行脚本的这一部分时,它会删除表中的所有记录,而不仅仅是受条件影响的记录:

date_default_timezone_set('America/New_York');

//PDO statement to select from order_status
$ordStatSql = 'SELECT order_id, order_status, is_placement, date_updated
FROM order_status';
try{
$ordStat = $MysqlConn->prepare($ordStatSql);
$result = $ordStat->execute();
}
catch(PDOException $ex)
{
echo "QUERY FAILED!: " .$ex->getMessage();
}

while($row = $ordStat->fetch(PDO::FETCH_ASSOC))
{
if(strtotime($row['date_updated']) > strtotime('-5 day') && $row['is_placement'] == 1){

$deleteOld = 'DELETE FROM Order_status';
try{
$delete = $MysqlConn->prepare($deleteOld);
$result = $delete->execute();
$count = $delete->rowcount();
echo "Records Deleted: " . $count;
}
catch(PDOException $ex)
{
echo "QUERY FAILED!: " .$ex->getMessage();
}

}
}

基本上,如果 SELECT 中的某一行将 is_placement 设置为 1 并且 date_updated 已超过 5 天,我只想删除该记录。

我在这里做错了什么?

最佳答案

问题是你正在运行

DELETE FROM Order_status

每一行都符合您的条件。该查询将简单地删除 order_status 中的所有内容,这就是您遇到的情况。直接的解决方案是在循环中删除具有当前行的 order_id 的行:

$deleteOld = 'DELETE FROM Order_status WHERE order_id = ?';
try {
$delete = $MysqlConn->prepare($deleteOld);
$result = $delete->execute([
$row["order_id"],
]);
// snip

注意 prepared statements 的使用.

但是,为了避免N+1 problem ,您应该只执行一个查询,其中包含条件。例如,如果我正确理解条件,这样的查询将如下所示:

DELETE FROM order_status WHERE is_placement = 1 AND date_updated > DATE_SUB(NOW(), INTERVAL 5 DAY)

然后,您只需执行一个查询(甚至不需要 SELECT)。

关于php - 使用 PDO 运行查询并根据条件执行大量操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49091511/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com