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

Laravel控制器登录功能报错SQLSTATE[42S22]:列未找到求助

问题排查与修复方案

嘿,看你抛出的SQL错误信息,一眼就能定位问题了:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where clause' (SQL: select * from users where email in (z6vCfv4iWVDd1mwdGv1gFc0DvP6E0d0ur1KtO1Em, johndoe@gmail.com, admin@1234) and 0 in (email) and admin = 1 limit 1)

错误根源

问题出在你调用Auth::attempt()时的参数格式完全错误:

Auth::attempt(['email' => $data, ['email'], 'password' => $data['password'], 'admin' => '1'])

这里有两个致命问题:

  • 你把整个请求输入数组$data直接赋值给了email字段,Laravel会把数组里的所有值当成email的IN查询条件,所以SQL里出现了email in (...)这种不符合预期的内容,而不是单个邮箱值。
  • 你多写了一个无键名的数组元素['email'],PHP会自动给它分配数字键0,Laravel把这个解析成了0 in (email)的查询条件——这就是为什么会报“找不到列'0'”的错误。

修复后的完整代码

把Auth::attempt()的参数改成正确的关联数组格式,同时还要注意删掉会中断代码的exit;语句(否则redirect永远不会生效):

class AdminController extends Controller {
    public function login(Request $request){
        if($request->isMethod('post')){
            // 先验证请求参数,避免空值报错
            $request->validate([
                'email' => 'required|email',
                'password' => 'required'
            ]);
            
            $data = $request->input();
            // 修正Auth::attempt的参数,只传正确的字段键值对
            if(Auth::attempt([
                'email' => $data['email'], 
                'password' => $data['password'], 
                'admin' => 1 // 如果数据库admin字段是int类型,用整数1更合适
            ])){
                return redirect('/admin/dashboard');
            }else{
                // 返回上一页并携带错误提示,比echo友好
                return back()->with('error', '登录失败,请检查邮箱、密码或权限');
            }
        }
        return view('admin.admin_login');
    }
}

额外优化点

  1. 移除exit;:之前的exit;会直接终止脚本执行,导致后续的跳转逻辑完全无法运行,必须删掉。
  2. 添加表单验证:用$request->validate()确保用户输入了邮箱和密码,避免因为参数缺失导致的额外报错。
  3. 字段类型匹配:如果你的users表中admin字段是整数类型,建议用1而不是字符串'1',保持数据类型一致,避免潜在的类型转换问题。

内容的提问来源于stack exchange,提问作者Zdol3232

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:52:32