2012-06-22 6 views
5

Eventuali duplicati:
PDO Prepared StatementsCome posso visualizzare un preparato Dichiarazione DOP SQL

Sono sicuro che la risposta a questa domanda è molto semplice, ma non sembrano essere in grado di trovarlo.

Sto usando PDO (PHP Data Objects) per eseguire una query su un database MySQL e troverei utile visualizzare la query preparata prima che venga eseguita sul DB.

C'è un modo per farlo? Ad esempio:

$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

Si è discusso qui http://stackoverflow.com/questions/2411182/how-to-debug-pdo-database-queries e http: //stackoverflow.com/questions/6961897/php-pdo-how-can-i-display-the-query-pdo-just-prepared – Bob

+0

Ovviamente non ho cercato troppo bene, data la velocità con cui entrambi avete trovato il altri post. – Bryan

+0

@Bryan Era il primo nel pannello delle domande correlate sul lato destro! – lonesomeday

risposta

3

Non è possibile ottenere la query inviata al server perché PDO non funziona in questo modo.

Invia $ query separatamente e $ id separatamente al database del server che vengono eseguiti dopo essere entrati dal database.

3

Una pratica frequente è stampare la query (che contiene segnaposti) accanto ai valori associati. Quando si utilizza un array dello stile :placeholder => value, è possibile solo var_dump, print_r o var_export l'array.

Questo è fatto nel debug di Magento SQL ad esempio.

La query "finale" non esiste come stringa a meno che il driver PDO non supporti le istruzioni preparate e le stia simulando.

In sostanza, è possibile pensare a istruzioni preparate come se fossero una funzione memorizzata o una stored procedure. Lo crei una volta e lo esegui più volte con più parametri.

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

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