O WHERE 1 = 1 kullanarak bir SQL sorgusu oluşturmak için kötü bir uygulama mı VE

7 Cevap php

Ben dizesinin ve gerektiği gibi WHERE maddesi koşulları ekleyerek bir SQL sorgusu oluşturur bir PHP komut dosyası yazıyorum.

O WHERE 1=1 ilk koşulu memnun olduğunu ve komut sadece sorguya AND x = 'y' bitiştirmek böylece, ya da kontrol etmek için ekstra kod yazmak gerekir kullanmak daha pratik olurdu a fıkra eklenmiş ve değilse, AND eklemek olmuştur?

İlk çözüm komut temiz kod sağlar ama sadece bana yanlış geliyor.

Soru, kafa karıştırıcı biliyorum. Ben daha net olmak gerekirse haberim olsun.

Soymak

7 Cevap

Eğer ihtiyacınız hangilerinin belirlemek gibi koşulların bir dizi oluşturmak. Eğer dizi boş olup olmadığını kontrol, sorgu oluşturmak için hazır olduğunuzda boş değilse ... sonra yazdırın elemanları tarafından takip "NEREDE" ile birlikte katıldı "VE" nin.

edit

PHP kullanarak konum beri, bazı kod örneği vereyim:

<?php
    $conditions = array();
    if($foo == "bar") {
        $conditions[] = "some_table.foo = 'bar'";
    }
    if($show_future) {
        $conditions[] = "some_table.entry_date > NOW()";
    }
    $sql_where = count($conditions) ? "WHERE " . implode(" AND ", $conditions) : "";
    $sql = "SELECT * FROM some_table $sql_where;";
?>

Hayır, SQL iyimserlik sadece uzakta 1=1 atmak ve yolunda olacak.

PHP kullanarak konum beri, Ty W 'cevabı genişletmek için:

$clauses = array();

// Optionally add one or more clauses to the array like this:
$clauses[] = "test = 2";

// Now generate the WHERE clause:
$sql = 'SELECT * FROM Table ';
$sql .= count($clauses) ? ('WHERE ' . implode(' AND ', $clauses)) : '';

Bir yere açıkladı eğer ben, SQL sorguları bir 1=1 göremeyecek rahatsız olmaz.

Ben Python yapıyor olsaydı söyledi, muhtemelen böyle bir şey yapmak istiyorum:

query = (where_clauses or ["1=1"]).join(" AND ")

"Gerçek" sorguları garip 1=1 gerek olmazdı ki.

Aslında bir performans sorunu vurmak kadar Genel olarak, ben, tüm performans dert olmaz.

O dedi, bir şey gibi 1=1 şaşırtıcı performans sonuçları olabilir. Sürpriz beni yakaladı bir örnek için, bkz: this question. Ama sonra tekrar, prefixing 1=1 sorgu daha hızlı yapacak durumlar da vardır! Bilge programcı ölçümüne dayalı hale getirir. Bu değişim performansını nasıl etkileyeceğini tahmin etmek imkansız.

1 = 1 şey hoş olmasa da, kod yaratıcılar genellikle hoş değil şeyler. Bu tutulan veya (geliştirici bina ve jeneratör hata ayıklama dışında) herkes tarafından anlaşılması gerekir kod değilse, o zaman ben çirkinlik konularda inanmıyorum.

PHP bunun için güzel bir fonksiyona sahiptir: implode. (Http://www.php.net/manual/en/function.implode.php)

Aşağıdaki gibi kullanabilirsiniz:

$rawConditions = array("x='y'", "z='a'");
$conditions = "WHERE ".implode(" AND ", $rawConditions);
// $conditions == "WHERE x='y' AND z='a'"