2015-03-07 3 views
1

У меня есть основы, где я создал два файла, форму поиска, в которой пользователь вводит параметры поиска, и файл результатов, который перехватывает введенные элементы. Для простоты мы будем обозначать файл формы поиска как 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 ИЛИ все элементы, если необходимо). Я думаю, мне нужно переосмыслить логику в обоих файлах, но я открыт для любых идей или предложений, которые могут иметь это замечательное сообщество! Любые советы/рекомендации будут очень признательны.

+0

Можете ли вы переформатировать свой код? Чрезвычайно трудно читать, когда у вас есть странный отступ + php открывать и закрывать теги, помещенные, по-видимому, случайным образом. – Tivie

+0

Используете ли вы PDO или MySQLI? – Barmar

+0

@tivie Очищенный код и этикетка таблиц. См. Правки. – jayburg

ответ

6

Строить позицию 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()) { 
    ... 
} 
+0

Спасибо за помощь. См. Мой комментарий к его сообщению ниже. Кажется, я почти здесь, но что-то не так? – jayburg

1

Если вы не собираетесь ничего менять в базе данных - вы просто выбор - идти вперед и использовать 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); 
} 
?> 

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

редактировать: Я написал другую половину ответа, а затем он написал 2-й половины, так что я просто включил его ...

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

+0

Запрос генерируется динамически. Потрясающие.Возможно, я делаю что-то неправильно, потому что print_r дает мне: объект PDOStatement ([queryString] => SELECT * FROM 'user_details' JOIN' user' b ON a.uid = b.id WHERE a.major =: major) .. но, похоже, это ничего не приносит. – jayburg

+1

У вас есть цикл 'while ($ student = $ stmt-> fetch())'? – Barmar

+0

Я понятия не имею, что я делаю неправильно, но теперь он работает @Barmar. Еще раз спасибо за вашу помощь, сэр. – jayburg

Смежные вопросы