Ответы пользователя по тегу PHP
  • Как сохранить сформированный через 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";
    Ответ написан
    Комментировать
  • Как отправить данные с формы $_POST на разные страницы в зависимости от нажатой кнопки (перенаправление)?

    @alexalexes
    Button может отправлять форму с иными атрибутами, если их переопределить в button, например, можно задать другой action.
    <form name="MyForm" method="post" >
        <label for="select-option">Select an option:</label>
        <select name="select-option" id="select-option">
            <option value="option1">Option 1</option>
            <option value="option2">Option 2</option>
            <option value="option3">Option 3</option>
        </select>
        <br>
        <button formaction="/termin" type="submit">termin</button>
        <button formaction="/info" type="submit">termin</button>
    </form>

    Тогда не нужен никакой роутер на стороне сервера для текущей страницы.
    Ответ написан
    6 комментариев
  • Как сделать табы с выводом из бд?

    @alexalexes
    Выводить также как из любого другого источника данных.
    1. Подготовьте источник данных.
    - Разверните службу СУБД в операционной системе сервера.
    - Выберите менеджер, чем вам будет удобно просматривать объекты СУБД.
    - Установите менеджер СУБД.
    - При помощи менеджера СУБД заведите пользователя базы данных, схему базы данных, структуру таблиц и связей, вставьте необходимые данные.
    2. Изучите способы подключения к источнику данных и взаимодействия из PHP (как делать коннект к СУБД, как подготавливать запросы и параметры к ним, как фетчить результат выборки запроса).
    3. Подключитесь к базе, выполните запрос, встройте выборку результата в ваш шаблон HTML (табы).
    Ответ написан
    3 комментария
  • Как сделать проверку на значения в переменной?

    @alexalexes
    Вариант 1. Если надо проверить одно единственное булево выражение и что-то вывести, не отходя от склейки строки:
    td>".($row["ID_EMPLOYEE"] ==1 ? "первое значение" : "второе значение")." </td>

    Вариант 2. Когда у вас возможна более толстая логика вывода в каждой ветке if:
    echo 'Перед if прекращаем шлепать HTML закрывающейся кавычкой и точкой запятой';
    if(условие)
    {
      echo 'Шлепаем HTML по истине if-а';
    }
    else
    {
      echo 'Шлепаем HTML по ИНАЧЕ';
    }
    echo 'Продолжаем шлепать HTML';
    Ответ написан
    8 комментариев
  • Какой тип должна возвразать функция при скачивании файла?

    @alexalexes
    Если возвращается идентификатор файла - тип integer.
    Если возвращается полный путь к файлу или его url - тип string.
    Если возвращаются бинарные данные содержимого файла - тип string.
    Если возвращаются raw данные из буфера ob_* вместе с http заголовками и телом файла - тип string.
    Если файл открыт файловой функцией и берется ее указатель - смотрите какой тип возвращает эта функция для указателя.
    Ответ написан
    2 комментария
  • Как хранить массив внутри value каждой опции выпадающего списка selectize?

    @alexalexes
    Если переводить массив в JSON то там тоже будут кавычки и это возможно может сломать html.

    Если вы не самописной функцией создаете строку JSON, то в функции-энкодере json_encode уже есть механизмы экранирования, чтобы ваши данные не сбежали за пределы закодированного строкой значения в JSON. (речь идет пока об абстракции JSON, принятые меры экранирования для этого уровня экранирования html не касаются!)

    Каждой опции соответствует свой массив данных, которые я планирую записать в значение value в этой форме html.

    Если вы самописно генерируете html элемент и записываете свойства атрибута элемента, то вы сами должны позаботиться об экранировании на уровне этой абстракции. В php для генерации безопасной строки для подстановки в html существуют функции htmlspecialchars и htmlentities, только настройте их, какие кавычки нужно экранировать.
    Ответ написан
    Комментировать
  • Можно ли присвоить имя файла функции, которая в нём находится?

    @alexalexes
    Понимаю, хотите изобрести свой composer.
    $func_file_full_path = ''; // полный путь к файлу модуля с функцией
      require_once ($func_file_full_path);
      $func_name = basename($func_file_full_path,  '.php');
    
      $funct_name($func_arg1, $func_arg2....); // если попытаться вызвать переменную как функцию, то интерпретатор PHP попытается обратиться к глобальной функции по имени что содержится в этой переменной в виде строки.
      
      call_user_func($funct_name, $func_arg1, $func_arg2....); // то же самое, но в более классическом виде
    Ответ написан
    3 комментария
  • Как в php заполнить автоматически массив данными?

    @alexalexes
    $out_arr = [];
    // Тут нужно указать параметры каждого N - места в шаблоне
    $i_min = 1; $i_max = 9;
    $j_min = 1; $j_max = 9;
    $k_min = 1; $k_max = 9;
    for($i=$i_min; $i <= $i_max; $i++)
    {
      for($j=$j_min; $j <= $j_max; $j++)
      {
        for($k=$k_min; $k <= $k_max; $k++)
        {
           $out_arr[] = "ваш".$i."шаблон".$j."строки".$k;
        }
      }
    }
    var_dump($out_arr);
    Ответ написан
    Комментировать
  • Как получить timestamp,обрезав пустое время?

    @alexalexes
    komino, это проблема разработчика, а не конфига драйвера СУБД, как он будет интерпретировать значение даты в конкретном запросе, если ему не подходит статичный шаблон nls_date_format. Такой шаблон не имеет в себе лексического интерпретатора, способного выполнять условные операторы.
    Решение:
    select
    -- вариант 1
    to_char(sysdate, 'DD.MM.YYYY' || decode(sysdate - trunc(sysdate), 0, '', ' HH24:MI:SS')) as your_format_date_1, 
    -- вариант 2
    case
      when sysdate - trunc(sysdate) > 0
      then to_char(sysdate, 'DD.MM.YYYY HH24:MI:SS')
      else to_char(sysdate, 'DD.MM.YYYY')
    end as your_format_date_2
    from dual;
    Ответ написан