PHP - 优秀实践阅读 POST 变量

3

我打算思考一种读取客户端提交的POST数据的良好做法。

例如,如果我有一个应该具有以下结构的post变量:

array(
    [0] => array(
      ['test'] => array(1, 2, 3),
      ['test2'] => "string"
    ),
    [1] => array(
        ['test'] => array(),
        ['test2'] => "string2"
    ),
)

需要始终存在索引“test”和“test2”,但其值可能为空(array() 和“”)。

处理 POST 数据的函数期望正确的格式,因此我必须确保数据未被篡改。

我可以采取以下措施:

$result = array();
if(isset($_POST['myVar']) && is_array($_POST['myVar'])) {
    foreach($_POST['myVar'] as $array) {
        $new = array('test' => array(), 'test2' = "");
        if(isset($array['test']) && is_array($array['test'])) {
            foreach($array['test'] as $expectedInt) {
                $new['test'][] = (int)$expectedInt;
            }
        }


        if(isset($array['test2']) && is_string($array['test2']))
            $new['test2'] = $array['test2'];
    }

    $result[] = $new;
}

我想你已经明白我想表达的意思了。我想知道是否有更好的做法将POST数据读入到预期的格式中。


发送JSON格式的数据,然后在服务器上使用json_decode将其转换为PHP对象,这个方案怎么样? - gkalpak
1
@专家 对不起,但这是最无用的建议。您仍然需要在服务器上验证接收到的数据。 - deceze
1
@deceze:感谢指出“无用”的部分。仍然比通过多个forEach循环自己构建PHP对象更容易_验证_它。但也许你有更好的建议。 - gkalpak
1
@ExpertSystem 没问题: <input name="myVar[0][test2]" value="abc" /> 等等... - mario.schlipf
1
@schlimpf:太酷了!我知道我可以传递一个数组,但我不知道它也可以在多个维度上工作(真丢人)。谢谢! - gkalpak
显示剩余8条评论
1个回答

1
我通常这样做来确保我有默认的索引:
$par = $_POST;
$par += [
   'key' => 'default',
   'other' => 'default',
]

如果$par不包含这些键,它们将被设置。
在您的情况下,您可以这样做:
$ready = [];
foreach($_POST as $k => $v){
   $v += [
     'test' => [],
     'test2' => "string2",
   ];
   // Validate if needed
   $v['test'] = (array)$v['test'];
   $v['test2'] = (string)$v['test2'];

   $ready[$k] = $v;
}

稍后您可以确定,$ready 将包含具有 testtest2 键的值。
这在函数中非常有用,您可以使用一个参数数组替换许多参数,然后稍后设置默认值。

$v+= 似乎出现了 Unsupported operand types 错误。有任何想法为什么会这样? - James P.
1
@JamesPoulson 可能是你的服务器不支持简写数组。尝试用经典的 array(..) 定义替换 [..] - Mārtiņš Briedis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接