【问题标题】:PG_FETCH_ARRAY() doesn't return any dataPG_FETCH_ARRAY() 不返回任何数据
【发布时间】:2016-02-22 17:46:27
【问题描述】:

pg_fetch_array() 有以下问题,代码如下:

 //Controllo utente
      $u= "SELECT FROM utente WHERE idutente = '$username' and password= '$password'"; 
                                                     $result = pg_query($db,$u) or die(pg_last_error()); 

                                                     //Controllo query
                                                     if(!$result) {echo "problemi con la query"." ".$u;}

                                                     $tuplaUtente = pg_fetch_array($result);

                                                     //Numero di tuple
                                                     if($tuplaUtente === false) {echo "error fetch";}
                                                     else 
                                                      {   echo $tuplaUtente['idutente'];
                                                          echo "else";
                                                          }

                                                    pg_close();

此代码仅显示“else”,尽管使用 PgAdmin,“$u”查询返回正确的结果。

事实上,如果我输入最后一个 else:

                                              else 
                                              {   
                                                  var_dump($tuplaUtente);
                                              echo $u;
                                              echo "else";
                                              }
                                                  }

                                            pg_close();

它显示“array(0) { } SELECT FROM utente WHERE idutente = 'usr' and password='pwd'else”。

【问题讨论】:

  • 您正在检查$tuplaUtente === false - 这是在检查$tuplaUtente 是否为布尔假,而您的 var_dump 显示它不是 - 您得到的是一个空数组,而不是假的。我怀疑您的查询没有找到有效的结果,而不是失败。
  • 尝试echo pg_num_rows($result) 验证是否有返回记录。
  • 谢谢,我在这个模式下改变了 else:{ echo "else"." with number ".pg_num_rows($result)." ".$tuplautente['idutente'];它返回:“else with number 1”。
  • 您的SELECT 后面应该有一个列列表,例如SELECT idutente FROMSELECT * FROM。尽管我会假设您的代码在 pg_query 步骤中会失败,就像现在一样......
  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。在这个简短的示例中,您有许多危险的SQL injection vulnerabilities 来自鲁莽地缺少proper escaping。当任何现代development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。

标签: php sql postgresql


【解决方案1】:

这个查询:

SELECT FROM utente WHERE idutente = '$username' and password= '$password'

正如@Jerrad 评论的那样,不返回任何列。

在 PostgreSQL 9.4 之前这曾经是无效的 SQL,但从那时起允许使用,请参阅Release Notes

E.7.3.3。查询

[...]

允许 SELECT 有一个空的目标列表 (Tom Lane)

缺少任何输出列是pg_fetch_array 返回的数组为空的原因:结果本身只有一行但零列。

这显然是查询中的一个错误:鉴于其余代码,它应该至少在 SELECT 之后有 idutente 列。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2021-12-13
    • 2016-12-06
    • 2011-04-04
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多