我试图找出如何使用复选框删除多个记录。我的页面上有一个表,用于从数据库中获取数据。每行的第一列都有一个复选框,如下所示:
<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;
}
?>
问题:当然这不起作用。这是我第一次尝试这样做。
问题:我是否在正确的道路上?我如何修改它以使其有效?
答案 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);
}
或只是手动循环。