Intereting Posts

Написание запроса, содержащего переменную WHERE на основе ввода пользователем

У меня возникли проблемы с запросом. То, что я хотел бы сделать, это проверить, что каждая переменная существует, и игнорировать их, если они этого не делают. Я также хочу отображать результаты в таблице. Любая помощь будет принята с благодарностью!

Что я до сих пор: Это мой код. На данный момент он возвращает массив со всеми результатами из базы данных, но если я изменил ORs в предложении WHERE на AND, все поля должны быть заполнены. Я хочу, чтобы пользователь мог вводить как можно больше информации, чтобы показать все возможные результаты.

<?php require("common.php");?> <?php if(!empty($_POST)) { $sth = $db->prepare("SELECT * FROM customer WHERE First_name LIKE '%$First_name%' OR Surname LIKE '%$Surname%' OR DOB LIKE '$DOB' OR Street LIKE '%$Street%' OR Suburb LIKE '$Suburb' OR State LIKE '$State' OR Postcode LIKE '$Postcode' OR Phone LIKE '$Phone'"); $sth->execute(); /* Fetch all of the remaining rows in the result set */ print("Fetch all of the remaining rows in the result set:\n"); $result = $sth->fetchAll(); print_r($result); $First_name = $_POST['First_name']; $Surname = $_POST['Surname']; $DOB = $_POST['DOB']; $Street = $_POST['Street']; $Suburb = $_POST['Suburb']; $State = $_POST['State']; $Postcode = $_POST['Postcode']; $Phone = $_POST['Phone']; } ?> <fieldset><legend>Find a customer</legend> <form name="querycustomerform" method="post" action="qcustomer.php"> <table class="five"> <tr> <td colspan="4"> <h3>Please fill out as many details as possible</h3> </td> </tr> <tr> <td> <input type="text" name="First_name" maxlength="30" size="30" placeholder="First name"> </td> <td> <input type="text" name="Surname" maxlength="30" size="30" placeholder="Surname"> </td> <td style="text-align: right">Date of Birth:</td> <td> <input type="date" name="DOB"> </td> </tr> <tr> <td> <input type="text" name="Street" maxlength="40" size="30" placeholder="Street Address"> </td> <td> <input type="text" name="Suburb" maxlength="15" size="30" placeholder="Suburb"> </td> <td> <select name="State"> <option value="">State</option> <option value="ACT">Australian Capital Territory</option> <option value="NSW">New South Wales</option> <option value="NT">Northern Territory</option> <option value="QLD">Queensland</option> <option value="SA">South Australia</option> <option value="TAS">Tasmania</option> <option value="VIC">Victoria</option> <option value="WA">Western Australia</option> </select> </td> <td> <input type="text" name="Postcode" maxlength="4" size="30" placeholder="Postcode"> </td> </tr> <tr> <td> <input type="text" name="Phone" maxlength="15" size="30" placeholder="Phone Number"> </td> <td> </td> <td> </td> <td> <input class="button" type="submit" value="Search"> </td> </tr> </table> </form> </fieldset> 

Условие ИЛИ требует, чтобы любое условие (т.е. условие1, условие2, условие_n) должно быть выполнено для записи, которая должна быть включена в результирующий набор. Если условие И требует, чтобы все условия (то есть: условие1, условие2, условие_n) должно быть выполнено. Для вашего требования требуется условие ИЛИ .

Для этого вам нужно создать динамический запрос. Начните с основной заглушки

 $sql = "SELECT * FROM customer"; 

Затем вам нужно установить начальное предложение WHERE.

 $clause = " WHERE ";//Initial clause 

Вам нужен массив для хранения параметров

 $paramArray =array(); 

Начните строить запрос. Заметьте, что я изменил с POST на GET, так как он легче протестировать. Также см. PDO WIKI для использования% в placeholders.ie заполнители не могут представлять произвольную часть запроса, а только полный литерал данных.

 if(isset($_GET['First_name'])){ $First_name = $_GET['First_name']; $sql .= "$clause First_name LIKE ?"; $clause = " OR ";//Change clause array_push($paramArray,"%$First_name%"); } 

Продолжить следующее предложение

 if(isset($_GET['Surname'])){ $Surname = $_GET['Surname']; $sql .= "$clause Surname LIKE ?"; $clause = " OR "; array_push($paramArray,"%$Surname%"); } 

Добавить оставшуюся часть статей, как указано выше

Результат теста, Удалить после тестирования и изменить GET на POST

 echo $sql ; echo "<br>"; print_r($paramArray); 

Подготовьте и выполните запрос

 $sth = $db->prepare($sql); $sth->execute($paramArray); 

Типичный результат теста из test.php?First_name=dave&Surname=smith

 SELECT * FROM customer WHERE First_name LIKE ? OR Surname LIKE ? Array ( [0] => %dave% [1] => %smith% ) 

от test.php?Surname=smith

 SELECT * FROM customer WHERE Surname LIKE ? Array ( [0] => %smith% ) 

Попробуйте изменить

 $sth = $db->prepare("SELECT * FROM customer WHERE First_name LIKE '%$First_name%' OR Surname LIKE '%$Surname%' OR DOB LIKE '$DOB' OR Street LIKE '%$Street%' OR Suburb LIKE '$Suburb' OR State LIKE '$State' OR Postcode LIKE '$Postcode' OR Phone LIKE '$Phone'"); 

в

 $sth = $db->prepare("SELECT * FROM customer WHERE First_name LIKE '%'".$First_name."'%' OR ... 

Возьмите $ First_name из строки literal и соедините его с литеральной строкой. То, что вы делали, буквально искало «$ First_name», а не значение переменной $ First_Name. Это немного беспорядочно с точки зрения внешнего вида, но я счел более безопасным объединить текст с переменными, а не развернуть переменные в кавычках.

Дэррил