PHP未捕获错误:在null上调用成员函数query(),

时间:2017-12-06 10:27:40

标签: php

我正在研究php并尝试将它与oop集成在一起,有人可以解释这个错误的想法吗?

因为我猜它找不到查询,但我无法理解,因为在$query中一切都是正确的,ps global $mysqli仅用于测试目的,我知道使用它粗心大意。

    <?php 

class Index{
    public function connect(){
    $mysqli=new mysqli();
    $mysqli->connect('localhost',"root","");
    $conn=$mysqli->select_db("webartisan");

    if($mysqli->errno){
    echo "Unable to connect to the database: ".$mysqli->error;
    exit();
    }
 }
public function select_data($table,$id){
    $query="SELECT * FROM {$table} WHERE id=$id  ";
    }
    public function insert_data(){
        global $conn;
        $username=$_POST['username'];
        $password=$_POST['password'];
        $query="INSERT INTO artisan(username,password) VALUES('$username','$password')";

        $result=$conn->query($query);

        if($result->num_rows){
            return true;
        }
    }
    public function register(){
        if(isset($_POST['submit'])){
            self::insert_data();
        }
    }   
}
$index=new Index();
$index->register();
?>

<form method="POST" action="index.php">
    <input type="text" name="username"><br><br>
    <input type="password" name="password"><br><br>
    <input type="submit" name="submit">

</form>

错误:

  

致命错误:未捕获错误:在null上调用成员函数query()   在C:\ xampp \ htdocs \ webartisan \ index.php:23堆栈跟踪:#0   C:\ xampp \ htdocs \ webartisan \ index.php(31):Index-&gt; insert_data()#1   C:\ xampp \ htdocs \ webartisan \ index.php(36):Index-&gt; register()#2 {main}   在第23行的C:\ xampp \ htdocs \ webartisan \ index.php中抛出

1 个答案:

答案 0 :(得分:3)

$conn变量无法作为全局变量访问,因为您在$conn方法中将connect()声明为局部变量。

要解决此问题,您需要声明为类字段,然后您可以在类$conn的任何方法中访问$this->conn Index。这样您就不需要global $conn

例如:

<?php
class Index{
    private $conn;

    public function connect() {
        ...
        $this->conn = $mysqli->select_db("webartisan");
        ...
    }

    public function insert_data() {
        ...
        $result = $this->conn->query($query);
        ...
    }    
}

<强>更新

select_db()返回布尔值,而不是连接对象。如您在评论中所述,以下行会导致Call to a member function query() on boolean错误。

$this->conn = $mysqli->select_db("webartisan");

您应该阅读mysqli documentation