我对编码很新,所以我很乐意接受批评和帮助。我正在尝试将分页应用于我的搜索结果。我已经返回了我需要的结果,应用了限制并设法让分页控件正确显示。但是,当我选择“下一个”或“上一个”时,页面没有结果。我确信有一些根本性的错误,但我无法发现它。
?php
include_once("db_connex.php");
if (isset ($_POST ['search'])) {
$searchq = $_POST ['search'];
$count_query = mysql_query("SELECT * FROM activejobs WHERE jobtitle LIKE '%$searchq%' OR region LIKE '%$searchq%' AND status= '1'");
$count = mysql_num_rows($count_query);
// pagination starts here
if (isset($_GET['page'])) {
$page = pre_replace("#[^0-9]#","",$_GET['page']);
}
else {
$page = 1;
}
$perPage = 3;
$lastPage = ceil($count / $perPage);
if ($page < 1) {
$page = 1;
}
else if ($page > $lastPage) {
$page = $lastPage;
}
$limit = "LIMIT " . ($page - 1) * $perPage. ", $perPage";
$query = mysql_query("SELECT * FROM activejobs WHERE jobtitle LIKE '%$searchq%' OR region LIKE '%$searchq%' AND status= '1' ORDER BY jobid DESC $limit");
}
if ($lastPage != 1) {
if ($page != $lastPage) {
$next = $page + 1;
$pagination .= '<a href="jobsearch.php?page='.$next.'">Next</a>';
}
if ($page != 1) {
$prev = $page - 1;
$pagination .= '<a href="jobsearch.php?page='.$prev.'">Previous</a>';
}
}
while ($row = mysql_fetch_array($query)) {
$jobtitle = $row['jobtitle'];
$region = $row['region'];
$salary = $row['salary'];
$jobdescription = $row ['jobdescription'];
$joburl = $row ['joburl'];
$output .= '<div id= "searchresults"><a href = "http://www.nursestation.co.uk/jobdetails.php?id=' . $jobid . '"><div id= "applybutton">Details</div></a><font id= "resultstitle">'.$jobtitle.' - '.$region.' - '.$salary.'</font><br>'.$jobdescription.'</div>';
}
?>
答案 0 :(得分:1)
这种 if-else 地狱:
// pagination starts here
if (isset($_GET['page'])) {
$page = pre_replace("#[^0-9]#","",$_GET['page']);
}
else {
$page = 1;
}
可以像这样解决(默认情况下在开始时):
// pagination starts here
$page = 1;
if (isset($_GET['page'])) {
$page = pre_replace("#[^0-9]#","",$_GET['page']);
}
甚至这个(如果你喜欢冒险):
$page = (isset($_GET['page']) ? pre_replace("#[^0-9]#","",$_GET['page']) : 1);
制作很多If-else在开始时很容易,之后很难,所以通过减少你无事可做的事情来保持简单。使代码更小,更接近>>任何解决方案。
这也很常见:
...
while ($row = mysql_fetch_array($query)) {
$jobtitle = $row['jobtitle'];
$region = $row['region'];
...
为什么要将$jobtitle
分配给$row['jobtitle'];
?
它不会使您的代码更容易,只是添加更多代码并使您更难阅读。
直接给$row['X']
。
此外,正如 @ojovirtual 所述,您需要每次都传递“$ search”参数,否则您的整个代码块将被忽略(“$ search” 未设置)
最后,在使用MySQL时,您需要检查为查询提供的值,
在此示例中为$searchq
。恶意编码器可以使$searchq
看起来像查询的一部分。
有一个简单的解决方法:
而不是简单:
$count_query = mysql_query("SELECT * FROM activejobs WHERE jobtitle LIKE '%$searchq%' OR region LIKE '%$searchq%' AND status= '1'");
养成这样做的习惯:
$searchq = mysql_real_escape_string($searchq);
$count_query = mysql_query("SELECT * FROM activejobs WHERE jobtitle LIKE '%$searchq%' OR region LIKE '%$searchq%' AND status= '1'");
在进入新技术作为首发之前,不是通用解决方案,而是启动器。 这是用户名,密码等字段必须的。
最后,改为:
if (isset ($_POST ['search'])) {
$searchq = $_POST ['search'];
为:
if (isset ($_GET['search'])) {
$searchq = $_GET['search'];
答案 1 :(得分:0)
您需要在search
和next
按钮中再次传递previuos
。快速解决方法是:
将$_POST
更改为$_REQUEST
:
if (isset ($_REQUEST ['search'])) ...
将搜索内容添加到您的next
和previous
按钮:
$pagination.= '<a href="jobsearch.php?search='.urlencode($_REQUEST["search"]).'&page='.$next.'">Next</a>';
与previous
按钮相同。
正如有人所说,你应该在任何数据库查询之前做一些输入卫生。