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

    @alexalexes
    https://www.php.net/manual/ru/function.mail.php
    Читайте документацию:
    Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
    Ответ написан
    Комментировать
  • Как найти обьект без ключа JSON decode PHP?

    @alexalexes
    Пересоберите массив пользователей:
    $out_users = [];
    foreach($array_decode['response'] as $user)
      $out_users[$user['id']]['user'] = $user['user'];

    Тогда сможете обращаться как хотели:
    $out_users[идентф_ключа]['user'];
    PS: Вариант пересборки, если вас куча пользователей и вы ограничены по оперативной памяти скрипта:
    $out_users = [];
    foreach($array_decode['response'] as &$user) // обратите внимание на доступ по ссылке & к элементу массива
    {
      $out_users[$user['id']]['user'] = $user['user'];
      unset($user); //удаляем элемент из массива $array_decode['response'], чтобы не росло использование памяти.
    }
    Ответ написан
    1 комментарий
  • Как заменить на дефисы все его аналоги?

    @alexalexes
    Можно определиться, какие символы у вас встречаются в подавляющем большинстве, и пропустить каждый из них через replace.
    update your_table set name = replace(name, '_', '-')

    Только смотрите внимательно, в какой кодировке подготавливаете и выполняете запрос, иначе искомый символ исказится и вы замените что-то другое.
    Ответ написан
    Комментировать
  • Почему слетела кодировка и как всё исправить?

    @alexalexes
    Укажите перед выводом данных в php, в какой кодировке собираетесь его делать.
    header('Content-Type: text/html; charset=utf8', true);
    Ответ написан
  • Как перевести пароли с md5 на bcrypt?

    @alexalexes
    Сморите по регламенту сайта, каков официальный срок действия пароля (если нет такого, то определяетесь с этим).
    1. Создаете в базе новое поле под bcrypt пароль, а также дату смены пароля.
    2. Делаете авторизацию использующую как md5, так и bcrypt если последняя задана.
    3. Разрабатываете систему оповещения для пользователей, у которых истек срок действия пароля.
    4. Ставите дату пароля такой же как и дату регистрации пользователя, если не использовали это раньше.
    5. При смене пароля пишете только bcrypt, md5 не используете, лучше сделать поле-флаг, что пользователь менял пароль уже по новой технологии.
    В течение пару периодов срока действия пароля будет постепенный переход на новый хэш.
    Активных пользователей придется как-то стимулировать, чтобы сменили пароль.
    Неактивные будут восстанавливать пароль, например, по email, если они вернутся на ваш ресурс и вы решите когда-нибудь больше не поддерживать md5 хэш.
    PS: Принудительно заставлять менять пароль пользователю - это не самый оптимальный вариант. Заменяйте хэш пароля по новому алгоритму, как только получили от пользователя исходный пароль, который валиден по старому алгоритму, например, в процессе авторизации.
    Ответ написан
    8 комментариев
  • Как отправить PDF файл по API?

    @alexalexes
    Обрабатывать пришедшие данные налету или перезаписывать в файлы?
    Зависит от того, хватает ли выделенной оперативной памяти PHP скрипту если попытаться сформировать тело $xml_post_string с бинарником. Если размер файлов, перекодированных в base64 в большинстве случаев заведомо меньше чем возможности ОЗУ скрипта, то смело можете налету обрабатывать.
    Если нет, то принимаете все меры предосторожности, чтобы скрипт не хапнул лишних данных, вызывая переполнение выделенной ОЗУ, (если такая ситуация случится, то скрипт умрет молча, не выдав исключение). Записываете временный файл из $_FILES, порционно формируете другой временный файл с форматом $xml_post_string. Потом присоединяете данные этого файла к curl и отправляете.
    Ответ написан
    Комментировать
  • Как отфильтровать массив 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);
    Ответ написан