Yii2 обрезает IP при INET_NTOA

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

Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

Есть реальное свойство ip. Запись проходит нормально. При чтении INET_NTOA, Yii обрезает IP до первой точки. Тоесть выводит например 192, а должен 192.168.0.1. Причем при выборке asArray(), все работает хорошо. Где затык?

База

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

CREATE TABLE `ips` (
  `id` int(11) NOT NULL,
  `ip` int(10) UNSIGNED NOT NULL,
  `mac` varchar(17) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Модель

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

    public function beforeSave($insert) {
        $this->ip = new \yii\db\Expression('INET_ATON(:ip)', ['ip' => $this->ip]);
        return parent::beforeSave($insert);
    }
      public static function find() {
        return parent::find()->select(['INET_NTOA(`ip`) `ip`']);
    }
Контроллер

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

    public function actionIndex() {
        $model = Ips::find()->where(['id' => 89])->one();
        echo $model->ip . "<br/>";
        return $this->render('index');
    }
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Yii2 обрезает IP при INET_NTOA

Сообщение andku83 »

morfey писал(а): 2018.10.16, 00:22 Где затык?
Скорее всего причина в rules()
И скорее всего в начале beforeSave() у вас там уже 192
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

andku83 писал(а): 2018.10.16, 15:22
morfey писал(а): 2018.10.16, 00:22 Где затык?
Скорее всего причина в rules()
И скорее всего в начале beforeSave() у вас там уже 192
Нет, в базу сохраняет нормально. Rule на проверку записи же + я писал что при выборке Ips::find()->where(['id' => 89])->asArray()->one(); тоже все хорошо

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

SELECT INET_NTOA(ip) FROM `ips`
INET_NTOA(ip)
192.168.225.1

SELECT ip FROM `ips`
ip
3232293121
А вот так:

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

   public function actionIndex($customerID = false) {
        $model = Ips::find()->where(['id' => 89])->one();
        echo $model->ip;
}
результат = 192
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

Если создать новое свойство, тоже все работает

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

public $ip_string;

 public static function find() {
        return parent::find()->select([self::tableName() . '.*, INET_NTOA(' . self::tableName() . '.`ip`) as `ip_string`']);
    }
Controller:

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

       echo $model->ip_string;
       Результат = 192.168.225.1

urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Yii2 обрезает IP при INET_NTOA

Сообщение urichalex »

3232293121 не входит в int
Храните в unsignet int или biging
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

У меня unsigned int(10)

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

DB ip value = 3232293121 (int(10) unsigned)

$model = Ips::find()->select(['INET_NTOA(ip) ip'])->where(['id' => 89])->one();
echo $model->ip; //return 192

$model = Ips::find()->select(['INET_NTOA(ip) ip_string'])->where(['id' => 89])->one();
echo $model->ip_string; //return 192.168.225.1 (public $ip_string in model)


$model = Ips::find()->select(['INET_NTOA(ip) ip'])->asArray()->where(['id' => 89])->one();
echo $model['ip']; //return 192.168.225.1
Так думаю понятней будет
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

Прблема в том, что Yii2 возвращает тип свойства как int. А вот как переопределить этот тип?

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

  ["_attributes":"yii\db\BaseActiveRecord":private]=>
  array(1) {
    ["ip"]=>
    int(192)
  }
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Yii2 обрезает IP при INET_NTOA

Сообщение urichalex »

yii\db\ActiveRecord приводит к типу на основе типа колонки в базе, без условий...
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

urichalex писал(а): 2018.10.16, 20:47 yii\db\ActiveRecord приводит к типу на основе типа колонки в базе, без условий...
Это я уже понял)
Есть мысли как переопределить?
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Yii2 обрезает IP при INET_NTOA

Сообщение urichalex »

morfey писал(а): 2018.10.16, 21:02
urichalex писал(а): 2018.10.16, 20:47 yii\db\ActiveRecord приводит к типу на основе типа колонки в базе, без условий...
Это я уже понял)
Есть мысли как переопределить?
Выбирать как есть, а получать ИП через long2ip()
Либо переопределять yii\db\ActiveQueryTrait
morfey
Сообщения: 8
Зарегистрирован: 2018.10.16, 00:15

Re: Yii2 обрезает IP при INET_NTOA

Сообщение morfey »

В общем, пока вернусь на varchar..
Ответить