Столкнулся с такой ситуацией: столбец test в БД хранится как DECIMAL по умолчанию значение 100.00 при выборке выводится как STRING "100.00", свойству test присваиваю 100 - это INT, теперь хочу узнать изменилось ли значение И array_diff_assoc() выдаёт что есть различие: "test" int 100, НО ведь логически значение не изменилось, если я свойству пропишу тип float, ТО array_diff_assoc() выдаст empty - всё правильно значение не изменилось. Мне свойства типизировать или шаманить с типа столбцов? Есть какие-нибудь методички по типизации свойств относительно типов столбцов мускула или наоборот?
Конкретно по типизации свойств относительно типов столбцов не назову, но, может быть, вам поможет собственный мануал разработчиков MySQL. Более 5000 (пяти тысяч!) страниц убористого текста, правда, к сожалению, не на русском языке. Во всяком случае, более полной методички по MySQL, чем эта, лично я на сегодняшний день не знаю: https://downloads.mysql.com/docs/refman-8.0-en.a4.pdf Если кто из коллег назовёт более полную или более лучшую методичку, чем эта, мне и самому станет интересно посмотреть.
я прям вот всё сейчас брошу в свои 44 и пойду девяносто восьмой с половиной раз перечитывать мануал по мускулу, мы на php.ru, вопрос по PHP
а как приводить? то есть есть ли мануал какой тип мускула каким будет в php, там же их в мускуле много всяких вот такого бы что-нибудь
такого мануала не может быть в принципе.... ибо это две разные системы и не связаны с собой ничем просто рассматриваете наиболее часто используемые вами типы в мускуле, составляете некую таблицу соответствия для пыхи например для пыха - нет разницы decimail и float Mysql итд итп... ибо у пыхи не так много типов.... совсем мало ))) и в мускуле - вспотеешь все перебирать
тут я может неправильно делаю: я получаю объект из БД, там типы правильные, так как эмуляция отключена, НО я их складываю в массив, а там они все string а в массив их можно поместить с теми ЖЕ типами? --- Добавлено --- @ADSoft вернее не все, deciamal - это string почему-то, вот double - это float
deciamal - это string почему-то, вот double - это float PHP: // примерно так protected $original_properties = []; public function __construct() { $this->original_properties = $this->getPropertiesArray(); } private function getPropertiesArray() { return array_filter(get_object_vars($this), fn($property) => !is_array($property)); }
Спойлер: Триньк Код (Text): object(app\models\user\User)[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
ну так из бд получается объект, он заполняет свойства класса, а конструктор их все в массив грузит дополнительно, чтобы потом сравнивать, что поменялось может мне decimal на что другое поменять, но мне нужно 2 знака после точки чтобы было
Читай структуру таблицы из бд и навешивай доп. логику в похапэ в соответствии с типами столбцов бд, если хочешь сверхуниверсальности.
Читай доку и будет Счастье. https://www.php.net/manual/ru/mysqli-result.fetch-field-direct --- Добавлено --- Согласно доке, все данные из MySQL приходят в виде строк. В стандартном варианте. Можно поизвращаться и некоторые типы будут автоматом преобразовываться (числовые, например). Но это только если ОЧЕНЬ надо. IMHO, лучше ручками просто прописать несколько строчек ПХП-кода для каждого такого запроса, ибо за универсальность всегда надо платить.