繁体   English   中英

动态准备语句,PHP

[英]Dynamic prepared statement, PHP

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

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

$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()

知道我在做什么错吗?

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

  1. ? :Placeholders替换为?
  2. 调用bind_param并用call_user_func_array提供mysqli_stmt期望的动态引用。

这是创建动态绑定的代码:

            $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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM