php - php - 获取 pg_execute() 准备好的语句的关联数组返回 false
问题描述
语境
我正在尝试使用 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
。
解决方案
感谢Don't Panic 的评论,我将user
表重命名为utiliser
,一切正常。
还应该注意的是,这可以通过在表名上使用双引号来规避(根据这个答案),但是,双引号是邪恶的,所以最好远离。
这是要避免作为表/列名的保留字的完整表。
推荐阅读
- angular - 在 Angular 中获取 URL 参数
- magnolia - 查找节点是否为子 magnolia CMS
- php - 在刀片 laravel 中使用连接
- python - 其他语句导致基本字数计数程序中的无限循环?
- python - 有没有办法在 numpy 中将值添加到 3d 数组的页面中?
- python - 将带有 Openpyxl 的 Excel 工作表名称与 Pandas 列中的项目匹配并返回匹配项
- angular - 将来自 Api 的图像显示为 base64 img src
- python - 展开熊猫数据框中的分隔单元格
- python - Python - 具有拆分选项输出差异的映射
- python-3.x - 尽管程序以交互方式正确运行,但 Python 脚本不返回值(windows10 cmd)