5

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

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

例如,声明

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

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

如何获取查询的类型?

4

3 回答 3

10

我一直在寻找相同的答案并偶然发现了 这篇文章。它最后一次更新是在八月。其中,有一个部分:“确定语句的类型”您基本上可以做出以下假设:(从文章中复制)

  • 如果 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++;
    }
}
于 2013-11-05T16:55:11.633 回答
4

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

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

因此,为了便于阅读,只需调用适当的函数即可获得您目前需要的结果——ffectedRows 或 numRows。它不会使您的代码臃肿,但会使其更具可读性。

于 2013-03-18T07:37:21.540 回答
-1

我正在使用这个:

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

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

于 2016-09-28T01:33:11.527 回答