Удаление нескольких записей (строк) из таблиц с помощью флажков - PullRequest
0 голосов
/ 03 октября 2011

Попытка удалить несколько строк с помощью флажков. Сначала я создаю оглавление с колонкой флажка. Затем размещение данных на стороне php. Проблема в том, что PHP-сторона возвращается на текущую страницу. Это означает, что все выполнено успешно и страница возвращена пользователем обратно. Но безуспешно. В логах php нет ошибок и проблем с MySQL. Я пытался print_r ($_POST['checkbox']); die(); после $delete=$_POST['delete'];. Это дало мне что-то подобное 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;
                }
        }

    ?>

1 Ответ

2 голосов
/ 03 октября 2011

Ваш кодекс - абсолютная катастрофа.

1) Использование echo с повторной конкатенацией строк для вывода html. Посмотрите HEREDOC s, строки в двойных кавычках или просто выход из режима PHP (?>) для вывода html.

2) Проверка POST путем поиска полей формы. Если вы хотите убедиться, что находитесь в состоянии POST, вместо этого выполните if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. Это на 100% надежно и не зависит от наличия (или отсутствия) определенных полей формы. Если данные были отправлены по почте, это утверждение оценивается как истинное ВСЕГДА.

3) Вы слепо встраиваете предоставленные пользователем данные в строки запроса SQL. Прочитайте о атаках SQL-инъекций , затем подумайте, что произойдет, если кто-то взломает вашу форму и отправит значение флажка ' or 1' - попрощайтесь с содержимым таблицы флажков.

4) Похоже, у вас в строке вывода флажка ":

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

, который почти наверняка «ломает» вашу форму и приводит к неверной интерпретации последующих атрибутов тега.

5) с другой стороны, мне придется дать вам так много - вы, по крайней мере, проверяете ошибки запросов в двух запросах на удаление, что всегда приятно видеть. Однако это огромный плюс в огромном поле негативов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...