从页面上调用的对象访问$ _POST数组

时间:2011-06-30 02:19:43

标签: php

我有一个页面从表单接收POST数据。我还有一个表单验证类,它在页面上创建FormValidation对象时尝试访问$ _POST数组。但是,FormValidation对象似乎无法访问$ _POST数组。为什么会发生这种情况,我该如何解决这个问题?

编辑:添加代码:)

此代码来自register.php

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
var_dump($_POST);

$errors = validate_form();

if(count($errors) > 0)
{
    display($errors);
}
else
{
    act();
}
}
else
{
display();
}

function validate_form()
{
$validator = new FormValidation('POST');

$validator->add_field('first_name', 'First Name');
$validator->add_field('last_name', 'Last Name');
$validator->add_field('email_address', 'Email Address');
$validator->add_field('password', 'Password');
$validator->add_field('password_confirmation', 'Password Confirmation');

$validator->add_rule('first_name', 'required');
$validator->add_rule('last_name', 'required');
$validator->add_rule('email_address', 'required');
$validator->add_rule('email_address', 'is_valid_scarsdaleschools_email');
$validator->add_rule('password', 'required');
$validator->add_rule('password_confirmation', 'required');
$validator->add_rule('password_confirmation', 'matches', array('password', 'Password'));


return $validator->validate();
}

表单验证代码如下所示

class FormValidation
{
var $fields;
var $rules; //Associative array that maps field_name to array of rules
var $errors;

var $form_method_type;

function FormValidation($form_method_type)
{
    $this->form_method_type = strtoupper($form_method_type);

    $this->fields = array(); //maps fields to field labels
    $this->rules = array();
    $this->errors = array();
}

function validate() 
{   
    foreach(array_keys($this->fields) as $field_name)
    {
        if(!array_key_exists($field_name, $this->rules))
        {
            continue;
        }
        foreach(array_keys($this->rules[$field_name]) as $rule_name)
        {
            call_user_func_array(array($this, $rule_name), $this->rules[$field_name][$rule_name]);
        }
    }

    return $this->errors;
}

function add_field($field_name, $field_label)
{
    $this->fields[$field_name] = $field_label;
}

function add_rule($field_name, $rule_name, $parameters=array())
{                                                           
    if(!isset($this->rules[$field_name]))
    {
        $this->rules[$field_name] = array();
    }

    array_unshift($parameters, $field_name, $this->fields[$field_name]);
    $this->rules[$field_name][$rule_name] = $parameters;
}

function var_isset($field_name)
{
    global ${'$_' . $this->form_method_type};
    var_dump(${'$_' . $this->form_method_type}[$field_name]);
    return isset(${'$_' . $this->form_method_type}[$field_name]);
}

function get_value($field_name)
{
    global ${'$_' . $this->form_method_type};
    return ${'$_' . $this->form_method_type}[$field_name];
}

    ////////////////////////////////////////////////////////////
/////RULES//////////////////////////////////////////////////
////////////////////////////////////////////////////////////

function required($field_name, $field_label)
{
    if(!$this->var_isset($field_name))
    {
        $this->errors[$field_name] = "$field_label is a required field";
    }
}

function is_valid_email($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!validEmail($this->get_value($field_name)))
        {
            $this->errors[$field_name] = "$field_label requires a valid email address";
        }
    }
}

function is_alpha($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!ctype_alpha($this->get_value($field_name)))
        {
            $this->errors[$field_name] = "$field_label requires alphabetical characters only";
        }
    }
}

function is_alphanumeric($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!ctype_alnum($this->get_value($field_name)))
        {
            $this->errors[$field_name] = "$field_label requires alphanumeric characters only";
        }
    }
}

function is_integer_number($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!is_int($this->get_value($field_name)) || preg_match('[-+]?[0-9]+', $this->get_value($field_name)) == 0)
        {
            $this->errors[$field_name] = "$field_label must be an integer";
        }
    }
}

function is_float_number($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!is_float($this->get_value($field_name)) || preg_match('[-+]?[0-9]*\.?[0-9]+', $this->get_value($field_name)) == 0)
        {
            $this->errors[$field_name] = "$field_label must be a number";
        }
    }
}

function is_valid_scarsdaleschools_email($field_name, $field_label)
{
    if($this->var_isset($field_name))
    {
        if(!validEmail($this->get_value($field_name)))
        {
            $this->errors[$field_name] = "$field_label requires a valid email address";
        }

        $email = $this->get_value($field_name);

        if(!(endsWith($email, 'scarsdaleschools.org', $case=false) || endsWith($email, 'scarsdaleschools.com', $case=false) || endsWith($email, 'scarsdaleschools.k12.ny.edu', $case=false)))
        {
            $this->errors[$field_name] = "$field_label requires a Scarsdale Schools email address";
        }
    }
}

function max_length($field_name, $field_label, $max_length)
{
    if($this->var_isset($field_name))
    {
        if(strlen($this->get_value($field_name)) > $max_length)
        {
            $this->errors[$field_name] = "$field_label cannot be longer than $max_length characters";
        }
    }
}

function min_length($field_name, $field_label, $min_length)
{
    if($this->var_isset($field_name))
    {
        if(strlen($this->get_value($field_name)) > $min_length)
        {
            $this->errors[$field_name] = "$field_label must be at least $min_length characters";
        }
    }
}

function matches($field_name, $field_label, $match_field_name, $match_field_label)
{
    if($this->var_isset($field_name) && !$this->var_isset($match_field_name))
    {
        $this->errors[$field_name] = "$field_label must match $match_field_label";
    }
    elseif(!$this->var_isset($field_name) && $this->var_isset($match_field_name))
    {
        $this->errors[$field_name] = "$field_label must match $match_field_label";
    }
    if($this->var_isset($field_name) && $this->var_isset($match_field_name))
    {
        if(strcmp($this->get_value($field_name), $this->get_value($match_field_name)) != 0)
        {
            $this->errors[$field_name] = "$field_label must match $match_field_label";
        }
    }
}
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我们还没有看到任何代码发布,但我会建议使用依赖注入将$_POST数据放入表单验证类,而不是从类内部访问超全局。< / p>

由于在测试代码时无法始终依赖$_POST正确填充,因此建议将$_POST的内容作为参数注入到类的构造函数中将会被使用。这使以后更容易调试。

class MyClass {
  // Public property to hold post array data 
  public $postdata;

  // constructor receives $_POST as a parameter
  function __construct($param1, $param2, $postdata) {
    //
    $this->postdata  = $postdata;
  }
}

// Instantiate the class with $_POST injected
$x = new MyClass($a, $b, $_POST);
代码发布后

ADDENDUM

我没有在您的类中看到任何在验证时实际调用get_value()方法的方法。目前还不清楚您是否曾在$_POSTvar_isset()方法中访问该类中的get_value()内容。

答案 1 :(得分:1)

您的代码中存在一个小错误。你写的内容基本上是$$_POST。您需要从变量名中删除额外的美元符号(下面的更正方法)。此外,您无需担心调用global $_POST;,因为$ _POST是超全局或自动全局。

更新:通过$_POST检索${'_' . $this->form_method_type}似乎不起作用。我发给你的代码在班级外面工作,但不在里面。我想确保你理解我的发现和区别。所以虽然$ {'_'。 $ formMethodType}在类之外工作,你必须使用这样的东西:

const TYPE_POST = 'POST';
const TYPE_GET = 'GET';
const TYPE_SESSION = 'SESSION';
const TYPE_SERVER = 'SERVER';
const TYPE_REQUEST = 'REQUEST';

public $fields = array();
public $rules = array();
public $errors = array();

public function __construct($formMethodType)
{
    $r = new ReflectionClass($this);
    $constants = $r->getConstants();

    $formMethodType = strtoupper($formMethodType);
    if (!array_key_exists('TYPE_' . $formMethodType, $constants)) {
        throw new InvalidArgumentException('Could not find type matching $formMethodType : ' . $formMethodType);
    }
    $this->form_method_type = $formMethodType;
}

public function var_isset($field_name)
{
    $values = $this->get_values();
    var_dump($values[$field_name]);
    return isset($values[$field_name]);
}

public function get_value($field_name)
{
    $values = $this->get_values();
    return $values[$field_name];
}

public function get_values()
{
    switch ($this->form_method_type) {
        case self::TYPE_POST:
            $values = $_POST;
            break;
        case self::TYPE_GET:
            $values = $_GET;
            break;
        case self::TYPE_REQUEST:
            $values = $_REQUEST;
            break;
        case self::TYPE_SERVER:
            $values = $_SERVER;
            break;
        case self::TYPE_SESSION:
            $values = $_SESSION;
            break;
    }
    return $values;
}

答案 2 :(得分:0)

/**
 * This should work for $_REQUEST and $_POST the mysql_real_escape_string
 * was added to escape urls. It is best not to allow URLs as parameters.
 */
foreach( $_POST as $key=> $val)
{
  ${$key} = mysql_real_escape_string($val);
}