【问题标题】:How to insert into postgre database without concatenate strings?如何在没有连接字符串的情况下插入 postgres 数据库?
【发布时间】:2016-03-29 22:47:52
【问题描述】:

我的代码是这样的:

 $sql = "INSERT INTO oraculo VALUES(".$name.$pass.")";
    pg_query($dbconn, $sql);

在 java 中,我使用 PreparedStament 插入没有连接字符串的值(如果我是正确的,可以避免 sql 注入)。可以在 PHP 中做这样的事情吗?我想做这样的事情:

$sql = "INSERT INTO oraculo VALUES(?, ?)";
//set the value of first '?'
setValue(1, "somename");
//set the value of second '?'
setValue(2, "somepass");
pg_query($dbconn, $sql);

【问题讨论】:

  • ReadTheManual。虽然公平地说 PHP 的文档非常糟糕 - pg_query 的文档应该有指向这些页面的巨大响亮警告。

标签: php database postgresql


【解决方案1】:

您可以使用pg_prepare 在 PHP 中对 postgres 执行准备好的语句。

所以你的代码看起来像:

pg_prepare($dbconn, "login", 'SELECT * FROM shops WHERE name = $1');
$rs = pg_execute($dbconn, "login", array("somename", "somepass"));

【讨论】:

  • 或使用pg_query_params。或者,你知道的,PDO,它已经取代了 10 年不推荐使用的 mysqli 和 pg 驱动程序......
  • @CraigRinger 很抱歉地说——我知道你不是 PHP 开发者;)——PDO 没有弃用 pg_* 驱动程序。它以牺牲性能和某些功能为代价,为所有驱动程序提供了一个通用接口。 PHP 的 pg_* 仍然得到维护,并且随着时间的推移具有新功能。如果您知道您的项目将仅使用 PostgreSQL,那么这些应该是首选。
  • @greg 好的,谢谢,很高兴知道。我从文档和讨论中得到的印象是 PDO 旨在替换单个驱动程序,而不是包装它们。对困惑感到抱歉。我支持我的 cmets,PHP 文档在指向 php.net/manual/en/security.database.sql-injection.phpphp.net/manual/en/function.pg-query-params.php 的 pg_query 页面上未能提供 GIANT WARNING 令人震惊地松懈。它说“在大多数情况下应该首选 pg_query_params()。”但考虑到这些问题,这显然太弱了。
猜你喜欢
  • 2012-03-06
  • 2012-06-25
  • 2019-02-08
  • 2021-02-09
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多