【问题标题】:postgresql lacking support for parameterizd queriespostgresql 缺乏对参数化查询的支持
【发布时间】:2011-11-04 15:35:29
【问题描述】:

我没有通过浏览谷歌找到答案。所以我决定在这里问。使用 php pdo 的 postgre 是否支持参数化查询?

如果没有。我怎样才能达到同样的安全性?

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

对福尼尼的回应;

这样的参数化查询:

     $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 字段中,并将 aray 参数放在私有 $_parameters 字段中。然后我调用 save 方法,它准备语句,将 $this->_query 作为参数提供给 PDO::prepare(),然后调用 PDO::execute,将 $this->_parameters 作为参数。插入失败

【问题讨论】:

  • 为什么不呢?我不知道 PDO,但是 PostgreSQL 支持 JDBC 和 ODBC 中的参数化查询。
  • 因为如果我使用未参数化的查询,它会插入数据,而使用参数化,它不会。使用完全相同的数据。我用 print r's 和 echos 验证了这一点。
  • 显示您的代码。问题出在你自己,而不是 PostgreSQL。
  • 你为什么不使用 pg_query_params() ?当您只使用 PostgreSQL 时,PDO 只是开销。只需在 PHP 中使用 PostgreSQL 函数
  • 我不知道在 php 中为 postgre 构建的标准函数,但我们总是在项目中使用 PDO。这是标准。项目也往往会变得相当大,与其他平台(如 android 等)进行通信。

标签: php postgresql pdo


【解决方案1】:

是的,参数化查询与 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'];

【讨论】:

  • 您是否收到错误或只是不插入数据? save() 方法不存在。
  • 我的数据库类中存在save方法。我创造了它。我首先在我的 dbhelper 类中调用查询方法,该方法设置一些变量,然后使用 save() 来保存该数据。我没有收到错误,应用程序流程按预期工作。它只是不插入数据。如果您阅读我编辑过的帖子,我希望它会变得更加清晰。
  • 您是否尝试将此参数添加到您的 PDO 对象? $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  • 没有。我没有。当我星期一回到工作岗位时,我会这样做。感谢您指出。希望它会有所帮助。我现在不能再测试任何东西了。你确信这是可能的吗?没有 bindParam 方法?
  • 我打电话给同事让我访问工作服务器。查询产生了错误。非常感谢。
【解决方案2】:

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

Prepared statements 很可能是您的想法。

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

这里是一个相关问题的related answer

【讨论】:

  • 很好的发现,感谢您的链接。我明白你的想法,但我最好使用我编辑的问题代码。 +1 链接虽然
猜你喜欢
  • 1970-01-01
  • 2016-11-19
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多