2013-05-08 52 views
0

这里是我目前要做的事:如何在PHP SQL查询中自动转义字符串?

$db->query(sprintf('INSERT INTO pages (title, content) VALUES ("%s", "%s")', 
    $db->esc($title), 
    $db->esc($content)));

正如你可以看到我手动每个字符串传递给我的$ DB-> ESC()方法逃避在上面的查询每个字符串。

首先让我指出我不想使用预准备语句。

我可以想出最好的办法是让我的$ DB-> query()方法包装的sprintf()并自动调用$ DB-> ESC()对每个字符串转换规范 - 这样的:

$db->query('INSERT INTO pages (title, content) VALUES ("%s", "%s")', 
    $title, 
    $content);

对我来说这看起来不错,但现在我的问题是如何正确解析出格式字符串中的所有字符串转换规范,并在每个相应参数上调用$ db-> esc()(在将所有参数传递给sprintf ())?

你会以不同的方式去做吗?

+0

你不能只是逃避**所有* *输入参数?我认为这不会破坏符合数据(如数字值等)。 – Lukas 2013-05-08 05:07:37

+1

你不想使用预备声明的任何原因? – Passerby 2013-05-08 05:12:17

回答

2

您应该阅读约prepared statement

准备:语句模板由应用程序创建并发送到数据库管理系统(DBMS)。某些值未指定,所谓的参数,占位符或绑定变量(标记为下面的“?”):

`INSERT INTO PRODUCT (name, price) VALUES (?, ?)` 

的DBMS分析,编译和执行的报表模板查询优化和存储结果不执行它。 执行:稍后,应用程序为参数提供(或绑定)值,并且DBMS执行语句(可能返回结果)。

而且它的执行力度在PHP中:PDOMySQLiPostgreSQL等。所以,没有理由自己去实现它。只要使用它。

1

首先让我表明您使用准备好的语句。
非常自动的“转义”(尽管它有被称为格式化)你说的,到底是什么准备语句是。
准备好的语句不一定必须基于数据库支持的本地准备语句。预备语句的一般思想是用占位符表示某个查询部分,并在用占位数据替换占位符时应用一些格式。因此 - 您的方法已使用占位符AKA准备好的语句。

但也有你错过

  • 一些重要的事情无所谓“逃逸”可以做什么正确的格式必须代替应用
  • 适当的字符串格式化或者需要引用逃逸,因此你准备语句的处理程序应该同时适用。
  • 还有不止一个不同的SQL文字,每个要求不同格式。因此,为了满足现实生活的要求,你不能依靠单一的esc()功能

所以,在这里你去 - the code for such a wrapper you're asking for,这确实正确格式,因此你将有你的查询不低于安全比PDO。尽管有PDO所具有的所有限制。

所以,如果你要正确地格式化一切,可能会被添加到查询,则需要另一种包装,更复杂的一个:safeMysql