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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PDO运行查询并根据条件执行大量操作相关的知识,希望对你有一定的参考价值。

我正在尝试重构一个脚本并将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)。

以上是关于使用PDO运行查询并根据条件执行大量操作的主要内容,如果未能解决你的问题,请参考以下文章

PDO预编译语句执行查询与DML操作

如何根据某些过滤条件从 bigquery 导出数据

GraphQL 查询,根据某些条件使用片段。已加载 GraphQL 文件

使用 PDO 的条件选择查询

事务、存储过程和 PDO

PDO 不返回任何结果,而 MySQL 命令行返回预期结果