【问题标题】:Fatal error: Call to undefined method connectDB::prepare()致命错误:调用未定义的方法 connectDB::prepare()
【发布时间】:2017-06-10 19:35:46
【问题描述】:

我尝试使用 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);

?>

【问题讨论】:

  • 您的 DBConnect 类中没有prepare 方法!!!!
  • MYSQLI 扩展有一个非常好的 OO 访问方法。您只会使尝试重新包装自己的事情复杂化
  • 这是一条免费的建议:停止为连接抽象制作包装器。他们毫无意义。另外,请阅读有关依赖注入的信息。哦..不要称他们为“模特”。你所拥有的只是active record 的即兴创作。

标签: php mysql mysqli


【解决方案1】:

你的误解是这样的:

    return $this->sql;

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

【讨论】:

    【解决方案2】:

    您的 connectDB 类没有拥有名为 prepare() 的方法。

    您可能正在尝试调用$this-&gt;db-&gt;sql-&gt;prepare(),因为在connectDB 中,您将实际的数据库连接存储到$this-&gt;sql。但是,由于$sql 属性是private,因此您不能这样做。

    您要么需要将$sql 设为public 属性,要么在connectDB 类中创建一个方法来充当代理。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 2020-02-23
      • 2015-01-28
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多