如何在PDO中获取查询语句的类型


How to get the type of a query statement in PDO?

在MySQL参考手册中,有数据定义语句和数据操作语句的区别。

现在我想知道查询是否插入数据库记录,更新记录,删除记录或修改表结构等等,或者更准确地说,受影响的行的确切数量,但只有在适用的情况下。

例如,语句

SELECT *
FROM SomeTable
WHERE id=1 OR id=2

返回受影响的行数(在本例中为2),但是对于SELECT语句,数据库中没有任何修改,因此该数将为0

如何获取查询的类型?

我正在寻找同样的答案,偶然发现了这篇文章。最近一次更新是在8月份。其中有一节:"确定语句的类型"你基本上可以做出以下假设:(从文章中抄来的)

  • 如果columnCount()为零,则该语句没有生成结果集。相反,它修改行,您可以调用rowCount()来确定受影响的行数。
  • 如果columnCount()大于零,则语句生成一个结果集,您可以获取行。要确定有多少行,请在获取它们时计数。

我将省去你的麻烦,只需粘贴代码示例在这里

$sth = $dbh->prepare ($stmt);
$sth->execute ();
if ($sth->columnCount () == 0)
{
    # there is no result set, so the statement modifies rows
     printf ("Number of rows affected: %d'n", $sth->rowCount ());
}
else
{
    # there is a result set
    printf ("Number of columns in result set: %d'n", $sth->columnCount ());
    $count = 0;
    while ($row = $sth->fetch (PDO::FETCH_NUM))
    {
    # display column values separated by commas
       print (join (", ", $row) . "'n");
       $count++;
    }
}

我一直在思考同样的问题,得出的结论是,在这件事上我不需要任何自动化。

这种自动检测的唯一用途是一些魔术函数,它将返回受影响的行数。但是这样的魔法,虽然给语法添加了一点糖,但总是使代码支持成为噩梦:
当您调用一个函数时,它可以根据上下文返回不同类型的值,您无法分辨在每个特定时刻返回的是哪一个。因此,它使调试变得更加困难。

因此,为了可读性起见,只需调用适当的函数来获得您当前需要的结果—受影响的drows或numRows。它不会使您的代码臃肿,但会使更具可读性。

我用这个:

substr($statement->queryString, 0, strpos($statement->queryString, ' '));

其中$statement是一个PDOStatement对象,这里需要注意的几件事是,你应该在使用它之前验证$statement是一个PDOStatement对象,我们也应该把strpos从substr语句中取出,以防strpos返回false,这可能会导致错误,最后,这只适用于一个词的语句类型,如SELECT, INSERT等,而不是多词的语句类型,如ALTER TABLE