Ответы пользователя по тегу PHP
  • Как отфильтровать массив php через foreach?

    @alexalexes
    Вы еще извращеннее вывод могли придумать, чтобы избегать накопления вывода в отдельной переменной, чтобы код был максимально неподдерживаемый для разработки?
    Вот решение:
    <?foreach ($arResult["PARTNERS"] as $partners) {if($partners['NAME']=='test')continue;?>
    Ответ написан
    1 комментарий
  • Как пересобрать массив с элементами?

    @alexalexes
    Если вы видите, что пишите один и тот же код повторно, значит, пора общую часть кода выносить в функцию или метод. И эта ситуация может случиться не обязательно в модуле валидации.
    Пишите базовые функции:
    а) проверка обычной строки на минимум и максимум по длине;
    б) проверка радиокнопки;
    в) проверка чекбокса;
    г) выпадающего списка.
    Все остальные функции будут вызывать что-то из этого базиса и допроверять свойства поля, например, email вы проверяете функцией А на корректность длины, а потом валидность по регулярке. Если длина не та, то предупреждения выведете из функции А, а регулярку не станете проверять, а если косячит по регулярке, то уже будет предупреждение, что email некорректен.
    Ответ написан
    1 комментарий
  • При выборке двух таблиц с БД одним запросом, на выводе получаются дубликаты. В чем может быть проблема?

    @alexalexes
    Если просто нужен флаг, что товар в корзине, то достаточно этого запроса.
    SELECT p.*,
                case
                   when exists(SELECT 1 from cart c where c.products_id = p.id)
                   then 1
                   else 0
                end is_exists_in_cart -- есть товар к корзине? 0 - нет, 1 - есть
    FROM table_products p

    Если нужны параметры товара, а не только его наличие, то как минимум будет такая конструкция:
    SELECT p.*, c.*
    FROM table_products p
    left join cart c on c.products_id = p.id

    PS: Конструкция запроса может сильно меняться от того, какие свойства вам нужно извлечь, чтобы вывести в итоговую выборку.
    Ответ написан
    Комментировать
  • Почему так рано удаляется временный файл?

    @alexalexes
    public function  getTemplatePath(где аргумент $template?)
    Ответ написан
  • Как сгенерировать datetime?

    @alexalexes
    Приводите склеенную строку $date_time.$time и параметр функции STR_TO_DATE к одинаковому формату времени.
    Делаете с помощью bind_param функций привязку склеенной строки на месте знака вопроса.
    insert into your_table (your_field)
    values (  STR_TO_DATE(?, '%d.%m.%Y %h:%i')  )

    Выполняете этот запрос, он вставит в таблице your_table свойство your_field в формате datetime.
    Дополнено:
    $sth = $dbh->prepare("insert into your_table (your_field)
    values (  STR_TO_DATE(:your_datetime_string, '%d.%m.%Y %h:%i')  )");
    $sth->bindParam(':your_datetime_string', $date_time.' '.$time, PDO::PARAM_STR);
    $sth->execute();

    Ссылку на подключение к базе $dbh подготавливаете согласно PDO.
    Ответ написан
  • Как заменить ASCII символ?

    @alexalexes
    Можно, используйте функцию rawurlencode для получения валидного url.
    Ответ написан
  • Вытащить из json значение?

    @alexalexes
    Проблема обойти невалидное название свойства (так как используется дефис).
    Используем магию именования свойства класса через переменную.
    $recaptcha_property_name = 'error-codes';
    echo $recaptcha->$recaptcha_property_name[0];
    Ответ написан
    2 комментария
  • Как получить товары сразу из нескольких категорий?

    @alexalexes
    А в чем сложность?
    Берем таблицу товаров (goods), подключаем таблицу категорий (category), по parent_id получаем товары одной категории родителя.
    select distinct g.*
    from goods g
    join category c on c.id = g.category_id  
                            and c.parent_id = 34

    Если у вас товары входят в несколько категорий, то наверняка, есть промежуточная таблица связей "многие ко многим", то запрос будет примерно такой:
    select distinct g.*
    from goods g
    join good_category_hold gch on g.id = gch.good_id
    join category c on c.id = gch.category_id
                                    and c.parent_id = 34
    Ответ написан
    3 комментария
  • Выборка из массива по значению?

    @alexalexes
    Фильтруете массив:
    $selected_items = array_filter($inp_array, function($item){return $item['status'] == 0;});
    Ответ написан
    Комментировать
  • Как генерировать и выдавать ссылку на скачивание по хешу?

    @alexalexes
    Ведете таблицу в базе данных site_files, в которых как минимум присутствуют поля:
    file_id - идентификатор файла (первичный ключ);
    file_path - путь к файлу на сервере;
    hash - хэш файла (от содержимого или случайная последовательность символов).
    При необходимости можете хранить оригинальное имя файла, расширение, размер, дату создания и т.д.
    Во время вставки файла на сервер, записываете сведения о нем в эту таблицу.
    Делаете скрипт отдачи, доступный по адресу: site.ru/file_download или по параметру action=get_file
    site.ru/?action=get_file&hash=18972198231
    В этом скрипте определяете, что сведения о файле нужно искать по хэшу.
    По хэшу находите file_path и отдаете по нему содержимое файла клиенту.
    Ответ написан
    Комментировать
  • Parse error: syntax error, unexpected '[' in?

    @alexalexes
    какая версия php?
    Если выше 5.6, то синтаксис массива [] допустим, если ниже, то только array().
    Ответ написан
    1 комментарий
  • Как перехватить защищенный JS?

    @alexalexes
    Вам поможет среда PhantomJS.
    https://github.com/diggin/php-PhantomjsRunner
    В ней подожгете событие на нужной кнопке, подождете чуть-чуть и выцепите ссылку.
    Ответ написан
  • Как из многомерного массива вывести не все элементы, а только, допустим, имена?

    @alexalexes
    Скорее всего $massiv - это индексный массив, и имена находятся по индексу 1 (вторые).
    foreach ($model as $massiv)
            {
                    echo  $massiv[1] . "<br>";              
            }

    Если в массиве индексы пропущены, то вам нужно переиндексровать этот массив, и тогда точно получите результат по индексу 1.
    foreach ($model as $massiv)
            {
            $massiv_new = array_values($massiv);               
        echo   $massiv_new [1] . "<br>";              
            }
    Ответ написан
    Комментировать
  • Почему возвращается ошибка Fatal error: Function name must be a string in?

    @alexalexes
    Либо у вас сервер PHP ниже версии 5.3.0 (не позволяет использовать магический метод __invoke).
    Либо попробуйте $this добавить в замыкание (где use).
    return $current($context, function ($context) use ($this, $next) {
                return $this($context, $next);
    Ответ написан
  • Ошибка при направлении на другую страницу?

    @alexalexes
    Если хотите работать с заголовками, то размещать голый html с включениями php кода нельзя, будет засоряться лог предупреждениями.
    При исполнении php файла в начале он должен молчать как рыба, если логика работы предусматривает выбор - работать сначала с заголовками, а потом выводить контент, или просто выводить контент (через print, echo и т.д.).
    То есть, заголовки должны срабатывать первыми, любое echo между выполнением header() будет нарушать порядок.
    Ответ написан
    Комментировать
  • Как вывести не id элемента, а слово, которое к нему привязано?

    @alexalexes
    После этой строчки:
    $countryN->execute([':id' => $countries_id]);
    ... вам нужно применить один из методов:
    $rows = $countryN->fetchAll();
    var_dump($rows);

    или
    $row = $countryN->fetch();
    var_dump($row);

    Почитать тут и тут.
    Вкратце, работа с базой идет по таким этапам:
    1) Подключение к БД (хост, логин пароль и тд)
    1.1) Обработка ошибок подключения
    2) Передача параметров кодировки, форматов даты/время, локали и тд
    3) Подготовка запроса (prepare функция)
    3.1) Обработка синтаксических ошибок текста запроса.
    4) Подготовка входных и выходных параметров запроса (bind функция)
    4.1) Обработка ошибок параметров (результат возврата значения bind функции).
    5) Выполнение (execute функция).
    5.1) Обработка ошибок выполнения (обычно, смотрят состояние возврата значения execute функции).
    6) Выборка результата (фетчинг, используем fetch-функции).
    *) https://www.php.net/manual/ru/pdo.errorinfo.php получение состояния ошибки на любом этапе.
    Ответ написан
    Комментировать
  • Как сделать рандом с процентами?

    @alexalexes
    Возьмите интервал генерации случайных чисел (от 0 до 99) и раскидайте сгенерированные числа по эквивалентным интервалам (0...69, 70...89, 90...99) - если число попало в опред. интервал, значит ширина интервала будет вероятностью попадания в него этого числа.
    $rnd_number = rand(0, 99);
    switch(true)
    {
      case $rnd_number < 70: 
       echo "One";
        break;
     case $rnd_number >= 70 && $rnd_number < 90:
        echo "Two";
        break;
     case $rnd_number  >= 90:
        echo "Three";
        break;
    }

    Чтобы в этом убедиться, повторите эксперимент, например, 1000 раз:
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
      $rnd_number = rand(0, 99);
      switch(true)
      {
        case $rnd_number < 70: 
         $counter["One"]++;
          break;
       case $rnd_number >= 70 && $rnd_number < 90:
          $counter["Two"]++;
          break;
       case $rnd_number  >= 90:
          $counter["Three"]++;
          break;
      }
    }
    var_dump($counter);

    Если хотите эксплуатировать именно функцию array_rand(), то ей нужно предоставить такой массив:
    $block_array = array('One','One','One','One','One','One','One','Two','Two','Three');
    $counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
    for($i = 0; $i < 1000; $i++)
    {
     $gen_value = array_rand($block_array);
     $counter[$gen_value]++;  
    }
    var_dump($counter);

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

    @alexalexes
    Подключите в отдельном php файле модуль include "includes/setmailer.php";
    и попробуйте себе что-нибудь отправить, отдельно от бизнес-логики оплаты.
    PS: Возможно, придется исправить конфиг этого модуля по части smtp протокола.
    PPS: У хостинга, от куда вы отправляете письмо, могут быть особенности с работой smtp - уточняйте.
    Ответ написан
    4 комментария
  • Как получить вложенные изображения при отправке формы?

    @alexalexes
    Ваша форма должна как-то сообщить серверу, что пользователь удалил файлы.
    Например, в скрытых input полях (у которых type="hidden") держать перечень метаданных (id или имя файла) удаленных файлов, которые были загружены на сервер ранее. При отправке формы, сравнивать список удаленных файлов и имеющихся файлов.
    Если форма не отправляется целиком в привычном понимании, то при помощи аякс-запросов при клике на удалить сообщать серверу, что именно удалили.
    Ответ написан
  • Почему в PHP zlib не работает во врапперах?

    @alexalexes
    Попробуйте одинарные кавычки вместо двойных.
    'php://filter/read=convert.base64-decode|zlib.inflate/resource='.$sourceFile

    PS:
    Нашел вот такой комментарий на Хакере.
    https://xakep.ru/2012/11/22/php-filter-wrapper-attacks/
    При всех выгодах данный метод уничтожения стопперов не может быть универсальным. В 2009 году было замечено, что функция base64_decode некорректно обрабатывает строки, содержащие в середине знаки равенства [#47174]. Этот баг был довольно оперативно исправлен для функции base64_decode, но для фильтра convert.base64-decode никаких исправлений сделано не было. Поэтому, если при «выдавливании» на каком-то шаге получаются данные, содержащие знак равенства, дальнейшее применение фильтра convert.base64-decode уничтожит преобразуемую строку.

    $s = 'php://filter/read=convert.base64-decode/resource=data:,dGVzdA==CRAP'; 
    var_dump(file_get_contents($s)); // print: string(0) ""

    Ответ написан