Задать вопрос
  • Как лучше сделать историю покупок на MySQL?

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

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

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

    И как бы Вы реализовали систему списания и начисления баллов? Наверное это самый главный вопрос
    Так а какая логика начислений? Надо добавить - делаем апдейт на нужную сумму, нужно списание - делаем апдейт на нужную разницу, в чем вопрос?

    Стоит ли делать зависимости? Чтобы сумма бонусов клиента зависела от таблицы покупок
    Может где то, в определённом источнике имеется свод информации, касаемо таких решений? Может где то, в определённом источнике имеется свод информации, касаемо таких решений?
    Это называется "нормальные формы". На практике вам будут нужны первая, вторая и третья нормальная форма (например хранение total_purchase нарушает 3 НФ, так как может быть вычислена из объединения с таблицей покупок).

    По наименованию полей: Вроде все более-менее норм, единственно что list_purchase и sum_purchase логичнее переставить - purchase_list и purchase_sum, хорошо же начинали с purchase_date, что пошло не так? )
    Ответ написан
    Комментировать
  • Почему не работает innerHTML?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    я правильно понимаю что вы меняете innerHTML у строки, полученной из innerHTML?
    Ответ написан
    Комментировать
  • Как получить удаленный доступ к локальным доменам?

    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, либо авторизированная сущность, и тогда нужно связывать юзера и сущность через один-к-одному, в случае если доктор и пациент кардинально различаются по свойствам, а не просто имеют разные права. А пользователь просто способ авторизации/идентификации.
    Ответ написан
    Комментировать