2016-09-16 77 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中的所有內容)