Регистрация

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
CCCZen
Сообщения: 21
Зарегистрирован: 2018.04.01, 15:41

Регистрация

Сообщение CCCZen »

При сохранении в бд, не сохраняет username(заполняет как пустое поле)
При этом в модель юзернейм ушел
object(app\models\User)#97 (15) {
["id"]=>
NULL
["username"]=>
string(5) "admin"
["password"]=>
NULL
["authKey"]=>
NULL
["accessToken"]=>
NULL
["_attributes":"yii\db\BaseActiveRecord":private]=>
array(4) {
["email"]=>
string(11) "1232dd@ma.u"
["created_at"]=>
int(1522586398)
["password_hash"]=>
string(60) "$2y$13$HVJWcUQRBIe/J9YcBgoJR.qvpeHdmwJT/EcYVyljZuZPG3Od57Ez6"
["auth_key"]=>
string(32) "ZVHoDuAPsFC1_PU_lvGLHseRuunguFUI"
}

(вардамп beforeSave)
в чем может быть проблема?

Integrity constraint violation: 1062 Duplicate entry '' for key 'username'
The SQL being executed was: INSERT INTO `user` (`email`, `created_at`, `password_hash`, `auth_key`) VALUES
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Регистрация

Сообщение andku83 »

CCCZen писал(а): 2018.04.01, 15:48 Integrity constraint violation: 1062 Duplicate entry '' for key 'username'
что тут не понятно?
CCCZen
Сообщения: 21
Зарегистрирован: 2018.04.01, 15:41

Re: Регистрация

Сообщение CCCZen »

То что юзернейм то в модель передается а sql запускается без него.
INSERT INTO `user` (`email`, `created_at`, `password_hash`, `auth_key`) VALUES

В самой модели User ник есть
object(app\models\User)#97 (15) {
["username"]=>
string(5) "admin"
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: Регистрация

Сообщение Евгений Емельянов »

username не в safe-атрибуте?
CCCZen
Сообщения: 21
Зарегистрирован: 2018.04.01, 15:41

Re: Регистрация

Сообщение CCCZen »

Код: Выделить всё

 public function rules()
    {
        return [
            ['username', 'trim'],
            ['username', 'required'],
            ['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been taken.'],
            ['username', 'string', 'min' => 2, 'max' => 255],
            ['email', '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()
    {


        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->created_at = time();

        return $user->createUser();
    }
     public function createUser()
    {
        if (!$this->validate()) {
            return null;
        }
        $this->setPassword($this->password);
        $this->generateAuthKey();

        if ($this->save()) {
            return $this;
        } else {
            return null;
        }
    }
    

Код: Выделить всё

 public function actionNewuser(){
        $model = new SignupForm();


        if ($model->load(\Yii::$app->request->post())) {
            if ($user = $model->signup()) {
                if (\Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }

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

Код: Выделить всё

 $this->createTable('user', [
            'id' => $this->primaryKey(),
            'username' => $this->string()->notNull()->unique(),
            'auth_key' => $this->string(32)->notNull(),
            'password_hash' => $this->string()->notNull(),
            'password_reset_token' => $this->string()->unique(),
            'email' => $this->string()->notNull()->unique(),
            'status' => $this->smallInteger()->notNull()->defaultValue(10),
            'created_at' => $this->integer()->notNull(),
            'updated_at' => $this->integer()->notNull(),
        ]);
mysql-5.5
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Регистрация

Сообщение andku83 »

попробуйте сбросить кеш структуры БД
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Регистрация

Сообщение andku83 »

тупо, но мало ли
CCCZen
Сообщения: 21
Зарегистрирован: 2018.04.01, 15:41

Re: Регистрация

Сообщение CCCZen »

Username не попадает в DirtyAttributes
С чем это может быть связано?

Код: Выделить всё

array(4) {
  ["email"]=>
  string(13) "adsad@mail.ru"
  ["created_at"]=>
  int(1522731640)
  ["password_hash"]=>
  string(60) "$2y$13$F8A0aV4zV1rPR4LVkHZhkObcaF0X01NqbgGQgbQECRjVwKrxzqe7O"
  ["auth_key"]=>
  string(32) "ffu58zBwFb_bf3qQLEkIOz90oryXEfIQ"
}
array(9) {
  ["id"]=>
  NULL
  ["username"]=>
  string(4) "test"
  ["auth_key"]=>
  string(32) "ffu58zBwFb_bf3qQLEkIOz90oryXEfIQ"
  ["password_hash"]=>
  string(60) "$2y$13$F8A0aV4zV1rPR4LVkHZhkObcaF0X01NqbgGQgbQECRjVwKrxzqe7O"
  ["password_reset_token"]=>
  NULL
  ["email"]=>
  string(13) "adsad@mail.ru"
  ["status"]=>
  NULL
  ["created_at"]=>
  int(1522731640)
  ["updated_at"]=>
  NULL
}

Код: Выделить всё

public function beforeSave($insert)
    {
      echo "<pre>";
        var_dump($this->getDirtyAttributes());
        var_dump($this->attributes);

        echo "</pre>";
        return parent::beforeSave($insert); // TODO: Change the autogenerated stub
    }

Код: Выделить всё

public function getDirtyAttributes($names = null)
    {

        if ($names === null) {
            $names = $this->attributes();
        }
        $names = array_flip($names);
        $attributes = [];
        echo "<pre>";
        var_dump($this->attributes);
        var_dump($this->_attributes);
        echo "</pre>";

Код: Выделить всё

array(9) {
  ["id"]=>
  NULL
  ["username"]=>
  string(6) "asddas"
  ["auth_key"]=>
  string(32) "Zj9RofdpMOYiTYHETTzdLYVR7UWuu_4S"
  ["password_hash"]=>
  string(60) "$2y$13$tciwm7eB5/tzICQmhEYqy.o4aXvONEPEkxq5.4qTTGzMEnv5u4uh."
  ["password_reset_token"]=>
  NULL
  ["email"]=>
  string(14) "asdasd23@ma.ru"
  ["status"]=>
  NULL
  ["created_at"]=>
  int(1522740594)
  ["updated_at"]=>
  NULL
}
array(4) {
  ["email"]=>
  string(14) "asdasd23@ma.ru"
  ["created_at"]=>
  int(1522740594)
  ["password_hash"]=>
  string(60) "$2y$13$tciwm7eB5/tzICQmhEYqy.o4aXvONEPEkxq5.4qTTGzMEnv5u4uh."
  ["auth_key"]=>
  string(32) "Zj9RofdpMOYiTYHETTzdLYVR7UWuu_4S"
}
что за атрибуты с подчеркиванием*
откуда у них есть значения, пытаюсь проследить по коду не могу найти
почему мы форичем проходим по _attr если именно в этом месте составляем из всех аттрибутов модели?

Код: Выделить всё

foreach ($this->_attributes as $name => $value) {

                if (isset($names[$name])) {
                    $attributes[$name] = $value;
                }
            }
CCCZen
Сообщения: 21
Зарегистрирован: 2018.04.01, 15:41

Re: Регистрация

Сообщение CCCZen »

В общем как это бредово бы не звучало: помогло удаление паблик переменной username;
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Регистрация

Сообщение urichalex »

CCCZen писал(а): 2018.04.03, 11:01 В общем как это бредово бы не звучало: помогло удаление паблик переменной username;
andku83 писал(а): 2018.04.03, 00:05 тупо, но мало ли
Ответить