简体   繁体   中英

PHP PDO Display message if no results are found in search

I am trying to set an 'No Results Found' message when no search results are found after executing a MySQL 'LIKE' Query

I have the following code below:
I have an if statement just to test to see if an error message will work but I seem to get the output of the else statement 'found'

    <table class="center">          <!-- Creating a table with the class of 'center' -->
<!-- SEARCH FORM -->    
<?php 

    $KEYWORD = $_POST['keyword'];
    $stmt = $conn->prepare("SELECT DISTINCT dog_park_name FROM dog_park.items WHERE dog_park_name LIKE '%{$KEYWORD}%'");
    $stmt->execute();
    for($i=0; $row = $stmt->fetch(); ){ 
        $_SESSION["KEYWORD".$i] = $row[0];  


if(empty($stmt))
{
    echo 'Nothing found';
}
else
{
echo 'found';
}



?>
<!-- DISPLAY RESULTS -->
    <tr>            <!-- Adding the first table row -->
        <th>Dog Park</th>   <!-- Adding the second table header -->
    </tr>
    <tr>            <!-- Adding the second table row -->
        <td><a href="individual_item_page.php?keyword='<?php echo $row[$i] ?>' " ><?php echo $row[$i] ?></a></td>        <!-- Add the second cell on the second row -->
    </tr>
        <?php } ?>

</table>

Example:
If a user searches a keyword, and no results are found from that keyword, I am trying to get a message saying 'No Results found'

Your if structure should show 'found' because your query executed successfully, in this cases you can count rows for decide about this issue:

if($stmt->rowCount() == 0)
{
     echo 'Nothing found';
}
else
{
     echo 'found';
}

To make a Mike Brant's answer a proper one:

$stmt = $conn->prepare("SELECT DISTINCT dog_park_name FROM items WHERE dog_park_name LIKE ?");
$stmt->execute(array("%".$_POST['keyword']."%"));
$_SESSION['KEYWORD'] = $stmt->fetchAll(PDO::FETCH_COLUMN);

if($_SESSION['KEYWORD']) {
?>
<table>
  <tr><th>Dog Park</th></tr>
 <?php foreach($_SESSION['KEYWORD'] as $word):?>
    <tr><td><?php echo $word?></td></tr>
 <?php endforeach?>
</table><?php
} else {
    echo 'Nothing found';
}

So in other words, you always have the query results to tell whether you have any results.

I am not going to get into the SQL injection problem you have with your current code. You need to fix it, likely using parameters with your prepared statement, but that is another topic.

I would also say your KEYWORD.$i approach is an antipattern. Why not just have numerically-indexed array under $_SESSION['KEYWORD'] ?

$_SESSION['KEYWORD'] = array();
$stmt = $conn->prepare("SELECT DISTINCT dog_park_name FROM dog_park.items WHERE dog_park_name LIKE '%{$KEYWORD}%'");
if($stmt) {
    $result = $stmt->execute();
    if($result) {
        while($row= $stmy->fetch() {
            $_SESSION['KEYWORD'][] = $row[0];
        }
    }
}  
if(count($_SESSION['KEYWORD']) === 0) {
    echo 'Nothing found';
} else {
    echo 'found';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM