试图在PDO之上定义一个模型类,结果失败了


Trying to define a model class on top of PDO and failing big time

我正在尝试用纯php构建一个看似简单的小型应用程序(不能使用任何框架或花哨的工具,如orms)。

我从定义代表我的模型的对象开始。我的想法是有一个Model基类,它将包含一个访问数据库的静态pdo实例,以及从中继承并实现所需自定义方法的两个"具体"模型类。

天啊,我是不是对PHP生疏了。这也是我第一次用它做真正的oop(我在其他语言(主要是C#和python)中已经做了足够多了),以了解它应该如何工作,但有些微妙之处可能我很难理解

如果有人愿意帮忙,以下是我迄今为止所拥有的:

<?php
/**
 * Base model class, handling basic db connection
 */
Class Model {
    protected static $db;
    public static function initDb() {
        self::$db = new PDO(DB_CONNECTION_STRING, DB_USER, DB_PSWD);
    }
    protected function _prepare_request($sqlstmnt) {
        return self::$db->prepare($sqlstmnt);
    }
}
Model::initDb();
/**
 * Model class for Category objects
 **/
Class Categorie extends Model {
    private $request_getSingle = NULL;
    public function __contruct() {
        $this->request_getSingle = $this->_prepare_request(
            "SELECT * FROM categorie WHERE cat_id = :id;"
        );
    }   
    public function getById($id) {
        $poop = $this->request_getSingle->execute(array(':id' => $id));
        $res = $poop->fecthAll();
        print_r($res);
    }
}
// Debug tests:
$c = new Categorie();
var_dump($c);
$c->getById('1');
print_r($c);
echo 'done';
?>

我的查询对象似乎没有正确初始化——以下是我运行愚蠢的调试代码时得到的结果:

object(Categorie)#3 (1) { ["request_getSingle":"Categorie":private]=> NULL } 
Fatal error: Call to a member function execute() on a non-object in /home/raphi/dev/naoned-test/models/categories.php on line 18 
Call Stack: 
    0.0003 648192 1. {main}() /home/raphi/dev/naoned-test/models/categories.php:0 
    0.0011 661784 2. Categorie->getById() /home/raphi/dev/naoned-test/models/categories.php:27

我不知道到底出了什么问题。我可能错误地使用了静态变量,或者遗漏了PDO的工作原理。

希望这一点足够清楚,并感谢任何愿意提供帮助的人(由于周围的无助黑客攻击,可能会出现一些愚蠢的错误)。

编辑:经过黑客攻击,事实证明,如果我在getById中调用PDO prepare、execute等方法,一切都会很好。但是,为什么我不能将准备好的SQL语句作为实例变量?每次我想访问它时都必须调用prepare,这似乎违背了它的目的。。。

编辑:好这似乎是固定的,但我仍然不明白。我已经用一个数组替换了我的request_getSingle变量,该数组包含几个准备好的语句(这是我最终计划做的…),一切都很好。

我不明白。如果我把它们存储在一个数组中,它们可以从类的其他方法访问,但如果我把它存储为常规属性,它们就不能?

如果有人知道发生了什么,我仍然感兴趣。。。

试试这个:

Class Model extends PDO {

我有一个类似的类,它在PDO之上编写自定义函数。我想你也在尝试做类似的事情。这就是我班的初始代码的样子:

class MySQLDB extends PDO{
    public function __construct($dsn, $user="", $pass="") {
        $options = array(
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            PDO::ATTR_PERSISTENT => true, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );
        try {
            parent::__construct($dsn, $user, $pass, $options);
        } catch (PDOException $err) {
            die($e->getMessage());
        }
    }
}

完成之后,您应该能够通过这个类使用所有PDO函数。