有人告诉我,最好使用PDO
MySQL转义,而不是mysql_real_escape_string
。
也许我真是个脑筋急转弯的一天(或者可能是我天生没有想象力的天才程序员,而我在PHP方面仍然处于新手阶段),但是查阅了PHP手册并阅读了PDO上的条目,我仍然不清楚PDO到底是什么以及为什么它比使用PDO更好mysql_real_escape_string
。这可能是因为我还没有真正掌握OOP的复杂性(我认为这与OOP有关),但是除了变量和数组值似乎在它们前面有一个冒号之外,我仍然不确定它到底是什么以及如何使用(以及为什么它比mysql_real_escape_string
。(这也可能与我对“类”不是很清楚的事实有关,因此当我阅读“
PDO类”时,我并不是真正的明智者)。
在MySQL网站的“开发人员专区”上读过一两篇[文章后,我仍然不清楚。由于我现在甚至无法弄清楚它是什么,所以我认为现在使用它可能超出了我一点,但是我仍然对扩大我的教育范围以及寻找如何改善自己的事物感兴趣。
谁能用“普通英语”向我解释什么是PDO(或让我了解用普通英语写的主题的方向),以及您将如何使用它?
当您的问题更着眼于一般概述时,当当前答案更加详细时,我将尝试一下:
PDO类旨在封装与数据库交互所需的所有功能。他们通过定义“方法”(函数的OO客厅)和“属性”(变量的OO客厅)来做到这一点。您可以将它们用作您现在用于与数据库对话的所有“标准”功能的
完全替代 。
因此,与其调用一系列的“ mysql_doSomething()”函数,而不是将其结果存储在自己的变量中,而是“实例化” PDO类中的一个对象(“
class” =抽象定义,“ object” =具体的可用实例)类)并在该对象上调用方法以执行相同操作。
例如,如果没有PDO,您将执行以下操作:
// Get a db connection
$connection = mysql_connect('someHost/someDB', 'userName', 'password');
// Prepare a query
$query = "SELECT * FROM someTable WHERE something = " . mysql_real_escape_string($comparison) . "'";
// Issue a query
$db_result = mysql_query($query);
// Fetch the results
$results = array();
while ($row = mysql_fetch_array($db_result)) {
$results[] = $row;
}
而这与使用PDO等效:
// Instantiate new PDO object (will create connection on the fly)
$db = new PDO('mysql:dbname=someDB;host=someHost');
// Prepare a query (will escape on the fly)
$statement = $db->prepare('SELECT * FROM someTable WHERE something = :comparison');
// $statement is now a PDOStatement object, with its own methods to use it, e.g.
// execute the query, passing in the parameters to replace
$statement->execute(array(':comparison' => $comparison));
// fetch results as array
$results = $statement->fetchAll();
因此,乍一看,除了语法上没有什么区别。但是PDO版本具有一些优点,最大的优点是数据库独立性:
如果您需要与PostgreSQL数据库通信,则只需在实例化调用中更改mysql:
为。使用旧方法时,您将必须遍历所有代码,用其对应的“pg_doSomthing()”函数替换所有“mysql_doSomething()”函数(始终检查参数处理中的潜在差异)。对于许多其他受支持的数据库引擎,情况也是如此。pgsql:``newPDO()
因此,回到您的问题上,PDO基本上只是为您提供了实现相同目标的不同方法,同时提供了一些快捷方式/改进/优势。例如,转义将以您正在使用的数据库引擎所需的正确方式自动发生。同样,参数替换(防止SQL注入,未在示例中显示)更加容易,从而减少了出错的可能性。
您应该阅读一些OOP基础知识,以了解其他优点。
问题内容: 我试图用PDO编写更新查询,但我无法执行代码? 问题答案: 您的语法错误 您可能打算更新一行而不是全部更新,因此您必须使用子句来定位特定行 更改 至
问题内容: 我不敢相信我在问这个,但是… 您如何使用SCALA在SPARK SQL中逃逸SQL查询字符串? 我已经厌倦了一切,到处搜寻。我以为apache commons库可以做到,但是没有运气: ”‘“).map(_.getValuesMapAny)).collect().foreach(println); 返回以下内容: topic =’‘’Ulmus_minor _’‘Toledo’‘’^在
我不敢相信我问这个但是... 如何使用Scala在SPARK SQL中转义SQL查询字符串? 我累了所有的东西,到处找。我以为apache commons库可以做到这一点,但运气不好: 返回以下内容: 帮个忙就好了。 j
问题内容: 谁能看到以下查询出了什么问题? 当我运行它时,我得到: #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第8行的’a where a.CompetitionID = Competition.CompetitionID’附近使用 问题答案: 主要问题是内部查询不能与外部语句上的子句相关,因为在内部子查询执行之前,where过滤器首先应用于要
我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,
我有一个简单的查询如下: 这很好用。但是,如果我将isEqualTo替换为isGreaterThan,那么它什么也找不到(是的,我有大于这个数字的数字)。我在数字和日期上尝试过,无论数据库内容是什么,我都无法在isGreaterThan或isGreaterThanOrEqualTo上获得生成任何内容的查询,只有isEqualTo工作。