2017-12-29 8 views
-1

Ich versuche in einer Datenbank mit mehreren Suchparametern zu suchen. Allerdings bekomme ich immer die ganze Tabelle als Ausgabe. Der Benutzer soll ein oder mehrere Felder in einem HTML-Formular ausfüllen. Nachdem das Formular abgeschickt wurde, sollten nur Einträge angezeigt werden, die den Benutzerparametern entsprechen. Es hat gut funktioniert, als ich nur einen Parameter hatte.PDO Datenbanksuche mit mehreren Parametern

Dies ist mein Code:

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

Sie nicht lesen das Handbuch korrekt auf vorbereitete Anweisungen –

+1

Sollte Ihr nicht '$ sein sql' referenziert bindet wie ': lastName' anstelle der Variable' $ lastName'? Warum sonst mit einer vorbereiteten Aussage belästigen? Auch ... warum deklarieren Sie Variablen wie '$ lastName' nach Ihrer' SELECT' Anweisung, wo sie zuerst verwendet werden? –

+0

nächste Zeit, RTM http://php.net/manual/en/pdo.prepared-statements.php –

Antwort

0

Sie sind nicht Parameter in der Abfrage verwenden, werden Sie String-Verkettung verwenden. Schlimmer noch, Sie verketten Variablen, die noch nicht existieren, also ersetzt PHP eine leere Zeichenkette. Die Abfrage, die Sie erstellen, ist im Wesentlichen:

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

Deshalb erhalten Sie die gesamte Tabelle.

Sie sollten stattdessen mit dem Namen Parameter sein, während Sie die % Zeichen auf die Werte hinzufügen sollte:

$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();