2016-02-01 152 views
0

我有一個相對較小的搜索表單,我希望人們用來搜索我的SQL數據庫。PHP從URL查詢創建MySQL查詢

我以前做過這件事的唯一方法是擁有十億嵌套if語句。有一個更好的方法嗎?

我解析我的網址查詢字符串,所以我有我說的變量:

​​

如果我只是試着去嘗試:

$sql = "SELECT * FROM $table_name WHERE "; 

if(isset($city)) { 
    $sql .= " `City` LIKE " . $city; 
} 
if(isset($bedrooms)) { 
    $sql .= " AND `Bedrooms` >= " . $bedrooms; 
} 
if(isset($elementaryschool)) { 
    $sql .= " AND `ElementarySchool` = " . $elementaryschool; 
} 

然後,我遇到一個問題,當$ city未設置,因爲我的查詢以「SELECT * FROM $ table_name WHERE和Bedrooms> = $臥室結束」

這不會正好工作。我有什麼選擇?

我完全理解如何做到這一點,如果我在我的查詢中包含所有參數,這似乎是所有以前的問題都要求。但是,如果不是所有字段都有價值,我該如何做到這一點?我總共有12個可能的字段用於搜索,他們可以只搜索1或全部搜索到12個。

正如我之前提到的,所有我已經能夠找到的問題都提到了一個問題靜態SQL查詢,而不是具有不同數量參數的查詢。

+2

同意這個問題不是重複的(至少是引號/蜱鏈接),如果重新打開,我會幫助你。同時,請閱讀[PDO並準備好帶有參數的語句](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/60496#60496) 。直接在查詢字符串連接中使用用戶輸入可能會使您容易受到SQL注入攻擊 – WebChemist

回答

0

我會去的:

$sql = "SELECT * FROM $table_name"; 
$where = array(); 
$params = array(); 

然後:

if(isset($city)) { 
    $where[] = "City LIKE ?"; 
    $params[] = $city; 
} 

if(isset($bedrooms)) { 
    $where[] = "Bedrooms >= ?"; 
    $params[] = $bedrooms; 
} 

if(isset($elementaryschool)) { 
    $where[] = "ElementarySchool = ?"; 
    $params[] = $elementaryschool; 
} 

最後:

if(!empty($where)) { 
    $sql .= "WHERE " . implode(" AND ", $where); 
} 

$result = $db->prepare($sql)->execute($params); 

請注意,在這裏,因爲我不知道什麼樣的數據庫圖層/抽象,$db代表數據庫連接,prepare()用於創建準備好的語句,​​tu運行它,就像您使用PDO一樣;這也可以防止SQL注入。

+0

這很有道理,與我所操作的非常相似。我正在嘗試實施PDO,以確保安全...手指交叉。非常感謝您的投入! –