2016-06-18 51 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沒有返回它作爲測試輸出。