使用PHP为Postgres准备的语句

时间:2009-08-07 22:58:44

标签: php database postgresql

这是与此"When not to use Prepared statements?"类似的问题,但是对于“如何”部分和PostgreSQL。

我知道我需要准备好的语句,因为我在一个脚本中对数据库进行了多次调用。

我想了解following sentence

的具体示例
  

查看类型转换,验证和清理变量以及将PDO与预准备语句一起使用。

通过验证和消毒变量,我知道他的意思。但是,我并不完全确定准备好的陈述。我们如何准备陈述?通过过滤器,即通过消毒?或者通过一些PDO层?层的定义是什么?

声明中准备好的陈述是什么意思?请使用具体的例子。

4 个答案:

答案 0 :(得分:6)

这意味着它将通过消除手动引用参数的需要来帮助您防止SQL注入攻击。

不是将变量放入sql中,而是使用命名或问号标记,在执行语句时将替换实际值。

PHP手册中PDO的定义:
'PHP数据对象(PDO)扩展定义了一个轻量级,一致的接口,用于访问PHP中的数据库。'

请参阅PDOPDO::prepare上的php手册。

带有命名标记的预准备语句的示例:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = :username
AND password = :pass";

$sth = $pdo->prepare($sql);
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password']));
$result = $sth->fetchAll();

带有问号标记的预准备陈述的示例:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = ?
AND password = ?";

$sth = $pdo->prepare($sql);
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetchAll();

答案 1 :(得分:5)

  

准备好的陈述是什么意思   声明?

来自documentation

此功能允许重复使用的命令只被解析和计划一次,而不是每次执行。

请参阅pg_prepare

上面链接的页面中的示例:

<?php
// Connect to a database named "mary"
$dbconn = pg_connect("dbname=mary");

// Prepare a query for execution
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Execute the prepared query.  Note that it is not necessary to escape
// the string "Joe's Widgets" in any way
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Execute the same prepared query, this time with a different parameter
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));
?>

MySQL documentation for Prepared Statements很好地回答了以下问题:

  • 为什么要使用准备好的陈述?
  • 什么时候应该准备好 语句?

答案 2 :(得分:0)

我们如何准备陈述:

您可以定义一次查询,并且可以根据需要使用不同的值来调用它。 (例如,在循环中)

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));
$result = pg_execute($dbconn, "my_query", array("row two"));
$result = pg_execute($dbconn, "my_query", array("row three"));

请参阅:http://us2.php.net/manual/en/function.pg-execute.php

答案 3 :(得分:0)

回复Karim79的回答

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1');

似乎与此相同

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?');

结论:使用pg_preparepg_execute可以提高PHP效率,因为您无需考虑清理。它还可以帮助您使用PDO。

相关问题