私は、純粋なphpで小さくて一見単純なアプリを構築しようとしています(フレームワークやormsなどの派手なツールは使用できません)。
モデルを表すオブジェクトを定義することから始めました。私の考えはModel
、データベースにアクセスするための静的pdoインスタンスを保持する基本クラスと、それを継承して必要なカスタムメソッドを実装する2つの「具体的な」モデルクラスを持つことです。
まあ、男の子は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
た。配列には、いくつかの準備されたステートメントが含まれており(最終的にはこれを行う予定でした...)、すべて正常に動作します。
理解できません。それらを配列に格納すると、クラスの他のメソッドからアクセスできますが、通常の属性として格納するとアクセスできませんか?
誰かが何が起こっているのかについて何らかの考えを持っているなら、私はまだ興味があります...