1

私はPHP5.3でPearMDB2を使用しています。DBを更新するプロジェクトをコーディングしていて、データの変更を開始する前に、autoPrepare()とexecute()によって生成されたSQLクエリが実際に実行される前にどのように見えるかを確認したいと思います。

次のような更新クエリを作成して実行する予定です。

    $stmt = $db->extended->autoPrepare($tableName, $tableColumns,
    MDB2_AUTOQUERY_UPDATE, 'id = ' . $db->quote(12345, 'integer'),
    $tableColumnTypes));

    $res =& $stmt->execute($tableColumnValues);

autoPrepare()にアクセスすると、値のプレースホルダーを使用して生成されたSQLを確認できることはすでに知っています$stmt->query実際にクエリをDBに送信せずにexecute()、プレースホルダーの代わりに値を使用して、によって生成された完成したSQLを確認したいと思います。

どうやってやるの?

4

2 に答える 2

5

プリペアドステートメントはサーバー側でコンパイルされるため、実行前に表示することはできません。たとえば、MySQLでは、プリペアドステートメントを実行する場合、MDB2が実際に行うことは次のとおりです。

PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?';
SET @baz = 'baz';
EXECUTE stmt USING @baz;

サーバーは、実行した実際のクエリを「返す」ことはありません。実行されたクエリを確認する場合は、クエリログを設定する必要があります。

たとえば、MySQL(my.cnf)では次のようになります。

[mysqld]
general_log_file = /var/log/mysql_queries.log
general_log = 1

上記のクエリの例では、クエリログに次のように表示されます。

Query     PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?';
Query     SET @baz = 'baz';
Query     EXECUTE stmt USING @baz;
Execute   SELECT * FROM foo WHERE bar = 'baz';
于 2011-06-08T19:54:34.497 に答える
0
print_r ($db->last_query, true);
于 2013-07-24T09:02:16.353 に答える