2016-06-18 52 views
0

这是我的功能。PDO功能简化

我想简化这个功能。

任何人都可以帮我吗?

public function showData($table,$fields,$values) 
{ 

     $first = true; 
     $whereClause=null; 
     foreach($fields as $key => $value) 
     { 
      if($first) 
        { 
         $whereClause .= " WHERE $value = '$values[$key]'"; 
         $first = false; 
       } 
       else 
        { 
         $whereClause .= " AND $value = '$values[$key]'"; 
       } 
     } 

     $sql = "SELECT * FROM $table $whereClause"; 
     $q = $this->conn->prepare($sql) or die("failed!"); 
     $q->execute(); 
     while ($r = $q->fetch(PDO::FETCH_ASSOC)) 
     { 
      $data[] = $r; 
     } 
     return $data; 
} 
foreach($ob->showData($tablenm,$field,$val) as $roleval) 
{ 
     //Do Something 
} 

任何其他方式来简化这个功能。

请帮助我。

回答

1
public function query($sql, $params = NULL) 
{ 
    $stmt = $this->conn->prepare($sql); 
    $stmt->execute($params) 
    return $stmt; 
} 

$data = $ob->query("SELECT * FROM table WHERE foo = ? AND bar = ?", [$foo, $bar]); 
foreach($data as $roleval) 
{ 
    //Do Something 
} 

这个功能比你的方式更简单,方式更强大,方式也更灵活。抛开你的想法是本质上和不可恢复的倾向于SQL注入,只是嘲笑准备好的声明,但没有真正使用它。

你要明白,在SQL关键字服务为可读性的伟大目标,使得整个语句读取和明确的,在世界上每一个程序员理解。所以你可以告诉你最初的想法是保存你自己的SELECT或WHERE的类型,结果并不那么出色。

此外,PDO支持数十种不同的返回格式,而您仅限于一种。

你可以在我的文章进一步阅读Your first database wrapper's childhood diseases

-1
function showData($table, $fields, $values) { 
    if(!(is_array($fields) && is_array($values)) || count($fields) !== count($values)) 
    throw new Exception('Arguments error: "fields" and "values" must be arrays with equal number of elements.'); 

    foreach ($fields as $key => &$field) 
    $field = '`' . str_replace('`', '``', $field) . '` = ' . $this->conn->quote($values[$key]); 

    return 'SELECT * FROM `' . str_replace('`', '``', $table) . (empty($fields) ? '`' : '` WHERE ' . implode(' AND ', $fields)) . ';'; 
} 

测试用例:

echo showData('table`name', ['col`1', 'col\`2', 'col\\`3'], ["Tom's cat 1", "Tom's cat 2", "Tom's cat 3"]); 

#output: SELECT * FROM `table``name` WHERE `col``1` = 'Tom\'s cat 1' AND `col\``2` = 'Tom\'s cat 2' AND `col\``3` = 'Tom\'s cat 3'; 

当然,你将执行SQL没有返回它作为测试输出。