我正在努力学习OOP,并决定创建一个使用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);
编辑:我真的不知道自己做错了什么,但似乎这些用法没有区别。他们现在都在工作。
这就是我使用方法的方法
$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);
}
答案 0 :(得分:2)
不要在很多方面扩展PDO,这是错误的。您应该像标题建议一样使用它
class Database
{
protected $pdoInstance;
public function __construct($pdoInstance)
{
$this->pdoInstance = $pdoInstance;
}
public function query($query)
{
$preparedStatement = $this->pdoInstance->prepare();
/* bla bla bla */
}
}
这段代码更有意义,是良好的面向对象编程的一个更好的例子。 (但它仍然让我感到畏缩,但这是一个好的开始)
答案 1 :(得分:1)
首先,这里很少见到这么好的问题 很少有人理解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