无论我多么努力解决这些问题,我都遇到了这些问题。 我正在研究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;
}
}
提前致谢。
答案 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
中的值不是有效查询,而且是罪魁祸首。