使用复选框删除多个记录

时间:2010-10-26 21:25:22

标签: php sql-delete delete-record

我试图找出如何使用复选框删除多个记录。我的页面上有一个表,用于从数据库中获取数据。每行的第一列都有一个复选框,如下所示:

<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 :(得分:0)

例如,检查数组的每个元素是否为整数(使用ctype_digit()),然后您可以使用不含引号的implode,如下所示:

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

答案 1 :(得分:0)

这会产生错误:

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

因为array_map想要一个回调作为第一个,一个数组作为第二个参数。其余的设置非常好,但由于mysqli_real_escape_string需要连接,array_map或array_walk不太方便,您可以尝试正常的foreach循环。或者,如果id总是整数:

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

...并删除implode语句中值的引号(尝试为整数列提供mysql整数,为其他(char / date / blob / text)列提供字符串)。

答案 2 :(得分:0)

使用PHP&gt; = 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);
}

或只是手动循环。