Php 从数据库中搜索时如何避免第一个结果为空
我有搜索网页,但当搜索运行时,第一个结果是空白的Php 从数据库中搜索时如何避免第一个结果为空,php,html,mysql,Php,Html,Mysql,我有搜索网页,但当搜索运行时,第一个结果是空白的 <?php include "headnav.php"; $count = 0; $sql = "SELECT * FROM lost_property"; if (!empty($_POST)) { $name = mysqli_real_escape_string($dbconnect, htmlspecialchars($_POST['name'])); $item = mys
<?php include "headnav.php";
$count = 0;
$sql = "SELECT * FROM lost_property";
if (!empty($_POST)) {
$name = mysqli_real_escape_string($dbconnect, htmlspecialchars($_POST['name']));
$item = mysqli_real_escape_string($dbconnect, htmlspecialchars($_POST['item']));
$area = mysqli_real_escape_string($dbconnect, htmlspecialchars($_POST['area']));
$sql = "
SELECT *
FROM lost_property
JOIN item
ON lost_property.itemID = item.itemID
JOIN area
ON lost_property.areaID = area.areaID
WHERE name LIKE '%$name%'
AND item LIKE '%$item%'
AND area LIKE '%$area%'
ORDER
BY lost_property.name ASC
";
$search_query = mysqli_query($dbconnect, $sql);
$count = mysqli_num_rows($search_query);
}
$result = $dbconnect->query($sql);
?>
<body>
<div class="form">
<h1>Search for lost property here:</h1>
<form action="" method="POST">
Name:
<input type="text" placeholder="Name" name="name">
Item type:
<select name="item" class="dropdown">
<option value="" disabled selected>Item</option>
<?php
$item_sql = "SELECT DISTINCT item FROM `lost_property`
JOIN item ON (lost_property.itemID = item.itemID)
ORDER BY item ASC
";
$item_query = mysqli_query($dbconnect, $item_sql);
$item_rs = mysqli_fetch_assoc($item_query);
do {
?>
<option value="<?php echo $item_rs['item']; ?>"><?php echo $item_rs['item']; ?></option>
<?php
} while ($item_rs = mysqli_fetch_assoc($item_query));
?>
</select>
Area (where it was found):
<select name="area" class="dropdown">
<option value="" disabled selected>Area</option>
<?php
$area_sql = "SELECT DISTINCT area FROM `lost_property`
JOIN area ON (lost_property.areaID = area.areaID)
ORDER BY area ASC
";
$area_query = mysqli_query($dbconnect, $area_sql);
$area_rs = mysqli_fetch_assoc($area_query);
do {
?>
<option value="<?php echo $area_rs['area']; ?>"><?php echo $area_rs['area']; ?></option>
<?php
} while ($area_rs = mysqli_fetch_assoc($area_query));
?>
</select>
<input type="submit" value="Search" name="btn">
</form>
</div>
<div class="gallery">
<h2>Search results:</h2>
<?php
//check for results. If there are none display error
if ($count < 1) {
?>
<div class="error">
<h1>No results were found.</h1>
</div>
<?php
} //end if
else {
do {
?>
<!-- display image and information from database and show in gallery -->
<div class="results">
<h3><?php echo $search_rs['name']; ?></h3>
<h3><?php echo $search_rs['item']; ?></h3>
<p><?php echo $search_rs['area']; ?></p>
</div>
<?php
} // end of do
while ($search_rs = mysqli_fetch_assoc($search_query));
} //end else
//if there are any display
?>
</div>
</table>
</body>
</html>
区域(发现地点):
地区
搜索结果:
未发现任何结果。
没有CSS很难看到,但是无论搜索什么,总是有一个结果,但是h3和p字段没有任何内容。如果没有“无结果”错误消息,它也会在那里弹出。是什么导致了第一个结果?使用while(){}
,如果使用do,它将首先运行一次(归功于Magnus Eriksson)
结果就像
else {
while ($search_rs = mysqli_fetch_assoc($search_query)) {
?>
<!-- display image and information from database and show in gallery -->
<div class="results">
<h3><?php echo $search_rs['name']; ?></h3>
<h3><?php echo $search_rs['item']; ?></h3>
<p><?php echo $search_rs['area']; ?></p>
</div>
<?php
} // end of do
} //end else
//if there are any display
?>
else{
while($search\u rs=mysqli\u fetch\u assoc($search\u query)){
?>
而不是
else {
do {
?>
<!-- display image and information from database and show in gallery -->
<div class="results">
<h3><?php echo $search_rs['name']; ?></h3>
<h3><?php echo $search_rs['item']; ?></h3>
<p><?php echo $search_rs['area']; ?></p>
</div>
<?php
} // end of do
while ($search_rs = mysqli_fetch_assoc($search_query));
} //end else
//if there are any display
?>
else{
做{
?>
请参阅关于sql注入以及准备好的和绑定的查询的重要性。这不是我们清理数据的方式。看到迭代记录集的do…while
循环而不是更常见的while(){}
类型是很奇怪的,有什么理由这样选择吗?您应该使用while(…){…
而不是do{..}而(…)
。如果使用do while
则循环将始终至少运行一次,因为在循环之后而不是之前检查条件。是否有区域
为空的记录?这似乎是最符合逻辑的explanation@BenHillier-OP说总是有一个空行。那是因为在do-while循环中,它将是一个始终运行第一个循环,不管发生什么。它也会在条件之前运行(在$search\r被分配任何数据之前),这就是为什么它们总是得到一个空行的原因。实际上,foreach
循环会简单得多