PHP和PDO类
问题描述:
我正在尝试学习OOP并决定使用PDO创建一个类。下面是我的一些代码。PHP和PDO类
class DB extends PDO {
public function _construct($dsn,$user,$pass,$options=""){
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
try {
parent::__construct($dsn, $user,$pass,$options);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function run($query,$all="",$secure=""){
if(empty($secure)){
$qry=$this->query($query);
}else{
$qry=$this->prepare($query);
$qry->execute($this->cleanup($secure));
}
if($all=="all"){
return $qry->fetchAll(PDO::FETCH_ASSOC);
}else{
return $qry->fetch(PDO::FETCH_ASSOC);
}
}
private function cleanup($secure) {
if(!is_array($secure)) {
if(!empty($secure))
$secure = array($secure);
else
$secure = array();
}
return $secure;
}
public function rowCount($table,$extra=""){
$query="Select count(*) from ".$table;
if(!empty($extra)){
$query="Select count(*) from ".$table." ".$extra;
}
$qry=$this->query($query)->fetchColumn();
return $qry;
}
public function select($table,$extra=""){
$query="Select * from ".$table;
if(!empty($extra)){
$query="Select * from ".$table." ".$extra;
}
return $this->query($query);
}
}
是什么如下代码,为什么我没有得到同样的结果之间的差异?
//usage 1 (it doesnt work that way)
$return =$qry->fetchAll(PDO::FETCH_ASSOC);
return $return;
//usage 2 (it is exactly what i need but i want to learn the difference)
return $qry->fetchAll(PDO::FETCH_ASSOC);
编辑:我真的不知道我在做什么错,但它似乎有两个工作,现在这些usages.They之间没有什么区别。
这是我用我的方法
$result=$db->run("my query","all");
foreach($result as $r){
//
}
在构造方法中我使用PDO的查询方法,以字符集为UTF-8,但它不工作。如果我在创建了一个DB对象之后使用它,
try {
parent::__construct($dsn, $user,$pass,$options);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->query("SET NAMES 'UTF8'");
$this->query("SET CHARACTER SET UTF8");
}
最后一个问题
//what do u think about this usage.I didnt run accross some thing like this
//all the pdo classes i checked use it just
// return $qry->fetchAll(PDO::FETCH_ASSOC);
//do you think i need to separate "fetchAll" and "fetch"
if($all=="all"){
return $qry->fetchAll(PDO::FETCH_ASSOC);
}else{
return $qry->fetch(PDO::FETCH_ASSOC);
}
答
不要扩展PDO,它在很多方面都是错误的。喜欢你的标题所暗示的
class Database
{
protected $pdoInstance;
public function __construct($pdoInstance)
{
$this->pdoInstance = $pdoInstance;
}
public function query($query)
{
$preparedStatement = $this->pdoInstance->prepare();
/* bla bla bla */
}
}
该代码使得很多更有意义,而且是良好的面向对象编程的一个更好的例子你应该用它代替。 (但它仍然让我畏缩不过,但这是一个好开始)
答
首先,这样一个很好的问题可以在这里很少见到。
很少有人了解PDO抽象类的需求。
所以,这里有一些建议。
-
请勿将
run
设置为单一功能。为不同的结果类型分别使用不同的方法会更加方便。比较$data = $db->getAll($sql); $data = $db->run($sql,"all"); $data = $db->getOne($sql); $data = $db->run($sql,"one"); $data = $db->getCol($sql); $data = $db->run($sql,"col");
您需要考虑函数名称。您的“清理”功能不会进行任何清理。
我会使用func_get_args()来代替。-
以下代码之间有什么区别,为什么我不会得到相同的结果?
没有区别
$return = $qry->fetchAll(PDO::FETCH_ASSOC); return $return;
应该工作。定义“它不起作用”。
-
在构造方法中,我使用PDO的查询方法将字符设置为utf-8,但它不起作用。
虽然你应该在DSN中设置charset,但这个应该也能工作。定义“不工作”
另外我会建议在构造函数中创建DSN,使配置文件更熟悉。 你也可以从我的mysql helper class得到一些想法。虽然它使用准备好的语句中的不同方法,但它比PDO更安全
在你学习OOP之前,你应该学习如何一致地缩进 – 2013-03-06 13:21:36
然后我只需要学习如何在*的编辑器中进行操作:) – kres 2013-03-06 13:42:39