来自$ _POST

时间:2016-01-26 11:40:47

标签: php

我对PHP比较新。我已经为用户输入创建了一个验证类,并查看是否有更有效的方法为其分配$ _POST变量,所以目前我有:

    if (isset($_POST['title']))     $valInput->title=$_POST['title'];
    if (isset($_POST['firstName'])) $valInput->firstName=$_POST['firstName'];

哪个工作正常,但我有近15个变量,所以这个方法在代码方面似乎有点冗长?我知道我可以在$ _POST变量上使用foreach,但这显然不太安全。

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使用循环,如下所示:

foreach($_POST as $key => $val)
{
    // Instead of blindly adding anything that was posted we make sure a property exists 
    // in $valInput that matches the name of the posted value.
    if (property_exists($valInput, $key))
    {
        $valInput->$key = $val;
    }
}

它仍然安全,因为您检查$valInput中已存在与已发布变量同名的属性。这意味着将跳过$valInput中未定义的任何内容。

如果您只希望能够编辑某些属性而不能编辑其他属性,那么您可以使用公共声明和私有声明来确定哪些属性可以从类外部访问。

如果这仍然不够,即你想从外部访问一些但不可编辑,那么你可以使用数组来存储可编辑的变量白名单,例如:

$whitelist = array('foo', 'bar');
foreach($_POST as $key => $val)
{
    if (property_exists($valInput, $key) && in_array($key, $whitelist))
    {
        $valInput->$key = $val;
    }
}

或者更好的选择是使用getter和setter,只为那些你想要访问的人创建setter。

class fooBar {
    private $foo;
    private $bar;

    /**
     * @return mixed
     */
    public function getFoo()
    {
        return $this->foo;
    }

    /**
     * @return mixed
     */
    public function getBar()
    {
        return $this->bar;
    }

    /**
     * @param mixed $bar
     */
    public function setBar($bar)
    {
        $this->bar = $bar;
    }

}

这样人们就可以访问foobar,但只能设置bar。然后你将foreach改为

foreach($_POST as $key => $val)
{
    // We add set to the name as we're checking for a set method
    $key = 'set'.ucfirst($key);
    if (method_exists($valInput, $key))
    {
        $valInput->$key($val);
    }
}

答案 1 :(得分:0)

检查这个

$exclude = array('submit', 'lastname'); // fields to exclude from $_POST array

$valInput = new stdClass(); // empty object

foreach ($exclude as $val) {
    unset($_POST[$val]); // remove unnecessary fields 
}

foreach ($_POST as $key => $val) {
    $valInput->$key = $val; // assign value to object
}

如果您想选择特定字段,请尝试

$include = array('title', 'firstname'); // fields to include from $_POST array

$valInput = new stdClass(); // empty object

foreach ($include as $key => $val) {
    if (isset($_POST[$val])) {
        $valInput->$val = $_POST[$val]; // assign value to object
    }
}

答案 2 :(得分:0)

您可以遍历对象属性并检查POST数组中是否存在相应的键:

<?php

class Foo
{
    public $foo;
    public $bar;
    public $baz;
    private $bat;
}

$array = array('foo' => 'big', 'bar' => 'fat', 'baz' => 'momma', 'bat' => 'man');

$foo = new Foo;
foreach($foo as $key => $val) {
    if(isset($array[$key])) $foo->$key = $array[$key];
}

var_dump($foo);

输出:

object(Foo)[1]
  public 'foo' => string 'big' (length=3)
  public 'bar' => string 'fat' (length=3)
  public 'baz' => string 'momma' (length=5)
  private 'bat' => null