Ответы пользователя по тегу PHP
  • Ошибка при направлении на другую страницу?

    @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) ""

    Ответ написан
  • Переход сайта с http на https. Почему не работает getimagesize() по пути //site.ru?

    @alexalexes
    На стороне сервера нужно выявить места, где идет обращение к файлам сервера, где пути к файлам это не url в представлении клиента (браузера), а путь внутри файловой системы сервера, и переписать соответствие url и filepath.
    В вашем случае путь в файловой системе может выглядеть так:
    htdocs/TmpGif/tr_87754306592959_133380.gif
    Ответ написан
  • Как вывести данные в loadTpl?

    @alexalexes
    Скорее всего вызов шаблона при переборе строк будет такой:
    while ($news = $NewsQuery->fetch())
    {
       $lastNewsList .= loadTpl("/last_news/news.html", 
    [
      "created_at" => $news['created_at'],
      "title" => $news['title'],
      "content" => $news['content']
    ]);
    }

    ... или даже еще проще:
    while ($news = $NewsQuery->fetch())
    {
       $lastNewsList .= loadTpl("/last_news/news.html",  $news);
    }

    Как поведет себя шаблон в этой строчке -
    $pageData['lastNews'] = loadTpl("/last_news/parent.html", $data);

    Без кода parent.html - не ясно.
    Как обрабатывается $pageData при наличии ключа 'lastNews', тоже нужно поинтересоваться, а надо ли намерено где-то еще указывать 'lastNews', чтобы отрисовать этот контент.
    Ответ написан
  • Как разделить число на 100 и прибавить получившейся результат к сумме которую делим?

    @alexalexes
    Если округлять центы в пользу пользователя, то:
    UPDATE dle_users
    SET user_balance = user_balance + round(user_balance / 100.0, 2)

    Если округлять центы в пользу системы, то:
    UPDATE dle_users
    SET user_balance = user_balance + ceil(user_balance / 100.0 * 100) / 100.0
                                                                    ^       ^
                                              корректировка ceil по 2 знакам после запятой
    Ответ написан
    1 комментарий
  • Как реализовать создание файла xls на сайте из php sql запроса?

    @alexalexes
    Это называется кэширование файлов.
    Вы привели только заголовок, какой тип контента отдает скрипт.
    Типичный не оптимизированный скрипт (его поведение) под отдачу файла.
    // Запрос к БД, получающий ресурсы для формирования файла
    // Заголовком сообщаем имя файла клиенту
    // Формируем / получаем тело файла
    echo /*отдаем переменную с телом файла*/;

    Оптимизированное под кэширование поведение скрипта:
    // Запрос к БД на время обновления ресурсов из чего собирать файл
    // Получаем время изменения файла в каталоге files
    // Если файл не старее чем сведения в БД то формируем тело из него.
    // Если файл старее чем сведения в БД на установленную константу времени жизни кэша, то получаем новое тело файла и обновляем файл кэша.
    // Заголовком сообщаем имя файла клиенту
    echo /*отдаем переменную с телом файла*/;
    Ответ написан
    Комментировать
  • OpenWRT+PHP7 "Ошибка Call to undefined function mysqli_connect()" не понимаю что делать?

    @alexalexes
    Поиск по OpenWRT ресурсам говорит, что, возможно, проблема в конкретной сборке OpenWRT.
    Попробуйте воспользоваться советом:
    Try this. Check /etc/php7/

    Rename 20_mysqli.ini to 30_mysqli.ini, or delete 20_mysqli.ini if both exist. If you also have 20_openssl.ini there, rename that to 10_openssl.ini.
    Above change is needed to load the modules in the correct order.
    This should now be fixed in the latest builds, but you could be running older code, or suffering from the bug that was there earlier.
    Ответ написан
    1 комментарий
  • Зачем присваивать переменной результат readdir()?

    @alexalexes
    Функция readdir(), как правило, используется вместе с while.
    За один цикл нужно только один раз вызвать readdir, чтобы можно было поработать с дескриптором элемента каталога, не перейдя на другой элемент, поэтому появится такая неуклюжесть :
    while(true)
    {
      $f = readdir($d);
      if($f === fasle)
      {  break; }
      // Сделать что-то с $f в противном случае.
    }

    А если писать присваивание в одну строчку, там же, где хотим выйти из цикла, то получается очень компактно.
    Возможно, стиль кода по while плавно перешел в if.
    Ответ написан
    Комментировать
  • Как подключить на одной странице к одному phpmailer-файлу две формы?

    @alexalexes
    Можно. Самое главное, мы не подключаем php-скрипт, а отправляем данные этих форм на обработку этим php-скриптом. Так проще прийти к пониманию, как оно работает.
    Чтобы php-скрипт мог воспринимать данные первой формы, он должен уметь пренебрегать наличием параметра user_car.
    А делается это таким образом:
    строчка:
    $car = $_POST['user_car'];
    исправляется на:
    $car = array_key_exists('user_car', $_POST) ? $_POST['user_car'] : null;

    и другая строчка:
    $mail->Body    = '' .$name . ' хочет перегнать машину ' .$car. '  из ' .$from. ' в ' .$to. '. <br> Вот его номер телефона ' .$phone;

    исправляется на:
    $mail->Body    = $name . ' хочет перегнать '.(is_null($car) ? 'неуточненную машину' : 'машину ' .$car). '  из ' .$from. ' в ' .$to. '. <br> Вот его номер телефона ' .$phone;

    PS:
    Чтобы вам не прислали js-инъекцию на почту, все принимаемые параметры, из которых формируется текст письма, следует экранировать.
    $name = htmlspecialchars($_POST['user_name']);
    $phone = htmlspecialchars($_POST['user_phone']);
    $car = array_key_exists('user_car', $_POST) ?  htmlspecialchars($_POST['user_car']) : null;
    $from = htmlspecialchars($_POST['from']);
    $to = htmlspecialchars($_POST['to']);
    Ответ написан
    Комментировать
  • Несколько массивов вместо одного?

    @alexalexes
    $description1[] = array([..................])
    Обратите внимание сколько раз тут объявлен массив в массиве.
    array([]) - это аналогично [[]] или array(array())
    PS: Для того, чтобы не путаться впредь, перестаньте использовать один из способов.
    Либо array() если у вас php 5.6-
    либо [] если php 5.6+ (это предпочтительней - стильно, модно молодежно, похож на JS)
    Ответ написан
  • Как определить переменную в зависимости от размера картинки?

    @alexalexes
    Определяете с помощью метрики - пропорции:
    $p = $imgwidth * 1.0 / $imgheight; // пропорция; умножение на 1.0 чтобы перевести число в float;
    $delta_q = 0.1; // Дельта ощущения "квадратности" изображения
    switch(true)
    {
      case $p > (1.0 +  $delta_q): echo 'альбомный формат изображения'; break;
      case $p < (1.0 - $delta_q): echo 'книжный формат изображения'; break;
      default: echo 'изображение, вероятно, квадратное'; 
    }

    Когда у вас пропорция $p == 1.0 , то изображение строго квадратное.
    Чтобы избавиться от строгости, вводится дельта $delta_q, дабы считать квадратными изображения, в пропорции "слегка" меньше единицы и "слегка" больше единицы.
    Ответ написан
    Комментировать
  • Учить PHP 5 или 7?

    @alexalexes
    Пока не появится реальная задача - вообще бесполезное метание.
    Читать про то и про другое, потом что-то пытаться накодить.
    Однако, по-настоящему вы освоите ту или иную версию, когда будете работать над реальным серверным приложением/сайтом.
    Ответ написан
    Комментировать
  • Почему не работают функции mb_convert_encoding() и iconv()?

    @alexalexes
    Страница-источник на самом деле в кодировке utf8 отдается, а не в windows-1251, как это указано в html.
    Конвертировать не нужно, если вам нужен utf8 на выходе:
    header('Content-type: text/html; charset=utf8');
      echo file_get_contents('http://antiko22.info/vse_novosti/dolg-pered-mfo-ne-mozhet-prevyshat-telo-zajma-bolee-chem-v-3-raza/');
    Ответ написан
  • Как правильно вывести записи из бд(MySql,PHP)?

    @alexalexes
    Накопите промежуточные строки в $out_arr, соедините элементы массива через разделитель join-ом и подайте на вывод.
    $out_arr = array(); 
    while($hero2 = mysqli_fetch_assoc($hero1))
        {
         
    $time_now = strtotime($hero2['cron1']);
    $time_need = strtotime($hero2['cron2']);
    if($time_need>=$time_now ){
    $t_s= date("H:i ",75600-($time_need-$time_now));
    }
    else
    $t_s= date("H:i ",75600-($time_now-$time_need));
           $out_arr[] = str_replace(":",".",$t_s);
     }
    echo "[".join(' ,',  $out_arr).']';
    Ответ написан
    Комментировать
  • Как заменить специальные символы & quot;?

    @alexalexes
    Если не хотите заморачиваться с регулярными выражениями, то достаточно функции замены строк.
    $result = str_replace(array('amp;', '&', 'quot;'), '',  'Ремень HENDERSON &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot; "2 в 1&am');

    PS: Только определитесь в том, что у вас могут быть сущности в строковом представлении или в кодах символах, от этого зависит нужно ли конвертировать коды символов в html-сущности и обратно в первом аргументе функции.
    Ответ написан
    Комментировать
  • Как сделать корректный вывод json?

    @alexalexes
    Вы вот это:
    array(
                        'id' => $banner->id,
                        'url' => $banner->url,
                        'name' => $banner->name,
                        'image' => $banner->image
                    );

    Вкладываете в $this->data по ключу $key, отсюда следует, что $this->data - это массив, поэтому он декодится в скобочках [].
    Ответ написан
    Комментировать