seçmek ...

6 Cevap php

Bu masada bakın lütfen

table
|id| |name| |order|

i name = something ve order = somevalue satırları almak gerekir

bu yüzden yazıyorum

select `id` from `table` where `name` = 'something' and `order` = 'somevalue'

ama bazen ben bağımsız order değeri name = something tüm satırları, almak gerekir, php mantığa dayanır. i uygulamada alanların çok sayıda ve sorguları olası sayısı vardır çünkü, sorgu yapısını değiştirmek istediğiniz çok büyük olacak değil. bu yüzden save sorgu yapısı, ve ben sadece adıyla seçmek gerektiğinde, ben böyle bir şey yazmak istiyorum istiyorum:

select `id` from `table` where `name` = 'something' and `order` = any value 

bu mümkün mü?

teşekkürler

6 Cevap

Evet, bu bir hack naziksiniz, ama sen gerçekten bunu yapmak gerekiyorsa, bu gibi çalışacağız:

select `id` from `table` where `name` = 'something' and `order` = `order`

"Düzen kendisi gibi aynı yerde", bu yüzden her zaman doğrudur o zaman sadece söylüyorsun.

Hayır, bu mümkün değildir. Sen yapısını değiştirmek gerekir (böylece '%' kullanabilirsiniz GİBİ isteğe bağlı, ama bu çok çirkin).

Ancak, her olası birleşimini işlemek için farklı bir sorgu yazmak gerekmez. Sadece dinamik sorgu oluşturabilirsiniz:

//create base query
$query = "select `id` from `table` where `name` = 'something' ";

//add order if we need it
if ($use_order)
  $query .= "and `order` = 'somevalue' ";

//repeat for any other optional part

Şeyleri basit tutmak için burada bu dahil değil - elbette yine SQL enjeksiyon ve diğer güvenlik sorunlarını önlemek için uygun önlemleri alması gerektiğini unutmayın.

Eğer bağlı parametreleri kullanıyorsanız, imkansız olurdu.

Sadece değerler yerine varsa, aşağıdakileri yapabilirsiniz:

select `id` from `table` where `name` = 'something' and `order` = `order`

Bu veritabanı sorgu ile ortak bir tema - Eğer bunu sorgular verilere uygulamak isteyen ne kadar filtreleme bağlı olarak değişken bir sorgu gerekir. Eğer sorgu kod boyunca bir dize olarak tekrarlanan sahip rota gidebiliriz, ama gereksiz kod karmaşıklığı arttıkça bu kötü uygulamadır. Hataları için Şansını nedense sorgusunu değiştirmek gerekir oluşabilir ve bunun sonucunda birden fazla yerde değiştirmek zorunda.

Daha iyi çözüm yürütmek için sorgu oluşturur bir işlevi oluşturmak için:

function buildMyQuery($name, $order = null) {
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'";

    if ($order != null) {
        $sql .= " AND `order`='$order'";
    }

    return $sql;
}

Daha sonra sadece 'isim' alanını kullanarak bu çalıştırabilir:

$query = buildMyQuery("somename");

Ya da her ikisi alanları kullanarak bu:

$query = buildMyQuery("somename", "someorder");

Birisi yukarıda da belirtildiği gibi, bu kod kasten basitleştirilmiş ve $ isim veya $ emri ile geçti muhtemelen tehlikeli veriler için herhangi bir imkana içerir. Veri parçası ya kullanılan önce fonksiyonunun başında, mysql_real_escape_string ya da ilk verileri temizlemek için benzer bir şey kullanmak gerekir.

Byron dediği gibi dinamik sorgu oluşturma hayatın bir gerçeği olduğunu, bu yüzden buna alışmış artık ziyade hack-imsi geçici çözümler kullanarak olur.

Ben size "unfilter" Yapamam bir seçim yapmak kere ... Eğer herhangi bir seçim olduğunu düşünüyorum ve daha fazla satır alamadım.

Iki bağımsız sorgu veya bir geçici tabloya adını seçer biri, ve sonra (isteğe bağlı) bir sipariş özniteliği daha seçer ya - Sen sadece iki sorgu kullanmanız gerekir.

Çad yukarıda söylediğim gibi, sadece kendine eşit sütun ayarlayın. ! Fakat bazı platformlarda, dikkatli ol / yapılandırmaları yüklemek, null = null:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')