Laravel SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
ich bin ganz neu in Laravel und dies ist mein erstes Projekt in Laravel.Wie üblich, zunächst einmal bin ich der Entwicklung eine vollständige Benutzer-Authentifizierung-system.Ich kann registriert einen einzelnen Benutzer senden kann Benutzer Bestätigungs-E-Mail und nach einem Klick auf diesen link kann ich aktivieren Sie ein neues Benutzerkonto, kann sich anmelden und Abmelden können.Aber nach, dass, Wann immer ich versuche, registriert eine weitere neue Benutzer-und nach einem Klick auf den Bestätigungs-link , ich bin vor eine Ausnahme, die ist,
Illuminate \ Database \ QueryException
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'users_code_unique' (SQL: update `users` set `code` = , `active` = 1, `updated_at` = 2014-07- 25 04:26:06 where `id` = 41)
nun, dies ist mein route.php,
<?php
Route::get('/',array(
'as' =>'home',
'uses' =>'HomeController@index'
));
Route::get('/signin',array(
'as' =>'signin',
'uses' =>'AccountController@signinGet'
));
Route::get('/signup',array(
'as' => 'signup',
'uses' => 'AccountController@signupGet'
));
/*
/*
/Authenticated Group
*/
Route::group(array('before' => 'auth'),function(){
/*
/Sign Out(GET)
*/
Route::get('/signout',array
(
'as' => 'signout',
'uses' => 'AccountController@signoutGet'
));
});
/*
/UnAuthenticated Group
*/
Route::group(array('before' => 'guest'),function(){
/* CSRF Protect*/
Route::group(array('before' => 'csrf'),function(){
/*
/Create Account(POST)
*/
Route::post('/signup',array(
'as'=> 'signup',
'uses'=>'AccountController@signupPost'
));
/*
/Sign In(POST)
*/
Route::post('/signin',array(
'as' => 'signin-post',
'uses' => 'AccountController@signinPost'
));
});
/*
/Sign In (GET)
*/
Route::get('/signin',array(
'as' => 'signin',
'uses' => 'AccountController@signinGet'
));
/*
/Create Account(GET)
*/
Route::get('/signup',array(
'as' => 'signup',
'uses'=> 'AccountController@signupGet'
));
Route::get('signup/account/activate/{code}',array(
'as' =>'activate-account',
'uses' =>'AccountController@activatePost'
));
});
?>
und das ist mein AccountController
<?php
class AccountController extends \BaseController {
public function signinGet()
{
return View::make('account.signin');
}
public function signinPost(){
$validator = Validator::make(Input::all(),array(
'email' => 'required|email',
'password' => 'required'
));
if($validator->fails()){
//redirect to the signin page
return Redirect::route('signin')
->withErrors($validator)
->withInput();
}else{
//Attempt user singin
$auth = Auth::attempt(array
(
'email' => Input::get('email'),
'password' => Input::get('password'),
'active' => 1
));
if($auth){
//Redirect To intented URL
return Redirect::intended('/');
}
else
{
return Redirect::route('signin')
->with('global','The username or password you provided is wrong or account not activated!');
}
}
return Redirect::route('signin')
->with('global','There is a problem Signing You in.');
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function signupGet()
{
return View::make('account.signup');
}
public function signupPost()
{
$validator = Validator::make(Input::all(), array(
'email' => 'required|max:255|email|unique:users',
'username' => 'required|min:3|unique:users',
'password' => 'required|min:6',
'password_again' => 'required|same:password'
)
);
if($validator->fails())
{
return Redirect::route('signup')
->withErrors($validator)
->withInput();
}else
{
$email = Input::get('email');
$username = Input::get('username');
$password = Input::get('password');
//Activation Code
$code = str_random(60);
$user = User::create(array(
'email' => $email,
'username' => $username,
'password' => Hash::make($password),
'code' => $code,
'active' => 0
)
);
if($user){
//User Activation Code Creation
Mail::send('emails.auth.activate', array('link' => URL::route('activate-account',$code), 'username' => $username),function($message) use ($user)
{
$message->to($user->email,$user->username)->subject('Activate Your Account');
});
return Redirect::route('signup')
->with('global','Your Account has been created! We have sent you an email to activate your account.Please Check the both the Inbox and Spam Folder.');
}
}
//return 'This is a Post Result';
}
public function activatePost($code){
$user = User::where('code','=',$code)->where('active','=',0);
if($user->count()){
$user = $user->first();
$user->active = 1;
$user->code = '';
if($user->save()){
return Redirect::route('home')
->with('global','Activated!.You can sign in now!');
}
}
else{
return Redirect::route('signup')
->with('global','Sorry!We could not activate your acount,please try again later.');
}
}
public function signoutGet(){
Auth::logout();
return Redirect::route('home');
}
}
?>
und das ist mein erstellen Sie Benutzer-migration-Datei
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('username',255)->unique();
$table->string('email',255)->unique();
$table->string('password',60);
$table->string('password_temp',60);
$table->string('code',60)->unique();
$table->integer('active');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}
?>
- und das ist meine user.php
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface {
public function getRememberToken()
{
return $this->remember_token;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
public function getRememberTokenName()
{
return 'remember_token';
}
protected $fillable = array('email','username','password','password_temp','code','active');
use UserTrait, RemindableTrait;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password', 'remember_token');
}
?>
nun was ist das problem?
- Es sieht aus wie die
user->code
ist nicht eindeutig. Sind Sie sicher, dass es ist? Versuchen Sie, hallte es, und vergleichen Sie, was Sie bereits in der Datenbank. Ich hatte ein Problem mal mit str_random auf winXP, in einem kurzen Zeitraum von Zeit, die es erzeugt, wird derselbe Zufalls-strings... - Ahh sorry, für mich war es nicht laravels 4
str_random
aber eine andere Funktion, die zufällig zu mischen, aber es erzeugt die gleichen Saiten wie ich sagte. - dann, wie dieses problem zu lösen,haben Sie eine Lösung?
- Nein, ich habe es gecheckt,in der Tat str_random() generieren von eindeutigen string.
- Das ist eine Vermutung, aber ich würde versuchen, die Steigerung string limit in DB-Schemas zB.
$table->string('code',256)->unique();
und sehen, ob die codes korrekt gespeichert werden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Ihre
code
Feld istnullable
, dann statt der Einstellung es Wert ist, zu leeren string, damit es null:Dann werden Sie in der Lage, speichern Sie es als NULL (MySQL) und bleibt dabei einzigartig.
Ändern sich auch diese:
Zu:
Brauchen Sie nicht zu rufen db zweimal, nur prüfen, ob zurückgegebene Ergebnis ist nicht-null - (
count
tun), was bedeutet, es kehrte eineUser
Objekt.Habe ich es gefunden. Haben Sie den code einstellen-Spalte als eindeutigen, wenn Sie setzen Sie es auf eine leere Zeichenfolge, wenn der Benutzer klicken Sie auf einen Aktivierungs-link. Und es gibt bereits eine Zeile in der Tabelle mit= code"; so wirft es einen Fehler. Das problem ist hier (activatePost):
Also entweder nicht leer, legen Sie es auf etwas anderes oder set db-Spalten als nicht eindeutig.
Ich würde den code ohne diese zu entleeren und zusätzlich würde ich prüfen, ob Benutzer aktiviert wurde - eine einfache
if
im activatePost. Vielleicht ist es eine gute Idee zu überprüfen, Benutzer, nicht nur nach dem code, sondern auch mit einer gehashten id im link.kann dein problem verwenden validator zu überprüfen. verwenden Sie einfach wie diese:
entdecken Sie mehr auf laravel validation
Gibt es ein paar Dinge, die Sie tun müssen, um zu verbessern Sie Ihre code. Aber doppelten Eintrag in der Regel passiert, wenn Sie eine Spalte auf unique und versucht neu zu inset-die gleichen Daten in einer anderen Zeile. Die meiste Zeit ist es verwirrend ist, wenn Sie überprüfen Sie Ihre Tabelle und suchen Sie die Spalte leer. Whoop! Wenn eine Spalte eingestellt ist einzigartig und leer, es bedeutet, dass keine anderen Spalte enthalten kann, die leeren Daten.
In einfachen Worten die form der Spalte kann nicht dupliziert werden, entweder null oder mit Daten.