You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']访问。

二、解决登录后跳转失效、刷新退出的问题

你的登录代码逻辑存在明显漏洞:

  1. 登录成功后未触发跳转逻辑
    当前action分支通过echo $try; die();返回JSON,属于AJAX请求场景,后端的header('Location: /')对AJAX请求无效,需要前端接收success: true的响应后,用JS执行跳转:window.location.href = '/'。如果是表单同步提交场景,就不要返回JSON,直接在后端执行header('Location: /'); exit();。
  2. 登录状态未持久化,刷新即丢失
    刷新后回到登录页,说明Session/Cookie未正确保存:
    • 检查AuthenticationFactory::login()内部是否正确初始化Session,比如是否漏写session_start()(若框架未自动处理Session)。
    • 查看PHP配置中session.save_path对应的目录是否有写入权限,无权限会导致Session无法存储。
    • 登录成功后直接执行var_dump(Authentication::logged());,验证该方法能否正确识别登录状态。
  3. 代码逻辑矛盾
    方法开头判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:01:27