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

用于执行MySQL和XML查找的抽象PHP类,php,mysql,xml,abstract-class,Php,Mysql,Xml,Abstract Class,我目前正在构建一个库,该库将用作网站的主存储引擎。它只是从MySQL数据库中提取信息,但我想创建变量(使用相同的函数和参数)来从其他存储系统(如XML或MSSQL)获取和设置数据,因此,如果更改了数据库类型,则无需重新编程。另外一个好处是,它还增加了安全性,以帮助防止SQL注入攻击 我现在讨论的问题是这门课的摘要。我不确定如何以一种适用于不同类型的方式构造它(因此我不能只使用SQL字符串)。是否有人对可以提供哪些论据有任何想法。我曾考虑使用嵌套数组为查询创建括号和定义运算符,但在使用XML时,这

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


我现在讨论的问题是这门课的摘要。我不确定如何以一种适用于不同类型的方式构造它(因此我不能只使用SQL字符串)。是否有人对可以提供哪些论据有任何想法。我曾考虑使用嵌套数组为查询创建括号和定义运算符,但在使用XML时,这可以用于直接分析。

我希望我没有误解您的问题(在这种情况下,我将编辑或删除答案),但如果我理解正确:


这取决于您的用例,但如果可能的话,我只会使用与相同的接口。然后,您可以在存在PDO驱动程序的地方使用PDO驱动程序。其他程序员将很容易理解您的API。

使用两个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 {
    ...
}

有点,但我试着用一些东西,在同一个论点中,把它紧密地联系在一起。我已经决定返回一个数据行数组(每行作为嵌套数组,在该数组中,键是列,值是值)。但是PDO看起来确实有用,但它不包含XML。原因是我为那些坚持自己托管的人编写了网站,但他们的托管软件包太便宜,无法升级。我们打算用它来快速解决问题。