• Как записать base64 в таблицу?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    1) Хранить картинки в бд крайне кривое решение. Это может быть оправдано только в случае когда там хранится пара иконок, вставленная в текст прям через <имг срц="тут_бэйз64_строка"... и нет желания все это переделывать ради 2 кастомных микрокартинок. В остальном - конвертировать в картинку и хранить на диске. В бд писать путь до картинки. Если это какой-то аватар или картинка, связанная с другим объектом, соответственно заводить отдельную таблицу на картинки и связь один-к-одному или один-ко-многим, в зависимости от ситуации. В худшем случае поле в той же таблице, если точно будете знать что других картинок к объекту относиться не будет, но это должен быть путь до реальной картинки на диске.
    2) Почему хранение в бд - плохая идея: При каждом запросе у вас будет вытаскиваться пару мегабайт данных из бд, передаваться по каналу соединения с бд, помещаться в память, и после этого еще нужно программно отдавать картину, кроме прочего картинка в бэйс64 занимает примерно на 30% больше места.
    Когда у вас есть картинка на диске, вы просто вставляете путь до нее, это ~50 символов, и сервер отдает ее БЕЗ УЧАСТИЯ ПРОГРАММНОЙ ЧАСТИ, средствами вебсервера и ОС. Это быстрее, потребляет меньше памяти и занимает меньше места в хранилище.
    Ответ написан
    Комментировать
  • Как защитить доступ к чувствительным файлам laravel-приложения из подприложения?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Самым очевидным решением видится создание нескольких пользователей и распределение пермишнов файлов/папок таким образом чтобы доступа к определенным папкам у таких сервисов не было физически. Как это реализовать - вопрос скорее к админу. Ну и переносимость такого решения на достаточно низком уровне...
    Ответ написан
  • Какой самый лёгкий и безопасный способ держать пользователя авторизованным?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Опять не подходит потому что куки могут украсть.
    Откуда вы такие специалисты по безопасности беретесь?..

    Вопрос остаётся - как реализовать нормальный и безопасный способ для такой функции, чтобы больше не приходилось использовать другие варианты после каждой очередной жалобы на взлом?
    Взлом через уведенную куку входит в топ 5 малореальных сценариев взлома, если у вас есть хоть какая-то защита от XSS.

    Хранить IP последнего входа в аккаунт? Идея неплохая, но если каким-то магическим образом БД взломают, то все айпи попадут нехорошим людям.
    Оу, вас это больше всего расстраивает? Учитывая что 80% траффика сейчас идет через мобильные сети, айпи будет разниться при каждой сессии авторизации. И в данном случае вероятность такого взлома вы почему-то оцениваете практически как "магию", в то время как доступ к кукам пользователя у вас на уровне "ну, это точно случится, и скорее всего раньше, чем позже, любой может там гулять как у себя дома"...
    Ответ написан
    2 комментария
  • Есть ли на самом деле учение о дизайне в золотом сечении?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Если вы об учебных материалах а-ля "постигаем дизайн в золотом сечении за 5 дней", то нет, такой фигни не существует. И тут у вас ошибка причины и следствия - обычно вот это все используется по факту - типа "смотрите какой дизайн мы налепили, и он еще в золотое сечение ложится!", хотя подается так как будто "мы применили секретную технику - золотое сечение" . Это больше про умение в пропорции, приятные для глаза, которые по факту часто ложатся в золотое сечение.
    Ответ написан
    Комментировать
  • Как сохранить другую сущность при авторизации?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Подскажите пожалуйста как сохранить модель Doctors как авторизованного пользователя?

    1) Модели не называются во множественном числе. Модель Doctor привязывается к таблице doctors. И "я получаю модель Users," - то же самое, модель User.
    2) Доктор или пациент это не пользователь, это либо роль, и тогда надо делать RBAC, либо авторизированная сущность, и тогда нужно связывать юзера и сущность через один-к-одному, в случае если доктор и пациент кардинально различаются по свойствам, а не просто имеют разные права. А пользователь просто способ авторизации/идентификации.
    Ответ написан
    Комментировать
  • Как лучше хранить данные при пошаговой регистрации?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Всем привет. Хочу сделать пошаговую регистрацию на сайте. Как бы это сделать правильнее?
    Нет рецепта для общего случая. Всегда есть нюансы, если вы делаете что-то чуть в сторону от классики.

    1. После каждого шага сохранять в БД? Много запросов бессмысленных
    Ого, много это сколько? И почему бессмысленных? Вы же осмысленные данные туда пишете?

    У кого, какое мнение? Где какие подводные камни/нюансы?
    Мнение: С таким описанием нихрена не посоветуешь. По конкретным шагам можно что-то обсуждать.
    В целом же: Если первый шаг позволяет ввести все данные необходимые для входа в аккаунт, то писать надо в бд, ну и соответственно выслать письмо с подтверждением. В бд можно писать так же стадию прохождения. Если остальные пункты не являются критическими для функционала, можно предлагать при следующем логине дозаполнить данные, основываясь на записанном номере стадии. Ну или просот сразу перекидывать на нужную фазу, если она является необходимой.
    Ответ написан
    Комментировать
  • Основа основ: какие инструменты нужны и что надо знать чтобы написать программу?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Тут в коментах понакидали, я немного разложу для понимания.
    Сегодня программирование это не 1 область, типа " - хочу в программирование - вам вот в эту дверь".
    Условно ее можно разделить на несколько подвидов, переход из которых в смежную будет сопровождаться некоторыми трудностями, особенно для новичка, по этому с направлением нужно определиться на берегу, или по крайней мере вовремя остановиться если увидели что это направление - не ваше.

    1) Веб разработка. В свою очередь делится на 2 поднаправления: фронтенд - все что отрисовывается и обрабатывается на клиенте (то есть проще говоря в браузере), и бэкенд - все что относится к работе со стороны сервера. Фронтенд, как это ни странно, ограничен в языках более всего, тут только яваскрипт или что-то типа тайпскрипта, которое по итогоу в яваскрипт "компилируется". Бэк в этом плане более разношерстный, тут можно практически все использовать, но мэйнстрим это пхп, питон, ява, сишарп, руби-рельсы. Первые два в основном используют студии вебразработки, вторые два - в основном энтерпрайз, последний уже больше экзотика.
    2) Геймдев. Как ни странно, тоже делится на 2 поднаправления: казуалки/мобилы и большие триплА проекты. В первом случае это сишарп + юнити (да, это не язык, а инструмент, но без него стек не полный), в редком случае что-то экзотическое. Во втором это скорее всего си++ и какой-то фреймворк, а-ля анриал или вулкан.
    3) Энтерпрайз. Тут стандарт де факто - ява. Как вариант Сишарп, но гораздо реже.
    4) Десктоп приложения. Простенькие консольные можно писать практически на чем угодно, более-менее обладающее интерфейсом тербует соответствующих gui библиотек, по типу Qt, gtk, ну и соответственно языков типа ява, си++, сишарп... Хочу заметить, что направление это весьма дохлое, в плане того что именно приложения для широких масс в последнее время практически не выпускаются, уступая место вебсервисам или мобильным приложениям, которые тоже не ахти какие рынки занимают...
    5) Мобильная разработка. Зверь редкий, так как под мобилы больше игры делают. Именно разработка приложений достаточно узкий сегмент, ну и опять же - делится на разработку под андроид и под айфон. В первом случае языком разработки будет Котлин(в девичестве Ява), под айфон соответственно будет Свифт. Есть решения кроссплатформенные, по типу флаттера, но это не всегда подходит, так как некоторые функции под конкретную платформу будут недоступны.

    Короче, определяетесь с направлением, пробуете, не нравится - берете следующее, с языками так же. По тому "в чем писать" определяться стоит по запросу "среда разработки для %языкнейм%"
    Ответ написан
    2 комментария
  • Как правильно спланировать обучение?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Если есть именно желание изучать - ты уже на полкорпуса впереди остальных.
    требования к джунам выросли, кол-во откликов от чуваков, прошедших трёхмесячные курсы скиллбокса, просто зашкаливает.
    Так и рынок взрослеет, раньше программирование было сродни шаманству, в институте учили азам, из учебников - документация, хорошо если на английском, а дальше старшие товарищи тебе объясняли как работает эта большая черная штука с зеленым монитором. Сейчас сфера как раз в том состоянии когда работы много, местами очень много, а работников с уровнем "сел и работает" кот наплакал, а джунов больше учить надо, чем ждать с них профита, так как обучаемость вещь ограниченная, ну и кроме того теперь вместо одной большой черной штуки их целый зоопарк, каждая контора молится на свой большой и черный набор технологий... То есть самый выгодный сотрудник - мифический "твердый мид", уже умеет делать что говорят, но стоит все еще не как сеньор.

    По этому рынок ищет джунов со скилами мида, ищет активно и не всегда безуспешно. Опыт собственных проектов сложнее верстки в 3 колонки и 3 скриптов, установленных с гита, играет в серьезный плюс.

    Из ваших скилов вам сильно не хватает как фронту одного-двух фреймворков, без которых сегодня уже никто никуда не едет в 90% случаев, соответственно учим в порядке популярности vue/react/angular, хотя бы 1 из уже будет серьезной заявкой на победу, тайпскрипт соответственно тоже.

    надеюсь что к моменту моего 3-4 курса (2026-2027) ситуацию с наймом как минимум не усугубится
    Ситуация будет усугубляться с каждым годом, в плане того что спецов так быстро готовить просто не реально, по крайней мере массово, по этому дефицит кадров будет только расти.

    Conclusio: Если вы не прекращаете учиться и каждый день посвящаете некоторое время разработке, то вы неизбежно найдете нормальную работу, смиритесь...
    Ответ написан
  • Как борются с взломом нейросетей?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Как борются с взломом нейросетей?
    Никак, так как взлом означает изменение функциональности, а в вашем описанном случае ничего не выходит за рамки функционала софта, о чем ниже.

    В нашей же реальности есть автомобиль Тесла с автопилотом и подтвержденный факт что люди нарисовав левую разметку вызвали попадание машины на отбойник.
    Во первых - "автопилот" 2 уровня, то есть по сути адаптивный круиз-контроль, никак не тянущий на полноценное решение для распознавания ошибок в дорожной разметке. Во вторых это не есть нарушение работы нейросети, она натренирована соблюдать разметку и делает это хорошо. Это все равно что взломать деревообрабатывающий станок, сунув в него лом вместо полена, результат будет такой же нестандартный, как и вводимый материал. Кроме того, замечу что уровни автономности определяют так же и юридические аспекты ответственности, так например уровень автономности от 1 до 3 предполагает ответственность водителя за все правонарушения и аварии, в то время как уровни 4 и выше уже выносят ответственность за все последствия на производителя.

    Как борются с этим явлением?
    Опи*дюливают товарищей, подвергающих опасности участников дорожного движения, намеренно изменивших разметку участка трассы, подвергнув опастности участников дорожного движения. Так то и человек может в отбойник улететь в таком случае, если следит за дорогой долго и монотонно. Они бы еще рельсы трамвайные под откос переложили и жаловались что трамвай небезопасный транспорт.
    Ответ написан
    Комментировать
  • Почему не добавляется в базу данных информация с формы?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    $q = "INSERT INTO post(author, date_p, text_p) VALUES ('$author', '$datep', '$text_content')"; 
    //  ";" в одиночных запросах не ставится, а текстовые значения обрамляются кавычками
    var_dump($q); //смотрим глазками, проверяем в консоли
    $q = "INSERT INTO post(author, date_p, text_p) VALUES (?, ?, ?)"; 
    //никогда не лезем в бд без подготовленных выражений!
    $st = $pdo->prepare($q);
    $sth->execute([$author, $datep, $text_content]);
    Ответ написан
    1 комментарий
  • Не работает return PHP. Ничего не выводит на экран, что делать?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Мне нужно что-бы функция вернула корни уравнения в виде массива.
    Она возвращает

    Однако я получаю пустоту.
    Однако не получаете

    Почему?
    Скорее всего вы подразумевали не "получение" а "вывод". Но никакого вывода на экран вы не используете.

    Не работает return PHP. Ничего не выводит на экран, что делать?
    Формально ответ - по тому что "получение"/"возвращение" и "вывод" абсолютно разные вещи.
    Ответ написан
    Комментировать
  • Какие вещи нужно изучить чтобы подготовить себя к работе с Highload проектами?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Хайлоад это не какой-то особенный тип проекта, это все обычные проекты, но с объемом "туда-сюдирования" данных выше, чем тянул "прошлый сервер", когда проект был еще не хайлоад. В 90% случаев это выражается в росте количества запросов к бд, которая либо становится слаба по железу, либо вылазят косяки в запросах, написаных абы как, включая отсутствие индексов и кривую архитектуру.

    Что делается для "хайлоадинга"?
    1) Меняются сервера на помощнее, но это больше к админам обычно.
    2) Выявляются узкие места, в подавляющем большинстве случаев это либо обращения к бд, либо работа со сторонними сервисами, а-ля АПИ фейсбука и все такое.

    Как разгонять именно такие затыки 2 варианта - есть 3 пути:
    1) Оптимизация. Все что возможно ускорить - ускоряется, находятся самые тормознутые запросы, прогоняются через explain, переписываются, тюнятся, индексируются до состояния максимальной производительности.
    2) Кэширование. Обычно используют кей-валуе инмемори хранилища а-ля мемкеш и редис, и результаты запросов часто используемых, но не часто обновляемых данных пишутся в кэш. Время жизни настраивается в зависимости от необходимой актуализации. По идее на высоких нагрузках даже кэш с времением жизни 5-10 секунд может в разы снизить нагрузку на сервера.
    3) Иногда стандартных средств и инструментов не достаточно, и нужно искать какие-то новые инструменты, например переходить на сфинкс, так как фултекстсерч не вывозит. Или большие объемы данных идут на запись, и стандартной пропускной способности бд уже не хватает и нужно что-то типа систем хранения логов, или наоборот, аналитические бд по типу кликхауса...

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

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Таблица users - данные о пользователе, + понадобятся справочные таблицы, где у вас будут перечислены свойства (гендер, телосложение, цвета частей тела и прочее).

    Таблица prefers - набор желаемых свойств, возможно с диапазонами (типа рост от 150 до 152) или списками (например карие + голубые + зеленые... ) через многие-ко-многим.

    Ну и какие-то настроечные/служебные, типа списка избранного, друзей и прочий фуфел.
    Ответ написан
    Комментировать
  • Некорректное поведение кэша сайта?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Я тут ради интереса глянул первый файл в гите. Увидел что у вас логин пароль и хэш лежит в куках. Понял что в принципе смысла дальше что-либо смотреть нет.

    На случай если вы что-то конкретное будете спрашивать, а не приводить юзекейсы и простыни кода на гитхабе в купе с роликами на ютубе:
    Определите проблему с точностью до куска кода, помещающегося в 10-20 строк.
    Опишите что должно быть и что получается
    По необходимости дайте дампы переменных или уточните запрашиваемые детали.

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

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Если злоумышленник введет логин и пароль чужого человека сможет ли он авторизоваться?
    Например, если он сделает curl запрос в котором user agent такой же как у жертвы и пароль и логин также такой же как у жертвы, то сможет ли он авторизоваться в чужой аккаунт? Откинем в сторону вопрос как он получил эти данные, трояном или как нибудь еще.
    Ответ написан
    9 комментариев
  • Нужно ли делать условие перед вызовом метода для избежания выделения дополнительной памяти?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Мне нужно аргументировать ответ, но я не знаю как ответить правильно.
    Очень просто: Так как проверка отнимает процессорное время, то экономия все равно будет липовой, вместо памяти потратится ресурс процессора. Сколь ни будь значительной экономии это не даст ни в том, ни в другом случае, точнее экономия будет в случае отсутствия проверки и существования переменной, что будет происходить скорее всего чаще чем несуществование переменной, ну или по крайней мере в каком-то числе случаев, в то время как проверка будет осуществляться всегда.
    Ответ написан
    Комментировать
  • SQL запрос к БД через WordPress в 46 раз дольше чем через phpmyadmin?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых нужно нормально писать запрос, хотя бы для понимания что вы делаете:
    SELECT DISTINCT tt.term_id 
    FROM wp_term_relationships AS tr 
    JOIN wp_term_taxonomy AS tt 
    ON tr.term_taxonomy_id = tt.term_taxonomy_id 
    JOIN wp_terms AS t 
    ON tt.term_id = t.term_id 
    WHERE tr.object_id IN (
       SELECT p.ID 
       FROM wp_posts AS p 
       JOIN wp_term_relationships AS tr 
       ON p.ID = tr.object_id 
       JOIN wp_term_taxonomy AS tt 
       ON tr.term_taxonomy_id = tt.term_taxonomy_id 
       JOIN wp_terms AS t 
       ON tt.term_id = t.term_id 
       WHERE p.post_type = 'product' 
       AND p.post_status = 'publish' 
       AND tt.taxonomy = 'product_cat' 
       AND t.term_id = '2961' 
    ) 
    AND tt.taxonomy LIKE 'pa_%';

    Во вторых, как уже написали, это старая "проблема", пхпмайадмин выдает результат "порциями" и большинство малоопытных разработчиков не обращают внимание на отображаемый в результатах запрос, где этот лимит отображен.

    Ну и в третьих, запросы без лимита почти всегда будут медленными, так как бд вынуждена перебирать все таблицы перебором. Если же такой запрос необходим по каким то причинам, то стоит посмотреть что же происходит с запросом. Нужно в первую очередь сделать отдельно вложенный запрос, проверить как он работает, оптимизировать, а затем то же самое сделать с внешним. Так же неплохо прогнать эти запросы через explain, посмотреть каких индексов не хватает. Ну и первое на что стоит обратить внимание это tt.taxonomy LIKE 'pa_%', что само по себе затратно, и требует обязательного индекса.
    Ответ написан
    Комментировать
  • Как правильно вывести последнее сообщение в блок слева который будет на картинке?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    SELECT m.*, u.login, i.img
        FROM messages m
        LEFT JOIN users u
        ON m.to_user_id = u.id
        LEFT JOIN image i 
        ON m.to_user_id = i.obj_id 
        WHERE m.date > :lastdate # надо выбирать все что позже уже полученных сообщений
        AND image.obj_type = 'user' 
        AND m.from_user_id = :fid  # айди "от юзера"
        AND m.to_user_id = :tid #айди "к юзеру"
        ORDER BY m.date  # по возрастанию все старше последнего полученного
    Ответ написан
    Комментировать
  • Как построить коллекцию на PHP при заданных ниже условиях?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    99% работы с массивами - циклы. Даже под капотом всяких мап тот же цикл, только скомпилированный в функцию. Тут безусловно нужен цикл.
    Ответ написан
    Комментировать
  • Как сделать повтор действия в php если элемент не найден?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    через n-времени начинаем снова искать до тех пор пока не найдем то что ищем в бд.
    То есть если по каким то причинам данные в бд не поступят, то цикл будет вечным... Вам не кажется что тут что-т не правильно?
    Ответ написан
    Комментировать