PHP登录跳转失效及非对象'total'属性获取报错求助
问题排查与解决办法
一、先搞定 trying to get property 'total' of non-object 报错
这个报错的核心是代码里尝试访问一个非对象的total属性,大概率出在这几个环节:
- 检查
AuthenticationFactory::login()返回的$try是否为标准JSON字符串。如果登录逻辑出错,返回的内容不符合JSON格式,Json::decode($try)会返回null或数组,后续访问$json->success甚至total属性都会触发非对象访问错误。- 临时调试:在
echo $try;前添加var_dump($try);,查看返回内容是否符合JSON规范。
- 临时调试:在
- 确认
Json::decode的返回类型:如果该方法默认返回数组,用->访问属性必然报错。可以改为$json = Json::decode($try, false);强制返回对象,或者改用数组写法$json['success']访问。
二、解决登录后跳转失效、刷新退出的问题
你的登录代码逻辑存在明显漏洞:
- 登录成功后未触发跳转逻辑
当前action分支通过echo $try; die();返回JSON,属于AJAX请求场景,后端的header('Location: /')对AJAX请求无效,需要前端接收success: true的响应后,用JS执行跳转:window.location.href = '/'。如果是表单同步提交场景,就不要返回JSON,直接在后端执行header('Location: /'); exit();。 - 登录状态未持久化,刷新即丢失
刷新后回到登录页,说明Session/Cookie未正确保存:- 检查
AuthenticationFactory::login()内部是否正确初始化Session,比如是否漏写session_start()(若框架未自动处理Session)。 - 查看PHP配置中
session.save_path对应的目录是否有写入权限,无权限会导致Session无法存储。 - 登录成功后直接执行
var_dump(Authentication::logged());,验证该方法能否正确识别登录状态。
- 检查
- 代码逻辑矛盾
方法开头判断Authentication::logged()就跳转,但登录成功的分支仅重新获取表单输入,未更新登录状态?若Forms::formNames(['email', 'password', 'mode'], true)是用来存储登录状态的,这个逻辑不合理,登录状态应该由AuthenticationFactory::login()内部处理完成。
三、额外排查点
- 检查PHP的
output_buffering配置,若开启缓冲,header()之前的输出(如空格、echo内容)会导致跳转失效。当前代码中echo $try;在header()之前(若后续添加),必然导致跳转失效,因此AJAX场景必须依赖前端跳转。 - 打开浏览器控制台的Network面板,查看登录请求的响应是否正常、Session Cookie是否被设置、跳转请求是否发送。
内容的提问来源于stack exchange,提问作者Bruno Ribeiro
相关产品推荐
相关产品推荐

