致命错误:调用未定义的方法connectDB :: prepare()

时间:2017-06-10 19:35:47

标签: php mysql mysqli

我尝试使用connectDB类连接MySQL数据库进行简单的CRUD。然后,当我尝试执行RecipesModel类的delRecipe方法时,系统会显示错误。

  

致命错误:调用未定义的方法connectDB :: prepare()

调用方法prepare()的正确方法是什么?为什么不被认可?

这是connectDB的代码(文件connectDB.php)

class connectDB {

    private $address='localhost';
    private $db_name='db-name';
    private $user='root';
    private $pswd='psswd';

    private $sql;

    public function __construct() {
        $this->sql = new mysqli($this->address,$this->user,$this->pswd,$this->db_name);
        if (mysqli_connect_error()) {
            die('Error de Conexion: '. mysqli_connect_errno().' - '.mysqli_connect_error());
        }
        return $this->sql;
    }

    public function __destruct() {
        if(!mysqli_close($this->sql)) {
            die('ERROR!:'.$this->sql->error);
        }
    }

    public function execute($query) {
        $res = $this->sql->query($query);
        if ($res) {
            return $res;    
        }
        else {
            die('ERROR!:'.$this->sql->error);
        }
    }
}

删除该行的类。

<?php
require_once('connectDB.php');

class RecipesModel {

    private $db;

    public function __construct() {
        $this->db = new connectDB();
    }

    public function delRecipe($id) {
        if (is_numeric($id)) {
            $sql = 'DELETE FROM t_platos WHERE ID_pl= ?';
            $this->db->prepare($sql);
            return $this->db->execute(array($id));
        }
    }
}

$recipe = new RecipesModel();
$res = $recipe->delRecipe(1);

?>

2 个答案:

答案 0 :(得分:1)

你的误解是这样的:

    return $this->sql;

你不能在构造函数中return选择一些东西。构造函数返回的值始终是该类的对象实例。

答案 1 :(得分:0)

您的connectDB课程没有名为prepare()的方法。

您可能正在尝试拨打$this->db->sql->prepare(),因为在connectDB中您将实际的数据库连接存储到$this->sql。但是,由于$sql属性为private,因此您无法执行此操作。

您需要将$sql设为public属性,或在connectDB课程中创建一个方法作为代理。