2011-11-04 30 views
2

我无法通过浏览谷歌找到。所以我决定在这里问。参数化查询支持我postgre使用PHP pdo?postgresql缺乏对参数化查询的支持

如果不是。我怎样才能达到同样的安全?

注意安全,因此注射证明是绝对必须的。使用另一个数据库不是一个选项作为旁注。

在对Fonini的回应中;

参数化查询,像这样:

 $st = $db->prepare(
     "insert into vendors set 
     first_name = :first_name, 
     last_name = :last_name" 
    ); 
    $st->execute(array(
     ':first_name' => $vendor->first_name, 
     ':last_name' => $vendor->last_name 
    )); 

不使用bindParam

这不插入我。

我的代码看起来像这样:

$project = new Project(); 
$project->id = 'sequence string'; 
$project->projectName = 'A project name'; 

$project->saveProject(); 

,并在项目模型:

public function saveProject() { 
    $this->_db->query("INSERT INTO projects VALUES (:id,:projectName)", array(':id' => $this->_projectFields['id'], ':projectName' => $this->_projectFields['projectName']))->save(); 

}

在我的DB类的查询方法将查询私人$ _query字段以及私有$ _parameters字段中的aray参数。然后我调用保存方法,准备语句,将$ this - > _ query作为参数传递给PDO :: prepare(),然后调用PDO :: execute给出$ this - > _ parameters作为参数。这不能插入

+1

为什么不呢?我不知道PDO,但PostgreSQL支持JDBC和ODBC中的参数化查询。 –

+0

因为如果我使用非参数化查询,它会插入数据,并且使用参数化,它不会。使用完全相同的数据。我通过打印r和回声确认了这一点。 –

+1

显示您的代码。问题在于你,而不是PostgreSQL的。 –

回答

5

是的,参数化查询与PHP PDO完美协同工作。

$db = new PDO('pgsql:host=localhost;dbname=cars', 'user', 'password'); 

$cars = $db->prepare('SELECT * FROM cars WHERE id = :id'); 
$cars->bindParam(':id', $id = 20, PDO::PARAM_INT); 
$cars->execute(); 

$result = $cars->fetch(); 
echo 'Name: ' . $result['name']; 
+0

看到我编辑的问题 –

+0

你有错误或只是不插入数据? save()方法不存在。 – fonini

+0

保存方法存在于我的数据库类中。我创造了它。我首先在我的dbhelper类中调用查询方法,该类设置了一些变量,然后保存()以保存该数据。我没有收到错误,应用程序流程按预期工作。它只是不插入数据。如果你阅读我编辑过的文章,我希望它会变得更清楚。 –

2

有几种方法可以提交值,而不是用值的文本表示构建SQL语句。

Prepared statements最有可能是你在想什么。

您也可以create functions(“存储过程”)并将值作为参数提交。

这是一个related answer到相关问题

+0

很好找,并感谢链接。我明白你的想法,但是最好用我编辑的问题代码。虽然链接为+1 –