参数化查询的示例

shi*_*hin 5 php mysql parameterized-query

有谁能举例说明如何使用MySQL/PHP参数化查询?

Tor*_*amo 8

参数化查询本质上是一个抽象所有输入的查询.这具有几个良好的副作用,例如使所有输入无害(即,无法进行有害注射)并且在重复使用时使其更快,因为它是预解析和编译的,因此引擎知道如何应用给定的输入.纯mysql中的一个例子是:

PREPARE qry FROM "INSERT INTO tbl VALUES (?)";
Run Code Online (Sandbox Code Playgroud)

该语句现在已编译和缓存,可以重复执行,无需重新编译和解释它:

SET @var = "some input";
EXECUTE qry USING @var;
SET @var = "some other input";
EXECUTE qry USING @var;
Run Code Online (Sandbox Code Playgroud)

在PHP中使用时,它通常像这样(缩短):

$stmt = prepare('INSERT INTO tbl VALUES(?)');
execute($stmt, array("some input"));
execute($stmt, array("some other input"));
execute($stmt, array("some more input"));
Run Code Online (Sandbox Code Playgroud)

  • 因为在将任何参数放入其中之前预编译了查询.因此,即使一个参数是`"; DELETE FROM stuff;`或类似的东西,它只会被插入到编译语句所说的任何地方,作为一个完整的字符串.它不会通过解析器,因为主要语句已经解析了.你可以将它与`eval()`进行比较:`eval("new Class($ data);")`.考虑数据为`); delete_all_my_files(`.预编译语句基本上意味着你避免使用"eval"问题. (3认同)