Ayrıştırma SQL dizesi

4 Cevap php

Içine ayrı bileşenleri bir sql dizesini ayrıştırma için iyi bir yöntem nedir. I'v ancak ben sadece doğru çalışması için alınamıyor, bir regex ile çalıştı.

Örneğin Say:

"SELECT * FROM tbl WHERE user_id > 50"

Tüm bileşenleri ile bir dizi yaratacak

$arr[0] = "SELECT";
$arr[1] = "*";
$arr[2] = "FROM";

vb ...

Teşekkür ederim

4 Cevap

Ben senin diline entegre olabilecek bir sql çözümleyici için gitmek istiyorum: tekerleği yeniden icat yok.

Ben tavsiye özellikle bir kullanmadıysanız, ama ben size gerekenleri yapmak bir bulabilirsiniz eminim.

Bkz ilgili: http://stackoverflow.com/questions/283087/php-mysql-sql-parser-insert-and-update

Bir SQL SELECT deyiminin tam sözdizimi çok karmaşık. Ben bunu bir alt kendinizi sınırlamak isteyebilirsiniz düşünüyorum.

Bir düzenli ifade sadece bir regular language ayrıştırmak. Yani, bir sonlu durum makinesi ile ifade edilebilir bir dildir.

SQL dahil birçok programlama dilleri, düzenli bir dil olarak ifade edilemez ve bu nedenle düzenli ifadeler ile çözümlenen olamaz. Hatta yarma SQL ifadeleri gibi sınırlı görevleri yaparken düzenli ifadeler ile çıldırtırcasına zor olacak.

Sen daha karmaşık gramer işleyebilir daha sağlam bir ayrıştırıcı jeneratör kullanmak gerekir. PHP ile sorunuzu etiketlemek, böylece içine bakmak isteyebilirsiniz Lime.

Ayrıca seçtiğiniz ayrıştırıcı jeneratör ile uyumlu PHP için bir dilbilgisi dosyayı bulmak gerekir. PHP ve Kireç için bir tane almak için nerede emin değilim, ama MySQL dilbilgisi dayanmaktadır DBIx::MyParsePP denilen saf Perl projesi var.

Tam ve doğru SQL ayrıştırma zordur. Ücretsiz bir SQL 'dilbilgisi' ile birlikte Antlr gibi ayrıştırıcı jeneratör araç kullanmak olabilir. Maliyet için Visual Studio Team System 2008 Database Edition, bir SQL çözümleyici içerir biliyoruz.