在php中调用未定义的方法

时间:2017-06-27 03:22:27

标签: php oop pdo error-handling

这是我的 config.php

  <?php

    define('DB_HOST', 'localhost');
    define('DB_NAME', 'xxxx');
    define('DB_USER', 'xxxx');
    define('DB_PASS', 'xxxx');
    ?>

DB.php

    <?php 
include 'config.php';


class DB {
    public static $pdo;

    public static function connection(){

        if (!isset(self::$pdo)) {

            try {

            self::$pdo = new PDO('mysql:host='.DB_HOST.'; dbname ='.DB_NAME,DB_USER, DB_PASS);
            }catch(PDOException $e){
                echo $e->getMessage();
            }

        }
        return self::$pdo;
    }


    public static function prepareOwn($sql){

        return self::connection()->prepare($sql);
    }
}



 ?>

第三个文件是 Student.php

<?php 
    include 'DB.php';



    class Student {
        public $table = 'student_info';

        public function readAll(){
            $sql = "SELECT * FROM $this->table";

            $stmt = DB::prepareOwn($sql);
            $stmt->execute();
            return $stmt->fetchAll();
        }   
    }
 ?>

但是当我尝试使用spl_autoload_register()从index.php访问 readAll()时,我可以看到致命错误:调用未定义的方法DB :: prepareOwn()

任何人都可以帮我解决问题吗?

非常感谢。 Sahidul

2 个答案:

答案 0 :(得分:1)

我将您的代码复制到我的代码中并看到了您的错误。但正如我猜测的那样,首先你会在db.php中找到这行错误:

return self::$pdo->prepare($sql);
  

致命错误:在null

上调用成员函数prepare()

准备功能来自哪里? $ pdo只是这个类中的一个静态属性,它没有一个名为prepare的函数!修好这一行

<强>更新
问题是你忘了在prepareOwn中调用连接方法。所以你的新prepareOwn函数应该是:

public static function prepareOwn($sql) {
    self::connection();
    return self::$pdo->prepare($sql);
}

答案 1 :(得分:0)

我希望这段代码适合你

class MySQLDatabase {

    // Class attributes
    private $host_name = "localhost";
    private $database_name = "XXXXXXX";
    private $database_username = "XXXXXXX";
    private $database_password = "XXXXXXX";
    private $is_connected;
    private $connection;

    private $statement ;


    // construct
    public function __construct() {

        $this->open_connection();

    }// End of construct

    // connection method
    public function open_connection() {

        try {
            $this->is_connected = TRUE ;
            // PDO Connection
            $this->connection = new PDO("mysql:host=".$this->host_name.";dbname=".$this->database_name.";charset=utf8",$this->database_username,$this->database_password);
            // Error reporting
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE);

        } catch(PDOException $errors) {

          $this->is_connected = FALSE ;

          self::catch_errors($errors);
        }



    }// End of open connection method

    // Get connection method
    public function connection(){
        return $this->connection ;
    }

    // Close connection method
    public function close_connection() {

        $this->connection = null;

    }// End of close connection method

    private static function catch_errors($errors) {
        echo("<h4><p>" . $errors -> getMessage() . "</p></h4>");
        die();
    }


    // query method

    public function query($sql){

    return $this->statement = $this->connection->prepare($sql);

    }




}// End of database class

$database = new MySQLDatabase();





    class Student {

        protected static $table = 'My_table';

        public function readAll(){
            global $database;       
            try{

                $sql = "SELECT * FROM ". self::$table;
                $stmt = $database->query($sql);
                $stmt->execute();
                return $stmt;

            }catch(PDOException $error){

                echo("<h4><p>" . $errors -> getMessage() . "</p></h4>");
                die();

            }

        }   
    }
    $c = new Student();     
    $s = $c->readAll();
    $stmt = $s->fetchAll(PDO::FETCH_ASSOC); 

    foreach($s as $v){

        var_dump($v);

    }