【发布时间】:2015-10-12 23:16:33
【问题描述】:
我有一个模块允许管理员将一些用户(可能是多个)添加到一个组中。
PHP
$user_id = $_POST["user_id"]; //this can be an array
$group_id = $_POST["group_id"];
$sql = "INSERT IGNORE INTO users_groups (user_id, group_id)
VALUES ($user_id[0],$group_id)";
for ( $i = 1; $i < count($user_id); $i++)
{
$sql .= ", ($user_id[$i],$group_id)"
}
如您所见,sql-query 取决于管理员选择了多少用户。
如何将这段代码用于准备好的语句,因为后变量来自用户(SQL 注入...)
更新
我有两个选择框:
- 一个供用户选择(可以多选->数组):
$_POST["user_id"] - 一个用于组选择(只能选择一个):
$_POST["group_id"]
现在我想要一个准备好的 SQL 语句,用于将 user_id 和 group_id 插入到多对多表 (users_groups)。问题是必须插入的值的数量可能会改变(取决于管理员在选择框中选择了多少用户)。
我想根据管理员选择的用户数量来更改准备好的查询。
例如:
- 管理员选择了两个用户 -> sql:
INSERT IGNORE INTO users_groups (user_id, group_id) VALUES ($user_id[0],$group_id), ($user_id[1],$group_id) - 管理员选择了四个用户 -> sql:
INSERT IGNORE INTO users_groups (user_id, group_id) VALUES ($user_id[0],$group_id), ($user_id[1],$group_id), ($user_id[2],$group_id), ($user_id[3],$group_id)
我的问题:我怎样才能自动执行此操作并使用准备好的 sql 语句,因为我不想拥有 10 次 if(count($user_id) == number) {...?
更新 2 如果我手动执行此操作,代码将如下所示:
$sql = $db->prepare("INSERT IGNORE INTO users_groups (user_id, group_id) VALUES (?, ?)");
$sql->bind_param('ii', $user_id[0], $group_id);
更新 3 检查post变量中是否只有整数:
$user_id = filter_input_array(INPUT_POST, 'user_id', FILTER_SANITIZE_NUMBER_INT);
$user_id = abs($user_id);
$group_id = filter_input(INPUT_POST, 'group_id', FILTER_SANITIZE_NUMBER_INT);
$group_id = abs($group_id);
【问题讨论】:
-
您使用的是什么驱动程序?您是否查看过有关此主题的任何主题?示例 #1:stackoverflow.com/questions/60174/…
-
这是准备好的语句不能很好地工作的情况之一。也就是说,看起来您只使用整数(或整数数组)。在
POST输入上运行PHP 的filter_input_array()应该可以有效地清理它,然后您根本不需要准备好的语句。见filter_input_array() -
您可以定义
$sql语句,然后在for 循环中为每个用户/组对进行绑定。 -
这是 PDO 吗?你用什么来和 MySQL 对话?