5

MySQL リファレンス マニュアルでは、データ定義ステートメントとデータ操作ステートメントが区別されています。

ここで、クエリがデータベース レコードを挿入するか、更新するか、削除するか、テーブル構造などを変更するか、またはより正確には、影響を受ける行の正確な数を知りたいのですが、それが適用可能な場合に限られます。

たとえば、ステートメント

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

影響を受けた行の数 (この場合は2 )を返しますが、このSELECTステートメントでは、データベースで何も変更されていないため、その数は0になります。

クエリの種類を取得するには?

4

3 に答える 3

10

私は同じ答えを探していて、この記事に出くわし ました。最後に更新したのは 8 月です。その中には、「ステートメントのタイプの決定」というセクションがあります。基本的には、次の仮定を行うことができます: (記事からコピー)

  • columnCount() がゼロの場合、ステートメントは結果セットを生成しませんでした。代わりに、行が変更され、rowCount() を呼び出して、影響を受ける行の数を確認できます。
  • columnCount() が 0 より大きい場合、ステートメントは結果セットを生成し、行をフェッチできます。何行あるかを判断するには、フェッチしながら数えます。

コードサンプルをここに貼り付けてください。

$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

私は同じ問題について考えてきましたが、この問題では自動化は必要ないという結論に達しました。

このような自動検出の唯一の用途は、影響を受ける行の数を返す魔法の関数です。しかし、そのような魔法は、構文に少し砂糖を追加しますが、常にコードのサポートを悪夢にします:
関数を呼び出しているとき、コンテキストに応じて異なる型の値を返すことができます。すべての特定の瞬間。そのため、デバッグが難しくなります。

したがって、読みやすくするために、適切な関数を呼び出して、現時点で必要な結果を取得してください。コードが肥大化することはありませんが、読みやすくなります。

于 2013-03-18T07:37:21.540 に答える
-1

私はこれを使用しています:

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

$statement は PDOStatement オブジェクトです。ここで注意すべき点は、これを使用する前に $statement が PDOStatement オブジェクトであることを確認する必要があることです。また、strpos が false を返す場合に備えて、substr ステートメントから strpos を取り出す必要があります。おそらくエラーが発生します。最後に、これは SELECT、INSERT などの 1 語のステートメント タイプでのみ機能し、ALTER TABLE のような複数ワードのステートメント タイプでは機能しません。

于 2016-09-28T01:33:11.527 に答える