2017-08-06 149 views
-1

无论我试图修复它们多少,我都会遇到这些问题。 我正在处理Html可视化编辑器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

'对不起,长头衔哈哈。我讨厌告诉你,但那个完全可怕的头衔会杀死你的问题。它要么被低估并关闭(并最终被删除),否则将被忽略。努力写出一个有意义的标题来真正解释你的问题,或者期望遇到问题。这次你可能会得到一个答案,但它会在未来的事件中给你带来问题 – psubsee2003

+0

对此很抱歉。 –

回答

1

错误消息很明显。您应该学会阅读错误消息,处理错误消息,并根据错误消息采取行动。

call_user_func_array()预计参数1是一个有效的回调,第一阵列构件是不是有效的类名或布尔

的第一部分对象 呼叫一个成员函数执行()错误_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)); 

错误的下一个部分 - 第一个数组成员不是有效的类名称或对象。调用布尔型上的成员函数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中的值不是一个有效的查询,并且是罪魁祸首。

+0

谢谢,解决了我的错误。 –

+0

一定要检查我最后一句话:真正的问题是'$ query'无效。我会鼓励你弄清楚为什么/如何发生,并防止_that_ –

相关问题