从过去几天开始,我一直在关注与数据库交互的不同方法的大量教程。像旧的MySQL方式,MySQLi,MySQL准备语句,PHP的PDO等。
我仍然是编程的新角色,因为我学习并开始编码已经不到1年了。我不时地努力改进我的代码并遵守Web开发人员定义的标准。现在是时候我觉得我改变了习惯用mysql_connect()和mysql_query()之类的旧MySQL方式与数据库进行交互的方式。
我的生产机器上有以下配置。
您认为我应该使用什么来进行数据库访问?为什么?
答案 0 :(得分:3)
不知道什么是MySQL Prepared Statement
,但是我坚持用PDO或使用Mysql手工编写的语句。
因为Mysql很熟悉而且PDO比mysqli更好
答案 1 :(得分:1)
这实际上取决于你在做什么。
如果您正在进行大量使用预准备语句的大量查询,则准备语句(通过mysqli或PDO)会很有用。准备好的语句更快,另外你不必担心像使用预准备语句转义数据这样的事情,但它们需要一些代码开销,所以对于一个简单的应用程序,有时候不值得使用预准备语句并使用旧的mysql_ *函数是更容易实现预期目的。
答案 2 :(得分:0)
与直接使用MySQLi相比,PDO for MySQL有几个主要优势。
?
)占位符之外,PDO中的预处理语句还支持命名占位符。call_user_func_array()
黑魔法。$stmt->execute()
来支持方便的快捷方式,其中每个键的值都作为键绑定到占位符。 (警告:它会将每个值转换为字符串,因此您必须bind one at a time if your statement has a variable LIMIT
。这是documented,并且feature request to change this casting to string。{/ li>
醇>
第2项到第4项相结合,使很多更容易以可证明的注射安全方式表达操作员IN
的右侧。使用PDO,您可以使用顺序名称(例如[':likeval0'=>$val0, ':likeval1'=>$val1, ':likeval2'=>$val2])
)构建关联数组,然后在该数组的右侧安全地构建占位符列表。代码可能如下所示:
$args = [];
foreach ($usernames as $n=>$value) {
$args[":likeval$n"] = $value;
}
$list = implode(',', array_keys($args));
// result is like ':likeval0,:likeval1,:likeval2'
$stmt = "SELECT * FROM app_users WHERE `username` IN ($list)";
$stmt = $dbh->prepare($stmt);
$c = $stmt->execute($args);
MySQLi仅支持?
占位符和通过变量参数函数调用的一次性绑定。在MySQLi中,通过对列表中的每个元素使用IN
,构造运算符$dbh->escape_string()
的右侧实际上要容易得多。如果经过充分测试,这种方法可以安全地防止SQL注入,但会引发一些"Bobby Tables" parameterization purists的红旗。