我有以下情况:
我为搜索框创建了一个代码,允许用户进行一些高级搜索并创建一个准备好的mysql语句。表单目标是同一页面。
我还创建了另一种允许排序的表单。表单目标是同一页面。
问题在于,如果我搜索某些内容然后对数据进行排序,它会返回到默认查询(没有在搜索框中设置参数),因此它会对整个数据进行排序。
他们的工作完全孤立,但我很乐意让他们一起工作,我真的无法弄清楚如何。
以下是搜索框和排序的PHP代码:
<?php
require 'connect.php';
if(isset($_POST['cauta'])){
$cauta=$_POST['cauta'];}
$clause = " WHERE ";
$query1="SELECT nume, prenume, email, functie, denumire FROM contacte_companii cc LEFT JOIN companii c
ON cc.com_id=c.id";
if(isset($_POST['submit'])){
if(isset($_POST['keyword'])){
foreach($_POST['keyword'] as $c){
if(!empty($c)){
$base_query=$query1 .= $clause." ".$c." LIKE '%".$cauta."%'";//
$clause = " OR ";//Change to OR after 1st WHERE
}
}
}
echo $base_query;
}
else {
$base_query="SELECT nume, prenume, email, functie, denumire FROM contacte_companii cc
LEFT JOIN companii c
ON cc.com_id=c.id";
echo $base_query;
}
?>
if(isset($_POST['ASC'])){
$query = $base_query . " ORDER BY prenume ASC"
;
}
// Descending Order
elseif (isset ($_POST['DESC'])) {
$query = $base_query . " ORDER BY prenume DESC";
}
else {
$query = $base_query;
}
$result=$db->query($query);
// Associative arrays of strings - for each row - stops at NULL;
while($row=$result->fetch_assoc())
{
?>
<tr>
<td><?php echo $row["prenume"]. " " .$row["nume"]; ?></td>
<td><?php echo $row["email"]; ?></td>
<td><?php echo $row["functie"]; ?></td>
<td><?php echo $row["denumire"]; ?></td>
</tr>
<?php
}
$db->close();
?>
以下是搜索框的表单:
<form action="<?PHP echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
<input type="checkbox" name="keyword[]" value="nume" checked> Nume
<input type="checkbox" name="keyword[]" value="prenume" checked> Prenume
<input type="checkbox" name="keyword[]" checked value="email"> Email
<input type="checkbox" name="keyword[]" value="denumire"> Companie
<input type="checkbox" name="keyword[]" value="telefon_b"> Telefon
<input type="checkbox" name="keyword[]" hidden value="telefon_m">
<input type="text" name="cauta">
<input type="submit" name="submit" value="Cauta">
</form>
以下是HTML中的排序按钮的样子:
<form action="<?PHP echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
th>Nume <button class="btn" type="submit" name="ASC" >
<img src="icons\09.png" width="20" height="20" style="margin:3.5px 3px" align="right"/>
</button></th>
</form>
答案 0 :(得分:0)
这不是一个完美的解决方案,但您可以在第二种形式添加尽可能多的隐藏输入,然后通过关键字进行测试
<form action="<?PHP echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
<input type="hidden" name="keyword[]" value=<? echo $_POST['Num'];?> >
<input type="hidden" name="keyword[]" value=<? echo $_POST['prenume'];?> >
<input type="hidden" name="keyword[]" value=<? echo $_POST['Email'];?> >
<input type="hidden" name="keyword[]" value=<? echo $_POST['Companie'];?> >
<input type="hidden" name="keyword[]" value=<? echo $_POST['Telefon'];?> >
th>Nume <button class="btn" type="submit" name="ASC" >
<img src="icons\09.png" width="20" height="20" style="margin:3.5px 3px" align="right"/>
</button></th>
</form>
答案 1 :(得分:0)
首先,如果您使用数据库查询类,则应使用其预准备语句功能,否则您很容易受到SQL注入攻击。
例如,如果我输入最后一个关键字[],就像这样的“123”; SELECT * FROM users
; - “。攻击者可以通过多种方式利用它,因为他可以编写数据库将执行的查询,因为它没有理由怀疑它们的有效性。
要做的另一件事是清理从表单中获得的输入。
对于问题的答案,您可以组合表单并添加复选框或其他内容以确定您是要搜索还是订购数据。因为我在你的代码中看到了$ _POST ['cauta']的条件。
或者您可以合并表单,然后将其添加到您的查询中:
if(isset($_POST['cauta'])){
$cauta=$_POST['cauta'];}
$clause = " WHERE ";
$query1="SELECT nume, prenume, email, functie, denumire FROM contacte_companii cc LEFT JOIN companii c
ON cc.com_id=c.id";
if(isset($_POST['submit'])){
if(isset($_POST['keyword'])){
foreach($_POST['keyword'] as $c){
if(!empty($c)){
$base_query=$query1 .= $clause." ".$c." LIKE '%".$cauta."%'";//
$clause = " OR ";//Change to OR after 1st WHERE
}
}
if(isset($_POST['ASC'])){
$base_query .= " ORDER BY prenume ASC";
}
// Descending Order
elseif (isset ($_POST['DESC'])) {
$base_query .= " ORDER BY prenume DESC";
}
}
echo $base_query;
}
答案 2 :(得分:0)
问题在于您使用的是两种不同的形式。
因此,当您发送任何表单时,它只发送该表单中包含的参数,而不是其他表单中的参数,因此它将“忘记”其他表单发送的内容。
解决方案:(实际上有很多方法,这里有一些)
将所有参数仅包含在一个表单而不是2中,这样它将始终发送所有信息。 **(我认为这将是最简单的)
将搜索表单中的参数作为隐藏字段添加到排序表单中,反之亦然。
使用会话或cookie来跟踪最后使用的选项(如果这样做,您需要考虑一种“清除”选项的方法,例如清除会话或cookie中的所有内容的清除按钮)