【发布时间】:2013-08-10 15:37:30
【问题描述】:
我一直在强迫自己进入更多的 OOP。直到现在我都讨厌这一切。当我在另一个类中的 PDO 中使用一些简单的准备语句作为方法时,它永远不会起作用。我通过做显而易见的事情来解决它:将 PDO 对象全球化到方法中。它可以工作,并且可以满足我的要求-但是如果我有很多来自不同类的方法,请添加“global $db;”作为所有功能/方法的第一行,它似乎很乏味。有没有办法将 PDO 集成到所有类中?或者至少是每个类——而不是每一个血腥的方法?
这是一个非常简单的例子,说明当前的工作原理,但正如我所说的乏味:
<?php
$db = new PDO("mysql:host=localhost;dbname=blaa;", "blaa", "blaa");
class test{
function show($col, $id){
global $db;
$result = $db->prepare("SELECT ".$col." FROM products WHERE id = :id");
$result->execute(array("id"=>$id));
$row = $result->fetch();
echo $row[$col];
}
}
$show = new test();
$show->show("price", 1);
?>
..所以我可以在方法“show()”中使用我的 PDO,但如果我要添加另一个方法,我将不得不输入“global $db;”又进去了……
那么我如何不只用一种方法来全球化它,而是用所有类来全球化呢? 我尝试将 PDO 类继承到“测试”类中,但没有奏效;我尝试使用如下构造函数:
<?php
$db = new PDO("mysql:host=localhost;dbname=blaa;", "blaa", "blaa");
class test{
public $db;
function __construct($db){
$this->db = $db;
}
function show($col, $id){
$result = $db->prepare("SELECT ".$col." FROM products WHERE id = :id");
$result->execute(array("id"=>$id));
$row = $result->fetch();
echo $row[$col];
}
}
$show = new test($db);
$show->show("price", 1);
?>
但这没有用..
任何帮助将不胜感激!
谢谢 -怀利
【问题讨论】:
-
在第二种情况下,$db PDO 对象超出了类的范围。类的公共 $db 与 PDO 对象 $db = new PDO(...) 不同。在第二种情况下,您可能希望将测试作为 PDO 的扩展类。您还可以通过引用查看传递对象。
-
你的 show 函数容易受到 SQL 注入的攻击
-
如果使用准备好的语句,它如何容易受到 SQL 注入的攻击...?
-
@user2670722 您正在将 $col 值直接传递给您的查询语句,而无需任何类型的清理。
-
他的意思可能是因为您已经将
$col直接放在SQL 中,而不是之后将其绑定到语句中。