我理解预处理语句的工作原理(在函数之外)。但令我困惑的是,准备语句如何在类文件的函数内工作。
例如,如果预准备语句的用法是:
$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 **?
无论如何,我希望这一切都有道理,我为任何错误道歉 - 我在打字时差点入睡!也许是时候把它叫做一个晚上了。
谢谢, 基隆
答案 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连接它们就可以工作。