如何更改我的PDO包装器类,以便如果我希望查询的单行结果使用fetch(),如果它需要多个结果,则使用fetchAll()。
现在,如果我只有一个结果,我仍然需要循环遍历结果数组,这对我来说似乎是不切实际的。
在模型中查询:
public function doccEdit() {
$id = mysql_real_escape_string($_GET['id']);
$this->result = $GLOBALS['db']->select("creditcards", "id = ?", $id);
print_r($this->result);
}
在包装器类中:
public function run($sql, $bind="") {
$this->sql = trim($sql);
$this->bind = $this->cleanup($bind);
$this->error = "";
try {
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
return $pdostmt->fetchall(PDO::FETCH_OBJ);
elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
return $pdostmt->rowCount();
}
} catch (PDOException $e) {
$this->error = $e->getMessage();
$this->debug();
return false;
}
}
答案 0 :(得分:2)
不要尝试自动化所有内容
代码中的魔力越少,支持越轻松,麻烦越少 不要试图将所有逻辑都填充到一个方法中。这是一堂课!您可以根据需要创建任意数量的方法。
当您需要rowCount()
时 - 明确选择它!这并不难
但是当你几个月后偶然发现这段代码时,你会知道这个值是什么意思。
当您需要单行时 - 使用方法获取单行。 当你需要很多行时 - 使用一种方法来获取很多行 它简单而且非常明确!
当您在2个月后转回代码时,您将完全不知道,您期望。所以 - 总是明确地写出来。
以下是我mysqli wrapper class的摘录,可以给你一个想法:
public function query()
{
return $this->rawQuery($this->prepareQuery(func_get_args()));
}
/**
* Helper function to get scalar value right out of query and optional arguments
*
* Examples:
* $name = $db->getOne("SELECT name FROM table WHERE id=1");
* $name = $db->getOne("SELECT name FROM table WHERE id=?i", $id);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return string|FALSE either first column of the first row of resultset or FALSE if none found
*/
public function getOne()
{
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query))
{
$row = $this->fetch($res);
if (is_array($row)) {
return reset($row);
}
$this->free($res);
}
return FALSE;
}
/**
* Helper function to get single row right out of query and optional arguments
*
* Examples:
* $data = $db->getRow("SELECT * FROM table WHERE id=1");
* $data = $db->getOne("SELECT * FROM table WHERE id=?i", $id);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array|FALSE either associative array contains first row of resultset or FALSE if none found
*/
public function getRow()
{
$query = $this->prepareQuery(func_get_args());
if ($res = $this->rawQuery($query)) {
$ret = $this->fetch($res);
$this->free($res);
return $ret;
}
return FALSE;
}
/**
* Helper function to get single column right out of query and optional arguments
*
* Examples:
* $ids = $db->getCol("SELECT id FROM table WHERE cat=1");
* $ids = $db->getCol("SELECT id FROM tags WHERE tagname = ?s", $tag);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array|FALSE either enumerated array of first fields of all rows of resultset or FALSE if none found
*/
public function getCol()
{
$ret = array();
$query = $this->prepareQuery(func_get_args());
if ( $res = $this->rawQuery($query) )
{
while($row = $this->fetch($res))
{
$ret[] = reset($row);
}
$this->free($res);
}
return $ret;
}
/**
* Helper function to get all the rows of resultset right out of query and optional arguments
*
* Examples:
* $data = $db->getAll("SELECT * FROM table");
* $data = $db->getAll("SELECT * FROM table LIMIT ?i,?i", $start, $rows);
*
* @param string $query - an SQL query with placeholders
* @param mixed $arg,... unlimited number of arguments to match placeholders in the query
* @return array enumerated 2d array contains the resultset. Empty if no rows found.
*/
public function getAll()
{
$ret = array();
$query = $this->prepareQuery(func_get_args());
if ( $res = $this->rawQuery($query) )
{
while($row = $this->fetch($res))
{
$ret[] = $row;
}
$this->free($res);
}
return $ret;
}
查看 - 从函数名称中,您始终可以确定期望的结果:
$name = $db->getOne('SELECT name FROM table WHERE id = ?i',$_GET['id']);
$data = $db->getAll("SELECT * FROM ?n WHERE mod=?s LIMIT ?i",$table,$mod,$limit);
不要被像返回行数这样的陷阱所迷惑
结果集中可能有一行,您打算用fetchAll
填充。因此,它将返回单维数组而不是多维数,并且您的页面上将有大量的视频效果
答案 1 :(得分:-1)
由于您没有将答案标记为已接受。我以为我会回答你的问题。我在寻找答案时发现了这一点。我同意“你的常识”,因为它们应该是两个独立的功能。但是,直接回答你的问题,这就是我所拥有的(PDO示例而不是mysqli):
function select($sql,$params=NULL,$fetchType=NULL){
try{
$qry = $this->db->prepare($sql);
$qry->execute($params);
if($qry->rowCount() > 1){
if($fetchType == 'OBJ'){//returns object
$results = $qry->fetchAll(PDO::FETCH_OBJ);
}elseif($fetchType == 'NUM'){//-numerical array
$results = $qry->fetchAll(PDO::FETCH_NUM);
}else{//default - associative array
$results = $qry->fetchAll(PDO::FETCH_ASSOC);
}
}
else{
if($fetchType == 'OBJ'){//returns object
$results = $qry->fetch(PDO::FETCH_OBJ);
}elseif($fetchType == 'NUM'){//-numerical array
$results = $qry->fetch(PDO::FETCH_NUM);
}else{//default - associative array
$results = $qry->fetch(PDO::FETCH_ASSOC);
}
}
if($results){
return $results;
}else{
return NULL;
}
}
catch(PDOException $err){
$this->logError($err);
}
}
但是我发现如果我查询表中的所有行但是表中只有一行它将返回1-d数组而不是2-d数组。我处理结果的代码不适用于这两种类型的数组。我每次都可以处理,但我发现它更容易,如上所述,将它们分成不同的功能,所以如果我知道只有一个答案,我可以称之为适当的功能。这就是我现在所拥有的:
function select($sql,$params=NULL,$fetchType=NULL){
try{
$qry = $this->db->prepare($sql);
$qry->execute($params);
if($fetchType == 'OBJ'){//returns object
$results = $qry->fetch(PDO::FETCH_OBJ);
}elseif($fetchType == 'NUM'){//-numerical array
$results = $qry->fetch(PDO::FETCH_NUM);
}else{//default - associative array
$results = $qry->fetch(PDO::FETCH_ASSOC);
}
if($results){
return $results;
}else{
return NULL;
}
}
catch(PDOException $err){
$this->logError($err);
}
}
function selectAll($sql,$params=NULL,$fetchType=NULL){
try{
$qry = $this->db->prepare($sql);
$qry->execute($params);
if($fetchType == 'OBJ'){//returns object
$results = $qry->fetchAll(PDO::FETCH_OBJ);
}elseif($fetchType == 'NUM'){//-numerical array
$results = $qry->fetchAll(PDO::FETCH_NUM);
}else{//default - associative array
$results = $qry->fetchAll(PDO::FETCH_ASSOC);
}
if($results){
return $results;
}else{
return NULL;
}
}
catch(PDOException $err){
$this->logError($err);
}
}