【问题标题】:php - fetching associative array of pg_execute() prepared statement returns falsephp - 获取 pg_execute() 准备好的语句的关联数组返回 false
【发布时间】:2020-11-05 09:57:45
【问题描述】:

上下文

我正在尝试使用 PHP 和 PostgreSQL 实现一个(希望如此)简单的登录系统。

这是包含用户名和散列密码的 postgres 表。

用户不应该能够在此表中创建新行,因此我已经使用 password_hash('password', PASSWORD_BCRYPT) 对密码进行了哈希处理,然后手动复制粘贴了表中的值。

如果您认为这会造成问题,请告诉我。

但是,用户可以通过在登录表单中输入正确的用户名和密码组合来登录到现有帐户。

按下登录按钮时,我需要检索有关输入用户的信息,以便如果它与任何用户匹配,我可以使用password_verify() 验证密码。

问题

点击登录按钮后,我运行以下代码:

$dbconn = pg_connect("host=host dbname=dbname user=user password=pwd");
if (!$dbconn) {
    die("Error in connection: " . pg_last_error());
}

// setting the username as it would be provided by the form field
$username = 'Dan';

// maybe unrelated: why do I need to write 'username' instead of username? all of my other queries work without ''
$query = "SELECT * FROM user WHERE 'username' = $1";

$stmt = pg_prepare($dbconn, "", $query);
var_dump($stmt); // gives output "resource(3) of type (pgsql result)", got no clue on how to see what's indside

$result = pg_execute($dbconn, "", array($username));
var_dump($result); // gives output "resource(4) of type (pgsql result)"

$row = pg_fetch_assoc($result);
var_dump($row); // gives output "bool(false)", indicating that pg_fetch_assoc() failed

主要问题是 pg_fetch_assoc() 失败并返回 false,但是我相信这也可能是由不正确的查询或我构建语句的方式引起的,因此我将所有内容都包含在内。

编辑

忘了提到我还尝试将查询公式化为:

$query = "SELECT * FROM user WHERE username = $1";

在这种情况下,我得到错误提示: Warning: pg_prepare(): Query failed: ERROR: column "username" does not exist LINE 1: SELECT * FROM user WHERE username = $1.

【问题讨论】:

  • 'username' = 'Dan' 为 false,因此查询不返回任何行,pg_fetch_assoc 没有可获取的内容并返回 false。查询应该是"SELECT * FROM user WHERE username = $1"。 pg_fetch_assoc 返回 false 并不一定意味着失败,而是没有可取的东西。
  • @Stefanov.sm 非常感谢,我忘了提到我第一次尝试像你说的那样运行查询。但是,在那种情况下,我收到一条错误消息 Warning: pg_prepare(): Query failed: ERROR: column "username" does not exist LINE 1: SELECT * FROM user WHERE username = $1
  • 如果一个语句“失败”,为什么不检查呢?如果查询不正确,您将收到一个明显的错误 - 如果您检查了它
  • "user" 是 postgresql 中的保留关键字。见stackoverflow.com/questions/9010634/…
  • 试试'SELECT * FROM "user" WHERE username = $1'

标签: php sql database postgresql prepared-statement


【解决方案1】:

感谢Don't Panic's comment,我将user 表重命名为utiliser,一切正常。

还应注意,这可以通过在表名上使用双引号来规避(根据this answer),但是,双引号是邪恶的,所以最好远离。

Here's the full table 的保留字要避免作为表/列名。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-01-31
    • 2019-05-26
    • 2011-02-02
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多