所以这就是我想要的。 我想使用PDO,因为它是我喜欢的,所以我想在PDO之上添加一些新的方法。PHP - 扩展PHP数据对象以添加新功能
像:更新(),插入(),删除(),fetchAllAssoc(),等...
所以我会从一个类内部都PDO和PDO Statement对象的工作。 由于无法实现更新,我将不得不建立一个查询,准备()它,这将返回PDO Statement对象,然后我将不得不bindValues,然后执行。
这是我迄今所做的:
<?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();
}
}
?>
你会使用这样的:
use Database\DBAL\Database;
$db = Database::getInstance();
$db->update("users", array("user_password" => "new password"), array("user_id" => 1));
我的问题是,这是做正确的方式? 我正在阅读有关装饰和门面模式,它看起来像这样。 什么是用我的方法扩展PDO类的最佳方法,它可以简单地删除,插入和获取一些数据?我希望PDO完好无损,所以我可以按照惯常的方式使用它...我应该使用什么样的模式,以及最好的方法是什么?
谢谢!
你认为使用orm like doctrine吗? – 2012-02-28 10:34:40
好吧,不是真的,我用Doctrine DBAL,而且我喜欢它,但是我认为就DBAL API而言,它可以变得更好。我不需要ORM,但是我需要更多的方法,这样我可以更容易地获取数据,并且我需要从SQL注入保护的所有内容,而Doctrine DBAL则不是这样。所以我想创建类似于Doctrine DBAL的东西,但更简单一些,使用一些附加功能来争用PDO,我需要的是找到应该使用哪些模式,以及什么是扩展PDO的最佳方式。 – Limeni 2012-02-28 10:40:16