【问题标题】:pg_query(): Query failed: ERROR: column doesnot existpg_query():查询失败:错误:列不存在
【发布时间】:2017-11-14 17:36:23
【问题描述】:

我确实遵循了这里的解决方案:Warning: pg_query(): Query failed: ERROR: syntax error at or near 但我仍然收到以下错误:

警告:pg_query():查询失败:错误:列“rosmoffi”不存在第 1 行:... FROM public."espece" where "espece"."Code_Espece" =Rosmoffi ^

这是我的代码:

$conn = pg_connect($conn_string);

$query = 'SELECT * FROM public."espece" where "espece"."Code_Espece" ='.$idd ;
if (!$result = pg_query($conn, $query)){
    echo  pg_result_error ($conn);
    return false;
}
$result = db($result); 
return $result;

【问题讨论】:

  • 您的 $idd 值没有被引用,因此它被假定为列名。使用参数,不要连接字符串。
  • @NishantSolanki 我确实尝试过,但我得到了同样的错误。
  • @SamiKuhmonen 我不知道是什么意思?
  • 查看我的答案并阅读有关参数的文档

标签: php database postgresql


【解决方案1】:
$query = 'SELECT * FROM public."espece" where "espece"."Code_Espece" ='.$idd ;

不要这样做。如果你要输出你在这里得到的东西,你会看到错误,正如你应该从错误消息中看到的那样。变量$idd 中的任何内容都将按原样放入查询中,并且将 not 被视为字符串。这只是查询的一部分。因此,由于没有引号,在这种情况下它将被理解为列名。

最糟糕的是,如果$idd 来自用户,那么当有人将其设置为1; truncate table espece 时会发生什么。或者更糟糕的事情。 立即了解如何使用parameters

使用参数您的代码将是:

$query = 'SELECT * FROM public."espece" where "espece"."Code_Espece" =$1';
if (!$result = pg_query_params($conn, $query, array($idd))){

这样变量就可以正确地提供给数据库并且不存在注入漏洞。

注意!对于那些一直说应该删除双引号的人,不。他们不应该。如果列名大写为Code_Espece,那么如果没有引号,PostgreSQL 将无法识别它。通常不建议大写。

【讨论】:

  • 我确实了解了您的建议,但我不知道如何解决我的错误
  • @MohamedRedaAguezzoul 通过不将 $idd 连接到 SQL 字符串,而是通过参数给出它。如果您这样做并遇到另一个错误,请使用详细信息更新问题。
  • @MohamedRedaAguezzoul 我添加了应该如何完成的代码示例
  • 警告:pg_query_params() 期望参数 3 是数组,字符串在第 21 行的 C:\wamp64\www\formdata1.php 中给出
  • @MohamedRedaAguezzoul 你给的参数错误。请参阅我编辑的答案。参数必须在数组中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多