绑定PDO的参数数量无效

时间:2015-05-28 07:41:28

标签: php mysql pdo

我正在使用这个项目的教程,但是我正在尝试扩展材料中提供的内容。我试图使用一个函数,在绑定值之前创建查询,以创建一个超过3个WHERE值的查询。

以下是代码:

private function action($action, $table, $where = array()){
    $operators = array('=', '>', '<', '>=', '<=' , 'AND' ,'OR', 'LIKE', 'GROUP BY','ORDER BY', 'ASC', 'DESC');
if(!empty($where)){
    $sql = "{$action} FROM {$table} WHERE ";
    if(count($where) > 3){
            $isVal = FALSE;
            $values = '';
            foreach ($where as $value) {
                    switch(trim($value)){
                        case '=':
                        case '>':
                        case '<':
                        case '>=':
                        case '<=':
                            $sql .= "{$value}";
                            $isVal = true;
                        break;
                        default:
                            if($isVal){
                                $sql .= " ? ";
                                $values .= $value;
                                $isVal = false;
                            }else{
                                $sql .= "{$value}";
                            }
                        break;
                    }

            }

        if(!$this->query($sql, $values)->error()){return $this;}

  /////////////////////////////////////////
 // From this point down everything works!!!
 ////////////////////////////////////////////
    }else if(count($where) === 3){
        $field      = $where[0]; 
        $operator   = $where[1];
        $value      = $where[2];
        if(in_array($operator, $operators)){
            $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; // NO $value ?
            if(!$this->query($sql, array($value))->error()){return $this;}
        }
    }
}else{
    // If array is empty
    $sql = "{$action} FROM {$table}";
    if(!$this->query($sql)->error()){return $this;}
}
return FALSE;
}

嵌套的Else IF语句读取计数($ where)=== 3的部分工作正常,但是第一个嵌套的IF'计数($ where&gt; 3)`会抛出错误。

我正在尝试找到一种方法来正确设置它,以便我可以使用多于3的值。

此处还有我的查询活页夹:

public function query($sql, $params = array()){
        $this->_error = FALSE;
        if($this->_query = $this->_pdo->prepare($sql)){
            $x = 1;
            if(count($params)){
                foreach($params as $param){
                    $this->_query->bindValue($x, $param);
                    $x++;
                }
            }// End IF count    

            if($this->_query->execute()){
                    $this->_lastID = $this->_pdo->lastInsertId();
                    try{
                        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                    }catch(Exception $e){
                        // Catch Error
                    }
                    $this->_count = $this->_query->rowCount();
            }else{

                $this->_error = TRUE;}
        }
        return $this;
    }

如果有人能帮我解决这个问题,我将非常感激......谢谢!

1 个答案:

答案 0 :(得分:0)

这里有一些问题,例如:

    第一个方法中的
  1. $values是一个连接字符串。将它转换为数组将为您提供一个包含1个元素的数组,这不是您需要的。您需要一个包含所有值的数组,例如$values[] = $value;而不是$values .= $value;
  2. 当您尝试添加ORAND语句的组合时会遇到问题,因为使用括号进行分组会产生很大的不同。
  3. 您正在为值使用预准备语句,但没有检查列名以防止sql注入。你应该在那里使用白名单。