草庐IT

php - 从 mysql_query 切换到 PDO 的问题

coder 2023-10-16 原文

我正在从传统的 mysql_query() 参数化查询切换到 PDO 以利用它的安全优势,我有几个问题。首先,就 magic_quotes 而言,是否需要做任何事情?这个 web 应用程序将安装在不同配置的系统上,有些系统(不幸的是)会打开它们,而另一些则会关闭。以前我正在对 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 是否足够普遍,可以在大多数服务器上启用它?

提前致谢!

最佳答案

This web app will be installed on systems of different configurations and some will (unfortunately) have [magic quotes] on while others will be off.

正如我在另一个答案的评论中指出的那样,PHP 手册有 an entire section关于处理恐怖的魔法引语。您通常可以在 .htaccess 中本地禁用它,或者在数据传入时更正它。我个人不会与默认启用它的托管服务提供商开展业务。

Previously I was doing the whole if statement to addslashes() when it's off to input data

哎呀! addslashes足够的保护。使用旧的 MySQL 扩展时,您需要使用 mysql_real_escape_string设置字符集之后。 Failing to do this can leave you open to a huge vulnerability .

... what needs to be done with PDO queries like these:

除了设置连接字符集,什么都没有! PDO 将尽可能使用真正的准备好的语句。这意味着它将首先将带有占位符的查询发送到服务器以便它可以处理它,然后它稍后将单独发送参数。这使得查询不受 SQL 注入(inject)的影响。

(一些数据库不支持使用 PDO 的预处理语句。对于这些,PDO 将处理查询,用带引号的转义值替换占位符。结果是一样的——免受 SQL 注入(inject)。)

Also, how necessary is it to close the database handler in the end? What is the detriment of not doing so?

就像其他 PHP 数据库处理程序一样,不需要关闭连接——当脚本结束时,连接将关闭。 ( Don't even think about persistent connections .)

Is PDO a good option for a CMS that will be installed on many different server setups? Is PDO ubiquitous enough where it will be enabled on most servers?

PDO 在 PHP 5.1 中成为标准,但这并不意味着它始终可用。大多数 Linux 发行版都分离出 所有 PHP 的数据库访问选项,以便安装它们时也会安装必需的库。有时,不称职或缺乏经验的托管服务提供商不会安装 PDO 包以与其他数据库访问选项一起使用,而没有意识到他们在做什么。这通常可以通过简单地要求他们启用 PDO 来纠正,如果他们不愿意或不能,则切换到另一个主机。

许多现代框架更喜欢在 PDO 之上构建,但提供其他选项。例如,Zend Framework's Zend_Db有适用于 PDO、mysqli 和其他一些的适配器。如果您担心 PDO 并不总是可用,那么使用适配器层可能会很适合您。 (与大多数 ZF 组件一样,Zend_Db 并不严重依赖其他 ZF 组件,这意味着您可以轻松地将它与您的代码捆绑在一起。)

关于php - 从 mysql_query 切换到 PDO 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753439/

有关php - 从 mysql_query 切换到 PDO 的问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  4. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  5. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  6. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  9. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐