0

我正在编写一个网络应用程序,该应用程序将在内部用于各种任务。它使用定期需要查询数据的 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;

}
4

2 回答 2

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);
}

它不是很方便,但至少它是可用的,并且 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));
于 2013-06-26T14:23:09.430 回答
0

这可能是一个很好的做法。如果您查看框架,它们实现了类似的东西,只是它更复杂,并且它们允许您使用不同的方法创建查询。这样做的目的是集中查询,如果所有查询都经过相同的路径,则更容易修改涉及所有查询的内容。例如,如果您想将数据库从 MySQL 更改为其他数据库。此外,您可以在这个中心点防御注射。

所以,你的想法很好,但当然也有可以改进的地方。您可以在打开应用程序时创建一个连接,并将其用于以后运行的每个查询。如果您的查询方法在类中,则连接可以是类属性,例如,在构造函数中初始化。

我的建议是看看其他人是如何做到的,并从中获得灵感。例如,看看框架如何处理这些东西。

此外,还有一个很好的 MVC 教程也谈到了这些东西,这里是:

http://johnsquibb.com/tutorials

于 2013-06-26T14:14:43.327 回答