PDO功能简化

时间:2016-06-18 06:35:57

标签: php 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
}

任何其他简化此功能的方法。

请帮帮我。

2 个答案:

答案 0 :(得分: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 :(得分:-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而不是将其作为测试输出返回。