Son SQL sorgusunu, içine eklenen parametre değerleriyle birlikte istediğinizi varsayıyorum. Bunun hata ayıklama için yararlı olacağını anlıyorum, ancak hazırlanan ifadelerin çalışma şekli bu değildir. Parametreler, istemci tarafında hazırlanmış bir ifadeyle birleştirilmez, bu nedenle PDO'nun hiçbir zaman parametreleriyle birlikte sorgu dizesine erişimi olmamalıdır.
Prepar () işlemini yaptığınızda SQL deyimi veritabanı sunucusuna gönderilir ve execute () işlemini gerçekleştirdiğinizde parametreler ayrı olarak gönderilir. MySQL'in genel sorgu günlüğü, siz () çalıştırdıktan sonra enterpolasyonlu değerlerle son SQL'i gösterir. Aşağıda genel sorgu günlüğümden bir alıntı var. Sorguları mysql CLI'den çalıştırdım, PDO'dan değil, ama prensip aynı.
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 özniteliğini PDO :: ATTR_EMULATE_PREPARES olarak ayarlarsanız, istediğinizi elde edebilirsiniz. Bu modda, PDO parametreleri SQL sorgusuna ekler ve () komutunu çalıştırdığınızda tüm sorguyu gönderir. Bu gerçek hazırlanmış bir sorgu değil. Execute () işleminden önce değişkenleri SQL dizesine enterpolasyon yaparak hazırlanmış sorguların faydalarından kaçınacaksınız.
@Afilina'dan yeniden yorum:
Hayır, metinsel SQL sorgusu edilir değil yürütme sırasında parametreleri ile birleştirdi. Yani PDO'nun size göstereceği hiçbir şey yok.
Dahili olarak, PDO :: ATTR_EMULATE_PREPARES kullanırsanız, PDO, hazırlayıp çalıştırmadan önce SQL sorgusunun bir kopyasını oluşturur ve parametre değerlerini buna enterpolasyonlar. Ancak PDO, bu değiştirilmiş SQL sorgusunu açığa çıkarmaz.
PDOStatement nesnesi $ queryString özelliğine sahiptir, ancak bu yalnızca PDOStatement yapıcısında ayarlanır ve sorgu parametrelerle yeniden yazıldığında güncellenmez.
PDO'nun yeniden yazılan sorguyu ifşa etmesini istemesi makul bir özellik isteği olacaktır. Ancak bu bile PDO :: ATTR_EMULATE_PREPARES kullanmadığınız sürece size "tam" sorguyu vermez.
Bu nedenle, MySQL sunucusunun genel sorgu günlüğünü kullanmanın yukarıdaki geçici çözümünü gösteriyorum, çünkü bu durumda parametre yer tutuculara sahip hazırlanmış bir sorgu bile, parametre değerleri sorgu dizesine doldurularak sunucuda yeniden yazılır. Ancak bu, sorgu yürütme sırasında değil, yalnızca günlük kaydı sırasında yapılır.