在调用insert()之前验证/验证数据

时间:2012-07-04 21:47:17

标签: php mysql zend-framework

我正在使用Zend的insert()函数在数据库表中插入记录。 例如。 从数据库模型对象,我调用Zend_Db_Table's insert()函数并将传入的数据作为数组传递 - $data,即

 $this->insert($data);

$data是一个数组。 $data的内容是混合数据类型 - 整数,金钱,文本等。

为了验证传入的$data数组,我编写了一个函数verifyData($data)

private function verifyData(&$data) {
    //Trim whitespace characters from incoming data.
    foreach($data as $key => $val)
    {
        $data[$key] = trim($val);
        if(empty($data[$key])) {
            unset($data[$key]);
        }
    }

    //Checking for not null table columns
    if( empty($data['id']) || empty($data['name']) || empty($data['age'])) {
        error_log("One of the required fields is missing");
        return false;
    }
    else {
        return true;
    }
}

如上所述,此功能:

  1. 修剪传入的数据并取消设置$ data数组中的任何字段(如果它们为空)。
  2. 然后此函数检查是否存在必填字段,如果缺少任何必填字段,则返回false。在此特定定义中,需要id,name和age。但是,我可能还需要其他非必填字段进行验证。例如$ data ['salary']
  3. 我需要帮助/建议,以上述功能/以任何其他方式添加以下验证:

    1. 我想检查数组中每个元素的数据类型是否符合预期/在插入数据之前将其转换为特定的数据类型。
    2. 我想转换/处理传入的数据,以便处理任何SQL注入威胁。
    3. 处理数据类型检查的一种方法是循环传入数据数组并将特定列值转换为其数据类型并进行验证。但我想知道是否有任何有效/标准的方法来实现上述两点。

      一个示例场景是,例如在我的webform上,当新人被添加到db时,我需要输入名称,年龄和薪水,其中名称和年龄是强制性的。年龄和薪水应仅作为整数输入。我想在php级别实现这个限制,我正在使用Zend Framework。

      非常感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:1)

一种简单的启动方式可能是Zend_filter_Input,它使用Zend_Validation和Zend_Filter对数据集应用过滤和验证。

//A simple exaample of how you might use Zend_Filter_Input
private function verifyData(&$data) {
    //Add any filters you want there are many standard filters, order of filters may matter
    $filters = array(
        '*' => 'StringTrim', //trim all fields
        'id' => 'Digits'     //filter for digits on id field
    );
    //add any validators you want there are many standard validators, order of validators may matter
    $validators = array(
        '*' => 'NotEmpty' //check all fields for empty()
    );
$input = new Zend_Filter_Input($filters, $validators, $data) {
    if ($input->isValid() {
       return TRUE;
    } else {
       return FALSE
    }    
}

毋庸置疑这是一个不完整的例子,说明这是如何运作的,但它应该给你基本的想法。有许多不同的方法可以完成验证,找到一个你喜欢的方法并去寻找它。

我个人最喜欢的是在输入阶段(表单,控制器......)进行基本的过滤和验证,然后在将数据发送到要插入的映射器之前在域模型中应用任何其他过滤或验证数据库。

祝你好运......

Standard Filters
Standard Vaildators

答案 1 :(得分:0)

insert应该已经处理了您可能遇到的任何SQL注入问题。至于类型检查和转换,PHP中有几种方法可用。例如,检查并转换为int

if(ctype_digit($something)) {
    $something = (int)$something;
}

这实际上取决于您需要的具体验证。