Ответы пользователя по тегу PHP
  • Как правильно использовать функции array_filter() и in_array()?

    @alexalexes
    Не знаю, как на стрелочных функциях, но на классической анонимной функции внутрь ее контекста нужно передавать доп. аргументы через use (замыкание):
    $array2_ = array_map(function($row){return $row['value'];}, $array2); // тут бы value вытащить в отдельный массив
    $result = array_filter($array1, function($row) use ($array2_) {return in_array($row['code'], $array2_);});
    Ответ написан
    Комментировать
  • PHP. Вместо символа кириллицы печатается заменяющий символ �. Как исправить?

    @alexalexes
    Нужно сообщить браузеру, в какой кодировке будет страница, при помощи http-заголовка:
    header('Content-Type: text/html; charset=utf-8');
    Так как присутствия
    <meta charset="utf-8" />
    недостаточно, если браузер взаимодействует с php сервером.
    PS:
    // $lastSymmbol = substr($ar['surname'], -1);
    Помните, что для utf-8, как для разновидности двухбайтовой кодировки, нужно использовать другой спектр функций mb_*, в данном случае mb_substr.
    Но чтобы одни работали, нужно убедиться, что включено расширение mbstring в настройках php.
    Ответ написан
  • Заморозка сервера в конец срока оплаты?

    @alexalexes
    У PHP сервера есть настройка в конфиге php.ini - макс. время выполнения скрипта - max_execution_time.
    Для долгоиграющих скриптов, обычно, разработчики либо в конфиге (повлияет на все скрипты), либо в htaccess (повлияет на скрипты в пределах каталога), либо в самом скрипте через функцию set_time_limit() корректируют этот параметр, чтобы таким скриптам хватило время на выполнение. Выкручивать этот параметр не нужно для всего сервера, иначе если в частонагруженных скриптах будут проблемы по зацикливанию, то их зависание скушает всю оперативную память сервера при многократном запуске.
    Ответ написан
  • Куда передаются и как извлечь данные через FETCH()?

    @alexalexes
    Объясните простыми словами новичку в javascript, куда передаются данные через fetch

    Данные передаются из браузера (он же клиент) передаются на сервер.
    Постоянно вижу разные примеры кода и везде прописывают файл назначения разным

    Это не файл, это url - адрес на сервере, от которого любым способом запустится какой-то скрипт, который сможет сформировать ответ для браузера (то есть для клиента).
    Если в url указан путь к файлу на сервере, то сервер может отдать статичный файл - но для сервера не принципиально, что отдавать по какому url, можно настроить любые правила взаимодействия.
    А ловят данные вообще через какой-то "php://input"

    Сервер ловит обращение по url (он же запрос), выясняет по настройкам, что нужно сделать: запустить серверный скрипт, отдать статичный файл или ответить каким-нибудь статусом (например, 404). Если по url запрос попадает на запуск скрипта, то в этом скрипте вы можете обработать параметры запроса. Параметры запроса как правило вылавливают в $_GET или $_POST, либо парсят часть url, либо в дополнение смотрят вложения $_FILES.
    Либо в вашем варианте смотрят сырцы запроса через php://input, если что-то нестандартное нужно обработать.
    Тогда зачем вообще эти файлы, которые указывают в Fetch? Причем одни с абсолютным адресом, другие с относительным, где-то указывают расширение (html, json и т.д.), где-то вообще без него.

    Сервер может отдать разные данные клиенту. Где-то их можно забрать из файла статично, где-то сгенерировать ответ серверным скриптом динамично. А можно на статичные пути генерить динамичные данные, по виду url это мало чего говорит.
    Нужно создавать файл какой-то на сервере в который якобы будет передаваться эта информация из JS через POST запрос?

    Да, на сервере должен быть скрипт, который сформирует ответ, если для клиента нужно сформировать нечто динамическое, зависящее от параметров запроса.
    Я создаю, у меня не выходит ничего, значение, при чтении этого файла или php://input (file_get_contents("php://input")) после передачи POST пустое.

    Указываете на клиенте метод POST - на сервере ловите параметры методом POST он будет в $_POST.
    Отправляете параметры GET или вшиваете их в url - ловите параметры на сервере в $_GET.
    Вкладываете файл на клиенте - получаете атрибуты файлов на сервере в $_FILES.
    Все просто.
    На клиенте:
    fetch('/foranswer.php', { //указываете скрипт на сервере, который сформирует ответ для клиента
                                                method: 'POST',
                                                headers: {
                                                    'Content-Type': 'text/plain'
                                                },
                                                body: player.signature
                                            });

    На сервере:
    Скрипт foranswer.php
    <?php
    var_dump($_POST); // Посмотрите, а что вообще пришло в пост параметрах.
    // Например, вам нужен параметр param1, забираем его значение из поста
    $param1 = isset($_POST['param1']) ? $_POST['param1'] : null;
    // Если param1 задан - что-то делаем
    if(!is_null($param1))
    {
      // Например, при наличии параметра param1 нужно прочитать некий ресурс на сервере
      $out = file_get_contents("/file.txt");
      // и отдать его содержимое клиенту
      echo $out;
    }
    else
    {
      // Нет обязательного параметра, отдаем ответ клиенту, что что-то не так.
      echo "Нужен обязательный параметр param1";
    }
    ?>
    Ответ написан
    1 комментарий
  • Как поменять формат вывода json?

    @alexalexes
    Попробуйте использовать опцию JSON_FORCE_OBJECT в функции json_encode.
    https://www.php.net/manual/ru/json.constants.php
    Добавлено:
    Ну, тогда item-ы кодируйте стандартной функцией, а сборку массива делайте кастомную:
    $imported_items[] = json_encode($product, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);
    ...
    $preview_items[] =  json_encode($preview_product, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);
    ...
    file_put_contents(sprintf(IMPORT_FILE, $id), '['.join(',', $imported_items).']');
    file_put_contents(sprintf(PREVIEW_FILE, $id), '['.join(',', $preview_items).']');
    Ответ написан
    1 комментарий
  • "Сырые строки" в php. Есть ли такое?

    @alexalexes
    Heredoc в php?
    $a = <<<THISISHEREDOC
    
    THISISHEREDOC;
    Ответ написан
    Комментировать
  • Как перевести дату в секунды если доступен только год?

    @alexalexes
    Вариант 1.
    1. Определите, что у вас - полная дата, или только год.
    2. Если только год, то приклейте 1 января.
    3. Конвертируйте в отметку Unix time как обычно.
    4. Если дата с фрагментом 1 января, то считаем, что известен был только год, выводим только год.

    Вариант 2.
    1. Определите, что у вас - полная дата, или только год. Результат сохраняем во временную переменную 1 - полная дата, 2 - только год.
    2. Если только год, то приклейте 1 января.
    3. Конвертируйте в отметку Unix time как обычно.
    4. Сохраните и отметку времени и результат выполнения шага 1 в отдельном поле (полная дата, или только год).
    5. Если полная дата, то конвертируем отметку времени в строковое представление, и берем всю строку. Если только год, то тоже конвертируем, но выводим только год.
    Ответ написан
    5 комментариев
  • Как лучше хранить заявки из форм в БД?

    @alexalexes
    А что вы так боитесь сделать в таблице кучу колонок?
    У записи заявки будет type_id - тип заявки, и в зависимости от этого будет использоваться разный набор колонок. Все колонки, которые опционально будут использоваться только в определенных типах будут с допущением null значениями.
    В основную записываем допустим имя, а в сводную то что придёт в формате ключ - значение.

    Имеет право на жизнь, но для разработчика будет сложнее сопровождать запросы. При написании запроса, если нужно вытащить или сравнить свойства заявок, будете писать на каждый такой момент подзапрос. Если захочется получать выборки с результатами в одну строку, то придется тоже использовать кучу подзапросов, возможно, сам текст запроса нужно будет формировать динамически.
    С точки зрения производительности. План запроса усложнится, нужно будет использовать индексы.
    2. Сохранять данные в json

    Если не будете использовать свойства, которые запишите в json для связывания таблиц, и формирования условий выборки, то можно использовать.
    Ответ написан
  • Как внутри echo или переменной выполнить цикл и ещё одно echo?

    @alexalexes
    // Вы определитесь:
    $table = /* либо копите результат верстки в переменной table, а потом после обработки выводите все содержимое на строке N */
     '
        <tr>
        <td>'. $trtd .'</td> //отрисовывает первым столбиком таблицы номер сотрудника в таблице бд
        <td>'. $array[0]++ .'</td> //отрисовывает вторым столбиком таблицы имя сотрудника в таблице бд
        '. // зачем тут перед for конкатенация ?
    
    for ($td=1; $td<=$daysinmonth; $td++){
    // Либо сразу выводите результат через echo, не накапливая ничего для вывода контента
    echo '<td>тут какое-то значение, в будующем должен быть код с операторами if и т.д.</td>';}.' //отрисосывает оставшиеся столбцы в зависимости от кол-ва дней в месяце
        </tr>';// если вы множите ячейки дней месяца, то наверное, строку таблицы нужно закрывать не в теле цикла?
      /*строка N */  echo ($table); // вывод всего накопленного содержимого

    Оператор .= вам в помощь, чтобы добавить еще что-то к $table.
    Ответ написан
  • Логирование mysql запросов с ошибками?

    @alexalexes
    Пройдите регуляркой по запросам:
    Вариант 1. Прописать всем insert явные названия полей.
    Найдите случаи, когда перед values (через пробелы или переносы строк) нет закрывающийся скобки - пропишите явно названия полей для вставки.

    Вариант 2. Подсчитать у всех insert для каждой table правильное кол-во значений для вставки.
    По названию таблицы перед values и по запятым после values в скобках определить случаи, когда кол-во полей не то.

    PS: Переведите проект на mysqli или PDO.
    PSS: вангую, что в проекте полный треш с bind-ами параметров - тоже отдельная задача.
    Ответ написан
    Комментировать
  • Как правильно настроить .htaccess?

    @alexalexes
    Добавьте выше правило:
    RewriteRule ^cases/$ /cases/index.php [QSA,L]
    Ответ написан
    Комментировать
  • Как изменить mime type у получаемого js файлы через import?

    @alexalexes
    Тип файла вы получили, теперь нужно отдать его заголовком.
    $mime_type = mime_content_type($_SERVER['DOCUMENT_ROOT'] . '/assets/js/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js');
    header( 'Content-type: '.$mime_type);
    Ответ написан
  • Какие существуют методы перемешивания массива в случайном порядке?

    @alexalexes
    Методов перемешивания столько же сколько методов сортировки (разработанных на коленке или имеющие конкретные названия). Просто применяете к функции сравнения в ядре функции сортировки random с разной вероятностью перестановки двух элементов - получаете свой метод перемешивания.
    usort($a, function($elem_1, $elem_2)
    {
      return rand(0, 1) == 1 ? 1 : -1;
    });
    Ответ написан
    Комментировать
  • Как в текущую строку mysql вставить значения из последующих строк? Зациклить новости по id?

    @alexalexes
    Если вы делали механизм связывания похожих новостей (в ручном режиме указания связей), то с точки зрения реляционной теории баз данных хранение связей реализовано не корректно.
    Сложно использовать атрибут rel_id, когда в него записывают несколько значений через запятую.
    Вместо данного атрибута нужно создать отдельную таблицу для хранения связей:
    news_relation - таблица связей похожих новостей:
    атрибуты:
    id - идент. связи (первичный ключ)
    news_id_1 - идент. новости (первый конец ребра связи, внешний ключ, создайте индекс)
    news_id_2 - идент. новости (второй конец ребра связи, внешний ключ, создайте индекс)
    Для новости, с id = 1 таблица будет заполнена так:
    id, news_id_1, news_id_2
    1, 1, 3
    2, 1, 4
    3, 1, 5
    4, 1, 6
    5, 1, 7
    Если ребра связей равнозначны (неориентированный граф), то достаточно иметь запись, подтверждающую связь от news_id_1 к news_id_2. Например, у вас есть запись связи 3, 1, 5 - связь от новости 1 к новости 5, то не нужно создавать еще одну запись вида 6, 5, 1 - связь от новости 5 к новости 1. При создании и редактировании новости отслеживайте этот момент - не допускайте создание повторных связей в другом направлении (иначе придется использовать distinct в запросе ниже, он будет работать медленнее). Эту неориентированность можно реализовать текстом запроса, не записывая дополнительных данных в таблицу (обратите внимание на условие с or в запросе).
    Запрос для получения связанных новостей будет такой:
    select n.*
    from news as n
    join news_relation as nr on (:id = nr.news_id_1 and n.id = nr.news_id_2) -- выявляем связь в одну сторону
                             or (:id = nr.news_id_2 and n.id = nr.news_id_1) -- выявляем связь в другую сторону
    order by n.id desc

    :id - входной параметр текущей новости
    Ответ написан
    Комментировать
  • Как выполнить функцию после обработки preg_replace на PHP 8?

    @alexalexes
    И правильно что убрали, не нужны eval возможности, там где должен быть текстовый параметр.
    Для пользовательской обработки есть отдельная функция с явным callback параметром:
    https://www.php.net/preg_replace_callback
    Получается, что нужно убрать модификатор /e и сделать обертку анонимной функции для нормального вызова функции.
    Ответ написан
    1 комментарий
  • Как получить первый элемент группы в объекте php?

    @alexalexes
    Нужно рекурсивно погрузиться внутрь дерева по ветке первого ребенка на нужный уровень вложенности.
    $doc = new DOMDocument;
    $doc->load('company.xml');
    function get_children($doc, $max_level, $level)
    {
      if($max_level > $level)
      {
         if($doc->count() > 0)
         {
           $childs = $doc->children(); 
           return get_children($childs[0], $max_level, $level + 1);
         }
         else
           return null;
      }
      return $doc;
    }
    $employee = get_children($doc, 2, 0); 2 -  целевой уровень, 0 - стартовое значение уровня.
    Ответ написан
  • Как изменить данные в SQL таблице?

    @alexalexes
    Используйте подготовленные запросы, чтобы вставлять параметры в текст запроса.
    $stmt = mysqli_prepare($link, 'UPDATE your_table SET name = ? where ID = ?');
    mysqli_stmt_bind_param($stmt, 'si', $name, $id);
    mysqli_stmt_execute($stmt);
    echo "строк изменено: ".mysqli_stmt_affected_rows($stmt);
    Ответ написан
    Комментировать
  • Как правильно объединить две таблицы?

    @alexalexes
    в гугле решения найти не смог

    sql join

    redbeanphp

    Научитесь сначала использовать базовый набор функций работы с СУБД:
    либо mysqli, либо PDO. Не нужно использовать ORM-ки на начальном этапе обучения.
    Ответ написан
    1 комментарий
  • Как кешировать rss на php?

    @alexalexes
    Вариант 1.
    Использовать cron с настроенным расписанием, чтобы каждые 30 мин выполнял ваш php скрипт, который будет делать запрос rss данных и сохранять локальный файл. Любые другие приложения читают только этот файл, но не делают запросы на его обновление.
    Вариант 2.
    Использовать этот скрипт в качестве подключаемого скрипта на вашем сайте с типичной конструкцией кеша:
    if(существует файл кеша и его время изменения меньше 30 мин)
    {
    // читать кеш
    }
    else
    {
     // запросить новые данные и записать файл
    }
    Ответ написан
    Комментировать