如何根据搜索选择特定术语?

时间:2019-04-09 18:31:39

标签: php sql

因此,我希望用户能够通过关键字或ID号进行搜索。例如,如果他们现在搜索“ test”,它将提取所有带有test的条目,这是我希望它对搜索的关键字部分执行的操作。但是,我还希望用户能够搜索我特定的特定ID#并仅提取该特定条目。我不确定该怎么做。我尝试执行某种OR语句,但未提取任何条目。

搜索框形式

        <div class ="search" id="browse">
                <p> Find your appointment below or search by keyword</p>

                <form id="" class="searchbar" action="searchAppt.php" method="get">
                    <input type="text" name="terms" size="40" class = "sbar" placeholder="Search by issue keyword or ID" oninput="validity.valid||(value='');"
                           onblur="if (this.value == '') {
                                       this.value = 'Enter keyword or ID';
                                   }"
                           onfocus="if (this.value == 'Enter keyword or ID') {
                                       this.value = '';
                                   }"/>&nbsp;&nbsp;
                    <button type="submit" class = "btn">Search</button>
                </form>
            </div>

searchAppt.php

if (filter_has_var(INPUT_GET, "terms")) {
    $terms_str = filter_input(INPUT_GET, 'terms', FILTER_SANITIZE_STRING);
} else {
    echo "There were no appointments found.";
    include ('includes/footer.php');
    exit;
}
            //explode the search terms into an array
            $terms = explode(" ", $terms_str);


            $sql = "SELECT * FROM appointments WHERE 1";
            foreach ($terms as $term) {
                $sql .= " AND email = '". $_SESSION['email'] ."'  AND issue LIKE '%$term%'  OR id ='%term%'
                ";
            }

            $result = $conn->query($sql);

            if ($result->num_rows > 0) {
                echo "<br /><br /><center><h1>My Ticket(s)</h1><br />
                <div class='table'>
                <div class='tr'>
                <div class='td'><b>Ticket #</b></div>
                <div class='td'><b>Issue</b></div>
                <div class='td'><b>Date</b></div>
                <div class='td'><b>Ticket Details</b></div>
                </div>";
                // output data of each row
                while($row = $result->fetch_assoc()) {
                   $starttimepast = strtotime($row["start_time"]); //converts date time received from MySQL into a string
                    $datepast = date("m/d/y", $starttimepast);
                    echo "<div class='tr'>
                    <div class='td'>".$row["id"]."</div>
                    <div class='td'>".$row["issue"]."</div>
                    <div class='td'>".$datepast."</div>
                    <div class='td'><form action='ticketdetails.php' method='post'>
                        <input type='hidden' name='id' value='".$row["id"]."'>
                        <input type='submit' value='Ticket Details'></form>
                    </div>
                    </div>";
                }
                echo "</div>";
                 echo "<br /><center><a href='myProfile.php'><h4>Go back to my profile</h4></a></center>";
                  include ('includes/footer.php');
            } else {
                echo "<br /> <br /><center><h3>Your search <i>'$terms_str'</i> did not match any appointments</h3></center>";
                echo "<center><a href='myProfile.php'><h4>Go back to my profile</h4></a></center>";
                echo "<br />";
                exit;
            }

        ?>
<?php
// clean up resultsets when we're done with them!
$query->close();

// close the connection.
$conn->close();

1 个答案:

答案 0 :(得分:0)

也许可以明确地对术语进行分组:

  $sql = "SELECT * FROM appointments WHERE email = '" . S_SESSION['email'] . "'";
  $exprs = array();

  foreach ($terms as $term) {
      $exprs[] = "(issue LIKE '%$term%' OR id LIKE '%$term%')";
  }

  if (!empty($exprs)) {
      $sql .= ' AND (' . join(' OR ', $exprs) . ')';
  }

在这种情况下,结果将包含与任何术语匹配的记录。

注意:最好使用laravel / PDO / mysqli之类的DB API简化查询的构建并正确地转义值。