PHP数据库连接类中的准备语句

时间:2016-02-27 01:27:06

标签: php mysql oop mysqli prepared-statement

我理解预处理语句的工作原理(在函数之外)。但令我困惑的是,准备语句如何在类文件的函数内工作。

例如,如果预准备语句的用法是:

$dbc->select('SELECT * FROM users WHERE firstname = ?');

但是,我不知道自己如何混淆用户如何使用$ dbc-> select();函数在类文件中,创建一个查询,然后使用预准备语句来执行查询。

是否像用户编写查询一样简单,然后将变量作为另一个参数,例如:

$dbc->select('SELECT * FROM users WHERE firstname = ?', 'Bob');

或者我将它作为用户填充的单独变量,然后将其构建到预准备语句中,例如:

$dbc->select($columns, $table, $variables = array());

还是会使事情复杂化?我还可以使用另一个选择特定行的函数。

我觉得选项1是更好的选择,但它似乎不是用户友好的?或者我只是太累了以至于我正在思考完整的sh **?

无论如何,我希望这一切都有道理,我为任何错误道歉 - 我在打字时差点入睡!也许是时候把它叫做一个晚上了。

谢谢, 基隆

1 个答案:

答案 0 :(得分:0)

正如我所提到的,所有这些都是可行的:

实例一:

class qEngine 
    {
        private $con,
                $bind,
                $query;

        public function __construct($con)
            {
                $this->con = $con;
            }
        public function addParams($array)
            {
                $i = 0;
                foreach($array as $key => $value) {
                    $bKey = ":{$i}";
                    $this->bind[$bKey] = $value;
                    $i++;
                }
                return $this;
            }
        public function query($sql)
            {
                if(!empty($this->bind)) {
                    $this->query = $this->con->prepare($sql);
                    $this->query->execute($this->bind);
                }
                else {
                    $this->query = $this->con->query($sql);
                }
                return $this;
            }
        public function getResults()
            {
                while($result = $this->query->fetch(PDO::FETCH_ASSOC)) {
                    $row[] = $result;
                }
                return (!empty($row))? $row : 0;
            }
    }

您的例子:

$dbc->select('SELECT * FROM users WHERE firstname = ?');

必须是:

// $con would be a PDO connection
$qEngine = new qEngine($con);
$results = $qEngine     ->addParams(array('Bob'))
                        ->query('select * from users where firstname = :0')
                        ->getResults();
print_r($results);

实例二:

class qEngine 
    {
        private $con,
                $bind,
                $query;

        public function __construct($con)
            {
                $this->con = $con;
            }
        private function addParams($array = false)
            {
                if(empty($array))
                    return false;

                $i = 0;
                foreach($array as $key => $value) {
                    $bKey = ":{$i}";
                    $this->bind[$bKey] = $value;
                    $i++;
                }
            }
        public function query($sql,$bind = false)
            {
                $this->addParams($bind);

                if(!empty($this->bind)) {
                    $this->query = $this->con->prepare($sql);
                    $this->query->execute($this->bind);
                }
                else {
                    $this->query = $this->con->query($sql);
                }
                return $this;
            }
        public function getResults()
            {
                while($result = $this->query->fetch(PDO::FETCH_ASSOC)) {
                    $row[] = $result;
                }
                return (!empty($row))? $row : 0;
            }
    }

您的例子:

$dbc->select("SELECT * FROM users WHERE firstname = ?",'Bob');

必须是:

// $con would be a PDO connection
$qEngine    =   new qEngine($con);
$results    =   $qEngine    ->query('select * from users where firstname = :0',array('Bob'))
                            ->getResults();

print_r($results);

实例三必须更复杂,因为你必须自动构建sql。我有一个类似的,但它很复杂。

无论如何,这大致是我会这样做的。一个注意事项,我还没有广泛使用它们,但只要你在构造中注入了适当的pdo连接它们就可以工作。