2017-08-30 71 views
0

我正在使用PHP和PDO構建CRUD應用程序。根據用戶輸入的第一個字符返回PDO查詢

我有一個表與各種食物,並希望返回基於用戶輸入的第一個字母的結果。就像「迴歸所有以'a'開頭的食物」一樣。

我有這個疑問:

$sql = "SELECT * 
        FROM food 
        WHERE FoodName LIKE 'a%'; 
    $userInput = $_POST['userInput']; 

這顯然工作並返回所有的食物開始的一個。

但是,如何根據用戶輸入查詢,而不是爲每個字母的字母寫上述內容。

我不能發佈整個應用程序,我把它放在本地主機上,但我不認爲這是必要的。什麼是最有效的方式來實現這一點? JS,PHP或PDO命令?

+0

這可能會幫助你[https://stackoverflow.com/questions/1457131/php-pdo-prepared-statements](https://stackoverflow.com/questions/1457131/php-pdo-prepared-statements) – vher2

+0

您的查詢似乎缺少結束雙引號;那是一個糟糕的粘貼? –

+0

@ Fred-ii-,它只是不是整個函數,只是try/catch位的一部分,爲了簡潔起見。 – ptts

回答

4

基於你有什麼有一個表單提交用戶輸入導致一個變量$_POST數組中:

$_POST['userInput'] 

爲了使用,在查詢你只是有更換搜索詞發佈的變量。下面是一個使用準備的語句,以防止潛在的SQL注入攻擊在PDO一個例子:

$sql = $conn->prepare("SELECT * FROM `food` WHERE `FoodName` LIKE :user_input"); // $conn being the database connection 
$parameters = array(':user_input' => $_POST['userInput'] . '%'); // note that I have concatenated the wildcard here 
$sql->execute($parameters); 
$results = $sql->fetchAll(PDO::FETCH_ASSOC); // fetch everything into an associative array 

在這裏,我已經執行的參數的陣列,每個參數單獨地使用bindParam()還可以結合(如果有一個以上的)

+1

非常感謝你,所以這個通配符是需要的,需要像這樣連接起來嗎?神奇的東西。 – ptts

+0

這是正確的*如果你期望查詢的第一個字母*。如果你希望你的''LIKE'包含一個通配符,應該連接到變量的from。 –

+0

是否有一種方法可以識別第一個用戶字符輸入,但是每個字符都是連續的?對不起,如果這聽起來像一個愚蠢的問題,我都是新的(有史以來的第一個數據庫項目),並認識到即使「正則表達式」是完全不同的。在JS中這樣做的方式對我來說很清楚,我只是想知道專家如何繼續討論這個問題就是DBO/SQL。感謝這些非常有價值的初步教訓。 – ptts