За последние 24 часа нас посетил 17541 программист и 1727 роботов. Сейчас ищут 1453 программиста ...

Имена полей с использованием переменных РНР

Тема в разделе "MySQL", создана пользователем Vladd55, 24 июн 2023.

  1. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Добрый день!

    Вот такой запрос:

    PHP:
    1. $gruppa = "grupp_$no";    
    2. $xx = "v_$step";
    3. $yy = "a_$step";
    4.          
    5. mysqli_query($db, "UPDATE $gruppa SET $xx = '$question', $yy = '$ball' WHERE `invite` = '$invite'");
    Вроде бы, работает нормально. Но мне не нравится вот что:

    1. Имена полей заключаются в одиночные обратные кавычки. Обычно я так и делаю, но как здесь это сделать?

    2. Формировать имена полей отдельно - это как-то кустарно. А как это сделать в теле запроса?
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Или в переменные включай, или в основную строку запроса (вокруг переменных).
    --- Добавлено ---
    Еще можно так:
    PHP:
    1. "UPDATE {$table('table')} SET {$field('field')}=..."
    И в функциях (они в переменных) можно оборачивать в нужные кавычки. Но это больше нужно для разных диалектов SQL (если используешь только мускул и не собираешься с него слезать, то не нужно). Также функция может быть одна. Я привел две, т.к. в наших поделках table() часто еще и само имя модифицирует, например добавляет префикс, а вот кавычки она может и не добавлять, т.е. может быть и так:
    PHP:
    1. "UPDATE `{$table('table')}`..."
    --- Добавлено ---
    Ну или юзай какой-нить QueryBuilder :D
    --- Добавлено ---
    P.S. Если для обычных сайтов тебе часто приходится брать имена полей из переменных, ты скорее всего делаешь что-то не так. Имен таблиц это тоже может касаться, но с ними ситуация все же немного другая.
     
    #2 miketomlin, 24 июн 2023
    Последнее редактирование: 24 июн 2023
  3. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    А что там другого? В моем примере и имя таблицы составлено с использованием переменной РНР. Тоже работает.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Имена таблиц могут браться из переменных, но нефиг создавать 100500 таблиц grupp_1-grupp_100500 ;)

    Пример: таблица одна, номер (идентификатор) группы в отдельном поле – внешнем ключе.
     
    artoodetoo и Vladd55 нравится это.
  5. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Это да. Но у меня только 6 таблиц, но для выбора использую переменные. Полагаю, что это нормально.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Две – уже много. Если сущности реально разнотипные и их не надо смешивать в одном списке и т.п., назови нормально таблицы, без этих циферок.
    --- Добавлено ---
    Цифру 6 можешь оставить. Будет группа шестерок :) Или пациентов палаты №6 :) Но только если они у тебя везде на отдельном учете и нигде не пересекаются с остальными :D
     
  7. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    а что в циферках плохого?

    PHP:
    1. $gruppa="grupp_$no";
    2. mysqli_query($db, "UPDATE $gruppa SET $xx = '$question', $yy = '$ball' WHERE `invite` = '$invite'");
    $no меняется от 1 до 6. И все обрабатывается одним этим запросом.

    Если же дать "нормальные" названия таблицам, то таких запросов потребуется шесть. А какой в этом смысл?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    А если нормально планировать задачу, то не понадобится шесть таблиц для одного и того же.
    Главное свойство программных "костылей" — они потребуют новых "костылей" чтобы минимизировать ущерб. И еще и еще...
     
  9. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    В моем случае проще всего было бы все разместить в одной таблице. Но в ней было бы 782 столбца. Мне показалось это неудобным. Тем более, что операции идут только с группами из 7 столбцов. Поэтому я разделил таблицу на 6 частей, а имена полей сделал такими, чтобы к ним обращаться через переменные РНР. Иначе все пришлось бы писать вручную индивидуально для каждой операции. Что не только трудоемко, но и наверняка где-нибудь напутаешь.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    ну вот: костыль тебует следующего костыля, а он ещё...
    782 столбца решается через связанные таблицы. НЕ ОДИНАКОВЫМИ таблицами, а имеющими осмысленное содержание, имена и связи. а если у тебя после "разрезания" таки получаются одинаковые поля, то очень вероятно, что нужна таки одна таблица, но с полем для группировки.

    не всегда плохо "писать вручную", кстати, когда то что ты пишешь читается нормально и помогает поддерживать дела в порядке.
    когда у сущностей есть имена, ты можешь с помощью IDE находить где что используется. даже переименовывать автоматически все случаи использования имени можно. а когда у тебя table_1, table_2... и ты их перебираешь в цикле, то найти где чего можно только приняв дозу LSD )))
    --- Добавлено ---
    P.S. я тебя не уговариваю. тебе выбирать каким путем идти: общепринятым или путём боли. просто я вижу некие маркеры говнокода и тригерюсь на них. в частности на смесь инглиша и руглиша. или на "Формировать имена полей отдельно - это как-то кустарно". ну-ну. оптимизируешь значит количество переменных. окей. потом попробуй ретроспективно оценить чего стоила эта оптимизация в человекочасах.

    удачи!
     
    Vladd55 нравится это.
  11. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    встречался, когда для скорострельности использовалась денормализация БД, но тут точно не тот случай
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Ну, по идее в основе должна быть нормализованная структура, а сверху уже можно наваливать различный кеш, в том числе и в «кеш-полях» таблиц БД.
    --- Добавлено ---
    У нас даже нек. таблицы целиком кешируются. Речь о явном кешировании, т.е. копировании или построении при старте, а не временных таблицах и прочей лабуде, поддерживаемой СУБД из коробки.
     
    #12 miketomlin, 29 июн 2023
    Последнее редактирование: 29 июн 2023