Php SQLSTATE[42S02]:未找到基表或视图:1146
我正在尝试以管理员身份登录。我对我的用户使用了多重身份验证,一个运行良好,另一个用于我尝试登录的管理员,但当我在数据库中插入正确的值时,我使用种子手动插入了值,这给了我一个错误,我不知道原因 我所做的是配置我的auth.php,这样我就可以对用户和管理员进行两次身份验证Php SQLSTATE[42S02]:未找到基表或视图:1146,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,我正在尝试以管理员身份登录。我对我的用户使用了多重身份验证,一个运行良好,另一个用于我尝试登录的管理员,但当我在数据库中插入正确的值时,我使用种子手动插入了值,这给了我一个错误,我不知道原因 我所做的是配置我的auth.php,这样我就可以对用户和管理员进行两次身份验证 <?php return [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' =
<?php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admins' => [
'driver' => 'session',
'provider' => 'admins'
]
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// For admin
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class
]
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
'passwords' => [
'users' => [
'provider' => 'users',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admins',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
];
admin.blade.php
<form class = "form-vertical" role = "form" method = "post" action = "{{ route ('auth.admin') }}">
<div class = "form-group {{ $errors->has('username') ? 'has-errors' : '' }}">
<label for = "username" class = "control-label">Username</label>
<input type = "text" name = "username" class = "form-control">
@if ($errors->has('username'))
<span class = "help-block">{{ $errors->first('username') }}</span>
@endif
</div>
<div class = "form-group {{ $errors->has('password') ? 'has-errors' : '' }}">
<label for = "password" class = "control-label">Password</label>
<input type = "password" name = "password" class = "form-control">
@if ($errors->has('password'))
<span class = "help-block">{{ $errors->first('password') }}</span>
@endif
</div>
<div class = "checkbox">
<label>
<input type = "checkbox" name = "remember">Remember me</input>
</label>
</div>
<div class = "form-group">
<button type = "submit" class = "btn btn-default">Login</button>
</div>
<input type = "hidden" name = "_token" value = "{{ Session::token() }}">
</form>
用户名
@如果($errors->has('username'))
{{$errors->first('username')}
@恩迪夫
密码
@如果($errors->has('password'))
{{$errors->first('password')}
@恩迪夫
记得我吗
登录
错误消息旁边的SQL查询显示
select count(*) as aggregate from `admin` where `password`=admin
现在,在WHERE子句中,密码被反勾选,所以我假设它是一列(而不是一个表)。反勾号通常在SQL中用于表名或列名。但是,您可以将列名与admin进行比较,而不使用勾号admin'不是保留字,并且在查询中不会引用为文本字符串,因此数据库服务器会开始查找与该名称匹配的表
那么,你有没有尝试在那里添加引号
SELECT COUNT(*) AS aggregate FROM `admin` WHERE `password`='admin'
编辑:
如果所有其他操作都失败,您可能还希望简单地转储正在发出的数据库查询。添加侦听器/转储:
\DB::listen(function($sql, $bindings, $time) {
var_dump($sql);
var_dump($bindings);
var_dump($time);
});
…并检查输出。您的表名在这里有疑问。。。我们认为应该是AdminTableSeeder中的“admins”,如下所示:
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder {
public function run() {
DB::table('admins')->delete(); //<== "admins" AS DEFINED IN YOUR CONFIG::: NOT "admin"
$admin = array(
array('username' => 'admin',
'password' => Hash::make('admin'))
);
DB::table('admins')->insert($admin);
}
}
使用照明\数据库\播种机;
类AdminTableSeeder扩展了播种器{
公共功能运行(){
DB::table('admins')->delete();//'admin',
'password'=>Hash::make('admin'))
);
DB::table('admins')->insert($admin);
}
}
AdminTableSeeder-种子
使用truncate而不是delete
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
public function run()
{
DB::table('admins')->truncate();
$admins = array(
array('username' => 'admin',
'password' => Hash::make('admin'))
);
DB::table('admins')->insert($admins);
}
}
您的播种机引用了一个
admin
表,而其他所有内容都引用了admins
@Mei,我没有注意到这一点。已经更新了。“我还是有错误的地方。”梅:你的观察似乎很正确。。。(Francisunox)你是说你在这篇文章中更新了它还是在你自己的代码中更新了它?@Poiz我也更新了同样的内容。但还是会出错。有任何帮助吗?原始SQL不包含其中username='admin'
,因此请检查HTML中的字段是否具有正确的name属性。代替dd('error')
try dd($request->only(['username','password'])。用户名和密码的管理员。是我在数据库中植入的值。因此我没有在这里使用任何Select语句。@francisunox是消息的顶部框(QueryException)包含我上面引用的SQL查询。因此,是的,它是一个Select语句,但它可能是由Laravel在幕后发出的。您可以使用调用堆栈查看从何处调用Connection.php:680吗?它可能是$this->validate()唯一的:admin?我要在哪里插入这个DB:listen
?尽可能晚,就在您要调试的代码之前,尽量少一些“无关的”尽可能的打印输出?你能提供例子吗?我没有完全理解你说的话,兄弟。已经这么做了兄弟。我得到了一个新的错误。它不会对我进行身份验证。我已经在配置中进行了多次身份验证。为什么我仍然无法登录?
select count(*) as aggregate from `admin` where `password`=admin
SELECT COUNT(*) AS aggregate FROM `admin` WHERE `password`='admin'
\DB::listen(function($sql, $bindings, $time) {
var_dump($sql);
var_dump($bindings);
var_dump($time);
});
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder {
public function run() {
DB::table('admins')->delete(); //<== "admins" AS DEFINED IN YOUR CONFIG::: NOT "admin"
$admin = array(
array('username' => 'admin',
'password' => Hash::make('admin'))
);
DB::table('admins')->insert($admin);
}
}
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
public function run()
{
DB::table('admins')->truncate();
$admins = array(
array('username' => 'admin',
'password' => Hash::make('admin'))
);
DB::table('admins')->insert($admins);
}
}