我有一个基本上重新创建数据库表的页面,并允许用户一次编辑多个记录的字段。当他们按下保存时,我提交的帖子将我的所有字段名称保存在正确的字段名称数组中。即一个字段名称是“table_name [name] []”这给了我一个看起来就像我想要它的数组
["name"] => array(2) {
[0]=> "name 1"
[1]=> "name 2"
}
我有很多可以编辑的字段。所以我的问题是:循环我的post数组并创建一个结构类似的数组的最佳方法是什么。
$updates[1] => array{
id => id from first record
name => name from first record
etc => remaining info from first record
}
[2] => array{
id => id from second record
name => name from second record
etc => remaining info from second record
}
除了必须写出每一个字段外,还有一种简单的方法吗?
答案 0 :(得分:0)
You can see this in action at IDEOne.com by clicking here.
我假设您的$_POST
看起来像这样:
$_POST = array(
'id' => array(
0 => 14,
1 => 15,
2 => 16
),
'name' => array(
0 => 'Jill',
1 => 'Jack',
2 => 'John'
)
); //I won't do any other columns because what's the point?
因此,您的条目目前按列聚合。您想按行聚合它们。
这是一个天真的解决方案。假设每行必须与id
相关联,请找出已发回的id
个。{/ p>
$total = sizeof($_POST['id']);
现在,多次遍历$ _POST数组:
$rows = array();
for ($i = 0; $i < $total; $i++) {
$rows[] = array(
'id' => $_POST['id'][$i],
'name' => $_POST['name'][$i]
);
}
现在,$rows
填充了按行而不是列分组的信息。
为了获得更好的性能,可以使用回调和内置数组函数来实现这一点。
如果你要重复使用这个逻辑,可以考虑将它放在一个静态函数中,或者构建一个以可重用/可移植的方式执行这个逻辑的辅助类。
You can see this in action at this IDEOne.com demonstration by clicking here.
您说您不想手动指定输入哪些字段。这可以实现,但首先要问自己以下问题:
我是否可以合理地保证只有
$_POST
中的字段?
答案是否定的,但我会先回答这个问题,好像它是肯定的。
同样,我们将使用id
作为告诉我们将有多少行的字段:
$total = sizeof($_POST['id']));
$rows = array();
for ($i = 0; $i < $total; $i++) {
//This part changes.
}
现在,在for循环中,我们需要遍历$ _POST数组,并获取键名:
for ($i = 0; $i < $total; $i++) {
$array = array(); //Create a blank array.
foreach ($_POST as $key => $value) {
$array[$key] = $value[$i]; //Add the key with it's value. Remember $value is an array here too.
}
$rows[] = $array;
}
我之所以回答上述问题的答案是否定的原因是因为用户可以操纵他们从客户端(浏览器)发送的数据,试图使页面执行除预期之外的操作(例如SQL注入, XSS攻击,功能/服务器发现等。)。
在上面的示例中,如果用户提交了表单,但通过添加表单元素来操纵它,例如:
<input type="hidden" name="breakpage" value="true" />
现在,您将拥有$_POST
数组的元素,该元素本身不是数组。当$_POST
数组被迭代时,页面将抛出一个关于未定义索引的错误,该错误将被回显给用户。您可以禁用错误显示,但仍会阻止页面运行。
假设您正在使用预准备语句来实际写入数据库,并且正在检查值中的XSS尝试,这可能与它会得到的一样糟糕。
要解决此问题,您可以设置$ _POST中接受的键数组,并迭代它而不是$_POST
本身。但是,您明确表示您不想这样做。