PDO ham SQL sorgu dizesini alma tablolarını

6 Cevap php

Hazır bir ifadeye PDOStatement :: execute () çağrılırken yürütülen ham SQL dize almak için bir yolu var mı? Hata ayıklama amacıyla bu son derece yararlı olacaktır.

6 Cevap

Ben size bunun yansıtılmadan parametre değerleri ile son SQL sorgusu, istediğiniz anlamına varsayalım. Ben bu hata ayıklama için yararlı olacağını anlıyoruz, ancak hazırlanan tablolar işe yol değildir. Parametreler istemci tarafında hazırlanmış bir deyimi ile kombine değil, bu yüzden PDO parametreleri ile birlikte sorgu dizesine erişiminiz asla.

Eğer () hazırlamak ne zaman SQL deyimi veritabanı sunucusuna gönderilir ve () yürütmek ne zaman parametreleri ayrı ayrı gönderilir. MySQL genel sorgu günlüğü () yürütme sonra interpolasyon değerleri ile son SQL göstermektedir. Aşağıda benim genel sorgu günlüğünde bir alıntıdır. Ben PDO gelen mysql CLI, gelen sorguları koştu, ancak prensip aynıdır.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
    	        2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
    	        2 Execute     [2] select * from foo where i = 1

Ayrıca PDO PDO :: ATTR_EMULATE_PREPARES özniteliği ayarlarsanız, istediğinizi alabilirsiniz. Bu modda, PDO SQL sorgusuna parametrelerini sokmak ve () çalıştırdığınızda tüm sorgu gönderir. This is not a true prepared query. Sen) (önce çalıştırılacak SQL dizeye değişkenleri enterpolasyonlayarak hazırlanan sorgularının faydalarını aşmak olacaktır.

Ben nerede (?) Gibi ifadeler için Dizilerin işleme çıkışını içerecek şekilde yöntemini değiştirdi.

GÜNCELLEME: Sadece NULL değer katma kontrol ve $ çoğaltılamaz böylece gerçek $ param değerleri değiştirilmiş değildir params.

Büyük iş bigwebguy ve teşekkür!

/**
 * 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 function interpolateQuery($query, $params) {
    $keys = array();
    $values = $params;

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

        if (is_string($value))
            $values[$key] = "'" . $value . "'";

        if (is_array($value))
            $values[$key] = implode(',', $value);

        if (is_null($value))
            $values[$key] = 'NULL';
    }

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

    return $query;
}

PDOStatement bir kamu malı $ QueryString vardır. Bu ne istediğinizi olmalıdır.

Ben sadece PDOStatement de bakmak isteyebilirsiniz belgelenmemiş bir yöntem debugDumpParams () olduğunu fark ettik.

Mike kod biraz daha Eklenenler - tek tırnak eklemek için değerleri yürümek

/**
 * 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 function interpolateQuery($query, $params) {
    $keys = array();
    $values = $params;

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

        if (is_array($value))
            $values[$key] = implode(',', $value);

        if (is_null($value))
            $values[$key] = 'NULL';
    }
    // Walk the array to see if we can add single-quotes to strings
    array_walk($values, create_function('&$v, $k', 'if (!is_numeric($v) && $v!="NULL") $v = "\'".$v."\'";'));

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

    return $query;
}

Sözü $ QueryStringÖzelliği muhtemelen sadece kendi değerleri ile değiştirilir parametre olmadan geçirilen sorgu dönecektir. . Net, basit bir arama hata günlüğü sorgu için kullanılmaya başlandı gerçek değerlerini göstermek böylece sağlandı onların değerleri ile parametreler üzerinde değiştiririm benim sorgu yürütücüsü yakalamak parçası var. Siz PHP parametreleri listelemek ve onların atanan değer parametrelerini değiştirmek gerekir.

Ben yazdığım bir PDO query logger (5.2.17 php tarafından test), ben (bu benim için gerekli değil, params günlük yeterli bence daha fazla), ancak bunu yapabilirsin henüz bu özelliği uygulamaya değil evaluating the SQL template manually İstersen ile ...