2011-10-02 118 views
0

嘗試使用複選框刪除多行。起初,我用複選框列生成目錄。然後發佈數據到php方面。問題是,PHP方面返回到當前頁面。這意味着所有成功完成並返回頁面的用戶返回。但沒有成功。在PHP日誌和MySQL問題中沒有錯誤。我在$delete=$_POST['delete'];後試過print_r ($_POST['checkbox']); die();。它給了我這樣的結果Array ([0] => on [1] => on)我的代碼有什麼問題?使用複選框從表格刪除多個記錄(行)

我的HTML標記看起來像

<?php 
$result = $db->query("SELECT id, name, showinmenu FROM menu") ; 
$num=$result->num_rows; 
if ($num>0) { 
?> 
    <form method="post" action="processor/dbdel.php"> 
    <div style="overflow-y: auto; overflow-x: hidden; height:500px"> 
    <table id="list" class="features-table">  
      <thead> 
       <tr> 
        <th>#</th> 
        <th style="min-width:80px;" class="name">Ad (menyuda işlənən)</th> 
        <th>Sil</th> 
       </tr> 
      </thead> 
      <tbody> 
<? 
while ($row = $result->fetch_object()) { 
echo '<tr> 
<td>'.$row->id.'</td> 
<td><a href="'.$wsurl.'admin/?page=edit&id='.$row->id.'">'.$row->name.'</a></td> 
<td><input type="checkbox" name="checkbox[]" method="post" value"'.$row->id.'" id="checkbox[]" "/></td> 
</tr>'; 
    } 

    // when the loop is complete, close off the list. 
    echo "</tbody> <tr id='noresults'> 
     <td style='text-align:center' colspan='9'>Nəticə yoxdur</td> 
    </tr></table> 
    </div> 
    <p style='text-align:center;'> 
    <input id='delete' type='submit' name='delete' value='Seçilənləri sil'/>  </p> 
    </form>"; 
    } 
    ?> 

這裏是我的PHP代碼

<?php 
    require '../../core/includes/common.php'; 
     $delete=$_POST['delete']; 
     if($delete) // from button name="delete" 
     { 
     if (is_array($_POST['checkbox'])) 
     foreach($_POST['checkbox'] as $del_id) { 
       $del_id = (int)$del_id; 
       $result=$db->query ("DELETE FROM menu WHERE id = '$del_id'") or die($db->error); 
       $result2=$db->query ("DELETE FROM pages WHERE id = '$del_id'") or die($db->error); 
      } 
       if($result2) 
      { 
        header("location:".$wsurl."admin/?page=db");  
       } 
       else 
       { 
        echo "Error: ".$db->error; 
       } 
     } 

    ?> 

回答

2

你的代碼是一個絕對的災難。

1)使用echo與重複的字符串連接來輸出html。查找HEREDOC s,雙引號字符串,或者簡單地從PHP模式(?>)中輸出html。

2)通過查找表單域來檢查POST。如果您想確保您處於POST狀態,請改爲if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }。這是100%可靠的,並且不依賴於特定表單字段的存在(或不存在)。如果數據是通過郵寄提交的,那麼這個聲明將評估爲真實,總是。

3)您正在盲目地將用戶提供的數據嵌入到SQL查詢字符串中。閱讀大約SQL injection attacks,然後考慮如果有人侵入您的表單並提交一個複選框值' or 1'會發生什麼情況 - 告別您的複選框表格的內容。

4)你似乎對你的複選框,輸出線的寄生"

[...snip...] method="post" value"'.$row->id.'" id="checkbox[]" "/></td> 
                   ^--here 

這幾乎肯定是「破」的形式,並導致隨後的標籤屬性被誤解。 5)在好的一面,我將不得不給你這麼多 - 你至少要檢查你的兩個刪除查詢的查詢錯誤,這總是很好看。然而,這是一個負面影響巨大領域的小增加。

+0

並且在您閱讀了SQL注入攻擊之後,請閱讀此內容,看看您是否瞭解它:http://imgs.xkcd.com/comics/exploits_of_a_mom.png – Icarus

+0

謝謝。我們可以繼續通過Skype進行討論嗎?我有幾個問題 – demonoid

+0

@Marc我修復了。仍然沒有成功 – demonoid