完整性约束违规 - yii \ db \ IntegrityException Yii2

时间:2016-08-28 08:31:14

标签: php login frameworks yii2

当我注册并输入数据用户名,电子邮件和密码时。字段用户名为null,我不知道为什么。然后当我再次输入数据用户名,电子邮件和密码时,结果是错误的。描述错误可以在图片中看到。

模型代码/ 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 个答案:

答案 0 :(得分:1)

删除User模型属性&#39;数据库表中存在的声明:

public $id;
public $username;

这些将由ActiveRecord处理,并且手动添加它会阻止此过程。