我正在努力为我的数据库添加过滤器,但我不知道和谷歌没有真正帮助所以我感谢所有的建议=)
我想添加名称和价格等过滤器,并按asc和desc顺序排列。
我的数据库有4列,id(int15),品牌/型号(varchar50),图片(longblob),价格(varchar50)。
关于如何处理这个问题的任何建议(如果我有初学者的话,最好有一些例子)? 目前下面我创建了下面的表单asc和desc,但我不知道如何集成到我的PHP代码。我已将表单名称设置为“结果”
我目前拥有的是什么 的的index.php
<form action="search.php" type="text" method="POST">
Name: <input type ="text" name="search_name" size='30' />
<input type="submit" value="Search">
<br><br>
<b>Arrange Price by :</b>
<select name="results">
<option value="">Select...</option>
<option value="asc">Ascending</option>
<option value="desc">Descending</option>
</select>
<?php
if (isset($_POST['search_name'])) {
$search_name = $_POST['search_name'];
if (!empty($search_name)){
if (strlen($search_name)>=3) {
$query = "SELECT * FROM `shoes` WHERE `brand/model` LIKE '".mysql_real_escape_string($search_name)."%' ORDER BY `price` ASC";
$query_run = mysql_query($query);
$query_num_rows = mysql_num_rows($query_run);
if ($query_num_rows>=1) {
echo $query_num_rows.' Results found:<br>';
while ($query_row = mysql_fetch_array($query_run)) {
$picture = $query_row['picture'];
echo "</br>";
echo $query_row ['brand/model'];
echo str_repeat(' ', 15); // adds 5 spaces
echo $query_row ['price'];
echo "</br>";
echo "</br>";
//header("content-type: image/jpeg");
echo "<img src='image.php?id=".$query_row['id']."' width='300' height='200' />";
echo "</br>";
}
} else {
echo 'No Results Found.';
}
} else {
echo 'Text field must be more than 3 characters.';
}
} else {
echo 'Text Field Cannot be Empty!';
}
}
&GT;
答案 0 :(得分:0)
只要您正在清理输入以防止SQL注入,就可以使用POST。为了进一步保护自己,您可以使用预备语句。另外,我看到你正在使用mysql_ * API。我强烈建议您切换到MySQLi或PDO。在这种情况下我会强调MySQLi,因为它看起来好像你在使用MySQL(尽管PDO也适用于MySQL)。
对于搜索组件:
如果已将索引编入索引,则最好搜索字段。数据库将在幕后使用它来更快地获取您的数据。但是,使用带有通配符(LIKE % <your search string> %
)的%
将取消您放置在列上的任何索引。这是因为在搜索的左侧使用通配符不允许MySQL使用索引。 (长话短说,除非它扫描整个表,否则根本无法确定文本是否匹配。)您需要的是FULLTEXT
索引,您可以使用MATCH...AGAINST
语法运行查询。如果需要,可以在索引列上使用LIKE
,但请删除左侧通配符,例如:SELECT * FROM ...... LIKE 'your search value'% .....
所以从这里开始我建议你研究以下概念/主题:
FULLTEXT
索引用于搜索目的)FULLTEXT
的内部“评分”以及如何使用
添加您想要的搜索过滤器是一个不错的功能,但它需要的功能比您尝试的要多一些。 (相信我,谷歌将为您提供大量信息和这些主题。这是一个练习和使用MySQL的新功能的问题。)
答案 1 :(得分:0)
•使用PDO或Mysqli准备好的声明。 •我将使用正则表达式过滤输入(删除所有非单词,数字和一些字符)。
example: $string = preg_replace('~[^\w\s-_\.,]~','',$string);
•我将使用全文搜索。
答案 2 :(得分:0)
尝试使用此代码,
if (!empty($search_name)){
if (strlen($search_name)>=3) {
if(empty($_REQUEST['searchTrm']))
$_REQUEST['searchTrm'] = 'price';
if(empty($_REQUEST['order']))
$_REQUEST['order'] = 'ASC';
$query = "SELECT * FROM `shoes` WHERE `brand/model` LIKE '".mysql_real_escape_string($search_name)."%' ORDER BY ".$_REQUEST['searchTrm']." ".$_REQUEST['order'];
$query_run = mysql_query($query);
$query_num_rows = mysql_num_rows($query_run);
if ($query_num_rows>=1) {
echo $query_num_rows.' Results found:<br>';
?>
<table border=1>
<tr>
<td>
<?php
//use your sql field name as searchTrm value
if($_REQUEST['searchTrm'] == 'brand/model' && $_REQUEST['order'] == 'DESC') { ?>
<a href='?searchTrm=brand/model&order=ASC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'ASC'>Brand Name</a>
<?php } else { ?>
<a href='?searchTrm=brand/model&order=DESC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'DESC'>Brand Name</a>
<?php } ?>
</td>
<td>
<?php if($_REQUEST['searchTrm'] == 'price' && $_REQUEST['order'] == 'DESC') { ?>
<a href='?searchTrm=price&order=ASC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'ASC'>Price</a>
<?php } else { ?>
<a href='?searchTrm=price&order=DESC&search_name=<?php echo $_REQUEST['search_name']?>' title = 'DESC'>Price</a>
<?php } ?>
</td>
<td>Image</td>
</tr>
<?php
while ($query_row = mysql_fetch_array($query_run)) {
$picture = $query_row['picture'];
?>
<tr>
<td><?php echo $query_row['brand/model'];?></td>
<td><?php echo $query_row['price'];?></td>
<td><img src='image.php?id=<?php echo $query_row['id'];?>' width='300' height='200' /></td>
</tr>
<?php
}
?> </table> <?php
} else {
echo 'No Results Found.';
}
} else {
echo 'Text field must be more than 3 characters.';
}
} else {
echo 'Text Field Cannot be Empty!';
}
}