Ответы пользователя по тегу PHP
  • "Сырые строки" в 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
    {
     // запросить новые данные и записать файл
    }
    Ответ написан
    Комментировать
  • Как сделать отправку формы в телеграмм бота но и чтобы форма делала запрос?

    @alexalexes
    document.getElementById('tg').addEventListener('submit',function(e){

    Вместо события submit подпишитесь на событие click не на тег формы, а на кнопку.
    На эту кнопку.
    <button type="submit">Отправить</button>
    У кнопки уберите тип submit - вы же не хотите дергать классическую отправку формы через submit.
    Все отправки делайте через axios (внутри этой библиотеки используется ajax - что вам и требуется, что и так используется).
    Ответ написан
  • Нужно ли в таких случаях делать защиту от инъекций?

    @alexalexes
    Помимо наличия возможности использовать инъекции есть еще один момент.
    Если у вас форма на редактирование, то хорошо бы, чтобы она имела скрытое поле id той записи, которую редактируете, в данном случае нужно принять user_id через POST и уже сразу делать обновление по известному телефону и user_id:
    $user_id = $_POST['user_id'];
    $tel = $_POST['tel'];
    $user = mysqli_query($connect, "UPDATE `bd` SET `tel` = '$tel'  WHERE `bd`.`id` = $user_id");

    Но есть еще одни нюанс. Если такую запись редактирует администратор (пользователь с самыми широкими правами), то доверять передачи $user_id через форму можно.
    Если такую запись редактирует тот же самый пользователь, который авторизован в системе, то доверять $user_id параметру из формы опасно, user_id нужно брать из сессии авторизации.
    $user_id = /* Нужно какой-то функцией забрать идентификатор пользователя из сессии авторизации */;
    $tel = $_POST['tel'];
    $user = mysqli_query($connect, "UPDATE `bd` SET `tel` = '$tel'  WHERE `bd`.`id` = $user_id");
    Ответ написан
    Комментировать
  • Как проверить на совпадение в бд?

    @alexalexes
    Динамически сформировать текст и список параметров запроса, в зависимости от критериев:
    $sql = "SELECT * FROM `shop` WHERE 1=1 "; // 1=1 - классическая заглушка, чтобы можно было удобно добавлять and.
    $params = []; // заготовка под входные параметры запроса.
    if(isset($_POST['criteria_1']) && $_POST['criteria_1'] == 'on') // выбрали нечто по первому критерию
    {
    // он проверяет только имя чего-то
    $sql .= 'and `name` = :name ' // добавляем условие в текст запроса
    $params['name'] = $_POST['name']; // добавляем параметры
    }
    if(isset($_POST['criteria_2']) && $_POST['criteria_2'] == 'on') // выбрали нечто по второму критерию
    {
    // он проверяет  например, страну и город
    $sql  .= ' and `country` = :country
                 and `city` = :city ' // добавляем условие в текст запроса
    $params['country'] = $_POST['country']; // добавляем параметры
    $params['city'] = $_POST['city']; // добавляем параметры
    }
    $stmt = pdo()->prepare($sql);
    $stmt->execute($params);
    if ($stmt->rowCount() > 0) {
        flash('Этот магазин уже существует.');
        header('Location: addshop.php'); // Возврат на форму регистрации
        die; // Остановка выполнения скрипта
    }
    Ответ написан
    Комментировать
  • Как отправить несколько записей?

    @alexalexes
    В самом примитивном варианте реализации.
    Даете тегу select атрибут multiple и name задаете как ключ-массив, чтобы отправляемая форма могла по данному name нести на сервер массив значений:
    <select name="category_id[]" form="data" multiple>
    ...
    </select>

    На стороне сервера на пост-параметре category_id вы увидите массив выделенных элементов:
    var_dump($_POST['category_id']);
    Ну, и остается перебрать этот массив, чтобы последовательно выполнить insert.
    PS: Однако, структуру базы вам придется изменить, добавив еще одну таблицу для хранения множественного выбора категорий, чтобы выполнить требования 3-ей нормальной формы нормализации данных.
    Ответ написан
  • Как приветси GET-ответ в удобочитаемый вид?

    @alexalexes
    Можно хоть с браузера изучать содержимое JSON:
    1. Открываете средство разработчика в браузере F12.
    2. Открываете консоль.
    3. Пишите:
    Текст вашего JSON;
    4. После нажатия Enter появится строчка со скомпилированным результатом. Теперь можете бродить по внутренностям этого объекта как по дереву каталогов.
    Ответ написан
    Комментировать