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

Php 在调用insert()之前验证/验证数据,php,mysql,zend-framework,Php,Mysql,Zend Framework,我正在使用Zend的insert()函数在数据库表中插入记录。 如。 从数据库模型对象,我调用Zend\u Db\u表的insert()函数,并将传入数据作为数组传递-$data,即 $this->insert($data); $data是一个数组。$data的内容是混合数据类型-整数、货币、文本等 为了验证传入的$data数组,我编写了一个函数,verifyData($data) 如上所述,此函数: 修剪传入数据并取消设置$data数组中的任何字段(如果为空) 然后该函数检查是否存在

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

 $this->insert($data);
$data
是一个数组。
$data
的内容是混合数据类型-整数、货币、文本等

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

如上所述,此函数:

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

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

    例如,在我的webform上,当新员工被添加到db中时,我需要输入姓名、年龄和薪水,其中姓名和年龄是必填项。年龄和工资只能作为整数输入。我想在php级别实现这个限制,我正在使用Zend框架


    任何帮助/建议都将不胜感激。

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

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

    这实际上取决于您需要的特定验证。

    一个简单的开始方法可能是,使用Zend_验证和Zend_过滤器对数据集应用过滤和验证

    //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
        }    
    }
    
    不用说,这是一个不完整的例子,说明了它是如何工作的,但它应该给你一个基本的想法。有许多不同的方法来完成验证,找到一种你喜欢的方法并付诸实践。

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

    祝你好运



    你被困在哪里?你尝试过什么?如果你想知道如何调整你现有的函数,至少你必须展示该函数的代码。僵尸猎人和杰伦:如果不清楚,很抱歉。我现在更新了我的问题。感谢minitech。我同意一种方法是检查特定数据类型的特定字段。但是,如果一个表中有太多列,我希望找到更好的解决方案来执行上述操作,而不是按顺序检查每个列。
    //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
        }    
    }