mysqli $ stmt - call_user_func_array期望参数1是有效的回调

时间:2017-08-06 20:33:51

标签: php mysql

无论我多么努力解决这些问题,我都遇到了这些问题。 我正在研究Html Visual Editor CMS,每次登录这些错误时都会显示。 希望这篇文章清晰易懂。如果不是问我,我会尽力回答你。 以下是错误:

call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object
Call to a member function execute() on boolean

以下是代码:

class database{
    public $root_db = 'cms';
    public $server_name = 'localhost:3306';
    public $root_db_user = 'root';
    public $root_db_pass = '';
    public $connection;
    public $error = false;

    function connect_to_db(){
        $this->connection = new mysqli($this->server_name,$this->root_db_user,$this->root_db_pass,$this->root_db);

        if($this->connection->connect_error){
            $this->error = "Connection Failed: " . $this->connection->connect_error;
        }
    }

    function executeCleanQuery($query,$params){
        $type_string = '';
        $param_arr = array();

        if(!empty($params)){
            for($i = 0; $i < count($params); $i++){
                $type = gettype($params[$i]);
                $type_string .= $type[0];

                $param_arr[$i] = $this->connection->real_escape_string(htmlentities($params[$i]));
            }

            array_unshift($param_arr,$type_string);

            if(!$stmt = $this->connection->prepare($query))
                $error = "Unable to prepare statement";

            call_user_func_array(array($stmt,"bind_param") ,$this->refValues($param_arr));

            if (!$stmt->execute())
                $error = "Unable to execute statement";

            $result = $stmt->get_result();

            if($result && (strstr($query,"SELECT") || strstr($query,"select")))
                return $result->fetch_all(MYSQLI_ASSOC);
            else{
                return $this->connection->insert_id;
            }
        }else if(strstr($query,"SELECT") || strstr($query,"select")){
            $result = $this->connection->query($query);
            return $result->fetch_all(MYSQLI_ASSOC);
        }else{
            return true;
        }
    }

    function refValues($arr){
        if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
        {
            $refs = array();
            foreach($arr as $key => $value)
                $refs[$key] = &$arr[$key];
            return $refs;
        }
        return $arr;
}
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

错误消息很明确。您应该学会阅读错误消息,处理它们并对错误消息采取行动。

  

call_user_func_array()期望参数1是有效的回调,第一个数组成员不是有效的类名或对象   在布尔值

上调用成员函数execute()

错误的第一部分_call_user_func_array()_告诉您确切找到错误的位置。鉴于您的代码,它只能在下面指定的行上(虽然错误消息也包括行号,因此使用行号也很有用):

if(!$stmt = $this->connection->prepare($query))
    $error = "Unable to prepare statement";

// this is the only "call_user_func_array" in your code, so must be the issue
call_user_func_array(array($stmt,"bind_param"), $this->refValues($param_arr));

错误的下一部分 - 第一个数组成员不是有效的类名或对象。调用boolean 上的成员函数execute()会告诉您具体的,array( $stmt, "bind_param" )不是有效函数,因为$stmt是布尔值。

抛出的原因是因为虽然您检查了$stmt是否已设置,但如果未设置,则实际上不会阻止继续操作。

虽然是一个“创可贴”解决方案来演示如何处理它(一个强大的解决方案将包括更好的错误处理),如果你改变你的代码,你可以解决这个问题:

if( ! $stmt = $this->connection->prepare( $query ) )
    $error = "Unable to prepare statement";
    // stop here, $stmt is not set, cannot continue
    die();
}

call_user_func_array(array($stmt,"bind_param"), $this->refValues($param_arr));

最后,要贯彻为什么发生此错误 - 几乎可以肯定$query中的值不是有效查询,而且是罪魁祸首。