我目前正在构建一个将用作网站主存储引擎的库。它只是从MySQL数据库中提取信息,但我想创建变体(使用相同的函数和参数)来从其他存储系统(如XML或MSSQL)获取和设置数据,因此不会重新编程如果数据库类型已更改,则为必需另外一个好处是还要在其中添加安全性以帮助防止SQL注入攻击。
我现在遇到的问题是班级的摘要。我不确定如何以适用于不同类型的方式构造它(所以我不能只有一个SQL字符串)。有没有人对可以提供什么参数有任何想法。我正在考虑使用嵌套数组创建括号并为Query定义运算符,但在使用XML时可以用于直接分析。
答案 0 :(得分:1)
我希望我不会误解你的问题(在这种情况下,我会编辑或删除答案),但是如果我找到你的话:
这取决于您的使用案例,但如果可能,我会使用与PDO相同的界面。然后你可以使用PDO驱动程序来存在它们存在的东西。其他程序员可以轻松了解您的API。
答案 1 :(得分:0)
如何使用两个OOP继承分支:查询和数据?
class query {
protected $row_classname = 'row';
protected $params = array();
protected $result;
public function bind_param($name, $value) { ... }
public function execute() {
//here go some common cache issues, param checks, etc.
$this->run_query();
}
public function get_result() {
//you can map it to $this using __get and __set
return $this->result;
}
abstract function run_query();
}
class sql_query extends query {
protected $pdo_connection;
protected $pdo_statement;
protected function run_query() {
$this->pdo_statement = $this->get_pdo()->prepare($this->get_statement());
$this->pdo_statement->setFetchMode(PDO::FETCH_CLASS, $this->row_classname);
$this->bind_params_to_pdo_statement();
$this->pdo_statement->execute();
$this->result = $this->pdo_statement->fetchAll();
}
}
class select_users_by_id extends sql_query {
protected $row_classname = 'user_row';
protected function get_statement() {
return 'SELECT * FROM users WHERE id = :id';
}
}
//memcached branch
class memcached_query extends query {
protected function run_query() {
$this->result = new $this->row_classname;
$results = $this->action();
foreach($results AS $k => $v) {
$this->result->$k = $v;
}
}
abstract protected function action();
}
class get_user_by_id extends memcached_query {
protected $row_classname = 'user_row';
protected function action() {
$this->get_memcached_handler()->get_by_key($this->params['key']);
}
}
//usage in project
...
$users_by_id = new select_users_by_id();
$users_by_id->bind('id', 14);
$users_by_id->execute();
var_dump($users_by_id->get_result()->name);
...
//user_row branch
class row {
protected $row = array();
public function __set($name, $value) {
$this->row[$name] = $value;
}
public function __get($name) {
return $this->row[$name];
}
}
class user_row extends row {
...
}