-1

我有以下代码:

<?php
include "include.php";
session_start();
// Defining variables from home.php if set
if(isset($_POST['title'])){
$title = mysql_real_escape_string($_POST['title']);
}
if(isset($_POST['author'])){
$author = mysql_real_escape_string($_POST['author']);
}
if(isset($_POST['isbn'])){
$isbn = mysql_real_escape_string($_POST['isbn']);
}
if(isset($_POST['keyword'])){
$keyword = mysql_real_escape_string($_POST['keyword']);
}
if(isset($_POST['sort'])){
$sort=@$_POST['sort'];}
// Determine the WHEREs to use
$where = array();
if ( ! empty($title))
$where[] = "booktitle LIKE '%" . $title . "%'";
if ( ! empty($author))
$where[] = "author LIKE '%" . $author . "%'";
if ( ! empty($isbn))
$where[] = "isbn LIKE '%" . $isbn . "%'";
if ( ! empty($keyword))
$where[] = "description LIKE '%" . $keyword . "%'";

//Determine the ORDERs to use
$order = array();
if ((isset($sort)) && ($sort=='lowhigh'))
$order[] = "price ASC";
if ((isset($sort)) && ($sort=='highlow'))
$order[] = "price DESC";
// Build the query
$query = 'SELECT * FROM book';
if ( ! empty($where))
$query .= ' WHERE ' . implode(' AND ', $where);
if(! empty($sort))
$query .= ' ORDER BY ' . implode($order);
//Display results
$result = mysqli_query($con, $query) or die("Error in query $query: " . mysqli_error());
while ($row = mysqli_fetch_array($result)) {
  ?><a id="1" href="book.php" border="0"><img src="<?php echo $row[12]; ?>" width="112px" height="150px" /></a>
<a href="book.php?booktitle='<?php echo $_SESSION['booktitle']=$row[1];?>'"><b><?php echo  $row[1] . ", (" . $row[5] . ")";?></b></a><br><?php
echo $row[2];
echo "<br><div style='text-align:right'> <b>&pound;" . $row[9] . "</b></div>";
echo "<b>Book description:</b> " . substr($row[3],0,300) . "...<br /><hr>";
}
mysqli_close($con);             //closes the connection
?>

它传递来自前端页面上四个文本字段的输入并显示结果。这一切都很好。这是我对显示的结果进行排序的时候。例如,如果我选择价格:从低到高,它会排列我数据库中的所有结果并显示所有内容,而不仅仅是执行搜索的结果。有人现在如何让它记住原始搜索?

这是我的表格:

<form id="rform" name="formsort" action=""  method="post">
<select name="sort" id="sort" onChange="document.forms['formsort'].submit()">
<option value="default">Sort Results</option>
<option value="lowhigh">Price: Low to High</option>
<option value="highlow">Price: High to Low</option>
</select>
</form>
4

4 回答 4

1

如何让 php “记住”进行的搜索

它实际上不是 PHP,而是 HTTP 协议的一般概念。因此,要解决您的问题,您必须遵循以下标准:

GET 方法应该用于搜索而不是 POST。这是由 HTTP 标准定义的,并且是 GET 方法的目的。虽然 POST 不应该用于搜索。

因此,只要您使用 GET 方法,您的数据就会自动保存。

唯一的问题可能是分页链接。要向它们添加当前查询字符串,http_build_query()必须使用函数。

您实际上可以减少页面上的条件数量。而不是使用 2 个单独的

if(isset($_GET['title'])){
    $title = mysql_real_escape_string($_POST['title']);
}
if ( ! empty($title))
$where[] = "booktitle LIKE '%" . $title . "%'";

必须使用一个

if(isset($_GET['title'])){
    $title = mysql_real_escape_string($_POST['title']);
    $where[] = "booktitle LIKE '%" . $title . "%'";
}
于 2013-03-29T07:28:51.870 回答
0

对不起,我再次检查了您的代码,发现它很清楚,解决方案也很清楚:)

将 3 个隐藏元素以依次对 (title,book,author) 命名的每个元素进行排序的形式,并存储从搜索操作发布的值,因此当您对结果进行排序时,您还将应用这些约束,因为再次发布:)

我的意思是您必须在您使用的排序表单内部添加以下代码:

<?php
    if(isset($_POST['title']))
        {
            echo '<input type="hidden" name="title" value="'.$_POST['title'].'" />';
        }
    if(isset($_POST['author']))
        {
            echo '<input type="hidden" name="author" value="'.$_POST['author'].'" />';
        }
    if(isset($_POST['isbn']))
        {
            echo '<input type="hidden" name="isbn" value="'.$_POST['isbn'].'" />';
        }
    if(isset($_POST['keyword']))
        {
            echo '<input type="hidden" name="keyword" value="'.$_POST['keyword'].'" />';
        }
    if(isset($_POST['sort']))
    {
        echo '<input type="hidden" name="sort" value="'.$_POST['sort'].'" />';
    }

?>

希望这会对您有所帮助:) 如果需要任何其他帮助,请告诉我 :)

于 2013-03-29T00:53:24.520 回答
0

在我看来,你为什么要进行如此激烈的排序?您可以简单地通过 php 在表格中显示结果,用于 jquery以任何方式对表格进行排序

http://tablesorter.com/docs/
http://joequery.github.com/Stupid-Table-Plugin/

于 2013-03-29T01:06:17.837 回答
-1

当您使用“ORDER BY”时,您正在对结果集进行排序,而不是对数据库本身进行排序。如果您想获取结果的新副本,只需在没有 ORDER BY 的情况下进行。

此外,PHP 的三元 if 结构更适合这里。代替 :

if(isset($_POST['title'])){
   $title = mysql_real_escape_string($_POST['title']);
}

你可以说:

$title = (isset($_POST['title']) ? mysql_real_escape_string($_POST['title']) : "");
于 2013-03-29T00:58:23.580 回答