gpt4 book ai didi

php - Laravel SQLSTATE[23000] : Integrity constraint violation: 1062 Duplicate entry

转载 作者:行者123 更新时间:2023-12-04 19:16:18 24 4
gpt4 key购买 nike

我是 Laravel 的新手,这是我在 Laravel 的第一个项目。像往常一样,首先我正在开发一个完整的用户身份验证系统。我可以注册一个用户,可以发送用户验证电子邮件,点击该链接后我可以激活一个新用户帐户,可以登录和可以注销。但是之后每当我尝试注册另一个新用户和点击验证链接后 ,我面临一个异常(exception),即

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)

现在这是我的 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'
));
});
?>

这是我的 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');
}
}
?>

这是我创建的用户迁移文件
<?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');
}

}
?>

这是我的 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');

}
?>

现在有什么问题吗?

最佳答案

确保您的 code字段是 nullable ,然后不是将其值设置为空字符串,而是将其设置为空:

$code = null;

然后您将能够将其保存为 NULL (MySQL),同时它保持唯一。

也改变这一点:
 $user = User::where('code','=',$code)->where('active','=',0);
if($user->count()){
$user = $user->first();

到:
 $user = User::where('code','=',$code)->where('active','=',0)->first();
if(count($user)){

您不需要两次调用 db,只需检查返回的结果是否为空( count 即可),这意味着它返回了 User目的。

关于php - Laravel SQLSTATE[23000] : Integrity constraint violation: 1062 Duplicate entry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com