Вероломство
Столкнулся с такой ситуацией: столбец 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:
// примерно так protected $original_properties = []; public function __construct() { $this->original_properties = $this->getPropertiesArray(); } private function getPropertiesArray() { }
ADSoft
а покажи var_dump() такого объекта, свойства которого ты в массив кидаешь?
ну в твоем случае $this
Вероломство
Код (Text):
object(appmodelsuserUser)[8] public ‘datetime_start’ => string ‘2021-04-08 12:35:52’ (length=19) public ‘datetime_last’ => string ‘2021-04-08 12:35:52’ (length=19) public ‘token’ => string ‘AN7wonkcamsz3HbBQtZvOGfDudYFhySgx149LMp6RP50EI2qWi’ (length=50) public ‘referer_id’ => int 0 public ‘role’ => string ‘admin’ (length=5) public ‘course_id’ => int 1 public ‘lvl’ => int 0 public ‘exp’ => float 0 public ‘exp_max’ => float 4 public ‘baks’ => string ‘0.00’ (length=4) public ‘gold’ => string ‘0.00’ (length=4) public ‘hp’ => string ‘100.00’ (length=6) public ‘hp_max’ => int 100 public ‘hp_reg’ => string ‘0.10’ (length=4) public ‘hp_skill’ => int 0 public ‘hp_skill_up’ => int 0 public ‘mp’ => string ‘100.00’ (length=6) public ‘mp_max’ => int 100 public ‘mp_reg’ => string ‘0.10’ (length=4) public ‘hit’ => string ‘5.00’ (length=4) public ‘hit_max’ => int 5 public ‘hit_reg’ => string ‘0.10’ (length=4) public ‘victories’ => int 0 public ‘defeats’ => int 0 public ‘kills’ => int 0 public ‘deaths’ => int 0 public ‘points’ => int 0 public ‘rank_name’ => string ‘Новобранец’ (length=20) public ‘country_code’ => null public ‘country_name’ => null public ‘country_up’ => int 0 public ‘login’ => string ‘Новобранец’ (length=20) public ‘password_hash’ => null public ’email’ => null public ‘id’ => int 1 protected ‘original_properties’ => array (size=35) ‘datetime_start’ => string ‘2021-04-08 12:35:52’ (length=19) ‘datetime_last’ => string ‘2021-04-08 12:35:52’ (length=19) ‘token’ => string ‘AN7wonkcamsz3HbBQtZvOGfDudYFhySgx149LMp6RP50EI2qWi’ (length=50) ‘referer_id’ => int 0 ‘role’ => string ‘admin’ (length=5) ‘course_id’ => int 1 ‘lvl’ => int 0 ‘exp’ => float 0 ‘exp_max’ => float 4 ‘baks’ => string ‘0.00’ (length=4) ‘gold’ => string ‘0.00’ (length=4) ‘hp’ => string ‘100.00’ (length=6) ‘hp_max’ => int 100 ‘hp_reg’ => string ‘0.10’ (length=4) ‘hp_skill’ => int 0 ‘hp_skill_up’ => int 0 ‘mp’ => string ‘100.00’ (length=6) ‘mp_max’ => int 100 ‘mp_reg’ => string ‘0.10’ (length=4) ‘hit’ => string ‘5.00’ (length=4) ‘hit_max’ => int 5 ‘hit_reg’ => string ‘0.10’ (length=4) ‘victories’ => int 0 ‘defeats’ => int 0 ‘kills’ => int 0 ‘deaths’ => int 0 ‘points’ => int 0 ‘rank_name’ => string ‘Новобранец’ (length=20) ‘country_code’ => null ‘country_name’ => null ‘country_up’ => int 0 ‘login’ => string ‘Новобранец’ (length=20) ‘password_hash’ => null ’email’ => null ‘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, лучше ручками просто прописать несколько строчек ПХП-кода для каждого такого запроса, ибо за универсальность всегда надо платить.