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ı?
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 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.
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.