2010-02-20 17 views
16

PHP'de mysqli ile hazırlanmış ifadeleri kullanmayı öğrenmek için çalışıyorum ve genellikle bir sorgu ile ilgili bir sorunum varsa, ilk adım olarak neye benzediğini görmek için ekrana yansıtıyorum.Hazırlanan bir ifadenin içeriğini nasıl görebilirim?

Bunu nasıl hazırlanmış bir deyimle yapabilirim?

Değişkenler değiştirildikten sonra SQL deyimini görmek istiyorum.

cevap

16

kullanma hazır deyimler: Eğer deyimi hazırlamak zaman değişkenleri + deyimini yürütmek bağlanınca

  • , bu MySQL sunucusunda
  • gönderilir, yalnızca değişkenler MySQL sunucusuna
  • gönderilir
  • Ve ifade + değişkenli değişkenler MySQL sunucusunda çalıştırılır - deyim her çalıştırıldığında "hazırlığı" yeniden yapılmadan hazırlanır. Bu nedenle, hazırlanan ifadeler aynı deyim birkaç yürütüldüğünde performans için iyi olabilir kez)

PHP tarafında bir SQL sorgusu yok, bu nedenle bu sorguyu almanın bir yolu yok.

Bu, bir SQL sorgusu görmek istiyorsanız, SQL sorguları ve hazırlanmamış ifadeleri kullanmanız gerektiği anlamına gelir.

+0

kuyu biraz rahatsız edici = \ İdam edilen ifadeyi getirmenin bir yolu olacağını düşünürdüm – Stomped

+0

PHP tarafında buna ihtiyaç duyarsanız, temelde hata ayıklama nedenleriyle, SQL'i yeniden yapılandırabilirsiniz. ifadesinin yürütülmesine eşdeğer olan sorgu: yer tutucuları değişkenlerin değerlerine göre değiştirmeniz gerekir * (veriden kaçmak, elbette size bırakılacaktır) * ;;; Buna sık sık ihtiyacınız varsa, bunu sizin için yapan bir işlev yazabilmelisiniz; Diğer bir deyişle, bir çift var_dump 'MySQL sunucusuna hangi verilerin gönderildiğini görmenize yardımcı olmalıdır. –

+1

@stomped Nokta, çalıştırılan bir ifadenin olmamasıdır. Bu adım tamamen atlandı. – troelskn

0

Pascal MARTIN (+1) ile anlaşarak, hata ayıklama için başka bir teknik öneririm: var_dump() veya ifadeye eklediğiniz her değişkeni günlüğe kaydeder, böylece yanlış veri mi olduğunu yoksa mantıksal olarak yanlış mı olduğunu anlamanız gerekir. SQL.

10
  • Sen (eğer pdo kullandığınız) hazırlanmış deyimi hakkında bazı bilgileri edinmek PDOStatement->debugDumpParams kullanabilirsiniz.
  • hazır deyimler logged in MySQL's general log şunlardır: mysql_stmt_prepare() ve mysql_stmt_execute() C API fonksiyonları ile yürütülür hazırlanan tablolarda için
, sunucu hazırlayın ve size söyleyebilirim ki genel sorgu günlüğüne satırları yürütme yazıyor ifadeler hazırlandığında ve yürütüldüğünde.
[...] sunucu aşağıdaki sorguları genel sorgu günlüğüne yazar:
Hazırla [1] SELECT?
[1] general log aktif hata ayıklama amacıyla Yani 3

SEÇ ve bu dosyada göz kulak yürütün.

düzenleme: oh, sorunun bir [mysqli] etiketi var ... tamamen gözden kaçırdı.
İfade hiç yürütülmediyse (çift/tripple) yol boyunca herhangi bir hata oluşmadığını kontrol ettiniz mi?

echo "<pre>Debug: start</pre>\n"; 

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test'); 
if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); 
} 

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))'); 
if (false=== $result) { 
die('error : '. $mysqli->error); 
} 

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)'); 
if (false===$stmt) { 
    die ('prepare() failed: ' . $mysqli->error); 
} 

$result = $stmt->bind_param('i', $x); 
if (false===$result) { 
    die('bind_param() failed'); 
} 

$x = 1; 
$result = $stmt->execute(); 
if (false===$result) { 
    die('execute() failed: '.$stmt->error); 
} 

echo "<pre>Debug: end</pre>\n"; 
2

Genellikle, hazırlanmış bir sql parametrelerle hata ayıklamak gerektiğinde yapıyorum.

örneği hazırlamak ve yürütmek:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')"; 
$prep = ibase_prepare($sql) or die("Error"); 
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true; 
           ^^^^^^^^^^^^^^^^^^^^^^^ 

öyle cümlenin çıkan SQL hata ayıklamak için kolay bir yol:

printf(str_replace('?', '%s', $sql), $param1, $param2, ....); 
             ^^^^^^^^^^^^^^^^^^^^^^ 
Yalnızca yerine bir printf yapmanız gereken

? Hazırlanan SQL dizesinde bir% s tarafından. printf, her bir parametreyi, her% s değiştirilene yerleştirerek tek bir dize olarak yorumlayacaktır.

0

Bu projeyi besteci entegrasyonu, birim testi ve referanslara göre argümanları kabul etmeyi daha iyi bir şekilde ele almak için yakın zamanda güncelledim (bu, php 5.6'ya güncellemeyi gerektirir).

:


Sana sağlamalıdır potansiyel sorgu dizesi, bir yorumu görüntülemesine izin vermek için öntanımlıyı mysqli ve mysqli_stmt sınıfları uzatmak sınıflar kümesi oluşturduk neyi aradığınız

Bu https://github.com/noahheck/E_mysqli sizin için (yakın) drop-in yerine geçer, normal özel mysqli_stmt nesnesi döndüren mysqli nesne zaman prepare() sorgu dizesi.

INSERT INTO registration SET name = 'John Doe', email = '[email protected]' 

uzantısını kullanarak bazı uyarılar vardır: içinde

$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName); 

$query = "INSERT INTO registration SET name = ?, email = ?"; 

$stmt = $mysqli->prepare($query); 

$stmt->bind_param("ss", $_POST['name'], $_POST['email']); 

$stmt->execute(); 

echo $stmt->fullQuery; 

neden olur: Parametrelerinizi bağlayıcı sonra, E_mysqli sen stmt nesnenin yeni bir özelliği olarak ortaya çıkan sorgu dizesi görüntülemek sağlayacak (github projesinde README'de açıklanmıştır), ancak uygulamanızın sorunlu alanlarını gidermek veya prosedürelden nesneye yönelik bir tarza geçiş yapmak için bu, çoğu kullanıcı için bir yardım düzeyi sağlamalıdır.

Github projesinde ana hatlarıyla belirttiğim gibi, mysqli uzantısını kullanan pratik bir deneyimim yok ve bu proje kardeş projesi olan kullanıcıların isteği üzerine oluşturuldu. Bunu üretimde kullanan devler çok takdir edilecektir.

Yasal Uyarı - Dediğim gibi, bu uzantıyı yaptım.

0

Lottip gibi aracı kullanabilirsiniz. Fikir MySQL proxy gibi davranıyor. MySQL paketlerini ayrıştırır, sorguları ve paramları çıkarır, böylece içerikle hazırlanmış ifadeleri görebilirsiniz.

+0

Lütfen Lottip'in konseptini ve kullanımını burada belirtin. Linkler sonsuza dek sürmez. – atomSmasher

İlgili konular