Ответы пользователя по тегу PHP
  • Как сформировать запрос SQL в случае отсутствия значения в таблице базы данных?

    Stalker_RED
    @Stalker_RED
    запрос к бд получается уже некорректным
    что в нем некорректного? Вы запросили данные, их в бд нет, вернулся пустой ответ. Так и должно быть.

    И возможно ваши страдания решаются запросом типа insert ... on duplicate key update ...
    https://dev.mysql.com/doc/refman/8.0/en/insert-on-...
    Ответ написан
    Комментировать
  • Где лучше хранить переводы в мультиязычном сайте?

    Stalker_RED
    @Stalker_RED
    В ларе есть специальный хелпер для локализации __()
    https://laravel.com/docs/10.x/localization

    Такой-же, кстати, в вордпрессе. Внутрянка немного различается, но применение практически одинаковое.

    В большом оперсорсном софте делают вот так. Но вы можете делать и свои велосипеды с json'ами-массивами, особенно если уверены, что объемы локализации небольшие, и вам не понадобится для них привлекать сторонних исполнителей, писать тесты, и прочие энтерпрайзные штуки. Ну просто для готовых решений уже тонны сопутствующего софта написаны, а для велосипедов придется их тоже велосипедить. Ну или не придется, если приложение мелкое или с коротким жизненным циклом.
    Ответ написан
    Комментировать
  • Как исправить ошибку при переходе на php8 Битрикс [TypeError] Argument #5 ($day) must be of type ?int, string given (0)?

    Stalker_RED
    @Stalker_RED
    Открываем документацию по mktime(), видим, что эта функция принимает только тип int в качестве аргументов. (впрочем, можно и не ходить в документацию, об этом же прямо в тексте ошибки написано).

    Смотрим что в нее передается в коде - три нуля, с ними все хорошо. Дальше какие-то значения из массива $de. Смотрим что там в этом массиве, он создается на пару строк выше:$de = explode(".", $date_end);
    Смотрим документацию по функции explode() (если вы забыли, что это одна из строковых функций), и видим, что она возвращает массив строк. (Ну и да, об этом тоже прямо в тексте ошибки написано, что передана строка).

    Вспоминаем чем отличается строка от числа и как преобразовать одно в другое.

    Было сложно? Нет, не особо. Но таких ошибок в движке битрикса могут быть сотни или тысячи. Вот в чем сложность.
    Ответ написан
  • Куда прописать alert, что данные отправлены?

    Stalker_RED
    @Stalker_RED
    Так он уже есть
    if (response.ok) {
        // ...
        alert(result.message);
    Ответ написан
    1 комментарий
  • Как получить "хеш"/сравнить изображение?

    Stalker_RED
    @Stalker_RED
    На хабре есть несколько статей, и с самописными решениями и с готовыми инструментами.
    https://www.google.com/search?q=habr+%D1%81%D1%80%...
    Ответ написан
    Комментировать
  • Как удалить сессию при закрытии вкладки/окна браузера?

    Stalker_RED
    @Stalker_RED
    При закрытии вкладки она и не должна удаляться. При закрытии браузера как-бы должна, но в браузерах давно есть галка "восстанавливать сессию". Можете найти её и отключить, если вам для себя.

    Upd: а вас не устроит установить сессию на минуту, например?
    Ответ написан
  • Как заполнить пустой массив хеш таблицей из другого массива php?

    Stalker_RED
    @Stalker_RED
    Ошибка в ничем. Код работает: https://ideone.com/UQ1EGS

    И вот такой код работает, причем вообще без циклов. На больших массивах разница в скорости будет заметна.
    $result = ['data' => [
    	'main'      => $keywords['data'],
    	'secondary' => $keywords['data'],
    ]];
    https://ideone.com/fi0l5o

    А если вам не просто сдублировать, то откройте для себя array_filter()
    Ответ написан
    Комментировать
  • Как разложить URL path на части?

    Stalker_RED
    @Stalker_RED
    $str = 'aaa/bbb/ccc/ddd';
    $separator = '/';
    $parts = explode($separator, $str); // <-- магия здесь
    var_export($parts);

    https://www.php.net/manual/en/function.explode.php
    Ответ написан
    1 комментарий
  • Как сформировать вывод через array_chunk?

    Stalker_RED
    @Stalker_RED
    foreach (array_chunk($items, 4) as $chunk) {
      var_dump($chunk[0]);
      echo '<hr>';
      var_dump($chunk[1]);
      echo '<hr>';
      var_dump($chunk[2]);
      echo '<hr>';
      var_dump($chunk[3]);
      echo '<hr>';
    }
    Ответ написан
    Комментировать
  • Поиск на сайте. Пишем "киа" - должен найти "KIA". Как?

    Stalker_RED
    @Stalker_RED
    Это называется нечёткий поиск (fuzzy search) и инструментов для него довольно много.
    https://www.google.com/search?q=%D0%BD%D0%B5%D1%87...
    Ответ написан
    Комментировать
  • Как вывести сумму?

    Stalker_RED
    @Stalker_RED
    array_column() чтобы получить все значения из полей quantitiy и array_sum() чтобы сложить их.

    Ну либо циклом перебрать, array_reduce либо обычный foreach.
    Ответ написан
    Комментировать
  • Почему у php недостаточно прав на перезапись файлов?

    Stalker_RED
    @Stalker_RED
    Запускается через php скрипт.
    как именно запускается? Через SSH-консоль, через вебсервер, может через крон? Это все может быть под разными пользователями.

    Для начала разобраться какие пользователи вообще замешаны. Для этого на боевом сервере делаешь эксперимент:
    создаешь файлик от имени обычного скрипта, от имени вашего опртимизатора, и от имени фтп-заливки.
    Вот прям создай папочку "test" и залей в нее hello_ftp.txt через ftp
    Затем из php скрипта сделай file_put_contents('test/hello_php.txt', 'foo');
    И в оптимизатор тоже добавь похожее file_put_contents('test/hello_optimizator.txt', 'foo');

    Затем зайди через SSH в папку test, напиши ls -l
    Если SSH нет, то можно опять-же сделать скриптом
    $files = glob('/path/to/test/*');
    foreach ($files as $fn) {
        echo $fn . ' | ' . fileowner($fn) . '<br>' . PHP_EOL;
    }

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

    Stalker_RED
    @Stalker_RED
    Это не обычное исключение. Нехватка памяти - это аварийная ситуация, при которой скрипт завершается.
    Но вы можете отловить ее при помощи register_shutdown_function().

    UPD: вот тут еще рекомендуют зарезервировать кусок памяти заранее, чтобы освободить ее когда поймаете ошибку
    https://stackoverflow.com/questions/8440439/safely...

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

    Stalker_RED
    @Stalker_RED
    Все js и css файлы проекта должны быть скомпилированы Vite
    не должны! В гите у вас исходники, скомилированные штуки не обязаны быть в исходниках (хотя иногда их и добавляют).
    Вы при желании можете скомпилировать их заранее, и залить в гит, либо выложить как релиз

    Некоторые процессы в проекте выполняются с помощью очередей и нужно как-то настроить
    приложение что бы команда
    Это нормальная история, к вашему приложению вполне может прилагаться перечень требований к инфраструктуре, инструкция по установке и настройке, либо скрипт-инсталлятор.
    Ответ написан
    3 комментария
  • Как можно оптимизировать данное полотно из if?

    Stalker_RED
    @Stalker_RED
    Пара забавных фактов:
    1. isset() проверяет существование переменной и возвращает true или false.
    2. == - не строгое сравнение

    В результате условия
    if (isset($data['time']) == 2) {}
    и
    if (isset($data['time']) == 3) {}
    Выполнятся оба, независимо от того что там в переменной $data['time']. Или не выполнятся, если ее вообще нет.
    Проверим?

    То есть у вас вопрос не как сократить, а понять для начала чего вы хотите добиться, а потом уже писать код. С нуля.
    Возможно стоит один раз написать формулу расчета, и один массив с коэфициентами (множителями), которые подставляются в формулу в зависимости от выбранной длительности сеанса.
    Ответ написан
    1 комментарий
  • Как реализовать бэкап сайта/бд посредством PHP?

    Stalker_RED
    @Stalker_RED
    Возможно, хотя непонятно зачем это делать на PHP.

    Достаточно одной команды архиватору - вот эту папку заархивируй, добавь в название дату, и помести вон в ту папку. Или отправь по почте, например.
    Ну и в планировщик задач это добавить.

    А вообще для бекапа есть специаллизированный софт, который не только позволит бекапить, но и разворачивать из бекапа обратно с минимальными усилиями.

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

    Stalker_RED
    @Stalker_RED
    Я бы не делал транслитерацию и проверку расширения. Вместо транслитерации генерировать название изображения на основе user_id, расширение вообще не проверять, - удалось прочитать картинку - отлично, конвертируем в единый для сайта формат. (конвертации у вас, кстати, нет, и вполне возможна загрузка rarjpeg или чего повеселее) Не удалось - неподдерживаемый формат. Проверка размера тоже не особо нужна.
    Половину ошибок текстовых можно спрятать от пользователя, незачем ему видеть что "Не удалось записать файл на диск", такие ошибки должны отправляться в мониторинг или админу на почту.
    Остальное вроде как стремно выбрасывать, вполне возможны случаи когда вместо картинки вам загрузят что-то другое.

    Какой-то сюр при записи в БД - вместо UPDATE USER почему-то вставка в таблицу wish(?), с прочерками в полях и цене(?!).

    Было даже интересно что там за навороченная загрузка фоточек на 46кб. Может там полновесный фоторедактор? Потому что кроме кропа и парочки фильтров при загрузке аватарки сложно что-то придумать. но мало-ли.
    Оказалось загрузчик занимает строчек 20, и в нем только jQuery.post и вывод парочки сообщений. Остальное место занято jQuery выпуска 2014 года. Вы вообще пытаетесь понять что вы делаете, или просто тащите всякий хлам из этих ваших интернетов в надежде, что оно как-то само заработает?
    Ответ написан
    1 комментарий
  • Как запретить обновление страницы для скачивания?

    Stalker_RED
    @Stalker_RED
    Со стороны браузера действие "обновить страницу" почти ничем не отличается от "закрыть, а потом открыть эту-же страницу" или даже от "открыть этот же адрес в новой вкладке".

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

    И т.д.

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

    "после окончания скрипта делался переход на другу страницу" - можно, но опять-же, это только мелкое неудобство, пользователь может вернуться через историю браузера.
    Ответ написан
    3 комментария