编写PDO DELETE查询值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写PDO DELETE查询值相关的知识,希望对你有一定的参考价值。

我想知道我们是否仍然可以使用来自新鲜的DELETE行的值作为SELECT或者我们真的需要之前使用SELECT吗?

示例: 改变这一点

$foo = $db->prepare("SELECT * FROM table WHERE id= :id");
$foo->execute(array(
    "id" => $table_id
));
$foo = $foo->fetch(PDO::FETCH_ASSOC);

$delete_foo = $bdd->prepare("DELETE FROM table WHERE id = :id");
$delete_foo->execute(array(
    "id" => $table_id
));
echo $foo['name'] . " has been deleted !";

进入:

$delete_foo = $bdd->prepare("DELETE FROM table WHERE id = :id");
$delete_foo->execute(array(
    "id" => $table_id
));
$delete_foo = $delete_foo->fetch(PDO::FETCH_ASSOC);
echo $delete_foo['name'] . " has been deleted !";

这会更容易。我只是想知道,我使用第一种方法,但它只是考虑到了,我找不到答案。

答案

postgresql中,有一个名为RETURNING的删除语句的专有扩展。 Sql Server提供类似的东西,他们称之为OUTPUT

例如,以下DELETE语句中的OUTPUT DELETED。*将返回从ShoppingCartItem表中删除的所有列:

DELETE Sales.ShoppingCartItem  
    OUTPUT DELETED.*;  

不幸的是,mysql没有像上面那样的东西。如果你删除了一行它就消失了(除非你回滚事务而不是提交)。如果要选择数据,则需要在DELETE之前执行SELECT

另一答案

DELETE查询不会返回任何结果(除受影响的行),因此PDO::query将不会有任何可用的数据来获取。

另一答案

对于提供的示例,额外的选择查询没有任何意义。因为你已经拥有了你的$ value。

我宁愿说你需要整体简化你的PDO代码。将以下代码段与您的代码段进行比较

$foo = $db->run("SELECT foo FROM table WHERE value = ?", [$value])->fetchColumn();
$db->run("DELETE FROM table WHERE value = ?", [$value]);
echo "$foo has been deleted!";

run()函数可以通过一个非常小的PDO修改来实现:

class MyPDO extends PDO
{
    public function run($sql, $args = NULL)
    {
        $stmt = $this->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

代码取自我的文章Simple yet efficient PDO wrapper

以上是关于编写PDO DELETE查询值的主要内容,如果未能解决你的问题,请参考以下文章

Huawei_Netconf_Ncclient

我应该在 PDO 对象中返回啥来生成可靠的代码?

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

PHP / PDO动态绑定值(无效的参数计数错误)

PHP PDO Select 查询返回双精度值

php PHP:PDO片段