2017-08-14 65 views
0

我有一個MySQL查詢將受益於通配符樣式的運算符。不幸的是,因爲我無法弄清楚如何縮小搜索關鍵字,因此互聯網搜索非常困難。我可以在WHERE子句中使用通配符運算符嗎?

我有,例如...

$my_color = "red"; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color=:color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

這個偉大的工程。但我想讓客戶有能力搜索任何顏色。是的,我可以(基本上)圍繞整個PDO塊(基本上)if-then創建多個查詢,但我希望有一個更優雅的解決方案。

MySQL是否有能力設置一個WHERE條件轉換爲「接受任何東西」?假設一個虛構的MySQL命令,ANY,我想設置我的變量的能力...

$my_color = "ANY"; 

,並得到任何顏色的所有行。

+0

'WHERE color LIKE'%%'' - '$ my_color =「%%」' – GrumpyCrouton

+0

爲什麼不只是不使用where子句,它會給你所有的東西。或者,如果您必須在where子句中輸入,則可以說1 = 1。 –

回答

1

使用LIKE而不是=。如果該值不包含任何通配符,則LIKE執行完全等效檢查。但是,您可以使用%作爲通配符來匹配任何內容。所以:

$color = '%'; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color LIKE :color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

但是,更好的選擇可能是將邏輯放在PHP而不是SQL中。

if ($color) { 
    $a = $pdo->prepare("SELECT * FROM my_table WHERE color=:color"); 
    $a->bindParam('color', $my_color); 
} else { 
    $a = $pdo->prepare("SELECT * FROM my_table"); 
} 
$a->execute(); 

參見https://stackoverflow.com/a/28909923/1491895一個更一般的技術用於從多個表單輸入動態建立的WHERE子句。

+0

我很好奇,爲什麼要處理它PHP方面是一個_better選項_? – GrumpyCrouton

2

您可以使用LIKE子句的輸入是這樣的通配符:

$my_color = "%"; 
$a = $pdo->prepare("SELECT * FROM my_table WHERE color LIKE :color"); 
$a->bindParam('color', $my_color); 
$a->execute(); 
$data = fetchAll(PDO::FETCH_ASSOC); 

More Info on the LIKE clause

相關問題