2016-11-10 4 views
0

PHP 7とMySQLデータベースへのPDO接続を使用してアプリケーションを構築しています。PHP配列からのPDO検索クエリの作成

アプリケーションの一部には、ユーザーがコースのカテゴリ、コース名、および日付の3つの異なるフィールドでトレーニングコースを検索できる検索フォームが含まれています。

フォーム上の要素の種類は次のとおりです。

  1. コースカテゴリ - ドロップダウン、(int型)のIDの数値を持ちます。
  2. コース名 - テキスト入力
  3. 日付ピッカー(HTML 5 type="date"パラメータを使用してブラウザでカレンダーを取得)。

これらのフィールドは、一緒に使用することも、単独で使用することもできます。これは、例えば、(1)、(2 & 3)、またはall(1 3)だけで検索できることを意味します。

私はPOSTデータを取得するためにPHPを書いてきたし、それが配列で、今だ - 例えば:

$search_data = [ 
    'category' => 3, 
    'name' => 'Hazard training', 
    'date' => '' 
] 

私は、PDOクエリ内にこれを使用したいが、私は何を最もよく知っていません(1)と(3)は=のクエリ条件になりますが、(2)はLIKEであるためです。私のソリューションは、検索用語をループして、次にクエリを構築しようとしていました。

$sql = ' WHERE '; 
foreach ($search_data as $key => $value) { 
    if ($key == 'category') { 
     $sql .= ' category = ' . $value; 
    } 
    if ($key == 'course_name') { 
     $sql .= ' course_name LIKE % ' . $value ' % '; 
    } 
    if ($key == 'date') { 
     $sql .= ' date = ' . $value; 
    } 
} 

この問題は、PDOでパラメータをバインドする必要があるために問題になります。また、各クエリの間にANDを取得する方法が見つからないため(先行する文がある場合)は機能しません。

私はこれで迷っています。これを書くにはどうすればよいかわかりません。

ご協力いただければ幸いです。

編集:私はその名前をハードコードすることを認識しています。 ($key == 'course_name')は理想的ではありませんが、これは異なるクエリ条件(LIKE=)のためにのみ実行されています。私は1つが$search_data多次元のクエリの種類を言うことができると仮定しますが、これは私の最初の問題とおそらく別の投稿を超えています。

答えて

3

Here`sあなたの問題に簡単な解決策:

$sql = 'SELECT ..... FROM ... WHERE 1 '; 
$where = ''; 
$pdoData = []; 

foreach ($search_data as $key => $value) { 
    if(!$value) continue; // skip empty values 

    if ($key === 'category') { 
     $pdoData[':category'] = $value; 
     $where .= ' AND category = :category '; 
    } 
    if ($key === 'course_name') { 
     $pdoData[':course_name'] = '%'.$value.'%'; 
     $where .= ' AND course_name LIKE (:course_name) '; 
    } 
    if ($key === 'date') { 
     $pdoData[':date'] = $value; 
     $where .= ' AND date = :date '; 
    } 
} 

$sql = $sql.$where; 

$stmt = $this->ci->db->prepare($sql); 
$stmt->execute($pdoData); 
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 

そして、あなたがバインドさデータを保持$pdoDate配列を持っています。

+1

私は「WHERE 1」が好きで、簡単に作れます。 – Veve

+1

私は 'course_name'部分を' $ pdoData [':course_name'] = '%'に変更しました。 $値。 '%'; 'LIKE%:course_name% 'が意図したとおりに動作するとは思わない... –

+1

($ key ===' category '&&!empty($ value)) – JYoThI