Yürütmeden olmadan bağlı parametreleri ile bir PDO sorgu dizesi Başlarken

2 Cevap php

Önce onu yürütme olmadan bağlı parametreleri ile bir PDO nesnesinin bir sorgu dizesi almak mümkün mü? Ben aşağıdaki benzer bir kodu var ($ dbc PDO nesnesi olduğu):

$query = 'SELECT * FROM users WHERE username = ?';
$result = $dbc->prepare($query);
$username = 'bob';
$result->bindParam(1, $username);
echo $result->queryString;

"? Username = kullanıcı SELECT * FROM": Şu anda, böyle bir SQL deyimi echo olacaktır. Ancak, bu gibi görünüyor böylece dahil bağlı parametre istiyorum:. 'SELECT * FROM uyeler WHERE username =' bob '"yapmak için bir yolu var mı bu kadar yürütme ya da bir şey yoluyla parametreleri ile soru işaretleri değiştirmeden gibi preg_replace?

2 Cevap

Kısacası: hayır. Bkz http://stackoverflow.com/questions/210564/pdo-prepared-statements/210693#210693

Sadece onu taklit etmek istiyorsanız, deneyin:

echo preg_replace('?', $username, $result->queryString);

Bu parametrelerin bir numaralı dizisi için regexp technique bir çeşididir:

function boundQuery($db, $query, $values) {
    return preg_replace_callback(
        '#\\?#',
        // Notice the &$values - here, we want to modify it.
        function($match) use ($db, &$values) {
            if (empty($values)) {
                throw new PDOException('not enough values for query');
            }
            $value  = array_shift($values);

            // Handle special cases: do not quote numbers, booleans, or NULL.
            if (is_null($value)) return 'NULL';
            if (true === $value) return 'true';
            if (false === $value) return 'false';
            if (is_numeric($value)) return $value;

            // Handle default case with $db charset
            return $db->quote($value);
        },
        $query
    );
}

Bir olabilir da extend PDOStatement a $stmt->boundString($values) yöntemi tedarik etmek amacıyla.