PDO PHP ile nasıl son SQL kontrol sorgu parametrelenmişse?

8 Cevap php

Parametrized sorgu ile PDO ile MySQL veritabanı erişirken PHP, nasıl (tüm belirteçleri değiştirildikten sonra) son sorguyu kontrol edebilirim?

Gerçekten veritabanı tarafından idam olur ne denetlemek için bir yolu var mı?

8 Cevap

Ben de sonunda kayıt için tam bir çözüm olması için benim kendi soru cevap olacak sanırım. Ama bunun için ipuçları sağlanan Ben James ve Kailash Badu teşekkür etmek gerekir.

Short Answer
As mentioned by Ben James: NO.
The full SQL query does not exist on the PHP side, because the query-with-tokens and the parameters are sent separately to the database. Only on the database side the full query exists.

Hatta PHP tarafında belirteçleri yerine bir işlevi oluşturmak için çalışırken değiştirme işlemi (token-tipi, bindParam vs bindValue, ... gibi zor şeyler) SQL biri olarak aynı garanti olmaz

Workaround
This is where I elaborate on Kailash Badu's answer. By logging all SQL queries, we can see what is really run on the server. With mySQL, this can be done by updating the my.cnf (or my.ini in my case with Wamp server), and adding a line like:

log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]

Just do not run this in production!!!

Parametrised değerleri ile hazırlanmış deyimleri kullanarak sadece dinamik SQL bir dize oluşturmak için başka bir yol değildir. Sen veritabanına hazırlanmış bir açıklama oluşturun ve daha sonra tek başına parametre değerleri göndermek.

Peki muhtemelen veritabanına gönderilir sonra, bir PREPARE ... olmak SET ... ve nihayet EXECUTE ... olacaktır.

Böyle bir sorgu hiç aslında veritabanına gönderildi çünkü eşdeğer sonuçlar üretecektir bile, SELECT * FROM ... gibi bazı SQL dizesini almak mümkün olmayacaktır.

Sen PDOStatement->debugDumpParams kullanmak mümkün olabilir. Bkz the PHP documentation.

Ben hazırlanmış deyimi idam edildi tam sorgu görmek için Sorgu Oturum kontrol edin.

Ben bir güçlük olacağını düşündüm ama hiç de zor değildir çünkü başlangıçta PDO'yu izlemek için günlüğe kaydetme açma kaçınılmalıdır. Sen (5.1.9 sonra) MySQL yeniden başlatmanız gerekmez:

PhpMyAdmin veya yüksek db ayrıcalıklara sahip herhangi başka bir ortamda bu SQL Yürüt:

SET GLOBAL general_log = 'ON';

Bir terminal, kuyruk log dosyası. Benimki burada oldu:

>sudo tail -f /usr/local/mysql/data/myMacComputerName.log

Bu terminal komutu ile mysql dosyaları için arama yapabilirsiniz:

>ps auxww|grep [m]ysqld

Ben PDO şeyi kaçar bulundu, böylece yazamazsınız

$dynamicField = 'userName';
$sql = "SELECT * FROM `example` WHERE `:field` = :value";
$this->statement = $this->db->prepare($sql);
$this->statement->bindValue(':field', $dynamicField);
$this->statement->bindValue(':value', 'mick');
$this->statement->execute();

Oluşturur Çünkü:

SELECT * FROM `example` WHERE `'userName'` = 'mick' ;

, Sadece boş bir sonuç bir hata yaratmadı Hangi. Bunun yerine kullanmak için gerekli

$sql = "SELECT * FROM `example` WHERE `$dynamicField` = :value";

almak için

SELECT * FROM `example` WHERE `userName` = 'mick' ;

Ne zaman yapılır yürütmek:

SET GLOBAL general_log = 'OFF';

veya başka günlükleri büyük alırsınız.

Birisi bana yanlış olacağını umuyoruz ama ben yapabilirsiniz inanmıyorum.

Ben sorguyu yazdırabilirsiniz ve toString yöntemi değiştirmeleri olmadan sql gösterecektir biliyorum. Karmaşık sorgu dizeleri inşa ediyorsanız bu kullanışlı olabilir, ama size değerlerle tam sorgu vermez.

Ne gerçek sorgu biraz karmaşık olduğunu yazdırmak için yaptım ama çalışıyor :)

Benim açıklamaya değişkenleri atar yöntemde böyle biraz görünüyor başka bir değişken var:

$this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt);

Where:
$column is my token
$param is the actual value being assigned to token
$this->fullStmt is my print only statement with replaced tokens

Ne yapar gerçek PDO atama olur basit bir değerler ile belirteçleri değiştirin.

Seni şaşırtmak ve en azından doğru yönde işaret vermedi umuyoruz.

Ben PDO kullandığınızda son sorgu metni görmek için en kolay yolu, özel hata yapmak ve hata mesajı bakmak olduğunu düşünüyorum. Bunu nasıl biliyorum, ama yok ben sorgu metni görebiliyordu pdo kullanmak yii çerçevesinde sql hata yaptığınızda