这是我目前的操作方式:
$ 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()之前)?
您会以不同的方式来做吗?
您应该阅读有关准备好的声明。
准备:语句模板由应用程序创建,并发送到数据库管理系统(DBMS)。某些值未指定,称为参数,占位符或绑定变量(以下标记为“?”):
`INSERT INTO PRODUCT (name, price) VALUES (?, ?)`
DBMS对语句模板进行解析,编译和查询优化,并在不执行结果的情况下存储结果。执行:稍后,应用程序提供(或绑定)参数的值,然后DBMS执行该语句(可能返回结果)。
这在PHP中是隐含的:PDO,MySQLi,PostgreSQL等。因此,没有理由自己实施它。只需使用它。