在做資料搜尋的時候,我們可能會加上許多的判斷條件,比如說像產品的話我們會依據分類、名稱、價錢... 等條件去做搜尋。
像是要依名稱搜尋在 PDO 會這樣寫:
$name="something"; $sql = "SELECT * FROM products WHERE name= ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$name]);
加入時間的判斷的話會是這樣:
$date1="2021-09-01"; $date2="2021-11-30"; $sql = "SELECT * FROM products WHERE created_at BETWEEN ? AND ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$date1, $date2]);
但搜尋的時候不一定每次都會用到所有的搜尋條件,若我們在寫的時候都像這樣判斷是否存在變數:
if(isset($_GET["name"])){ //依名稱搜尋寫這邊 }else if(isset($_GET["date1"]){ //依日期搜尋寫這邊 }
條件一多會變成很麻煩,而且我們也不能說有了 A 就不能有 B 這樣,那要做比較多條件的篩選的話,就可以利用陣列來幫我們儲存 query 的條件,之後再把陣列轉換為字串,舉例來說:
$conditions = []; $parameters = []; // conditional statements if (!empty($_GET['name'])) { // here we are using LIKE with wildcard search // use it ONLY if really need it $conditions[] = 'name LIKE ?'; $parameters[] = '%'.$_GET['name']."%"; } if (!empty($_GET['category'])) { $conditions[] = 'category = ?'; $parameters[] = $_GET['category']; } if (!empty($_GET['date_start']) && $_GET['date_end']) { // BETWEEN $conditions[] = 'created_at BETWEEN ? AND ?'; $parameters[] = $_GET['date_start']; $parameters[] = $_GET['date_end']; } // the main query $sql = "SELECT * FROM products"; // 把條件組合成 query 語法 if ($conditions) { $sql .= " WHERE ".implode(" AND ", $conditions); } // the usual prepare/execute/fetch routine $stmt = $pdo->prepare($sql); //丟入參數 $stmt->execute($parameters); $data = $stmt->fetchAll();
這樣就能應付比較複雜的條件,而且是比較有彈性的寫法了。