2016-09-16 83 views
0

我有以下的情况从另一个窗体添加数据时被擦除:

我已经创建了一个搜索框,允许用户做一些代码高级搜索并创建了一个准备好的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

难道你不能把两者结合成一个单一的形式吗?你的代码有点难以阅读,但我猜你的问题源于你在第二个表单上丢失了初始表单的POST数据 – georaldc

回答

0

这不是一个完美的解决方案,但你可以在第二种形式添加尽可能多的隐藏输入然后通过关键字

<form action="<?PHP echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> 
 

 
\t <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'];?> > 
 
\t \t 
 
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

的首先,如果你使用,你应该使用它的准备语句功能的数据库查询类让你的测试,否则你很容易受到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; 
} 
0

的问题是,您使用的是2点不同的形式。

因此,当你发送任何表单时,它只发送包含在该表单中的参数,而不是其他表单中的参数,因此它将“忘记”其他表单发送的内容。

解决方案:(很多方面实际上,这里有一些)

  • 附上所有的参数只有一种形式,而不是2,这样它会一直发送的所有信息。**(我认为这将是最简单的)

  • 将搜索表单中的参数作为隐藏字段添加到排序表单中,反之亦然。

  • 使用会话或cookie跟踪最后使用的选项(如果您这样做,您需要考虑一种方法来“清除”选项,如清除会话或cookie中的所有内容)