注册后数据库存数正常,访问指定URL时出现TypeError错误求助
问题分析与解决
错误原因定位
报错Uncaught TypeError: Cannot access offset of type string on string出现在messages.php第10行,核心原因是$_SESSION['user']被存储为字符串类型,而非预期的数组,导致无法通过['username']这种数组偏移方式访问值。
同时当前代码与配置存在两处明显问题:
1. Session跳转逻辑错误
messages.php中同时输出两个header跳转指令,浏览器仅会执行第一个,逻辑完全混乱:
if(!isset($_SESSION['user'])) { header('location: '.BASE_URL.'login'); header('location: '.BASE_URL.'register'); // 这行不会生效 exit; }
2. URL重写规则不匹配
你设计的URL结构是example.com/u/username/view,但.htaccess中^u messages.php的规则仅匹配/u路径,没有捕获username和view参数,无法正确传递路由信息。
修复步骤
步骤1:修正Session存储与访问逻辑
确保注册/登录成功后,$_SESSION['user']被存储为数组(比如从数据库查询用户信息后存入session):
// 示例:登录成功后的session存储逻辑 $user = $statement->fetch(PDO::FETCH_ASSOC); $_SESSION['user'] = $user; // 将用户信息数组存入session
如果$_SESSION['user']确实仅存储了用户名(字符串),则直接修改messages.php第10行代码:
$statement->execute(array($_SESSION['user'])); // 直接使用字符串值
步骤2:修复跳转逻辑
保留一个合理的跳转路径,比如未登录时统一跳转到登录页:
if(!isset($_SESSION['user'])) { header('location: '.BASE_URL.'login'); exit; }
步骤3:调整URL重写规则
修改.htaccess中^u的规则,捕获username和view参数并传递给messages.php:
RewriteRule ^u/([^/]+)/view$ messages.php?username=$1 [NC,L]
这样访问example.com/u/username/view时,就能通过$_GET['username']获取到目标用户名(如果业务需要的话)。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

