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

时间:2013-03-17 23:29:01

标签: php mysql pdo

MySQL Reference Manual中,数据定义语句和数据操作语句之间存在区别。

现在我想知道查询是插入数据库记录,更新数据库记录,删除数据库记录还是修改表结构等等,或者更准确地说,是受影响行的确切数量,但前提是它是否适用。 / p>

例如,声明

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

返回一些受影响的行(在本例中为 2 ),但是使用SELECT语句,数据库中没有任何修改,因此该数字将 0 < /强>

如何获取查询类型?

3 个答案:

答案 0 :(得分:9)

我正在寻找相同的答案,偶然发现了this article。它最后一次更新是在八月份。其中有一个部分:&#34;确定声明的类型&#34;您基本上可以做出以下假设:(从文章中复制)

  • 如果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++;
    }
}

答案 1 :(得分:4)

我一直在考虑同样的问题,并得出结论,在这件事情上我不需要自动化。

这种自动检测的唯一用途是一些魔法功能,它将返回受影响行的数量。但是这样的魔力,虽然在语法上加了一点糖,但总是让代码支持成为一场噩梦: 当你调用一个函数,它可以返回不同类型的值取决于上下文,你无法分辨在每个特定时刻返回哪一个。因此,它使调试更难。

因此,为了便于阅读,只需调用适当的函数来获得当前所需的结果 - affectedRows或numRows。它不会让你的代码变得臃肿,而是让它可读性很强。

答案 2 :(得分:-1)

我正在使用它:

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

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