2017-08-30 3 views
0

PHPとPDOを使用してCRUDアプリケーションを構築しています。ユーザー入力の最初の文字に基づいてPDOクエリを返します。

私は様々な食べ物を持つテーブルを持っており、ユーザー入力の最初の文字に基づいて結果を返したいと考えています。 「a 'で始まるすべての食品を返す」のように。これは明らかに動作し、Aで始まるすべての食品を返し

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

私はこのクエリを持っています。

しかし、すべてのアルファベット文字に上記を書くのではなく、ユーザーの入力に基づいてどのようにクエリを実行できますか。

私はアプリケーション全体を投稿できません。私はlocalhost上にありますが、これは必要ではないと思います。これを実装する最も効率的な方法は何ですか? 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の例である:ここで私はパラメータの配列を実行している(あなたが1以上のものを持っている場合)

$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

最初のユーザーのchar入力だけでなく、連続したすべての入力を認識する方法はありますか?申し訳ありませんが、これは愚かな質問のように聞こえる場合は、私はすべての新しい(最初のDBプロジェクトまで)SQLにしても、 "正規表現"が全く異なることを実現。 JSでこれを行う方法は私にはっきりと分かっていますが、私はちょうど専門家がこのことについてどのように進むのか、DBO/SQLに疑問を抱いています。これらの非常に貴重な初期レッスンをありがとう。 – ptts

関連する問題