PHP结合PostgreSQL使用Session变量时查询报错问题
你的Session变量设置问题分析与修复方案
嘿,我帮你梳理下这段登录代码里的问题,核心就是$_SESSION['user_id']没法正常工作的原因,咱们一步步来:
1. 结果行数判断完全错了
你用count($result)来判断是否返回1行,但pg_query()返回的是PostgreSQL的结果资源对象,不是数组,count()对它根本不起作用!应该用专门的pg_num_rows()函数来获取返回的行数:
// 替换原来的count判断 if(pg_num_rows($result) == 1) { $_SESSION['user_id'] = $row['id']; }
2. 忘了启动Session!
在使用$_SESSION变量之前,必须先调用session_start(),而且这个函数要放在任何输出之前——包括HTML标签、空格甚至换行都不行。没加这行的话,Session变量根本存不进去,这是最常见的坑:
// 把这行放在脚本最最开头 session_start(); $myemail = $_POST['email']; $mypassword = $_POST['password']; // ... 后续代码
3. 完全没做密码验证!
你的代码只查了邮箱匹配的用户,但根本没验证密码对不对!这会导致只要输入一个存在的邮箱,不管密码输啥都会设置Session,这是严重的安全漏洞。正确的做法是:
- 数据库里必须存哈希后的密码(绝对不能存明文!)
- 取出数据库里的哈希密码,用
password_verify()函数验证:
// 修改SQL,只查需要的字段(别用SELECT *) $sql = "SELECT id, password FROM users WHERE email = '$myemail'"; $result = pg_query($db,$sql); if(pg_num_rows($result) == 1) { $row = pg_fetch_assoc($result); // 验证密码是否匹配 if(password_verify($mypassword, $row['password'])) { $_SESSION['user_id'] = $row['id']; // 登录成功,这里可以跳转到首页或者做其他操作 } else { // 密码错误,提示用户 } } else { // 邮箱不存在,提示用户 }
4. 致命的SQL注入风险
直接把$_POST['email']拼进SQL语句,等于给黑客敞开大门,他们可以轻易篡改你的SQL查询。必须用参数化查询来避免:
// 用预处理语句安全传递参数 $sql = "SELECT id, password FROM users WHERE email = $1"; // 准备查询 pg_prepare($db, "get_user_query", $sql); // 执行查询,把邮箱作为参数传入 $result = pg_execute($db, "get_user_query", array($myemail));
5. 额外的安全检查:确保$row有效
就算pg_num_rows()返回1,也最好先检查$row是否存在且包含id字段,避免出现Undefined index的错误:
if(pg_num_rows($result) == 1) { $row = pg_fetch_assoc($result); if($row && isset($row['id'])) { $_SESSION['user_id'] = $row['id']; } }
把这些问题都修复后,你的Session变量应该就能正常设置了。测试的时候可以开启错误提示(error_reporting(E_ALL); ini_set('display_errors', 1);),这样能快速定位剩下的小问题。
内容的提问来源于stack exchange,提问作者Weichen Christopher Xu
相关产品推荐
相关产品推荐

