Ответы пользователя по тегу MySQL
  • В чем недостатки такого решения?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    В чем недостатки такого решения?

    Помимо отсутствия транзакционности в коде (о чём уже упоминали выше):

    1) Нет ключа на thread_id (желательно foreign)
    2) Типы в INT, вместо UNSIGNED INT
    Т.к. это MySQL, судя по вопросу, то:
    3) Нет указания на collation таблицы (желательно utf8mb4)
    4) Нет указания на движок таблицы (транзакции есть только в InnoDB и их нет в ISAM, MyISAM, Archive, Memory, etc.)
    5) Нет уникальности голосов (т.е. votes), как следствие - таблица денормализованная и подсчитывать так голоса - крайне глупо. В нормальном мире это делается отдельной таблицей с привязкой по comment_id и уникальным ключом на comment_id + user_id.
    6) Так как это комментарии, то использование varchar(255) для поля text - глупо. Нужен TEXT или LONGTEXT.
    7) Отсутствуют поля даты создания и редактирования, что в будущем не позволит строить статистические данные или расширять функционал (разрешать менять текст комментария только в течении 5ти минут, например). На это надо закладываться заранее.

    Это что касается структуры таблицы. Теперь по коду:
    8) Сервис-локация (класс App), вместо нормального DI - это жесть. Скрытые зависимости говорят о невозможности тестирования такого кода.
    9) "Магическая" константа 'comment' говорит о том, что потом такой код нормально не отрефакторить. Т.е. переименовываешь внутри что-то, а потом получаешь кучу ошибок и придётся лазать по коду и везде выгребать этот "get('comment')". И не дай бог где-то они получаются как-то иначе. Работы ещё на пол дня.
    10) Метод getById говорит о том, что сущность должна возвращаться всегда. Однако, может так случиться, что её по указанному id просто не найдётся. Как следствие - нет нормальной обработки ошибок.
    11) Мутабельное поле votes у comment (т.е. имеется прямой доступ к нему). Это говорит о том, что сущность очень сильно связана с БД, а значит любой рефакторинг таблицы ведёт к полному перелопачиванию всего кода.
    12) Нет обработки ошибок во время сохранения сущности.
    13) Метод vote - не лучшее название. Оно переводится и как глагол "голосовать" и как существительное "голос", что может запутать. Я бы переименовал в addVote. Хотя и так тоже норм.

    Это всё, что касается вопроса "в чём недостатки такого решения". Ответ - почти на каждой строчке косяк.

    Если есть вопросы - задавай, могу чуть поподробнее расписать что-либо.
    Ответ написан
    3 комментария
  • Как грамотно перейтй на php7 с php5.6?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    А что мешает заменить простенькой регуляркой?

    С
    (?<=\b)mysql([\w\h_]+)\(

    НА
    mysqli$1

    А потом просто прогнать тесты?
    Ответ написан
  • Почему запрос к бд возвращает ошибку?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Ураааа, новая классическая дырища в сайте!

    Вы ведь понимаете, что благодаря этому коду, после того как он заработает - вас сможет взломать любой школьник?
    Ответ написан
    Комментировать
  • Какую кодировку выбрать для базы чтобы можно было сохранять строки на любом языке и не парить себе мозг?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Стоит везде выставить utf8mb4_unicode_ci (работает точнее при сортироваках и проч.) или utf8mb4_general_ci (чуть быстрее работает, крайне незначительно, так что имеет смысл именно первый вариант).

    P.S. Указанные выше utf8_general_ci/utf8_unicode_ci поддерживают лишь половину диапазона utf8, отсюда сохранение, например эмодзи, будет физически невозможным.

    P.P.S. Суффикс "ci" означает Case Insensitive (нечувствителность к регистру при поиске и сравнении).
    Ответ написан
    4 комментария
  • Поле с каким типом данных нужно создать в MySQL для хранения массивов?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Эм, а может всё же не парить мозг и использовать JSON тип? Там и индексация, как бы есть, да и тип нативный...
    Ответ написан
    Комментировать
  • Чего не хватает моим функциям?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Друг, твой код - это феерический трешак, а начальник твой - хуже школьника. Так ему и передай, можешь на меня ссылаться.

    Мой добрый совет - беги оттуда, пока не поздно.
    Ответ написан
    Комментировать
  • Правильно ли я делаю?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Вопрос не понятен. Группе и так делегируется заказ, зачем что-то ещё дублировать? Обычная one2many связь.

    UPD: Да и полиморфичные связи ещё пока никто не отменял: https://laravel.com/docs/5.4/eloquent-relationship...
    Ответ написан
    Комментировать
  • Как правильно использовать AJAX + PHP?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Обратную связь реального времени можно сделать через:
    а) WebSocket
    б) Long Polling
    в) Другие морально устаревшие или извращённые решения, вроде "Опроса", "Gif Push", "iframe push", etc...

    Смотреть в гугле, т.к. сюда код не влезет, например: socketo.me/docs/hello-world
    Ответ написан
    4 комментария
  • Как сделать динамический title с помощью PHP и MySQL?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Как сказал выше Иван - ваш код не будет работать
    1) Функций `mysql_` в пыхе нету уже более 2-3х лет. И уже более 5ти лет помечен как устаревший.
    2) Открывающие `<?` на подавляющем большинстве серверов работать не будет.
    3) Закрывающий `?>` запрещён стандартом (в 2017ом это уже номинально не рекомендация, а стандарт) PSR, так же как и почти весь код в примерах.
    4) Интерполяция `$_GET` вместо препаред статментс добровольно превращает ваш код в один большой бекдор.

    Исправление п.4 и п.1 сделает работоспособным ваш вариант кода номер 2, который является корректным ответом на вопрос.
    Ответ написан
    Комментировать
  • Как сгруппировать записи по максимальному значению в целле?

    SerafimArts
    @SerafimArts Автор вопроса
    Senior Notepad Reader
    Проблема решена реструктуризацией БД. Всем спасибо за помощь.
    Ответ написан
    Комментировать
  • Не работает удаление строки из таблицы Mysql. В чем проблема?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    На всякий случай добавлю:
    1) Расширений mysql давно не поддерживается в php (удалено, используй mysqli или pdo)
    2) Указание переменной $delete как в первом комментарии позволит пользователю выполнить любой sql код, достаточно просто заменить get `delete_=42` на `delete_=some; drop ...`.
    Ответ написан
    Комментировать