これは私が実現したいことです。 私はそれが好きなので、PDO、joustを使いたいですが、PDOの上にいくつかの新しいメソッドを追加したいと思います。PHP - PHPのデータオブジェクトを拡張して新しい機能を追加する
同様:更新()、()を挿入、(削除)、fetchAllAssoc()、等...
だから私は、PDOと一つのクラス内からPDOのStatementオブジェクトの両方で動作する必要があります。 更新を達成するためには、私はクエリを作成し、準備しておく必要があります。それはPDO Statementオブジェクトを返し、bindValuesを実行してから実行する必要があります。
これは私がこれまでにやっていることである:、私の質問がある
use Database\DBAL\Database;
$db = Database::getInstance();
$db->update("users", array("user_password" => "new password"), array("user_id" => 1));
これはそれを行うための正しい方法です:あなたはこのようにそれを使用することになり
<?php
namespace Database\DBAL;
use PDO;
class Database extends PDO
{
protected static $instance;
public static function getInstance()
{
if(empty(static::$instance))
{
// This will be fetched from config
$dns = "mysql:host=localhost;dbname=db_name";
$username = "root";
$password = "my_pwd";
static::$instance = new Database($dns, $username, $password);
}
return static::$instance;
}
/**
* Detect param type
*/
protected function detectType($value)
{
if(is_string($value))
{
return PDO::PARAM_STR;
}
else if(is_int($value))
{
return PDO::PARAM_INT;
}
else if(is_null($value))
{
return PDO::PARAM_NULL;
}
else if(is_bool($value))
{
return PDO::PARAM_BOOL;
}
else
{
return false;
}
}
/**
* Updates table
*/
public function update($table, $data, $identifier)
{
$set = array();
foreach ($data as $columnName => $columnValue) {
$set[] = $columnName . ' = ?';
}
$query = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) . ' = ?';
$params = array_merge(array_values($data), array_values($identifier));
array_unshift($params, null);
unset($params[0]);
echo $query;
$pdos = static::$instance->prepare($query);
foreach($params as $key => $param)
{
$pdos->bindValue($key, $param, $this->detectType($param));
}
return $pdos->execute();
}
}
?>
? 私はデコレータとファサードのパターンについて読んでいました。 単純な削除、挿入、データのフェッチを行う方法でPDOクラスを拡張する最善の方法は何ですか?そして、私はPDOが無傷であることを願っています。私はいつもそうするように使用することができます。私はどのようなパターンを使用すべきでしょうか、何が最良の方法でしょうか?
ありがとうございます!
ormのようなdoctrineで作業することを検討していますか? –
まあまあ、私はDoctrine DBALを使いました。私はそれが好きですが、DBAL APIが行く限り良くなると思います。 ORM、joust DBALは必要ありませんが、より多くのメソッドが必要になりますので、データを取得するのが簡単になり、SQLインジェクションから保護されたものがすべて必要です。それはDoctrine DBALの場合とは異なります。だから私はDoctrine DBALに似たものを作りたいと思っていますが、いくつかの機能を追加したより簡単なjoust PDOです。必要なのはどのパターンを使うべきか、PDOを拡張する最良の方法を見つけることだけです。 – Limeni