动态预处理语句,PHP

时间:2015-05-12 19:01:28

标签: php mysql prepared-statement

我几乎检查了所有产生相同错误的问题,但所有这些问题都以某种错误的方式绑定了参数。也许而且很可能我也错误地绑定了params虽然我的情况不同,因为我有动态查询。

我正在从正在创建的输入中动态创建查询。但问题来自$stmt->bind_param循环内的foreach语句。这是我的错误代码片段:

$query = "UPDATE users SET";
        foreach($updationFields as $field => $value){
            if($value != "-"){
                $query = $query. " " . $field . " = :".$field.",";
            }
        }
        $query = rtrim($query, ",");
        $query = $query . " WHERE UserId = :UserId";

        $stmt = $this->conn->prepare($query);
        foreach($updationFields as $field => $value){
            echo $field;
            if($value != "-"){
                $input = ":".$field;
                $stmt->bind_param($input, $value); // This line produces error
            }
        }
        $stmt->bind_param(":UserId", $userId);

        $stmt->execute();      

这是为一个字段生成动态“字符串查询”:

UPDATE users SET fullName = :fullName WHERE UserId = :UserId

错误说:致命错误:在

中的非对象上调用成员函数bind_param()

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

正如@ Fred-ii-和@commorrissey :Placeholder所指出的那样,PDO不支持mysqli,所以我不得不这样做:

  1. :Placeholders替换为?
  2. 调用bind_paramcall_user_func_array按照mysqli_stmt的预期提供动态参考。
  3. 以下是创建动态绑定的代码:

                $params = array();//
                $params[] = $type;
                $i=0;
                foreach($updationFields as $field => $value){
                    if($value != "-"){
                        $bind_name = 'bind' . $i;
                        $$bind_name = $value;
                        $params[] = &$$bind_name;
                        $i++;
                    }
                }
                $bind_name = 'bind' . $i;
                $$bind_name = $userId;
                $params[] = &$$bind_name;
    
                $return = call_user_func_array(array($stmt,'bind_param'), $params);