0

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

<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;
}
?>

问题:这当然行不通。这是我第一次尝试这样做。

问题:我在正确的道路上吗?我需要如何修改它才能使其工作?

4

3 回答 3

0

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

$list = implode(", ", $checked);
于 2010-10-26T21:30:18.203 回答
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)列提供字符串)。

于 2010-10-26T21:35:31.980 回答
0

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);
}

或者只是手动循环。

于 2010-10-26T22:06:08.600 回答