2012-06-22 18 views
5

Duplicar posible:
PDO Prepared Statements¿Cómo puedo ver un preparado Declaración DOP SQL

estoy seguro de que la respuesta a esto es muy simple, pero no me parece que haya capaz de encontrarlo

Estoy usando PDO (objetos de datos PHP) para ejecutar una consulta en una base de datos MySQL, y me parece útil mostrar la consulta preparada antes de que se ejecute contra la base de datos.

¿Hay alguna forma de hacerlo? Por ejemplo:

$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(); 
+0

Se discute aquí http://stackoverflow.com/questions/2411182/how-to-debug-pdo-database-queries y http: //stackoverflow.com/questions/6961897/php-pdo-how-can-i-display-the-query-pdo-just-prepared – Bob

+0

Obviamente no busqué demasiado, dada la velocidad a la que ambos encontraron el otras publicaciones – Bryan

+0

@Bryan ¡Fue el primero en el panel de preguntas relacionadas en el lado derecho! – lonesomeday

Respuesta

3

No se puede obtener la consulta que se envía al servidor porque el PDO no funciona de esta manera.

Envía los $ query por separado y $ id por separado a la base de datos del servidor que se ejecutan después de unirse por la base de datos.

3

Una práctica frecuente es imprimir la consulta (que tiene marcadores de posición) junto con los valores encuadernados. Al utilizar una matriz del estilo :placeholder => value, puede simplemente var_dump, print_r o var_export la matriz.

Esto se hace en la depuración de Magento SQL, por ejemplo.

La consulta "final" no existe como una cadena a menos que el controlador PDO no admita las declaraciones preparadas y las esté simulando.

En esencia, puede pensar en las declaraciones preparadas como si fueran una función almacenada o un procedimiento almacenado. Lo crea una vez y lo ejecuta varias veces con múltiples parámetros.

3

usarlo:

/** 
* 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; 
} 

fuente: View and debug prepared PDO query without looking at MySQL logs

Cuestiones relacionadas