用于执行MySQL和XML查找的抽象PHP类

时间:2011-11-25 02:13:20

标签: php mysql xml abstract-class

我目前正在构建一个将用作网站主存储引擎的库。它只是从MySQL数据库中提取信息,但我想创建变体(使用相同的函数和参数)来从其他存储系统(如XML或MSSQL)获取和设置数据,因此不会重新编程如果数据库类型已更改,则为必需另外一个好处是还要在其中添加安全性以帮助防止SQL注入攻击。

我现在遇到的问题是班级的摘要。我不确定如何以适用于不同类型的方式构造它(所以我不能只有一个SQL字符串)。有没有人对可以提供什么参数有任何想法。我正在考虑使用嵌套数组创建括号并为Query定义运算符,但在使用XML时可以用于直接分析。

2 个答案:

答案 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 {
    ...
}