我已经说过,我会更好利用 PDO MySQL逃离,而不是 mysql_real_escape_string.

也许我有一个脑死亡的一天(或者,它可能是事实,我没有想象一个自然的程序员,并且我仍然非常多的新阶段的时候到PHP),但具有检查出PHP手册和阅读 该条在公设辩护人, 我仍然不清楚为什么公设辩护实际上是什么和为什么它比使用 mysql_real_escape_string.这可能是因为我还没真的有把握的复杂性,面向对象却(我假设它是什么做的面向对象的),但是比其他的事实变量和一系列的价值观似乎有一个结肠面前,我仍然不知道它实际上是什么以及如何使用它(和为什么它比 mysql_real_escape_string.(还可以有什么要做这样的事实,我真的没有一个清楚的了解什么'类的,所以当我读"公设辩护人类"我没有聪明真的).

具有读 一篇文章 或者两个在开发区域'位的MySQL网站,我仍然不清楚。我甚至不能找出它是什么在那一刻,我认为可能使用它,是有点超出我的权利,但我仍然感兴趣扩大我教育,并找出如何我可以改善的事情。

任何人都可以向我解释中的'简单的英语'这是一项旨是(或点我在方向上的一些主题编写简单的英语),以及你如何去使用它?

有帮助吗?

解决方案

由于目前的答案详谈,而你的问题是更面向一般概述,我给它一个尝试:

在PDO类旨在封装到与数据库交互所需的所有功能。他们通过定义“方法”(OO客厅的功能)和“属性”(OO客厅变量)做到这一点。你会用它们作为的完全替代的你现在正在通话到数据库中的所有“标准”的功能。

所以不是调用一系列“mysql_doSomething()”的功能,储存在自己的变量的结果,你会在实例化“从PDO类的对象(“类” =抽象的定义,“对象” =混凝土,可使用的一类的实例)和呼叫该对象上的方法来这样做。

作为一个例子,没有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: pgsql:to new PDO()。随着老方法,你必须去通过所有的代码,替换所有“mysql_doSomething()”与其功能“pg_doSomthing()”对口(总是检查在参数处理电位差)。这同样可以用于许多其它支持的数据库引擎的情况。

所以,回到你的问题,基本上PDO只是给你一个不同的方式来达到同样的事情,同时还提供了一些快捷键/改进/优点。例如,转义会在需要您所使用的数据库引擎的正确方法自动发生。也参数替换(防止SQL注入,例如在未示出)更容易,使其误差不易。

您应该读了一些OOP基础,以获得其他的想法优点

其他提示

我不是超级熟悉公设辩护人,但是之间是有区别的"准备好的发言",并逃串。是关于逃避 删除"不允许"的字符串 从查询,但是准备好的发言是关于 告诉数据库什么样的查询,以期待.

查询有多个部分

它认为这种方式:当你给一个查询的数据库,你告诉这几个分开的东西。有一件事可能是,例如,"我想要你做一个选择。" 另一个可能"的限制,它的行其中的用户名是以下的价值。"

如果你建立一个查询作为一串,并把它的数据库,它不知道有任何部分,直到它得到完成串。你可能会这样做:

'SELECT * FROM transactions WHERE username=$username'

当它到那串,它已分析,并决定"这是一个 SELECTWHERE".

得到该部分混合起来

假设某个恶意用户输入自己的用户名 billysmith OR 1=1.如果你不小心,你可能把那个放到你的串,导致:

'SELECT * FROM transactions WHERE username=billysmith OR 1=1'

...这将返回 所有交易的所有用户, 因为1总是等于1。哎呀,你已经被砍死!

看看发生了什么事? 该数据库不知道哪些部分期待在您的查询, ,所以它只是分析string.它并不感到惊讶的 WHERE 有一个 OR,有两个条件可以满足。

保持直线部分

如果只知道 什么期望, 即一个 SELECTWHERE 只有一个条件,恶意的用户不能欺骗。

与准备好的发言,你可以给它的正确期望。你可以告诉数据库"我要送你一个 SELECT, 和它将会局限于行 WHERE username = 一串,我要得到你。这一切-没有其他部分的查询。你准备好了吗?好的,这里涉及的串比较的用户名。"

与这一期望,该数据库中不会被愚弄:它只会返回行中 username 列包含实际string'billysmith或1=1.' 如果没有人用户的名称,它会回来什么。

其他好处准备的发言

除了安全利益,准备好的发言有几个速度的益处:

  • 他们可以被重新使用不同的参数,这些参数应该快于建设一个新的查询,从零开始,因为该数据库已经知道基本上是你要问的。它已经建立了"查询计划"。
  • 一些数据库(Postgres是一个,我觉得)将开始制作一个查询计划,尽快为他们得到准备的发言之前,你实际上已经发送的参数来使用它。所以你可以看到一个加速,甚至在第一个查询。

对于另一种解释,请参阅西奥的答案 在这里,.

不同于mysql_real_escape_string,PDO允许你执行一个数据类型。

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

请注意,在上面的例子中,第一个参数,热量,需要是一个整数(PDO :: PARAM_INT)。

二,对我来说,PDO参数化查询更容易阅读。我宁愿读:

SELECT name FROM user WHERE id = ? AND admin = ? 

大于

SELECT name FROM user WHERE id = mysql_real_escape_string($id) AND admin = mysql_real_escape_string($admin);

第三,你不必以确保正确报价参数。 PDO需要的照顾。例如,mysql_real_query_string:

SELECT * FROM user WHERE name = 'mysql_real_escape_string($name)' //note quotes around param

VS

SELECT * FROM user WHERE name = ?

最后,PDO允许您端口您的应用程序到不同的数据库,而无需更改PHP数据呼叫。

想象你写的线沿线的东西:

$query = 'SELECT * FROM table WHERE id = ' . mysql_real_escape_string($id);

这将不会从注射救你,因为$ id能被1 OR 1=1,你会得到从表中的所有记录。你必须投$ id来正确的数据类型(在这种情况下INT)

PDO具有另一个优点,那就是数据库后端的互换性。

在除了防止SQL注入,PDO允许您准备一次查询,并执行它多次。如果您的查询被执行多次(一环内,例如),这种方法应该是更有效的(我说“应该是”,因为它看起来像,是不是总是在旧版本的MySQL的情况下)。准备/ bind方法也更符合我合作过其它语言线。

为什么是一项旨在更好地为逃避MySQL查询/querystrings于mysql_real_escape_string?

只是因为"逃跑"就可以使有意义的。
而且,它是不同的 无与伦比的 事项。

唯一的问题是逃避 每个人都错了, 假设它作为某种形式的"保护"。
每个人都说"我逃了出来我的变量"的意思是"我保护我的查询"。
同时 逃单独有什么保护。

保护大致可以实现的情况下 我逃了出来,并援引我的数据, 但是不适用的无处不在,对于标识符,例如(以及公设辩护人,通过的方式)。

因此,答案是:

  • 公设辩护人,当做逃避对绑定价值,不仅适用于逃避但也引用--这就是为什么它是好。
  • "逃脱"不是同义词"保护"。"逃避+引用"大致。
  • 但对于某些查询的部分这两种方法不适用。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top