2017-12-29 29 views
-1

複数の検索パラメータを使用してデータベースを検索しようとしています。しかし、私は常にテーブル全体を出力として取得します。ユーザーは、HTMLフォームの1つ以上のフィールドに情報を入力する必要があります。フォームが送信された後、ユーザーのパラメータに一致するエントリのみが表示されます。私は1つのパラメータしか持っていなかったのでうまくいきました。複数のパラメータを使用したPDOデータベース検索

これは私のコードです:

if (isset($_POST['submit'])) 
{ 
    try 
    { 
     require "../config.php"; 
     require "../common.php"; 

     $connection = new PDO($dsn, $username, $password, $options); 

     $sql = "SELECT * 
       FROM medisGO_patient 
       WHERE lastName LIKE '%" . $lastName . "%' 
       AND firstName LIKE '%" . $firstName . "%' 
       AND birthday LIKE '%" . $birthday . "%' 
       AND course LIKE '%" . $course . "%' 
       AND id LIKE '%" . $no . "%'"; 

     $lastName = trim($_POST['lastName']); 
     $firstName = trim($_POST['firstName']); 
     $course = trim($_POST['course']); 
     $birthday = trim($_POST['birthday']); 
     $no = trim($_POST['no']); 

     $statement = $connection->prepare($sql); 
     $statement->bindParam(':lastName', $lastName, PDO::PARAM_STR); 
     $statement->bindParam(':firstName', $firstName, PDO::PARAM_STR); 
     $statement->bindParam(':birthday', $birthday, PDO::PARAM_STR); 
     $statement->bindParam(':course', $course, PDO::PARAM_STR); 
     $statement->bindParam(':id', $no, PDO::PARAM_STR); 
     $statement->execute(); 
     $result = $statement->fetchAll(); 

    } 
    catch(PDOException $error) 
    { 
     echo $sql . "<br>" . $error->getMessage(); 
    } 
} 
+0

あなたは –

+1

があなたの '$のsql'はすべきではないプリペアドステートメントに正しく説明書を読んでいません変数 '$ lastName'の代わりに':lastName'のようなバインドを参照していますか?さもなければ、なぜ準備された声明で気にしますかまた、なぜあなたは '$ lastName'のような変数を最初に使われた' SELECT'ステートメントの後に宣言していますか? –

+0

次回、RTM http://php.net/manual/en/pdo.prepared-statements.php –

答えて

0

あなたは文字列の連結を使用している、あなたのクエリでパラメータを使用していません。さらに悪いことに、まだ存在しない変数を連結しているので、PHPは空の文字列を置き換えます。基本的には、作成するクエリは次のとおりです。

SELECT * 
FROM medisGO_patient 
WHERE lastName LIKE '%%' 
AND firstName LIKE '%%' 
AND birthday LIKE '%%' 
AND course LIKE '%%' 
AND id LIKE '%%' 

だからこそ、テーブル全体が得られます。

あなたが値に%兆候を追加する必要がありながら、あなたは、代わりに名前付きパラメータを使用する必要があります:

$sql = "SELECT * 
     FROM medisGO_patient 
     WHERE lastName LIKE :lastName 
     AND firstName LIKE :firstName 
     AND birthday LIKE :birthday 
     AND course LIKE :course 
     AND id LIKE :id"; 

$lastName = '%' . trim($_POST['lastName']) . '%'; 
$firstName = '%' . trim($_POST['firstName']) . '%'; 
$course = '%' . trim($_POST['course']) . '%'; 
$birthday = '%' . trim($_POST['birthday']) . '%'; 
$no = '%' . trim($_POST['no']) . '%'; 

$statement = $connection->prepare($sql); 
$statement->bindParam(':lastName', $lastName, PDO::PARAM_STR); 
$statement->bindParam(':firstName', $firstName, PDO::PARAM_STR); 
$statement->bindParam(':birthday', $birthday, PDO::PARAM_STR); 
$statement->bindParam(':course', $course, PDO::PARAM_STR); 
$statement->bindParam(':id', $no, PDO::PARAM_STR); 
$statement->execute(); 
関連する問題