Ответы пользователя по тегу PHP
  • Ошибка при JSON.parse как исправить?

    @alexalexes
    Можно сделать из буханки хлеба троллейбус, но зачем?
    var dataJSONArray = JSON.parse('<?php echo str_replace( "\'", "\\'",json_encode($u,JSON_UNESCAPED_UNICODE)); ?>');
    Ответ написан
    Комментировать
  • Как получить "хеш"/сравнить изображение?

    @alexalexes
    Для ведения новостей прежде всего нужно определить порядок, как создавать каталоги для хранения сопутствующего контента для людей, кто ведет их. Если плагин галереи не берет на себя обязанность автоматически создавать каталоги под свои нужды и не скрывает это от контент-менеджера, то контент-менеджер (человек) тупо складывает картинки в один каталог.
    На моей практике я делаю так.
    Под новости создаю каталог news, в каталоге на каждый год создаю каталог года - 2023.
    Внутри каталога года создается каталог конкретной новости, который создается менеджером для новости, если требуется положить дополнительный контент. Обычно, имя у него такое: YYYY_MM_DD_NN, где YYYY - год, MM - месяц, DD - день, NN - порядковое число новости в один день.
    Для повторяющегося контента можно задать каталог по умолчанию в news, например default, и складывать туда часто используемые изображения, заглушки и т.д.
    И самое, главное, чтобы эту практику поддерживали менеджеры, тогда проблем с дублированием не будет, и не будет бардака в новостях.
    Ответ написан
  • Где здесь ошибка?

    @alexalexes
    Палим учетные данные окружения сервера.
    $conn = new mysqli("localhost", "y96360rs_a", "xR&O&&37", "y96360rs_a");

    То, что вы в вопросе показали пример запроса с параметрами - он выполнен с помощью склейки строк - так делать нельзя. Подготовленные запросы пишутся так:
    $sql = "UPDATE `admins` SET `login` = ?, `pass` = ?, `name` = ?, `role` = ? WHERE `id` = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('ssssi', $login, $pass, $name, $role, $id);

    Почувствуйте разницу.
    $id = $conn->insert_id;
    Зачем оно после запроса обновления, вы же знаете id изначально?
    Ответ написан
    Комментировать
  • Как лучше запрятать важные данные в коде?

    @alexalexes
    Свою клиентскую часть платежной системы делаешь как отдельный микросервис со своим локальным API и используешь на более подготовленном серверном окружении с точки зрения безопасности.
    Ответ написан
    Комментировать
  • Почему текстовый файл (.txt) превращается в бинарный?

    @alexalexes
    1. Какой-то другой скрипт переписал файл.
    2. Найти этот скрипт. Или заменить пути сохранения файлов, если лень.
    3. Взять из резервной копии (только не говорите, что у вас их нет).
    Ответ написан
    8 комментариев
  • Как показать определенное количество символов у ссылки а остальные скрыть?

    @alexalexes
    Проще со стороны формирующего скрипта подрезать лишнее внутри тега a.
    <?php echo mb_strlen($t_url) > 10 ? mb_substr($t_url, 0, 10).'...' : $t_url; ?>
    Ответ написан
    Комментировать
  • Как работает поиск по таблице в PhpMyAdmin?

    @alexalexes
    Откройте любую картинку взаимодействия:
    клиент <-> сервер приложений <-> сервер СУБД <-> физическое хранилище.
    И ответ будет просто иллюстрацией, как запрос от пользователя будет идти от клиента к хранилищу и обратно:

    Оболочка PhpMyAdmin формирует текст sql запроса выборки данных, драйвер расширения PHP для конкретной СУБД передает запрос в запущенный процесс СУБД mySQL. СУБД парсит запрос, строит план выполнения запроса, выполняет его, передает выборку данных обратно драйверу расширения, PHP отдает ответ оболочке PhpMyAdmin, или сам рисует эту оболочку голым HTML.
    Ответ написан
    Комментировать
  • Как добавить в цикл +время?

    @alexalexes
    Вам еще рано с шаблонами работать. Нужно научиться итерировать/трассировать циклы.
    if ( have_rows('whereblocks', $id) ) { // если найдены данные
    // тут объявить переменную i = 5
                   while ( have_rows('whereblocks', $id) ) { the_row();?>
           ....
                        data-wow-delay="<? /*тут вывести текущее i*/ ?>s">
            ....
      // тут прибавить к i 5
    } // конец цикла while
    } // конец if
    Ответ написан
    1 комментарий
  • Как сохранить сформированный через php xml в файл на сервере?

    @alexalexes
    // тут нужно создать болванку для исходящего xml документа с помощью XMLWriter.
    // перед входом в цикл нужно создать болванку списка юзеров
    while ($reader->read()):
         if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
            //........
             $UserFields = [];
             $AcceptedPosition = [];
             while($data->read()){
                 switch ($data->name){
                   // ....................
                 }
                
             }
             // считали свойства юзера во входящем документе, тут нужно создать элемент юзера в исходящем и закинуть туда значения из $UserFields,  $AcceptedPosition 
         }
    // закончили читать список юзеров, нужно закрыть список юзеров в исходящем доке.
    // закрыть исходящий док
    Ответ написан
    Комментировать
  • Как сортировать позиции в БД по заданным весам?

    @alexalexes
    Ну, если буквально понимать задачу, и у вас нужная характеристика имеет конкретное значение, то сортировать список нужно так:
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство = :входная_приоритетная_характеристика
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc,
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Если таких приоритетных характеристик несколько и они равнозначны, то можно сортировать по количеству подходящих под условие характеристик:
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end
    + -- очки приоритетов складываем
    case
      when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end
    + 
    -- ... и так далее все характеристики
     desc, -- 
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Если приоритеты имеют иерархию, то через запятую в order by раскладываем case от важной характеристики, к менее важной.
    select *
      from <таблица/соединенные таблицы для выборки товара> Tab1
    where <условия фильтрации>
    order by
    case
      when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc, -- эта более важная характеристика
    case
      when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
      then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
      else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
    end desc, -- эта менее важная характеристика
    -- ... и так далее все характеристики
    <Другие условия сортировки (по дате добавления, имени и т.д.)>

    Можно комбинировать подходы, если есть куча характеристик на одном уровне иерархии.
    Ответ написан
    1 комментарий
  • Почему в данных таблицы все не по порядку?

    @alexalexes
    О порядке добавления записей не нужно заботиться.
    У СУБД нет задачи хранить записи в строгом порядке, ваша задача понять, удовлетворит ли вас результат сортировки, если при выборке задать сортировку по darg-w:
    select *
      from verbs
    order by darg-w

    Если хотите получать список в порядке добавления, то логично сортировать по id:
    select *
      from verbs
    order by id

    Если хотите особую сортировку, которая не подчиняется ни id, ни естественному весу строк, то можете ввести новую колонку и следить за позиционированием строк при выборки сами, или по каким-то другим правилам вычислять позицию:
    select *
      from verbs
    order by position -- дополнительное поле, в которое будете сами или программно вбивать порядок сортировки

    Или запрос может выдергивать сам определенные строки, давая им высший приоритет (можно написать любое правило, что требует бизнес логика, или что в голову сбредет):
    select *
      from verbs
    order by case when id = 100 then 0 else 1 end -- даем записи id=100 наивысший приоритет, в любом состоянии списка она будет на 1 месте!
            , id -- остальные записи отсортируются в порядке добавления

    PS: Важно, чтобы поля, которые применяются в сортировке, были проиндексированы (в схеме СУБД были созданы индексы по данным полям и они своевременно пересчитаны).
    Ответ написан
    1 комментарий
  • Можно ли как-то получить html до определенного тега?

    @alexalexes
    1. Получить объект дерева документа d1.
    2. Создать пустой объект документа d2.
    3. Получить непосредственных детей объекта d1.
    4. Перейти к обработке очередного ребенка d1.
    4.1. Ребенок не содержит в себе признаков искомой ссылки - да, идем на шаг 4.2, нет - идем на шаг 5.
    4.2. Копируем ребенка в d2, идем на шаг 4.
    5. Прекращаем обработку детей d1, преобразуем объект d2 в текст.
    Ответ написан
    Комментировать
  • Как закрыть доступ к странице, если пользователь не авторизован?

    @alexalexes
    Ну, так основное правило в вебе касаемо кейса "сделать ресурс закрытым от пользователей, у которых нет прав" - это не спрятать ссылки на этот ресурс (в вашем случае дать пользователю редирект). А не давать пользователю получать данные на самом ресурсе, куда ведут ссылки.
    То есть, вам нужно чекать авторизацию и набор необходимых прав (если есть разделение на роли, помимо наличия факта авторизации), не только для редиректа, но и на самом ресурсе, куда пользователь может попасть любым путем (на personal_product.php).
    PS:
    $select = mysqli_query($conn, "SELECT * FROM employers WHERE username='$username' AND password='$password'");

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

    @alexalexes
    Припаркую свой велосипед.
    $input = 'Привет мир!';
    $input_len = mb_strlen($input);
    $output = join('', array_map(function($index, $char) use ($input_len)
                                 {
                                 	return $index > 1 && $index + 1 < $input_len ? '*' : $char;
                                 }, array_keys(mb_str_split($input)), mb_str_split($input)
                                )
                  );
    echo $output;
    Ответ написан
  • Как нанести одно изображение на другое?

    @alexalexes
    выдает только фон

    $image = imagecreatefromjpeg('/banner/png');
    Символ около расширения файла не смущает? И расширение png для метода *jpeg?
    PS: если вы var_dump-ните $image, то обнаружите false - значит, что-то с путем к файлу или его отсутствие.
    Ответ написан
    Комментировать
  • Как оптимизировать код php во избежании дублирования, при добавление данных в БД?

    @alexalexes
    Вам нужно проработать архитектуру таблиц.
    Чтобы удобно хранить свойства ads и serp в одной таблице, которые представленные в виде массива. Вам нужно не только выделить тип записи - ads или serp, но нужно как-то связать все записи, которые входят в одно событие свойства p1.
    Допустим, для событий мы создаем таблицу Event со свойствами:
    Event_Id - код события,
    info - строка или JSON-тип,
    success - число,
    query - строка или JSON-тип,
    total_count - число
    ...
    Не все свойства p1 перечисляю, так как, например, paa - тоже массив, и нужно понять, будете ли под него выделять отдельную таблицу или приспособите какую-нибудь существующую, добавив новый тип - paa.
    -----
    А для хранения элементов массивов ads, serp (и, возможно еще каких-либо свойств-массивов, которые появятся непосредственно в p1 не во вложенных свойствах) вы создадите отдельную таблицу event_prop_array:
    prop_arr_Id - код элемента свойства события
    prop_id - тип свойства из таблицы-справочника типов свойств (внешний ключ)
    event_id - событие, к которому относится запись, внешний ключ к таблице event
    link - строка
    snippet - строка
    ...
    дальше идут другие скалярные свойства, которые можно найти в одном элементе ads или serp
    ------
    Добавляем таблицу справочник, чтобы закодировать внешний ключ prop_id
    Таблица event_prop
    prop_id - код свойства
    prop_name - имя свойства
    ----------------------------
    Теперь, чтобы залогировать один элемент p1 нужно сделать так:
    1. Вставить в таблицу event запись из простых свойств (info, success, query, total_count, ... )
    2. Получить event_id вставленной записи (гуглите last_insert_id для PDO или дополнительную клаузу для insert - "returning event_id into :event_id", если вы используете, например, oracle, а не mySQL)
    3. Получить prop_id из справочника (тут обычный select)
    4. В цикле вставляете записи в таблицу event_prop_array, используя известные event_id, prop_id и текущие свойства элемента ads.
    5. Тоже самое как 4, но используете свойства serp.
    -------------------
    Когда сформируете лог в базе, то типичный запрос для выборки чего-либо будет иметь вид:
    select e.*, ep.*, epa.*
    from event_prop_array epa
    join event_prop ep on ep.prop_id = epa.prop_id
    join event e on e.event_id = epa.event_id
    -- какие-то условия для поиска
    where e.event_id = 1
     and ep.prop_name = 'ads'
    Ответ написан
    Комментировать
  • Как отрисовать страницу при асинхронном POST запросе?

    @alexalexes
    Если у вас строго режим одностраничного сайта, то да, сами перелицовываете body в любой непонятной ситуации (на самом деле для такой модели подбирают подходящий клиентский фреймворк. сами вы вряд ли охватите все обработчики событий, чтобы не заботится об реактивности блоков всей страницы). При этом нужно не забывать вести url history, чтобы адрес страницы фиктивно изменялся, следуя логике посещения виртуально нарисованных разделов сайта.
    Или же у вас не строго одностраничный сайт, то...
    Если у вас только некоторые контейнеры на странице обновляют сведения по ajax, то на какие-то действия нужно вызывать перезагрузку страницы, изменяя windows.location.href / windows.location.reload.
    Ответ написан
    Комментировать
  • Как выбрать значения из БД по JSON?

    @alexalexes
    Если СУБД поддерживает тип данных JSON, а вы хотите сравнивать JSON тело как строку, то приведите содержимое из JSON в строку.
    SELECT * FROM tavle
     WHERE JSON_EXTRACT(json, '$') = jsons; -- атрибут json относится к таблице tavle, а jsons - плейсхолдер, куда вы подставляете строку, по которой будете искать тело?
    -- JSON_EXTRACT(атрибут_типа_JSON, '$') - это выражение конвертирует JSON в строку, аналогично как в JS будет JSON.stringify(объект_с_данными).
    Ответ написан
    2 комментария
  • Как исправить кракозябры вместо кириллических символов?

    @alexalexes
    Посмотрите в отладчике браузера (вкладка Сеть), какие заголовки возвращаются с ответом сервера.
    Если там заголовок с кодировкой отличен от utf-8, то сервер по умолчанию ее не использует.
    Либо нужно php.ini исправлять, либо в скрипте отдавать нужный заголовок:
    header('Content-Type: text/html; charset=utf-8');
    То, что вы в HTML указали:
    <meta charset="utf-8">
    Не дает никаких указаний серверу, в какой кодировке отдавать ответ.
    Ответ написан
    Комментировать
  • Как сделать регулярное выражение?

    @alexalexes
    // шаблон в формуле
    $pattern = '[string] * [string] * 0.2';
    // определяем число плейсхолдеров - подстановочных мест для параметров
    $placeholder_count = substr_count($pattern, '[string]');
    $input_params = []; // массив входных параметров
    // заполняем массив входных параметров по кол-ву подстановочных мест
    for($i = 0; $i < $placeholder_count; $i++)
    {
      // имитация процесса получения входных параметров из другого источника
      $input_params[] = floatval('1.32453' + $i);
      // если параметры получают в виде строковых значений,
      // то их нужно обязательно пропускать через функции floatval или intval,
      // чтобы экранировать значения и недопустить попадания в шаблон чего-то,
      // кроме целых или вещественных чисел
    }
    // создаем выходной шаблон для подстановки параметров
    $out_pattern = $pattern;
    // производим подстановку параметров из массива
    for($i = 0; $i < $placeholder_count; $i++)
    {
      $out_pattern = str_replace('[string]', $input_params[$i], $out_pattern);  
    }
    // выполняем выходной шаблон как строку кода PHP.
    // Результат выполнения спроецируется в переменную $exec_result
    eval('$exec_result = '.$out_pattern.';');
    // смотрим пошагово, что происходит
    echo 'pattern: '.$pattern."\n";
    echo 'placeholder_count: '.$placeholder_count."\n";
    echo 'input_params: '.print_r($input_params, true)."\n";
    echo 'out_pattern: '.$out_pattern."\n";
    echo 'exec_result: '.$exec_result."\n";
    Ответ написан
    Комментировать