Типизация свойств относительно MySQL

Вероломство

Столкнулся с такой ситуацией: столбец test в БД хранится как DECIMAL по умолчанию значение 100.00 при выборке выводится как STRING «100.00», свойству test присваиваю 100 — это INT, теперь хочу узнать изменилось ли значение И array_diff_assoc() выдаёт что есть различие: «test» int 100, НО ведь логически значение не изменилось, если я свойству пропишу тип float, ТО array_diff_assoc() выдаст empty — всё правильно значение не изменилось.

Мне свойства типизировать или шаманить с типа столбцов?

Есть какие-нибудь методички по типизации свойств относительно типов столбцов мускула или наоборот?

 

alexphp

Конкретно по типизации свойств относительно типов столбцов не назову, но, может быть, вам поможет собственный мануал разработчиков MySQL. Более 5000 (пяти тысяч!) страниц убористого текста, правда, к сожалению, не на русском языке. Во всяком случае, более полной методички по MySQL, чем эта, лично я на сегодняшний день не знаю:
https://downloads.mysql.com/docs/refman-8.0-en.a4.pdf
Если кто из коллег назовёт более полную или более лучшую методичку, чем эта, мне и самому станет интересно посмотреть.

 

Вероломство

я прям вот всё сейчас брошу в свои 44 и пойду девяносто восьмой с половиной раз перечитывать мануал по мускулу, мы на php.ru, вопрос по PHP :)

 

ADSoft

можно отдельно схему таблицы читать, смотреть тип столбца — на его основе приводить в php

 

Вероломство

а как приводить?

то есть есть ли мануал какой тип мускула каким будет в php, там же их в мускуле много всяких :)

вот такого бы что-нибудь

 

ADSoft

такого мануала не может быть в принципе…. ибо это две разные системы и не связаны с собой ничем

просто рассматриваете наиболее часто используемые вами типы в мускуле, составляете некую таблицу соответствия для пыхи
например для пыха — нет разницы decimail и float Mysql итд итп…
ибо у пыхи не так много типов…. совсем мало ))) и в мускуле — вспотеешь все перебирать

 

Вероломство

тут я может неправильно делаю: я получаю объект из БД, там типы правильные, так как эмуляция отключена, НО я их складываю в массив, а там они все string

а в массив их можно поместить с теми ЖЕ типами?
— Добавлено —
@ADSoft вернее не все, deciamal — это string почему-то, вот double — это float

 

ADSoft

помещай … кто мешает

покажи код — как складываешь в массив

 

Вероломство

deciamal — это string почему-то, вот double — это float

PHP:
  1. // примерно так
  2.  
  3. protected $original_properties = [];
  4.  
  5. public function __construct()
  6. {
  7.     $this->original_properties = $this->getPropertiesArray();
  8. }
  9.  
  10. private function getPropertiesArray()
  11. {
  12.     return array_filter(get_object_vars($this), fn($property) => !is_array($property));
  13. }
 

ADSoft

а покажи var_dump() такого объекта, свойства которого ты в массив кидаешь?
ну в твоем случае $this

 

Вероломство

Код (Text):
  1. object(appmodelsuserUser)[8]
  2.   public ‘datetime_start’ => string ‘2021-04-08 12:35:52’ (length=19)
  3.   public ‘datetime_last’ => string ‘2021-04-08 12:35:52’ (length=19)
  4.   public ‘token’ => string ‘AN7wonkcamsz3HbBQtZvOGfDudYFhySgx149LMp6RP50EI2qWi’ (length=50)
  5.   public ‘referer_id’ => int 0
  6.   public ‘role’ => string ‘admin’ (length=5)
  7.   public ‘course_id’ => int 1
  8.   public ‘lvl’ => int 0
  9.   public ‘exp’ => float 0
  10.   public ‘exp_max’ => float 4
  11.   public ‘baks’ => string ‘0.00’ (length=4)
  12.   public ‘gold’ => string ‘0.00’ (length=4)
  13.   public ‘hp’ => string ‘100.00’ (length=6)
  14.   public ‘hp_max’ => int 100
  15.   public ‘hp_reg’ => string ‘0.10’ (length=4)
  16.   public ‘hp_skill’ => int 0
  17.   public ‘hp_skill_up’ => int 0
  18.   public ‘mp’ => string ‘100.00’ (length=6)
  19.   public ‘mp_max’ => int 100
  20.   public ‘mp_reg’ => string ‘0.10’ (length=4)
  21.   public ‘hit’ => string ‘5.00’ (length=4)
  22.   public ‘hit_max’ => int 5
  23.   public ‘hit_reg’ => string ‘0.10’ (length=4)
  24.   public ‘victories’ => int 0
  25.   public ‘defeats’ => int 0
  26.   public ‘kills’ => int 0
  27.   public ‘deaths’ => int 0
  28.   public ‘points’ => int 0
  29.   public ‘rank_name’ => string ‘Новобранец’ (length=20)
  30.   public ‘country_code’ => null
  31.   public ‘country_name’ => null
  32.   public ‘country_up’ => int 0
  33.   public ‘login’ => string ‘Новобранец’ (length=20)
  34.   public ‘password_hash’ => null
  35.   public ’email’ => null
  36.   public ‘id’ => int 1
  37.   protected ‘original_properties’ =>
  38.     array (size=35)
  39.       ‘datetime_start’ => string ‘2021-04-08 12:35:52’ (length=19)
  40.       ‘datetime_last’ => string ‘2021-04-08 12:35:52’ (length=19)
  41.       ‘token’ => string ‘AN7wonkcamsz3HbBQtZvOGfDudYFhySgx149LMp6RP50EI2qWi’ (length=50)
  42.       ‘referer_id’ => int 0
  43.       ‘role’ => string ‘admin’ (length=5)
  44.       ‘course_id’ => int 1
  45.       ‘lvl’ => int 0
  46.       ‘exp’ => float 0
  47.       ‘exp_max’ => float 4
  48.       ‘baks’ => string ‘0.00’ (length=4)
  49.       ‘gold’ => string ‘0.00’ (length=4)
  50.       ‘hp’ => string ‘100.00’ (length=6)
  51.       ‘hp_max’ => int 100
  52.       ‘hp_reg’ => string ‘0.10’ (length=4)
  53.       ‘hp_skill’ => int 0
  54.       ‘hp_skill_up’ => int 0
  55.       ‘mp’ => string ‘100.00’ (length=6)
  56.       ‘mp_max’ => int 100
  57.       ‘mp_reg’ => string ‘0.10’ (length=4)
  58.       ‘hit’ => string ‘5.00’ (length=4)
  59.       ‘hit_max’ => int 5
  60.       ‘hit_reg’ => string ‘0.10’ (length=4)
  61.       ‘victories’ => int 0
  62.       ‘defeats’ => int 0
  63.       ‘kills’ => int 0
  64.       ‘deaths’ => int 0
  65.       ‘points’ => int 0
  66.       ‘rank_name’ => string ‘Новобранец’ (length=20)
  67.       ‘country_code’ => null
  68.       ‘country_name’ => null
  69.       ‘country_up’ => int 0
  70.       ‘login’ => string ‘Новобранец’ (length=20)
  71.       ‘password_hash’ => null
  72.       ’email’ => null
  73.       ‘id’ => int 1

в мускуле столбцы baks, gold, hp, mp и т.п. — это decimal, exp и exp_max — double

 

ADSoft

блин …
а вот нельзя показать как ты из БД то вот это получаешь?
$original_properties

 

Вероломство

ну так из бд получается объект, он заполняет свойства класса, а конструктор их все в массив грузит дополнительно, чтобы потом сравнивать, что поменялось :)

может мне decimal на что другое поменять, но мне нужно 2 знака после точки чтобы было

 

ADSoft

найди место в своем коде — где у тебя тип БД decimal почему-то в string преобразуется

 

Вероломство

а где у меня decimal в php-коде?

 

don.bidon

Читай структуру таблицы из бд и навешивай доп. логику в похапэ в соответствии с типами столбцов бд, если хочешь сверхуниверсальности.

 

Chushkin

Читай доку и будет Счастье.
https://www.php.net/manual/ru/mysqli-result.fetch-field-direct
— Добавлено —

Согласно доке, все данные из MySQL приходят в виде строк. В стандартном варианте.
Можно поизвращаться и некоторые типы будут автоматом преобразовываться (числовые, например). Но это только если ОЧЕНЬ надо. IMHO, лучше ручками просто прописать несколько строчек ПХП-кода для каждого такого запроса, ибо за универсальность всегда надо платить.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *