首页 > 解决方案 > php - 获取 pg_execute() 准备好的语句的关联数组返回 false

问题描述

语境

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

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

来自 phpPgAdmin 的表格图片

用户并不意味着能够在此表中创建新行,因此我已经使用散列密码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

标签: phpsqldatabasepostgresqlprepared-statement

解决方案


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

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

这是要避免作为表/列名的保留字的完整表。


推荐阅读