"Id IN () kullanıcıları SELECT * FROM"

6 Cevap php

Ben (), bu hazır deyimleri öykünen denilen SQLf kullanmak bir işlevi var. Örneğin ben gibi şeyler yapabilirsiniz:

$sql = sqlf("SELECT * FROM Users WHERE name= :1 AND email= :2",'Big "John"','bj@example.com') ;

Çeşitli sebeplerden dolayı, ben hazırlanmış deyimleri kullanamazsınız, ama onları taklit etmek istiyorum. Ben çalıştırmak sorun gibi sorguları ile

$sql = sqlf("SELECT * FROM Users WHERE id IN (:1)",array(1,2,3) );

Benim kod çalışır, ama boş diziler ile başarısız, örneğin Aşağıdaki bir mysql hatası atar:

SELECT * FROM Users WHERE id IN ();

Herkes herhangi bir öneriniz var mı? Nasıl tercüme ve boş dizi bir IN yan tümcesi enjekte edilebilir sql içine gerekir? Saydırma null çalışmaz.

6 Cevap

Boş size garanti edemez tek değer kümesinde değil mi. Nasıl bir seçenek yok? Başka bir şey, potansiyel kümesinin parçası olarak görülebilir, hepsi değerlerdir.

Senin hazırlamak gibi işlevi sadece değiştirir: if, böylece: eşdeğer argümanı ile 1, sizin sorgu ('1'): gibi bir şey içerebilir sahip deneyebilirsiniz 1 boş, bu ('') giderir, hangi olmayacak (- bir int ise, bu bir sorun değildir, ancak bu alan boş değerlere sahip olabilir ancak eğer bu, istenmeyen davranışa neden olabilir) bir ayrıştırma hatası neden olur. Ancak, çok temiz bir çözüm değil, ve dizi boş olup olmadığını tespit ve sadece yoksun sorgu alternatif bir sürümünü kullanarak daha iyiyiz "IN (: 1)" bileşeni. (Yani WHERE yan tümcesinde tek mantık buysa, o zaman muhtemelen her şeyi seçmek istemiyorum, bu yüzden sadece sorguyu yürütmek olmaz.)

Ben senin "id" sütunu otomatik numaralar atanan pseudokey olduğunu varsayarsak, sıfır kullanmak istiyorsunuz.

Bildiğim kadarıyla, veritabanı çoğu marka otomatik anahtar jeneratörler 1'den başlar. Bu bir kongre değil, bir gereklilik (auto-numaralı alanlar standart SQL tanımlı değildir) 'dir. Ama bu kongre muhtemelen ona güveniyor ki yeterince yaygındır.

Zero "id" sütununda muhtemelen asla bu yana, giriş dizisi boş olduğunda () yüklemi IN bu değeri kullanabilirsiniz, ve bu maç asla.

Bunu yapmak için aklınıza tek yolu, belirli bir ikame yakında geçirilen değişken boş bir dizi olup olmadığını bir "IN (" sonra, koymak sonra gelirse sizin sqlf() işlev tarama görmek yapmak olurdu Eğer kesin olarak bilmek bir şey bu sütunda olmayacak:. "m,znmzcb~~1", örneğin Emin için, bir hack ama işe olur.

Hatta daha da ileriye götürmek istiyorsa değiştirmelerin farklı türleri vardır ki, sizin işlevini değiştirebilir? İşlev bir sayıyla bir kolon için tarar gibi görünüyor. Neden boş diziler akıllı olacak bir dizi, (bu değişken bir dizi olması gerekiyordu eğer tarama ve tahmin zorunda sizi kurtarır) tarafından izlenen bir @ gibi, başka bir türü eklemek değil.

Ben bir IN için argüman olarak bir dizi boş geçirerek () yan bir hata olduğunu söyleyebilirim. Bu işlevi ararken sorgu sözdizimi üzerinde kontrole sahip, bu nedenle de girişler için sorumlu olmalıdır. Ben işlevi çağırmadan önce argüman boşluk için atmanızı öneririm.

Boş diziler Withing SQLf algılamak ve IN yan tümcesi sahip değil SQL değiştirmek olabilecek bir ihtimal var mı?

O yüzden kaldırılması gerekiyordu başka hangi unsurları görmek için hile her türlü yapmak zorunda ediyorum rağmen "IN ()" bölümleri kaldırılır böylece Alteratively, size "gerçek" SQL uygulamakla geçirmeden önce SQL postprocess olabilir:

SELECT * FROM Users WHERE id IN ();
SELECT * FROM Users WHERE a = 7 AND id IN ();
SELECT * FROM Users WHERE id IN () OR a = 9;

olacak:

SELECT * FROM Users;
SELECT * FROM Users WHERE a = 7;
SELECT * FROM Users WHERE a = 9;

Bu sizin SQL karmaşıklığına bağlı olarak zor alabilir - temelde tam bir SQL dili tercümanı gerekiyordu.