Удалить несколько записей с помощью флажков - PullRequest
0 голосов
/ 27 октября 2010

Я пытаюсь выяснить, как я могу удалить несколько записей, используя флажки.У меня есть таблица на моей странице, которая получает данные из базы данных.В первом столбце каждой строки есть флажок, который выглядит следующим образом:

<input type="checkbox" name="checked[]" value='.$row['UserId'].' class="checkbox" />

Мой код выглядит следующим образом:

<?php
// get required includes
require_once(ROOT_PATH.'connections/mysql.php');
require_once(ROOT_PATH.'admin/controls/users_az/error_messages.php');

// declare variables
$msg = '';

// ------------------------------------------------------------------
// DELETE SELECTED USERS
// ------------------------------------------------------------------
if(isset($_POST['btnDeleteSelected']) && isset($_POST['checked']))
{
$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));
$list = "'" . implode("','", $checked) . "'";

$delete_selected = mysqli_query($conn, "DELETE FROM users WHERE UserId IN ($list)")
or die($dataaccess_error);

if($delete_selected)
{
    $msg = mysqli_affected_rows($delete_selected).' '.$msg_success;
}
}
elseif(isset($_POST['btnDeleteSelected']) && !isset($_POST['checked']))
{
$msg = $msg_error;
}
?>

Проблема: Естественноэто не работает.Это первый раз, когда я пытаюсь это сделать.

Вопрос: Я на правильном пути с этим?Как мне нужно изменить это, чтобы оно работало?

Ответы [ 3 ]

0 голосов
/ 27 октября 2010

Это приведет к ошибке:

$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));

Поскольку array_map хочет обратный вызов в качестве первого и массив в качестве второго аргумента.Остальные настройки довольно хороши, но поскольку mysqli_real_escape_string требуется соединение, array_map или array_walk не так удобны, вы можете попробовать обычный цикл foreach.В качестве альтернативы, если идентификаторы всегда целые:

$checked = array_map('intval',$_POST['checked']);

... и отбрасывайте кавычки вокруг значений в операторе implode (попробуйте ввести целые числа mysql для целочисленных столбцов, строки для других (char / date /blob / text) столбцы).

0 голосов
/ 27 октября 2010

С PHP> = 5.3 вы можете использовать анонимную функцию:

$checked = array_map(function($s) use ($conn) { return mysqli_real_escape_string($conn, $s); }, $_POST['checked']);

В противном случае вы можете либо вызвать обратный вызов пользовательской функции:

$checked = array_map('myescape', $_POST['checked']);
function myescape($s)
{
    global $conn;
    return mysqli_real_escape_string($conn, $s);
}

, либо просто выполнить цикл вручную.

0 голосов
/ 27 октября 2010

Просто убедитесь, что каждый элемент вашего массива, например, является целым числом (с ctype_digit ()), и тогда вы можете использовать implode без кавычек, например:

$list = implode(", ", $checked);
...