За последние 24 часа нас посетили 10274 программиста и 453 робота. Сейчас ищут 106 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 8 апр 2021 в 09:29.

  1. Вероломство

    Вероломство Активный пользователь

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

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

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

    alexphp Новичок

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

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    354
    Симпатии:
    12
    я прям вот всё сейчас брошу в свои 44 и пойду девяносто восьмой с половиной раз перечитывать мануал по мускулу, мы на php.ru, вопрос по PHP :)
     
    alexphp нравится это.
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    можно отдельно схему таблицы читать, смотреть тип столбца - на его основе приводить в php
     
    Вероломство нравится это.
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    354
    Симпатии:
    12
    а как приводить?

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

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

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    такого мануала не может быть в принципе.... ибо это две разные системы и не связаны с собой ничем

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

    Вероломство Активный пользователь

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

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

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    помещай ... кто мешает

    покажи код - как складываешь в массив
     
    Вероломство нравится это.
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    354
    Симпатии:
    12
    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. }
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    а покажи var_dump() такого объекта, свойства которого ты в массив кидаешь?
    ну в твоем случае $this
     
  11. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    354
    Симпатии:
    12
    Код (Text):
    1. object(app\models\user\User)[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
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    блин ...
    а вот нельзя показать как ты из БД то вот это получаешь?
    $original_properties
     
  13. Вероломство

    Вероломство Активный пользователь

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

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

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.765
    Симпатии:
    518
    Адрес:
    Татарстан
    найди место в своем коде - где у тебя тип БД decimal почему-то в string преобразуется
     
  15. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    354
    Симпатии:
    12
    а где у меня decimal в php-коде?
     
  16. don.bidon

    don.bidon Новичок

    С нами с:
    28 мар 2021
    Сообщения:
    55
    Симпатии:
    3
    Читай структуру таблицы из бд и навешивай доп. логику в похапэ в соответствии с типами столбцов бд, если хочешь сверхуниверсальности.
     
  17. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.045
    Симпатии:
    87
    Адрес:
    Мещёра, Центр, Болото N3
    Читай доку и будет Счастье.
    https://www.php.net/manual/ru/mysqli-result.fetch-field-direct
    --- Добавлено ---
    Согласно доке, все данные из MySQL приходят в виде строк. В стандартном варианте.
    Можно поизвращаться и некоторые типы будут автоматом преобразовываться (числовые, например). Но это только если ОЧЕНЬ надо. IMHO, лучше ручками просто прописать несколько строчек ПХП-кода для каждого такого запроса, ибо за универсальность всегда надо платить.