orm を使用した方がよいことはわかっており、将来的に使用する予定です。しかし今のところ、私は次のような構造で作業しています。
タイトルと日付を持つ Arcticle クラス データベース アクションの DataArticle クラス したがって、Article クラスではなく、別の Data クラスでデータベース アクションを実行します。
さて、すべての Data.. クラスで、コードを使用して次のようなデータベース アクションを実行しました。
public function getArticle($id){
$query = "SELECT title,date from articles where id = ?";
if ($stmt = $this->database->getConnection()->prepare($query)) {
$stmt->bind_param('i',$id);
$stmt->execute();
$stmt->bind_result($title,$date);
$stmt->store_result();
$stmt->fetch();
if(($stmt->num_rows) == 1){
$article = new Article();
$article->title = $title;
$article->date = $date;
$stmt->close();
return $article;
}else{
$stmt->close();
return null;
}
}else{
throw new Exception($this->database->getConnection()->error);
}
}
しかし、この方法で作業することは、データ クラスのすべての関数で、接続し、ステートメントを実行してエラーをスローすることを意味します。これは、ラッパーを使用して集中化できる多くの繰り返しコードです。
現在、すべてのデータベース処理を実行するデータベース ラッパー/ハンドラーを作成する際のアドバイス (関数で例外をスローするか、降下エラー処理を行う方法) に従っています。
そこで、PDO の使用を開始するためにこのクラスを作成しました。
<?php
class DatabasePDO
{
private $connection;
private $host = "";
private $username = "";
private $password = "";
private $dbname = "";
public function openConnection(){
$this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username,$this->password);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function getConnection(){
return $this->connection;
}
public function closeConnection(){
$this->connection = null;
}
public function insert($query, array $data){
$this->connection->prepare($query)->execute($data);
return $this->connection->lastInsertId();
}
public function update($query, array $data) {
$stmt = $this->connection->prepare($query);
$stmt->execute($data);
return $stmt->rowCount();
}
public function delete($query, array $data) {
$stmt = $this->connection->prepare($query);
$stmt->execute($data);
return $stmt->rowCount();
}
public function findOne($query, array $data = null){
$sth = $this->connection->prepare($query);
if($data != null){
$sth->execute($data);
}else{
$sth->execute();
}
if($sth->rowCount() == 1){
return $sth->fetchObject();
}else{
return null;
}
}
public function find($query, array $data = null){
$sth = $this->connection->prepare($query);
if($data != null){
$sth->execute($data);
}else{
$sth->execute();
}
if($sth->rowCount() > 0){
while($res = $sth->fetchObject()){
$results[] = $res;
}
return $results;
}else{
return null;
}
}
}
?>
しかし、いくつかの記事を読んだときに、PDO はすでにデータベース ラッパーであるため、これは適切な方法ではないことがわかりました。
ただし、by code は以前よりずっと読みやすくなっています。今はただ
public function getArticle($id){
$article = $this->database->find("select name, date from articles ?",array($id));
$article = new article($article->name, $article->date);
return $article;
}
このコードははるかに短く、すべてのデータベース ロジックは PDO ラッパー クラスで処理されます。そうしないと、すべての関数でラッパーのコードを繰り返す必要があり、コードが 1 つのラッパーではなく多くの場所に配置されることになります。
私のコードを使用するより良い方法はありますか、それとも私が使用している良い方法ですか。