Просмотр и отладка подготовленного запроса PDO, не просматривая журналы MySQL - PullRequest
3 голосов
/ 05 августа 2011

Я хочу посмотреть, что готовит PDO, не заглядывая в журналы MySQL. По сути, последний запрос, который он построил непосредственно перед выполнением запроса.

Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Нет встроенного способа сделать это. bigwebguy создал функцию для этого в одном из своих ответов :

/**
 * 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;
}
0 голосов
/ 06 января 2019

Это всего лишь производная кода @Maerlyn, приведенного выше, который принимает неассоциативные массивы для таких параметров, как и где, если ключ начинается уже с ':', не добавляйте его.

/**
 * 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
 * 
 * @author maerlyn https://stackoverflow.com/users/308825/maerlyn
 */
function interpolateQuery($query, $params) {
    $keys = array();

    # build a regular expression for each parameter

    if (!isAssoc($params)){
        $_params = [];  // associative array
        foreach($params as $param){
            $key = $param[0];
            $value = $param[1];
            // $type = $param[2];
            $_params[$key] = $value;
        }
        $params  = $_params;
    }       

    foreach ($params as $key => $value) {
        if (is_string($key)) {
            $keys[] = '/'.((substr($key,0,1)==':') ? '' : ':').$key.'/';
        } else {
            $keys[] = '/[?]/';
        }
    }

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

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

    return $query;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...