使用php正确编写PostgreSQL准备/执行语句?

时间:2012-07-16 16:48:00

标签: php sql postgresql

我听说在SQL语句中使用PREPAREEXECUTE会将用户提供的数据清理为无法注入SQL的内容。这是真的吗?

我的原始查询是:

$query = 
"SELECT * FROM sales_orders 
WHERE ksisoldby ILIKE '".$user."'";

这是我将其更改为准备/执行语句的最佳猜测:

 <?php
$id = $_POST['id'];
$search = $_POST['user_supplied_search_term'];

PREPARE search_query_function (varchar, varchar) AS

SELECT * FROM sales_orders 
WHERE ksisoldby ILIKE '$1'";

EXECUTE search_query_function($id, $search);
?>

这是否正确编写/调用?我也读过一些内置的php对象(PDO)。我应该使用它们还是结合使用?感谢您对此类广泛问题的帮助。

2 个答案:

答案 0 :(得分:5)

您可以使用预准备语句在PHP中合并prepare()execute(),这些语句在您使用PDO时可用。此扩展负责根据您选择的数据库驱动程序为您的数据库创建适当的PREPAREEXECUTE语句。

以下是使用prepare()execute()改编自the PHP manual的示例。

$sth = $dbh->prepare('SELECT * FROM sales_orders 
    WHERE ksisoldby ILIKE ?');
$sth->execute( array( $_POST['user_supplied_search_term']));

这将为您提供转义参数,并创建类似于:

的SQL语句
SELECT * FROM sales_orders 
    WHERE ksisoldby ILIKE 'something'

因此,您需要调整上述代码,以便在调用prepare()时包含SQL语句,这需要您将占位符添加到您希望包含参数的位置。然后你调用execute(),它将添加传递给它的值。

答案 1 :(得分:1)

您还可以使用pg_query_params,易于使用且安全。