0

我正在尝试用纯 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 工作原理的一些信息。

希望这足够清楚,并感谢任何愿意提供帮助的人(由于无助的黑客行为可能会导致一些愚蠢的错误)。

编辑: 经过修改后,事实证明,如果我在其中调用 PDO 准备、执行等方法getById,一切正常。但是为什么我不能将准备好的 SQL 语句保留为实例变量呢?prepare每次我想访问它时都必须打电话似乎违背了它的目的......

编辑: 嗯......这似乎是固定的,但我还是不明白。我已经用request_getSingle一个数组替换了我的变量,其中包含几个准备好的语句(这是我最终计划做的......)并且一切正常。

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

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

4

1 回答 1

1

尝试这个:

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 功能。

于 2013-07-16T20:21:49.323 回答