php – 从mysql_query切换到PDO的问题
我从传统的
mysql_query()参数化查询切换到PDO,以利用它的安全优势,我有几个问题.首先,就magic_quotes而言,还有什么需要做的吗?这个网络应用程序将安装在不同配置的系统上,有些人(不幸的是)将它们打开,而其他人将关闭.之前我正在使用addslashes()来完成输入数据时的整个if语句……需要对这些PDO查询做些什么:
$dbh = new PDO("mysql:host=$db_server;dbname=$db_database",$db_username,$db_password); $sth = $dbh->prepare("SELECT * FROM `users` WHERE `username` = :username "); $sth->bindParam(':username',$_POST['username']); $sth->execute(); if($row = $sth->fetch()){ // Yup } $dbh = null; 另外,最后是否有必要关闭数据库处理程序?不这样做有什么不利?对于将安装在许多不同服务器设置上的CMS,PDO是否是一个很好的选择? PDO是否普遍适用于大多数服务器上的启用? 提前致谢! 解决方法
正如我在另一个答案的评论中指出的那样,PHP手册有an entire section处理恐怖是魔法引用.您通常可以在.htaccess中本地禁用它,或者在数据进入时更正数据.我个人不会与默认启用它的托管服务提供商做生意.
哎呀! addslashes没有足够的保护.使用旧的MySQL扩展时,需要在设置字符集后使用mysql_real_escape_string. Failing to do this can leave you open to a huge vulnerability.
除了设置连接字符集,什么都没有! PDO将尽可能使用真实的准备语句.这意味着它将首先将带有占位符的查询发送到服务器,以便它可以处理它,然后它将分别发送参数.这使得查询不受SQL注入的影响. (有些数据库不支持使用PDO准备好的语句.对于这些,PDO将处理查询,用带引号的转义值替换占位符.结果是相同的 – 免于SQL注入.)
就像其他PHP数据库处理程序一样,不需要关闭连接 – 当脚本结束时,连接将关闭. (Don’t even think about persistent connections.)
PDO成为PHP 5.1的标准,但这并不意味着它始终可用.大多数Linux发行版都拆分了所有PHP的数据库访问选项,因此安装它们时也会安装必需的库.有时,无能或缺乏经验的托管服务提供商不会安装PDO软件包以配合其他数据库访问选项,而不会意识到他们正在做什么.这通常只需要求他们启用PDO,并在他们不愿意或不能使用时切换到另一台主机来纠正. 许多现代框架更喜欢在PDO之上构建,但提供其他选项.例如,Zend Framework’s Zend_Db具有适用于PDO,mysqli和其他一些适配器的适配器.如果您担心PDO并不总是可用,那么使用适配器层可能对您有用. (与大多数ZF组件一样,Zend_Db并不严重依赖其他ZF组件,这意味着您可以轻松地将其与代码捆绑在一起.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |