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)
我只能同意@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)
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |