J'utilise le framework Laravel.
J'ai 2 tables (utilisateurs et membres). Lorsque je souhaite me connecter, le message d'erreur suivant s'affiche:
SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'user_email' dans 'clause Where' (SQL: sélectionnez * à partir de
members
oùuser_email
=? limite 1) (Liaisons: tableau (0 => '[email protected]',))
Utilisateurs de la table
CREATE TABLE IF NOT EXISTS `festival_aid`.`users` (
`user_id` BIGINT NOT NULL AUTO_INCREMENT,
`user_email` VARCHAR(45) NOT NULL,
`user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user_modified` TIMESTAMP NULL,
`user_deleted` TIMESTAMP NULL,
`user_lastlogin` TIMESTAMP NULL,
`user_locked` TIMESTAMP NULL,
PRIMARY KEY (`user_id`),
UNIQUE INDEX `user_email_UNIQUE` (`user_email` ASC),
ENGINE = InnoDB;
Membres de la table
CREATE TABLE IF NOT EXISTS `festival_aid`.`members` (
`member_id` BIGINT NOT NULL AUTO_INCREMENT,
`member_password` CHAR(32) NOT NULL,
`member_salt` CHAR(22) NOT NULL,
`member_token` VARCHAR(128) NULL,
`member_confirmed` TIMESTAMP NULL,
`user_id` BIGINT NOT NULL,
PRIMARY KEY (`member_id`, `user_id`),
INDEX `fk_members_users1_idx` (`user_id` ASC),
CONSTRAINT `fk_members_users1`
FOREIGN KEY (`user_id`)
REFERENCES `festival_aid`.`users` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Utilisateur de migration
public function up()
{
Schema::table('users', function(Blueprint $table)
{
$table->increments('user_id');
$table->string('user_email');
$table->timestamp('user_created');
$table->timestamp('user_modified');
$table->timestamp('user_deleted');
$table->timestamp('user_lastlogin');
$table->timestamp('user_locked');
});
}
Membre de migration
public function up()
{
Schema::table('members', function(Blueprint $table)
{
$table->increments('member_id');
$table->string('member_password');
$table->string('member_salt');
$table->string('member_token');
$table->foreign('user_id')
->references('id')->on('users');
//->onDelete('cascade');
$table->timestamp('member_confirmed');
});
}
Modèle utilisateur
class User extends Eloquent {
protected $table = 'users';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'user_id';
public $timestamps = false;
}
Membre modèle
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class Member extends Eloquent implements UserInterface, RemindableInterface {
protected $table = 'members';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('member_password');
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->getKey();
}
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->member_password;
}
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail()
{
return $this->email;
}
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'member_id';
public $timestamps = false;
public function users()
{
return $this->hasOne('User');
}
}
Le modèle de membre utilise: use Illuminate\Auth\UserInterface;
<?php namespace Illuminate\Auth;
interface UserInterface {
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier();
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword();
}
Manette
public function store()
{
$input = Input::all();
$rules = array('user_email' => 'required', 'member_password' => 'required');
$v = Validator::make($input, $rules);
if($v->passes())
{
$credentials = array('user_email' => $input['user_email'], 'member_password' => $input['member_password']);
if(Auth::attempt($credentials))
{
return Redirect::to('/home');
} else {
return Redirect::to('login');
}
} else {
return Redirect::to('login')->withErrors($v);
}
}
auth.php
return array(
/*
|--------------------------------------------------------------------------
| Default Authentication Driver
|--------------------------------------------------------------------------
|
| This option controls the authentication driver that will be utilized.
| This drivers manages the retrieval and authentication of the users
| attempting to get access to protected areas of your application.
|
| Supported: "database", "eloquent"
|
*/
'driver' => 'eloquent',
/*
|--------------------------------------------------------------------------
| Authentication Model
|--------------------------------------------------------------------------
|
| When using the "Eloquent" authentication driver, we need to know which
| Eloquent model should be used to retrieve your users. Of course, it
| is often just the "User" model but you may use whatever you like.
|
*/
'model' => 'Member',
/*
|--------------------------------------------------------------------------
| Authentication Table
|--------------------------------------------------------------------------
|
| When using the "Database" authentication driver, we need to know which
| table should be used to retrieve your users. We have chosen a basic
| default value but you may easily change it to any table you like.
|
*/
'table' => 'members',
/*
|--------------------------------------------------------------------------
| Password Reminder Settings
|--------------------------------------------------------------------------
|
| Here you may set the settings for password reminders, including a view
| that should be used as your password reminder e-mail. You will also
| be able to set the name of the table that holds the reset tokens.
|
| The "expire" time is the number of minutes that the reminder should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'reminder' => array(
'email' => 'emails.auth.reminder',
'table' => 'password_reminders',
'expire' => 60,
),
);
Qu'est-ce que je fais mal ici?
Vous avez configuré le auth.php
et utilisé la table members
pour l'authentification, mais il n'y a pas de user_email
champ dans la table members
donc, Laravel dit
SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'user_email' dans 'clause where' (SQL: select * from members où user_email =? Limit 1) (Liaisons: array (0 => '[email protected]', ))
Parce qu'il essaie de faire correspondre le user_email
dans la table members
et ce n’est pas là. Selon votre configuration auth
, laravel
utilise la table members
pour l'authentification et non la table users
.
Vous n'avez pas de champ nommé user_email
dans la table des membres ... quant à pourquoi, je ne suis pas sûr car le code "ressemble" à ce qu'il devrait essayer de joindre sur différents champs
La méthode Auth :: try effectue-t-elle une jointure du schéma? Courir grep -Rl 'class Auth' /path/to/framework
et trouvez où se trouve la méthode attempt
et ce qu’elle fait.