6

重複の可能性:
PDOプリペアドステートメント

これに対する答えは非常に単純だと思いますが、私はそれを見つけることができないようです。

私はPDO(PHPデータオブジェクト)を使用してMySQLデータベースに対してクエリを実行していますが、DBに対して実行される前に、準備されたクエリを表示すると便利です。

これを行う方法はありますか?例えば:

$query = 'SELECT Id, Name, Comment FROM Users WHERE Id = :id';
$pdoStatement = $db->prepare($query);
$pdoStatement->bindValue(':id', $id);

// How can I view the actual statement that will be executed, showing the real
// value that will be used in place of ':id'

$pdoStatement->execute();
4

3 に答える 3

3

PDO がこのように動作しないため、サーバーに送信されるクエリを取得できません。

$query と $id を別々に server-database に送信し、データベースによって結合された後に実行されます。

于 2012-06-22T12:43:32.083 に答える
3

頻繁に行われるのは、バインドされた値と一緒にクエリ (プレースホルダーを含む) を出力することです。スタイルの配列を使用する場合は、または配列のみを使用:placeholder => valueできます。var_dumpprint_rvar_export

これは、たとえば Magento SQL デバッグで行われます。

PDO ドライバーが準備済みステートメントをサポートしておらず、それらをシミュレートしていない限り、「最終」クエリは文字列として存在しません。

本質的に、準備済みステートメントは、ストアド関数またはストアド プロシージャであるかのように考えることができます。一度作成し、複数のパラメーターを使用して複数回実行します。

于 2012-06-22T12:43:38.453 に答える
3

これを使って:

/**
 * Replaces any parameter placeholders in a query with the value of that
 * parameter. Useful for debugging. Assumes anonymous parameters from 
 * $params are are in the same order as specified in $query
 *
 * @param string $query The sql query with parameter placeholders
 * @param array $params The array of substitution parameters
 * @return string The interpolated query
 */
public static function interpolateQuery($query, $params) {
    $keys = array();

    # build a regular expression for each parameter
    foreach ($params as $key => $value) {
        if (is_string($key)) {
            $keys[] = '/:'.$key.'/';
        } else {
            $keys[] = '/[?]/';
        }
    }

    $query = preg_replace($keys, $params, $query, 1, $count);

    #trigger_error('replaced '.$count.' keys');

    return $query;
}

ソース: MySQL ログを見ずに、準備された PDO クエリを表示してデバッグする

于 2012-06-22T12:52:10.273 に答える