Обновил базу данных на сервере таким образом, удалил старую и сделал импорт новой из локального сервера. Теперь при входе в backend, после ввода логин и пароль выходит ошибка:
yii\db\Exception: amnah\yii2\user\models\User does not have a primary key. You should either define a primary key for the corresponding table or override the primaryKey() method. in /var/www/vhosts/infosec.uz/lab.infosec.uz/vendor/yiisoft/yii2/db/BaseActiveRecord.php:1036
А если нажать на любую ссылку, ошибка:
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'i' in 'where clause' in /var/www/vhosts/infosec.uz/lab.infosec.uz/vendor/yiisoft/yii2/db/Command.php:837
Next yii\db\Exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'i' in 'where clause'
The SQL being executed was: SELECT * FROM `user` WHERE `i`=1
in /var/www/vhosts/infosec.uz/lab.infosec.uz/vendor/yiisoft/yii2/db/Schema.php:628
А после обновления страницы, или нажатия любой ссылки, стоит и не меняется ошибка:
yii\base\InvalidConfigException: "amnah\yii2\user\models\User" must have a primary key. in /var/www/vhosts/infosec.uz/lab.infosec.uz/vendor/yiisoft/yii2/db/ActiveRecord.php:184
Я не пойму почему на локальном открывается, а на глобальном ошибка. Как можно решить проблему?
структура таблицы user:
id (Первичный) int(11)
role_id int(11)
status smallint(6)
email varchar(255)
username varchar(255)
password varchar(255)
auth_key varchar(255)
access_token varchar(255)
logged_in_ip varchar(255)
logged_in_at timestamp
created_ip varchar(255)
created_at timestamp
updated_at timestamp
banned_at timestamp
banned_reason varchar(255)
Класс User.php
namespace amnah\yii2\user\models;
use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\swiftmailer\Mailer;
use yii\swiftmailer\Message;
use yii\helpers\Inflector;
use ReflectionClass;
/**
* This is the model class for table "tbl_user".
*
* @property string $id
* @property string $role_id
* @property integer $status
* @property string $email
* @property string $username
* @property string $password
* @property string $auth_key
* @property string $access_token
* @property string $logged_in_ip
* @property string $logged_in_at
* @property string $created_ip
* @property string $created_at
* @property string $updated_at
* @property string $banned_at
* @property string $banned_reason
*
* @property Profile $profile
* @property Role $role
* @property UserToken[] $userTokens
* @property UserAuth[] $userAuths
*/
class User extends ActiveRecord implements IdentityInterface
{
/**
* @var int Inactive status
*/
const STATUS_INACTIVE = 0;
/**
* @var int Active status
*/
const STATUS_ACTIVE = 1;
/**
* @var int Unconfirmed email status
*/
const STATUS_UNCONFIRMED_EMAIL = 2;
/**
* @var string Current password - for account page updates
*/
public $currentPassword;
/**
* @var string New password - for registration and changing password
*/
public $newPassword;
/**
* @var string New password confirmation - for reset
*/
public $newPasswordConfirm;
/**
* @var array Permission cache array
*/
protected $permissionCache = [];
/**
* @var \amnah\yii2\user\Module
*/
public $module;
/**
* @inheritdoc
*/
public function init()
{
if (!$this->module) {
$this->module = Yii::$app->getModule("user");
}
}
/**
* @inheritdoc
*/
public function rules()
{
// set initial rules
$rules = [
// general email and username rules
[['email', 'username'], 'string', 'max' => 255],
[['email', 'username'], 'unique'],
[['email', 'username'], 'filter', 'filter' => 'trim'],
[['email'], 'email'],
[['username'], 'match', 'pattern' => '/^[A-Za-z0-9_]+$/u', 'message' => Yii::t('user', '{attribute} can contain only letters, numbers, and "_"')],
// password rules
[['newPassword'], 'string', 'min' => 3],
[['newPassword'], 'filter', 'filter' => 'trim'],
[['newPassword'], 'required', 'on' => ['register', 'reset']],
[['newPasswordConfirm'], 'required', 'on' => ['reset']],
[['newPasswordConfirm'], 'compare', 'compareAttribute' => 'newPassword', 'message' => Yii::t('user', 'Passwords do not match')],
// account page
[['currentPassword'], 'validateCurrentPassword', 'on' => ['account']],
// admin crud rules
[['role_id', 'status'], 'required', 'on' => ['admin']],
[['role_id', 'status'], 'integer', 'on' => ['admin']],
[['banned_at'], 'integer', 'on' => ['admin']],
[['banned_reason'], 'string', 'max' => 255, 'on' => 'admin'],
];
// add required for currentPassword on account page
// only if $this->password is set (might be null from a social login)
if ($this->password) {
$rules[] = [['currentPassword'], 'required', 'on' => ['account']];
}
// add required rules for email/username depending on module properties
$requireFields = ["requireEmail", "requireUsername"];
foreach ($requireFields as $requireField) {
if ($this->module->$requireField) {
$attribute = strtolower(substr($requireField, 7)); // "email" or "username"
$rules[] = [$attribute, "required"];
}
}
return $rules;
}
/**
* Validate current password (account page)
*/
public function validateCurrentPassword()
{
if (!$this->validatePassword($this->currentPassword)) {
$this->addError("currentPassword", "Current password incorrect");
}
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('user', 'ID'),
'role_id' => Yii::t('user', 'Role ID'),
'status' => Yii::t('user', 'Status'),
'email' => Yii::t('user', 'Email'),
'username' => Yii::t('user', 'Username'),
'password' => Yii::t('user', 'Password'),
'auth_key' => Yii::t('user', 'Auth Key'),
'access_token' => Yii::t('user', 'Access Token'),
'logged_in_ip' => Yii::t('user', 'Logged In Ip'),
'logged_in_at' => Yii::t('user', 'Logged In At'),
'created_ip' => Yii::t('user', 'Created Ip'),
'created_at' => Yii::t('user', 'Created At'),
'updated_at' => Yii::t('user', 'Updated At'),
'banned_at' => Yii::t('user', 'Banned At'),
'banned_reason' => Yii::t('user', 'Banned Reason'),
// virtual attributes set above
'currentPassword' => Yii::t('user', 'Current Password'),
'newPassword' => $this->isNewRecord ? Yii::t('user', 'Password') : Yii::t('user', 'New Password'),
'newPasswordConfirm' => Yii::t('user', 'New Password Confirm'),
];
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'value' => function ($event) {
return gmdate("Y-m-d H:i:s");
},
],
];
}
/**
* Stick with 1 user:1 profile
* @return \yii\db\ActiveQuery
*/
/*
public function getProfiles()
{
return $this->hasMany(Profile::className(), ['user_id' => 'id']);
}
*/
/**
* @return \yii\db\ActiveQuery
*/
public function getProfile()
{
$profile = $this->module->model("Profile");
return $this->hasOne($profile::className(), ['user_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getRole()
{
$role = $this->module->model("Role");
return $this->hasOne($role::className(), ['id' => 'role_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getUserTokens()
{
$userToken = $this->module->model("UserToken");
return $this->hasMany($userToken::className(), ['user_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getUserAuths()
{
return $this->hasMany(UserAuth::className(), ['user_id' => 'id']);
}
/**
* @inheritdoc
*/
public static function findIdentity($id)
{
return static::findOne($id);
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(["access_token" => $token]);
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return $this->auth_key === $authKey;
}
/**
* Validate password
* @param string $password
* @return bool
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password);
}
/**
* @inheritdoc
*/
public function beforeSave($insert)
{
// check if we're setting $this->password directly
// handle it by setting $this->newPassword instead
$dirtyAttributes = $this->getDirtyAttributes();
if (isset($dirtyAttributes["password"])) {
$this->newPassword = $dirtyAttributes["password"];
}
// hash new password if set
if ($this->newPassword) {
$this->password = Yii::$app->security->generatePasswordHash($this->newPassword);
}
// convert banned_at checkbox to date
if ($this->banned_at) {
$this->banned_at = gmdate("Y-m-d H:i:s");
}
// ensure fields are null so they won't get set as empty string
$nullAttributes = ["email", "username", "banned_at", "banned_reason"];
foreach ($nullAttributes as $nullAttribute) {
$this->$nullAttribute = $this->$nullAttribute ? $this->$nullAttribute : null;
}
return parent::beforeSave($insert);
}
/**
* Set attributes for registration
* @param int $roleId
* @param string $status
* @return static
*/
public function setRegisterAttributes($roleId, $status = null)
{
// set default attributes
$attributes = [
"role_id" => $roleId,
"created_ip" => Yii::$app->request->userIP,
"auth_key" => Yii::$app->security->generateRandomString(),
"access_token" => Yii::$app->security->generateRandomString(),
"status" => static::STATUS_ACTIVE,
];
// determine if we need to change status based on module properties
$emailConfirmation = $this->module->emailConfirmation;
$requireEmail = $this->module->requireEmail;
$useEmail = $this->module->useEmail;
if ($status) {
$attributes["status"] = $status;
} elseif ($emailConfirmation && $requireEmail) {
$attributes["status"] = static::STATUS_INACTIVE;
} elseif ($emailConfirmation && $useEmail && $this->email) {
$attributes["status"] = static::STATUS_UNCONFIRMED_EMAIL;
}
// set attributes and return
$this->setAttributes($attributes, false);
return $this;
}
/**
* Check for email change
* @return string|bool
*/
public function checkEmailChange()
{
// check if user didn't change email
if ($this->email == $this->getOldAttribute("email")) {
return false;
}
// check if we need to confirm email change
if (!$this->module->emailChangeConfirmation) {
return false;
}
// check if user is removing email address (only valid if Module::$requireEmail = false)
if (!$this->email) {
return false;
}
// update status and email before returning new email
$newEmail = $this->email;
$this->status = static::STATUS_UNCONFIRMED_EMAIL;
$this->email = $this->getOldAttribute("email");
return $newEmail;
}
/**
* Update login info (ip and time)
* @return bool
*/
public function updateLoginMeta()
{
$this->logged_in_ip = Yii::$app->request->userIP;
$this->logged_in_at = gmdate("Y-m-d H:i:s");
return $this->save(false, ["logged_in_ip", "logged_in_at"]);
}
/**
* Confirm user email
* @param string $newEmail
* @return bool
*/
public function confirm($newEmail)
{
// update status
$this->status = static::STATUS_ACTIVE;
// process $newEmail from a userToken
// check if another user already has that email
$success = true;
if ($newEmail) {
$checkUser = static::findOne(["email" => $newEmail]);
if ($checkUser) {
$success = false;
} else {
$this->email = $newEmail;
}
}
$this->save(false, ["email", "status"]);
return $success;
}
/**
* Check if user can do specified $permission
* @param string $permissionName
* @param array $params
* @param bool $allowCaching
* @return bool
*/
public function can($permissionName, $params = [], $allowCaching = true)
{
// check for auth manager rbac
// copied from \yii\web\User
$auth = Yii::$app->getAuthManager();
if ($auth) {
if ($allowCaching && empty($params) && isset($this->permissionCache[$permissionName])) {
return $this->permissionCache[$permissionName];
}
$access = $auth->checkAccess($this->getId(), $permissionName, $params);
if ($allowCaching && empty($params)) {
$this->permissionCache[$permissionName] = $access;
}
return $access;
}
// otherwise use our own custom permission (via the role table)
return $this->role->checkPermission($permissionName);
}
/**
* Get display name for the user
* @var string $default
* @return string|int
*/
public function getDisplayName($default = "")
{
// define possible fields
$possibleNames = [
"username",
"email",
"id",
];
// go through each and return if valid
foreach ($possibleNames as $possibleName) {
if (!empty($this->$possibleName)) {
return $this->$possibleName;
}
}
return $default;
}
/**
* Send email confirmation to user
* @param UserToken $userToken
* @return int
*/
public function sendEmailConfirmation($userToken)
{
/** @var Mailer $mailer */
/** @var Message $message */
// modify view path to module views
$mailer = Yii::$app->mailer;
$oldViewPath = $mailer->viewPath;
$mailer->viewPath = $this->module->emailViewPath;
// send email
$user = $this;
$profile = $user->profile;
$email = $userToken->data ?: $user->email;
$subject = Yii::$app->id . " - " . Yii::t("user", "Email Confirmation");
$result = $mailer->compose('confirmEmail', compact("subject", "user", "profile", "userToken"))
->setTo($email)
->setSubject($subject)
->send();
// restore view path and return result
$mailer->viewPath = $oldViewPath;
return $result;
}
/**
* Get list of statuses for creating dropdowns
* @return array
*/
public static function statusDropdown()
{
// get data if needed
static $dropdown;
$constPrefix = "STATUS_";
if ($dropdown === null) {
// create a reflection class to get constants
$reflClass = new ReflectionClass(get_called_class());
$constants = $reflClass->getConstants();
// check for status constants (e.g., STATUS_ACTIVE)
foreach ($constants as $constantName => $constantValue) {
// add prettified name to dropdown
if (strpos($constantName, $constPrefix) === 0) {
$prettyName = str_replace($constPrefix, "", $constantName);
$prettyName = Inflector::humanize(strtolower($prettyName));
$dropdown[$constantValue] = $prettyName;
}
}
}
return $dropdown;
}
}
Каждая ошибка. Только я вот всё равно не вижу. Вот логи
Продолжение
@edvardpotter,Собственно вот скрин
Всем кто принимал участие большое спасибо. Всё получилось и всё заработало. Только я не понимаю как=(( "Расскажу кратко что было в предыдущей серии" Я закачал Adminer на сайт. Логин-пароль у меня есть, тем самым получил доступ к БД. После я удалил таблицу "user" и импортировал с локальной БД копию этой таблицы. Попытался зайти, он мне теперь стал писать что пароль не верный. То есть я вообще потерял доступ к backen-ду. На следующий день зашел на сайт, ввел логин-пароль. Всё заработало. Магия. И как получилось не пойму. Только из за таблицы чтоль была проблема... ??? Всем спасибо!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется следующая проблема - PHP7, установлена PDO ODBC библиотекаЗапросы к серверу MsSQL(2016) делаю через него
У меня ошибка: не найден индекс alid в post-запросеВсе перепроверил - все вроде бы должно работать, так где тогда ошибка?