使用通用函数查询数据库是不好的做法吗?

har*_*ryg 0 php mysql database pdo

我正在编写一个webapp,可以在内部用于各种任务.它使用MySQL数据库,经常需要查询数据.

我知道准备好的语句并且它们是最佳实践,但是考虑到大量的表和连接,我发现最简单的方法是编写一个接受查询的常规函数​​,运行它并返回结果.

我知道如果它是在一个实时网站上,这可能容易受到SQL注入的影响,但使用这种方法有什么本质上的不好吗?我对php和MySQL之间的接口相对较新,并且有兴趣了解在webapp中运行语句的可重复方法的最佳实践.

这是我将用于SELECT查询的示例函数.

function getSQLResultsPDO($query){
  $mydb = new PDO('mysql:host=localhost;dbname=mydatabase;charset=utf8', 'user', 'password');
  $sth = $mydb->prepare($query);
 if (!$sth) {
    echo "\n<pre>PDO::errorInfo():</pre>\n";
    echo "<pre>";
    print_r($conn->errorInfo());
    echo "</pre>";
}
  $sth->execute();

  $result = $sth->fetchAll(PDO::FETCH_CLASS);
  if (empty($result)){
    $result = false;
  }

  return $result;

}
Run Code Online (Sandbox Code Playgroud)

You*_*nse 5

我只能同意@jay harris的评论:"关于那个剧本的一切都是不好的做法"

虽然使用这样的函数来处理数据库的想法唯一合理的选择,但实现完全错误.

首先,为什么你认为这样的功能与准备好的陈述相矛盾?为什么不添加一个额外的参数 - 一个包含数据的数组 - 并且具有功能和安全性?

接下来,正如您已经被告知的那样,不要为每个查询连接,而是每个应用程序连接一次.

最后,你的错误处理方式是错误的.

function getSQLResultsPDO($query, $params = array(), type = PDO::FETCH_CLASS){
  global $mydb;
  $sth = $mydb->prepare($query);
  $sth->execute($params);
  return $sth->fetchAll($type);
}
Run Code Online (Sandbox Code Playgroud)

它不是很方便,但至少它是可用的,95%安全.

使用此功能一段时间后,您会发现只有一个功能非常不方便.最终你会发现你需要一组功能.一个运行DML查询而不返回任何行,一些函数返回不同类型的结果.

比较这两个代码:

$data = getSQLResultsPDO("SELECT name FROM users WHERE id=?", array($id));
if (isset($data[0]->name)) {
    $name = $data[0]->name;
}
//and
$name = getSQLscalar("SELECT name FROM users WHERE id=?", array($id));
Run Code Online (Sandbox Code Playgroud)