2016-08-28 14 views
0

Когда я регистрирую и вводю данные, имя пользователя, адрес электронной почты и пароль. Поле имя пользователя равно null, я не знаю почему. И затем, когда я снова вводим имя пользователя, адрес электронной почты и пароль, результатом является ошибка. Ошибка описания на картинке.Нарушение ограничения целостности - yii db IntegrityException Yii2

Код для моделей/User.php:

<?php 

namespace app\models; 

use Yii; 
use yii\web\IdentityInterface; 
use yii\db\ActiveRecord; 
use yii\behaviors\TimestampBehavior; 

class User extends ActiveRecord implements IdentityInterface 
{ 
    const STATUS_DELETED = 0; 
    const STATUS_ACTIVE = 10; 

    public $id; 
    public $username; 
    public $password; 
    public $authKey; 
    public $accessToken; 

    public static function tableName() 
    { 
     return '{{%user}}'; 
    } 

    public function behaviors() 
    { 
     return 
      [ 
       TimestampBehavior::className(),  
      ]; 
    } 

    public function actionLogin() 
    { 
     if (!\Yii::$app->user->isGuest) { 
      return $this->goHome(); 
     } 

     $model = new LoginForm(); 
     if ($model->load(Yii::$app->request->post()) && $model->login()) { 
      return $this->goBack(); 
     } 
     return $this->render('login', [ 
      'model' => $model, 
     ]); 
    } 

    public function actionLogout() 
    { 
     Yii::$app->user->logout(); 

     return $this->goHome(); 
    } 

    public function rules() 
    { 
     return 
     [ 
      ['status', 'default', 'value' => self::STATUS_ACTIVE], 
      ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], 
     ]; 
    } 

    /** 
    private static $users = [ 
     '100' => [ 
      'id' => '100', 
      'username' => 'admin', 
      'password' => 'admin', 
      'authKey' => 'test100key', 
      'accessToken' => '100-token', 
     ], 
     '101' => [ 
      'id' => '101', 
      'username' => 'demo', 
      'password' => 'demo', 
      'authKey' => 'test101key', 
      'accessToken' => '101-token', 
     ], 
    ]; */ 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentity($id) 
    { 
     return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function findIdentityByAccessToken($token, $type = null) 
    { 
    } 

    /** 
    * Finds user by username 
    * 
    * @param string  $username 
    * @return static|null 
    */ 
    public static function findByUsername($username) 
    { 
     return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getId() 
    { 
     return $this->getPrimaryKey(); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function getAuthKey() 
    { 
     return $this->auth_key; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function validateAuthKey($authKey) 
    { 
     return $this->getAuthKey() === $authKey; 
    } 

    /** 
    * Validates password 
    * 
    * @param string $password password to validate 
    * @return boolean if password provided is valid for current user 
    */ 
    public function validatePassword($password) 
    { 
     return Yii::$app->security->validatePassword($password, $this->password_hash); 
    } 

    public function generatePasswordResetToken() 
    { 
     $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); 
    } 

    public function removePasswordResetToken() 
    { 
     $this->password_reset_token = null; 
    } 

    public function setPassword($password) 
    { 
     $this->password_hash = Yii::$app->security->generatePasswordHash($password); 
    } 

    public function generateAuthKey() 
    { 
     $this->auth_key = Yii::$app->security->generateRandomString(); 
    } 
} 

Код для моделей/SignupForm.php:

<?php 
namespace app\models; 
use app\models\User; 
use yii\base\Model; 
use Yii; 

class SignupForm extends Model 
{ 
    public $username; 
    public $email; 
    public $password; 
    public function rules() 
    { 
     return 
     [ 
      ['username', 'filter', 'filter' => 'trim'], 
      ['username', 'required'], 
      ['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been 
      taken.'], 
      ['username', 'string', 'min' => 2, 'max' => 255], 
      ['email', 'filter', 'filter' => 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      ['email', 'string', 'max' => 255], 
      ['email', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This email address has already 
      been taken'], 
      ['password', 'required'], 
      ['password', 'string', 'min' => 6], 
     ]; 
    } 

    public function signup() 
    { 
     if ($this->validate()) 
     { 
      $user = new user(); 
      $user->username = $this->username; 
      $user->email = $this->email; 
      $user->setPassword($this->password); 
      $user->generateAuthKey(); 
      if ($user->save()) 
      { 
       return $user; 
      } 
     } 
     return null; 
    } 
} 

контроллеры код/​​SiteController.php:

<?php 

namespace app\controllers; 

use Yii; 
use yii\filters\AccessControl; 
use yii\web\Controller; 
use yii\filters\VerbFilter; 
use app\models\LoginForm; 
use app\models\ContactForm; 
use app\components\AuthHandler; 
use app\models\UserSocialMedia; 
use app\models\User; 
use app\helpers\Url; 



class SiteController extends Controller 
{ 
    public function behaviors() 
    { 
     return [ 
      'access' => [ 
       'class' => AccessControl::className(), 
       'only' => ['logout'], 
       'rules' => [ 
        [ 
         'actions' => ['logout'], 
         'allow' => true, 
         'roles' => ['@'], 
        ], 
       ], 
      ], 
      'verbs' => [ 
       'class' => VerbFilter::className(), 
       'actions' => [ 
        'logout' => ['post'], 
       ], 
      ], 
     ]; 
    } 

    public function actions() 
    { 
     return [ 
      'error' => [ 
       'class' => 'yii\web\ErrorAction', 
      ], 
      'captcha' => [ 
       'class' => 'yii\captcha\CaptchaAction', 
       'fixedVerifyCode' => YII_ENV ? 'testme' : null, 
      ], 
      'auth' => [ 
       'class' => 'yii\authclient\AuthAction', 
       'successCallback' => [$this, 'successCallback'], 
      ], 
     ]; 
    } 

    public function successCallback($client) 
    { 
     // call safeAttributes method for properly format data 
     $attributes = $this->safeAttributes($client); 
    } 

    public function safeAttributes($client) 
    { 
     // get user data from client 
     $attributes = $client->getUserAttributes(); 

     // set default value 
     $safe_attributes = [ 
      'social_media' => '', 
      'id' => '', 
      'username' => '', 
      'name' => '', 
      'email' => '', 
     ]; 

      // get value from user attributes base on social media 
      if ($client instanceof \yii\autclient\client\Facebook) 
      { 
       $safe_attributes = [ 
        'social_media' => 'facebook', 
        'id' => $attributes['id'], 
        'username' => $attributes['email'], 
        'name' => $attributes['name'], 
        'email' => $attributes['email'], 
       ]; 
      } 
      else if ($client instanceof \yii\autclient\client\Google) 
      { 
       $safe_attributes = [ 
        'social_media' => 'google', 
        'id' => $attributes['id'], 
        'username' => $attributes['emails'] ['0'] ['value'], 
        'name' => $attributes['displayName'], 
        'email' => $attributes['emails'] ['0'] ['value'], 
       ]; 
      } 
      else if ($client instanceof \yii\autclient\client\Twitter) 
      { 
       $safe_attributes = [ 
        'social_media' => 'twitter', 
        'id' => $attributes['id'], 
        'username' => $attributes['screen_name'], 
        'name' => $attributes['name'], 
        'email' => '-', 
       ]; 
      } 
      else if ($client instanceof \yii\autclient\client\Github) 
      { 
       $safe_attributes = [ 
        'social_media' => 'github', 
        'id' => $attributes['id'], 
        'username' => $attributes['login'], 
        'name' => $attributes['name'], 
        'email' => $attributes['email'], 
       ]; 
      } 
     return $safe_attributes; 
    } 

    public function actionIndex() 
    { 
     return $this->render('index'); 
    } 

    public function actionLogin() 
    { 
     if (!\Yii::$app->user->isGuest) { 
      return $this->goHome(); 
     } 

     $model = new LoginForm(); 
     if ($model->load(Yii::$app->request->post()) && $model->login()) { 
      return $this->goBack(); 
     } 
     return $this->render('login', [ 
      'model' => $model, 
     ]); 
    } 

    public function actionLogout() 
    { 
     Yii::$app->user->logout(); 

     return $this->goHome(); 
    } 

    public function actionContact() 
    { 
     $model = new ContactForm(); 
     if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { 
      Yii::$app->session->setFlash('contactFormSubmitted'); 

      return $this->refresh(); 
     } 
     return $this->render('contact', [ 
      'model' => $model, 
     ]); 
    } 

    public function actionAbout() 
    { 
     return $this->render('about'); 
    } 


    public function actionCommentary() 
    { 
     $model = new \app\models\Commentary(); 
     // return $this->render('commentary',['model' => $model,]); 

     // Jika form di sumbit dengan method POST 
     if (Yii::$app->request->post()) 
     { 
      $model->load(Yii::$app->request->post()); 
      if($model->validate()){ 
       Yii::$app->session->setFlash('success','Thank You'); 
      } 
      else { 
       Yii::$app->session->setFlash('error','Sorry, something wrong'); 
      } 
      return $this->render('result_commentary',['model'=>$model,]); 
     } 
      else{ 
       return $this->render('commentary',['model'=>$model,]); 
      } 
    } 

    public function actionQuery() 
    { 
     $db = Yii::$app->db; 
     $command = $db->createCommand('SELECT * FROM employee'); 
     $employees = $command->queryAll(); 
     // Ekstrak data 
     foreach ($employees as $employee) 
     { 
      echo "<br>"; 
      echo $employee['id']." "; 
      echo $employee['name']." "; 
      echo $employee['age']." "; 
     } 
    } 

     public function actionQuery2() 
     { 
      $db= Yii::$app->db; 
      // return a single row 
      $employee = $db->createCommand('SELECT * FROM employee where id=1') 
      ->queryOne(); 
      echo $employee['id']." "; 
      echo $employee['name']." "; 
      echo "(".$employee['age'].")"; 
      echo "<hr>"; 
      // return a single column (the first column) 
      $names = $db->createCommand('SELECT name FROM employee')-> 
      queryColumn(); 
      print_r($names); 
      echo "<hr>"; 
      // Binding Parameter 
      $employee = $db->createCommand('SELECT * FROM employee WHERE id=:id' 
       ,['id'=>2])->queryOne(); 

      // INSERT (table name, column values) 
      //$db->createCommand()->insert('employee',['name'=>'Nur','age'=>'99', 
      // ])->execute(); 

      // UPDATE (table name, column values, condition) 
      //$db->createCommand()->update('employee',['age'=>'30'], 'id = 7') 
      //->execute(); 

      // DELETE (table name, condition) 
      //$db->createCommand()->delete('employee', 'id = 7') 
      //->execute(); 

      // table name, column name, column values 
      $db->createCommand()->batchInsert('employee', 
       ['name', 'age'], 
       [ 
        ['Nur', 25], 
        ['Dani', 32], 
        ['Nurul', 40], 
       ])->execute(); 
     } 

     public function actionActiveRecord() 
     { 
      $employees = \app\models\Employee::find()->all(); 
      foreach($employees as $employee) 
      { 
       echo "<br>"; 
       echo $employee->id." "; 
       echo $employee->name." "; 
       echo "(".$employee->age.") ";  
      } 
     } 

     public function actionSignup() 
     { 
      $model = new \app\models\SignupForm(); 
      // use session 
      $session = Yii::$app->session; 
      $attributes = $session['attributes']; 

      if ($model->load(Yii::$app->request->post())) 
      { 
       if ($user = $model->signup()) 
       { 
        if ($session->has('attributes')) 
        { 
         // add data user_social_media 
         $user_social_media = new UserSocialMedia([ 
          'social_media' => $attributes['social_media'], 
          'id' => (string)$attributes['id'], 
          'username' => $attributes['username'], 
          'user_id' => $user->id, 
          ]); 
         $user_social_media->save(); 
        } 

        if (Yii::$app->getUser()->login($user)) 
        { 
         return $this->goHome(); 
        } 
       } 
      } 

      if ($session->has('attributes')) 
      { 
       // set form field with data from social media 
       $model->username = $attributes['username']; 
       $model->email = $attributes['email']; 
      } 

      return $this->render('signup', ['model' => $model, 
       ]); 
     } 
} 

ответ

1

Удалить User декларации атрибутов модели, которые присутствуют в таблице базы данных:

public $id; 
public $username; 

Они будут обработаны ActiveRecord и добавив его вручную, вы препятствуют этому процессу.

Смежные вопросы