Форма поиска с одним или несколькими (несколькими) параметрами

Я получил основы, где я создал два файла, форму поиска, где пользователь вводит параметры поиска, и файл результатов, который перехватывает введенные элементы. Для простоты мы будем обозначать файл формы поиска как search.php, а страницу результатов – results.php.

РЕДАКТИРОВАТЬ: Убрана этикетка таблиц для более плавного чтения.

search.php

<?php if(!empty($_POST['id']) && isset($_POST['id'])) { header("Location: ?m=search.results&id=".$_POST['id'].""); } elseif(!empty($_POST['major']) && isset($_POST['major'])) { header("Location: ?m=search.results&major=".$_POST['major'].""); } elseif(!empty($_POST['college']) && isset($_POST['major'])) { header("Location: ?m=search.results&college=".$_POST['college'].""); } elseif (!empty($_POST['name']) && isset($_POST['name'])) { header("Location: ?m=search.results&name=".$_POST['name'].""); } elseif (!empty($_POST['id']) && !empty($_POST['college']) && !empty($_POST['major']) && isset($_POST['submit']) && !empty($_POST['name'])) { echo "<div class='alert alert-danger'>No students found. Please try different parameters.</div>"; } ?> <h4>Search</h4> <form method="POST"> <table width="100%"> <tr><td>ID:</td><td> <input type="text" name="id" class="form-control"></textarea></td></tr> <tr><td>Name:</td><td> <input type="text" name="name" class="form-control"></textarea></td></tr> <tr><td>Major:</td><td><select name="major" class="form-control"><option></option><?php echo majorSelect(); ?></select></td></tr> <tr><td>College:</td><td><select name="college" class="form-control"><option></option><?php echo collegeSelect(); ?></select></td></tr> <tr><td colspan="2"><input type="submit" name="submit" value="Search" class="btn btn-lrg btn-primary" style="margin-top:10px;"></td></tr> </table> </form> 

results.php

  <?php if(isset($_GET['id'])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.uid = '".$_GET['id']."'"); while($student = $students->fetch()) { echo ' <tr> <td>'.$student['uid'].'</td> <td>'.$student['name'].'</td> <td>'.$student['major'].'</td> <td>'.$student['college'].'</td> <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td> </tr>'; } } elseif(isset($_GET['major'])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.major = '".$_GET['major']."'"); while($student = $students->fetch()) { echo ' <tr> <td>'.$student['uid'].'</td> <td>'.$student['name'].'</td> <td>'.$student['major'].'</td> <td>'.$student['college'].'</td> <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td> </tr>'; } } elseif(isset($_GET['college'])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.college = '".$_GET['college']."'"); while($student = $students->fetch()) { echo ' <tr> <td>'.$student['uid'].'</td> <td>'.$student['name'].'</td> <td>'.$student['major'].'</td> <td>'.$student['college'].'</td> <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td> </tr>'; } } elseif(isset($_GET['name'])){ $name = $_GET['name']; $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND b.name LIKE '%". $name . "%'"); while($student = $students->fetch()) { echo ' <tr> <td>'.$student['uid'].'</td> <td>'.$student['name'].'</td> <td>'.$student['major'].'</td> <td>'.$student['college'].'</td> <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td> </tr>'; } } ?> 

Поэтому, по сути, я хотел бы переписать вышеупомянутое, в то время как пользователь может ввести один или несколько параметров и вернуть желаемый результат (например, имя и колледж – & name = x & college = y ИЛИ все элементы, если необходимо). Я думаю, мне нужно переосмыслить логику в обоих файлах, но я открыт для любых идей или предложений, которые могут иметь это замечательное сообщество! Любые советы / рекомендации будут очень признательны.

Стройте WHERE динамически. Мой рекомендуемый подход заключается в том, чтобы подталкивать каждое условие к массиву, а затем использовать implode() чтобы объединить все условия, связав их с AND или OR как вы предпочитаете.

 $wheres = array(); $params = array(); if (!empty($_GET['id'])) { $wheres[] = 'a.uid = :uid'; $params[':uid'] = $_GET['id']; } if (!empty($_GET['major'])) { $wheres[] = 'a.major = :major'; $params[':major'] = $_GET['major']; } if (!empty($_GET['name'])) { $wheres[] = 'b.name LIKE :name'; $params[':name'] = '%'.$_GET['name'].'%'; } // And so on for all parameters $sql = "SELECT * FROM user_details AS a JOIN user AS b ON a.uid = b.id"; if (!empty($wheres)) { $sql .= " WHERE " . implode(' AND ', $wheres); } $stmt = $db->prepare($sql); $stmt->execute($params); 

Затем отобразите результаты, как в исходном коде.

 while ($student = $stmt->fetch()) { ... } 

Если вы не собираетесь что-либо менять в базе данных – вы просто выбираете – продолжайте использовать GET вместо POST. Преимущество этого заключается в том, что он позволит вам сохранить URL в качестве строки поиска. Вы также можете обновить поиск, не получая сообщение о повторной отправке сообщения. Вы просто хотите убедиться, что вы параметризуете свои значения перед отправкой их в базу данных. Обычно я отправляю эти значения через санитирование функций, таких как регулярное выражение, которое гарантирует, что у вас будут буквы только в том случае, если вы ожидаете буквы или цифры, если вы ожидали числа.

На той же странице (весь поиск): (Я просто собираюсь описать это для вас.)

 <form action="<?= $_SERVER["REQUEST_URI"]; ?>" method="GET"> <input name="major" value="<?= $_GET["major"]; ?>" /> <select name="college"> <option value="1" <?PHP if( $_GET["college"] == 1 ) echo 'selected="true"'; ?>>Business</option> </select> </form> <?PHP if( ! empty( $_GET ) ){ if (isset($_GET['major'])) { $wheres[] = 'a.major = :major'; $params[':major'] = $_GET['major']; } if (isset($_GET['name'])) { $wheres[] = 'b.name LIKE :name'; $params[':name'] = '%'.$_GET['name'].'%'; } // And so on for all parameters $sql = "SELECT * FROM user_details AS a JOIN user AS b ON a.uid = b.id"; if (!empty($wheres)) { $sql .= " WHERE " . implode(' AND ', $wheres); } $stmt = $db->prepare($sql); $stmt->execute($params); } ?> 

Теперь вы можете отображать свои данные.

edit: Я написал вторую половину ответа, а затем он написал вторую половину, поэтому я просто включил его …

Кроме того, следующий уровень сложности в этом заключается в том, чтобы вывести PHP из файла поиска и поместить его в другой файл. Когда вы нажимаете кнопку поиска в своей форме, вы должны использовать AJAX для вызова элементов PHP. Затем файл PHP вернет результаты через Ajax. Вы можете вернуть либо предварительно отформатированный HTML, либо JSON, и пусть что-то вроде JQuery отобразит его для вас.