我正在尝试用纯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函数。