• Как получить удаленный доступ к локальным доменам?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Самым очевидным выходом выглядит впн + ремоут десктоп. Да, работать вы в таком случае будете именно на удаленной машине, но в принципе это самое удачное решение из имеющихся...
    Ответ написан
    Комментировать
  • Почему в response ответ выводит 500 (Internal Server Error)?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    storage/logs/laravel.log
    Ответ написан
    Комментировать
  • Как правильно оповестить пользователю о занятых его данных?

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

    Во первых не понятно чего вы боитесь - взлома почты или взлома аккаунта вашего сайта?
    Если первое - это как минимум глупо, все сервисы почты достаточно хорошо защищены от атак перебором, 99,9% взломов - фишинг и социнженерия. А емэйл достаточно публичная информация, чтобы не парится конкретно с вашим сайтом.

    Если второе - у вас так же должна быть защита от перебора, а подтверждение наличия зарегистрированности емэйла - нормальная практика, НИЧЕГО не дающая злоумышленнику. Ну, в случае ХОТЬ КАКОЙ-ТО РЕАЛЬНОЙ, а не мнимой защиты (как в случае "ой, нельзя говорить что такой имэйл уже есть, а то у нас от перебора защиты нету...").

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

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Так а в чем вопрос? У вас же переменная переписывается внутри цикла, во втором ифе? Учитесь дебажить:
    $selected_cat = 1111; // если тут прописать переменную, то выводит её значение которое тут
    $deb = [];
    $i = 0;
        foreach ($aTabs as $aTab) { 
            foreach ($aTab['OPTIONS'] as $key => $arOption) {
            $deb[$i]['key'] = $key;
                if ($request['apply']) {
                    $deb[$i]['apply'] = 1;
                    $optionValue = $request->getPost($arOption[0]);
                    $deb[$i]['optionValue']  = $optionValue;
                    if ($arOption[0] == 'select_cat') {
                            $deb[$i]['arOption'] = $arOption[0];
                            $deb[$i]['selected_cat_1'] = $selected_cat;
                            $selected_cat = $optionValue; //тут у вас на какой-то итерации пусто, и переменная дохнет
                            $deb[$i]['selected_cat_2'] = $selected_cat;
                            Option::set($module_id, 'qqqqq', $key );/// выводит 1
                    }
                    Option::set($module_id, 'sssss', $selected_cat );// выводит переменную
                    if ($arOption[0] == 'start_load_product') {
                        echo  $key; // выводит 2
                        Option::set($module_id, 'qqqqq', $key );// выводит 2
                        Option::set($module_id, 'sssss', $selected_cat );// переменная пустая
                    }
    
                }
            }
            $i++;
        }
    echo '<pre>' . print_r($deb,1).'</pre>'; exit;
    Ответ написан
    4 комментария
  • Как правильно сформировать логическое условие в php?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых - вы сравниваете строки, что уже хреново.
    Во вторых - в правилах выставления времени уже должны быть ограничения, например что время закрытия больше времени открытия, так же с обедом, и еще надо проверить что обед попадает между закрытием и открытием.
    Ну и когда вы приведете все условия в нормальный вид можно думать о логике, которая по факту проще пареной репы... ну и $work_time по уму должно быть $work_start_time, то же самое с $dinner_time.
    Если все еще не ясна логика:
    $work_time = [
      'work_start_time'=>'09:30',
      'work_end_time'=>'18:20',
      'dinner_start_time'=>'13:30',
      'dinner_end_time'=>'14:00',
    ];
    $answer = 'Closed';
    $date = str_replace(':','',$work_time);
    $now = date('Hi');
    if( $date['work_start_time'] <= $now && $now <= $date['work_end_time'] ) $answer = 'Now we open';
    if( $date['dinner_start_time'] <= $now && $now <= $date['dinner_end_time'] ) $answer = 'Now we on break';
    echo $answer;
    Ответ написан
    3 комментария
  • Как избавиться от ломающих тегов HTML которые создаются пользователем на странице?

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

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Есть код который надо запустить, перед тем как отдать страницу. Сервер Апач...
    Возможно можно в htaccess правило прописать или например через index.php отдавать страницы, но они уже созданы...
    В хтаксесе прописываете переадресацию всех запросов на индекс.пхп (т.н. единая точка входа, нужен модуль апача mod_rewrite), далее в индексе обрабатываете $_SERVER["REQUEST_URI"], достаете путь до хтмл файла и делаете readfile или include... Profit.
    Ответ написан
    1 комментарий
  • Почему нельзя/можно писать бизнес-логику в sql?

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

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

    Это еще не учитывая того что в проекте все равно понадобится пара программистов на каком-то ЯП, для формирования отображения и какой-то прослойки между пользователем и бд, которые должны будут разобраться с этим зоопарком наоборот.
    Ответ написан
    4 комментария
  • Увеличение записи на некоторое число по предыдущей записи?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Похоже что задача сводится к удалению всех айди и заполнения автоинкрементом с шагом 10.
    SET GLOBAL auto_increment_increment=10;
    SET GLOBAL auto_increment_offset=1;
    ALTER TABLE example DROP COLUMN id;
    ALTER TABLE example ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (id);
    Вообще задача странная, и попахивает очередным "гениальным" решением...
    Ответ написан
    1 комментарий
  • Что не так с моим маршрутом?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    емнип регулярка не может начинаться со слеша, думаю должно работать что-то вроде такого:
    where([
        'address' => '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$',
        'port' => '^[0-9]+$',
    ]
    Ответ написан
  • Как распознать что сайт пытаются взломать?

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

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых не понятно, что закешировалось? Стили/скрипты или сама страничка?
    Если именно страничка, то:
    Во вторых, браузер волен по своему усмотрению учитывать или не учитывать заголовки сервера, по этому можно попробовать отдать заголовки, указывающие что документ не требует кеширования или устарел, но это не гарантия.
    В третьих прописывать мета заголовки в сам документ особо смысла не имеет, так как собсно проблема в том что эти заголовки не прочтутся из нового документа, а будет использована закешированная версия.
    Ну и в четвертых, естественно, кеширование у вас происходит на клиенте, а не на сервере.
    В случае проблем именно со скриптами и стилями, просто добавьте гет параметр с версией в конец пути, типа:
    <link rel="stylesheet" href="/some/style.css?ver=2" >
    Ответ написан
    Комментировать
  • Не работает php код?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Логи смотри, ну или включи вывод ошибок.
    echo('Это имя пользователя уже занято.');
    header('Location: register.php'); // Возврат на форму регистрации
    Здесь стопудоф будет лажа, так как хеадер так не отправляется. Почему - учим матчасть. Собсно в логах это будет отражено.
    Ответ написан
  • Как записать 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, 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 комментария