Задать вопрос
Ответы пользователя по тегу PHP
  • Почему не отправляется сообщение через curl когда при вставке итогового запроса в браузер - всё работает?

    @alexalexes
    1) Включить вывод ошибок php на любую непонятную ситуацию:
    // в начале php файла указывается
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    2) Смотрите, что возвращает curl, и по ошибкам тоже:
    $result = curl_exec($ch);
    if($result === false)
    {
        echo 'Ошибка curl: ' . curl_error($ch);
    }
    else
    {
        var_dump($result);
    }

    3) Не светите данными авторизации в своих вопросах, особенно, всякими токенами доступа.
    ПС: curl_error.
    Ответ написан
  • Как взять каждое значение массива mysqli_fetch_array и занести каждое значение в строку таблицы mySQL?

    @alexalexes
    У вас:
    while($row=mysqli_fetch_array($res))
    {  
        // #########################
        // ####  начало тела цикла  #####
        // ##########################
        $iduser=$id;
        $idkat=$row['idkat'];
         // #########################
        // ####  конец тела цикла  #####
        // ########################## 
    }  
        $res=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat) 
     VALUES(?,?)");
     mysqli_stmt_bind_param($res, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ПОСЛЕДНЕМ прогоне цикла
     $result2=mysqli_stmt_execute($res);

    Как вы ожидаете:
    while($row=mysqli_fetch_array($res))
    {  
        // #########################
        // ####  начало тела цикла  #####
        // ##########################
        $iduser=$id;
        $idkat=$row['idkat'];
        $res2=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat) 
     VALUES(?,?)");
     mysqli_stmt_bind_param($res2, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ТЕКУЩЕМ прогоне цикла
     $result2=mysqli_stmt_execute($res2);
         // #########################
        // ####  конец тела цикла  #####
        // ########################## 
    }

    PS: Есть нюанс. Обработку второго запроса нужно вести по отдельному дескриптору $res2, чтобы не поломать дескриптор $res, по которому работает while.
    Ответ написан
    Комментировать
  • Делал форму обратной связи, вроде написал все правильно, но выводит ошибку заполните все поля, хотя все заполнил. Как быть?

    @alexalexes
    <form action="send.php">
    ...
    </form>

    Вы не указали метод отправки POST, соответственно, ваши переменные формы нужно искать в методе GET.
    <form action="send.php" method="POST">
    ...
    </form>

    Чтобы убедиться в этом:
    echo "GET:";
    var_dump($_GET);
    echo "POST:";
    var_dump($_POST);
    exit();
    Ответ написан
    Комментировать
  • Как решить проблему PDOStatement::execute(): SQLSTATE[HY093]?

    @alexalexes
    Если вы вставляете в запрос список числовых параметров, то можно провернуть такое.
    $product_list = [30, 32, 38];
    $query = " `productId` in (".join(', ', array_map(function($item){return int $item;}, $product_list)).")";
    $sql = "SELECT * FROM `products` WHERE ".$query;
    // Должен получиться запрос:
    // SELECT * FROM `products` WHERE `productId` in (30, 32, 38)
    // array_map тут нужен для принудительного перевода всех значений в числовой вид, обеспечив тем самым экранирование.
    $query = $db->query($sql);
    $products_data = $query->fetchAll(\PDO::FETCH_ASSOC);

    Если применять нормальную связку параметров PDO, как должны учить в учебниках:
    $product_list = [30, 32, 38];
    $in_params = [];
    for($i = 0; $i < count($product_list), $i++)
      $in_params[':productId'.$i] = $product_list[$i];
    // получили массив: $in_params = [':productId0' => 30, ':productId1' => 32, ':productId0' => 38];
    $placeholder_string = join(', ', array_keys($in_params));
    // получили строку $placeholder_string = ":productId0, :productId1, :productId2";
    $sql = "SELECT * FROM `products` WHERE `productId` in (".$placeholder_string.")";
    // Должен получиться запрос:
    // SELECT * FROM `products` WHERE `productId` in (:productId0, :productId1, :productId2)
    $query = $db->prepare($sql);
    $query->execute($in_params); // in_params в точности в таком формате, который нужен для связки параметров productId
    $products_data = $query->fetchAll(\PDO::FETCH_ASSOC);
    Ответ написан
  • Как обработать Hex код, чтобы создать pdf файл?

    @alexalexes
    Скорее всего так:
    $content = hex2bin(str_replace(" ","", "25 50 44 46 2D 31 2E 35 0D 0A 25 B5 B5 B5 B5 0D 0A 31 20 30 20 6F 62 6A 0D 0A 3C 3C 2F 54 79 70 65 2F 43 61 74 61 6C 6F 67 2F 50 61 67 65 73 20 32 20 30 20 52 2F 4C 61 6E 67 28 72 75 2D 52 55 29 20 2F 53 74 72 75 63 74 54 72 65 65 52 6F 6F 74 20 32 32 20 30 20 52 2F 4D 61 72 6B 49 6E 66 6F 3C 3C 2F 4D 61 72 6B 65 64 20 74 72 75 65 3E 3E 3E 3E 0D 0A 65 6E 64 6F 62 6A 0D 0A 32 20 30 20 6F 62 6A 0D 0A 3C 3C 2F 54 79 70 65 2F 50 61 67 65 73 2F 43 6F 75 6E 74 20 31 2F 4B 69 64 73 5B 20 33 20 30 20 52 5D 20 3E 3E 0D 0A 65 6E 64 6F 62 6A 0D 0A 33 20 30 20 6F 62 6A 0D 0A 3C 3C 2F 54 79 70 65 2F 50 61 67 65 2F 50 61 72 65 6E 74 20 32 20 30 20 52 2F 52 65 73 6F 75 72 63 65 73 3C 3C 2F 45 78 74 47 53 74 61 74 65 3C 3C 2F 47 53 35 20 35 20 30 20 52 2F 47 53 36 20 36 20"));
    // если записать в каталог сервера, то так:
    file_put_contents("file.pdf", $content);
    // если отдать контент браузеру, то так:
    header("Content-type:application/pdf");
    header("Content-Disposition:inline;filename='file.pdf");
    echo $content;
    Ответ написан
    1 комментарий
  • Есть ли смысл делать псевдо SPA на PHP?

    @alexalexes
    Гасить стандартное действие можно у ссылок, но это не освобождает от формирования url в ссылках.
    Параметры в ссылках нужно указывать такие, чтобы оно восстанавливало состояние страницы, если попытаться перейти по ней, а псевдо переход по ссылке менял адрес страницы без фактической перезагрузки (добавлял запись в историю url).
    Ответ написан
    1 комментарий
  • Как локализовать дату регистрации пользователя wordpress?

    @alexalexes
    Тут жестко задан формат:
    echo $datetime->format('F j, Y');
    Если хотите указать более общий вид, то задайте "d.m.Y".
    Ответ написан
  • Как решать эту проблему GD?

    @alexalexes
    ЧатГПТ может сколько угодно предлагать решения на основе GD, но одних только функций GD недостаточно для определения, что на рисунке есть что-то круглое.
    Предложенное решение прокатит, если фоновая область будет идеально одного оттенка без полутонов, чтобы чувствительности заливки фона хватило пометить его как прозрачный (что метод и предлагает).
    Ответ написан
    2 комментария
  • Как решить проблему с php?

    @alexalexes
    Во-первых, нужно узнать, где находиться файл error_log, куда сервер пишет ошибки.
    Во-вторых, в любой непонятной ситуации добавляем в начале скрипта принудительное рапортование ошибок в лог и вывод их пользователю в начале скрипта:
    <?php
    error_reporting(E_ALL); // репорт ошибок в файл error_log
    ini_set('display_errors', 'On'); // вывод сообщения об ошибке

    В-третьих, не стесняемся пользоваться функцией var_dump/print_r для любых переменных, где есть сомнения, что они содержат нужные значения.
    var_dump($_POST);
    В-четвертых, при изучении любой библиотеки взаимодействия с СУБД первым делом лезем в справку и ищем, как вывести человекочитаемые ошибки. В PDO это метод errorInfo. Применяем его после любой операции с СУБД - коннектом, подготовкой запроса, выполнением запроса, выборкой результата:
    var_dump($pdo->errorInfo());
    В-пятых, в браузере F12, вкладка "Сеть". Смотрим, а на тот ли адрес идет запрос отправки формы. Изучаем HTTP заголовки, полезную нагрузку, ответ от сервера.

    Вот пример базовых навыков PHP разработчика. Без них можно даже не открывать видосики.
    Ответ написан
    2 комментария
  • Почему $_SERVER['PATH_INFO'] выводит ошибку?

    @alexalexes
    Нельзя просто так взять и обратиться к элементу массива по ключу, нужно проверить "а был ли мальчик".
    if(array_key_exists('PATH_INFO', $_SERVER)) // проверяем наличие ключа
    {
      echo $_SERVER['PATH_INFO']; // что-то делаем с элементом массива по ключу, например, печатаем.
    }
    else
    {
      // что-то делаем, когда ключа нет
    }

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

    @alexalexes
    Вы, конечно, знаете толк в извращении.
    по ключу "qwe" быстро получать "num"

    Это нужно создать индекс по колонке url. Делается одной командой. Повышает производительность также, если бы вы изобрели на коленке бинарный поиск по файлу и потратили бы несколько недель на отладку своего решения.
    Ответ написан
    Комментировать
  • Как в Drupal 10 массово проставить noindex для >1000 страниц?

    @alexalexes
    писать скрипт, который будет вытаскивать по запросу необходимые записи, далее для каждой записи разбирать сер.массив, находить нужное значение, изменять его и затем записывать новый массив с изменённым значением в БД

    Именно так. Но лучше найти вариант вытаскивать список статей с помощью объектной модели движка самой CMS, и каммитить сохранение статьи тоже методом из объекта CMS (и не забыть еще дернуть метод очистки кэша страницы, или всего сайта, или части его контекста).
    Если у вас сайт высоконагруженный, то лучше разобраться с объектами CMS. Если нет, или не охота углубляться под капот CMS, то можно самописным скриптом поправить записи в базе, и не забыть сбросить кэш уже в панели управления CMS.
    PS: С drupal не знаком, но в любой CMS проблема будет решаться именно так.
    Ответ написан
    Комментировать
  • Как переделать код php, что бы отправлялись несколько файлов?

    @alexalexes
    Форма должна накидывать файлы в name="uploaded_file[]".
    А сервер должен итерировать так:
    if (isset($_FILES["uploaded_file"]) && !empty($_FILES["uploaded_file"]["name"]) && is_array($_FILES["uploaded_file"]["name"]) && count($_FILES["uploaded_file"]["name"]) > 0)
    {
      for($i = 0; $i < count($_FILES["uploaded_file"]["name"]); $i++)
      {
        $file_name = $_FILES['uploaded_file']['name'][$i];
        $file_size = $_FILES['uploaded_file']['size'][$i];
        $file_tmp = $_FILES['uploaded_file']['tmp_name'][$i];
        $file_type = $_FILES['uploaded_file']['type'][$i];
        $file_ext = strtolower(end(explode('.', $_FILES['uploaded_file']['name'][$i])));
        ...
      }
    }
    Ответ написан
  • Как связать таблицы по одному столбцу и посчитать сумму?

    @alexalexes
    /* создание подготавливаемого запроса */
    $stmt = $mysql->prepare("select sum(c.`Price`) as price_sum
                                 from `dogovor` d
                                 join `catalog` c on c.`Id_Product` = d.`Id_Product`
                              where d.`id_client` = ?");
    /* связывание параметров с метками */
    $stmt->bind_param("i", $id_client);
    /* выполнение запроса */
    $result = $stmt->execute();
    /* выборка результатов */
    $row = $result->fetch_accos();
    if($row)
    {
      echo 'Общая стоимость всех заказов клиента: '.$row['price_sum'];
    }
    else
    {
      echo 'Запрос не дал результата!';
    }

    Ошибки в вашем решении:
    1) Небезопасная подстановка параметров в запросах. Неумение использовать в этой ситуации подготовленные запросы.
    2) Использование id_client как строкового параметра, если он состоит из цифр, то целесообразно использовать целочисленный тип в колонке таблицы.
    3) Неиспользование агрегированных функций среды sql. Зачем на php плодить лишние циклы, когда сумму можно посчитать "из коробки" средствами самой СУБД? Она под это заточена.
    4) Связывание таблиц по наименованию сущности, а не по его идентификатору. Рационально связывать по id_product вместо name_product.
    Ответ написан
    Комментировать
  • Как подсчитать и вывести количество совпадений значения в строке при запросе в MySQL?

    @alexalexes
    Если у вас MySQL 8, то дубликаты телефонов можно найти тривиально:
    select A.*
      from (SELECT `date`, `name`, phone, count() over (partition by phone) phone_count
            FROM `myusers`
    ) A
    where A.phone_count > 1
    ORDER BY date ASC

    Если MySQL 5, то придется немного по сложнее:
    select `date`, `name`, phone, p.phone_count
    from `myusers` as mu
    join (SELECT phone, count(*) phone_count
             FROM `myusers`
             group by phone) p on p.phone = mu.phone
    where p.phone_count > 1
    ORDER BY mu.date ASC
    Ответ написан
    4 комментария
  • Можно ли запустить WebSocket по переходу на страницу?

    @alexalexes
    При переходе на wss://example.ru/ws.php, нужно проанализировать заголовки - браузер хочет получить стартовую заготовку html, или уже отправляет запросы ws. Если как html, то отдать контент страницы, если как ws, то смотреть что нужно для ws сессии.
    Ответ написан
  • Как можно установить время неответа на CURLOPT_WRITEFUNCTION?

    @alexalexes
    У вас callback в виде функции writer скорее всего не срабатывает, в случае ошибки по curl.
    Попробуйте проанализировать curl после посылки запроса:
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    if($info['http_code'] != 200)
    {
      // по http не получили статус 200, значит, пишем репорт об этом
    }
    curl_close($ch);

    Вариант 2:
    $result = curl_exec($ch);
    $curl_error_number = curl_errno($ch);
    if($curl_error_number)
    {
       $info = curl_getinfo($ch);
      // что-то случилось с соединением в целом, пишем репорт об этом со сведениями $info
    }
    curl_close($ch);
    Ответ написан
  • Как встроить html-код в массив php?

    @alexalexes
    Вам не нужно ни JS, ни HTML записывать в message. В json лучше держать "чистые" данные без форматирования (серверный API не должен ничего знать, как рисовать интерфейс пользователя).
    Ваша проблема связана с тем, что нужное форматирование сообщения необходимо произвести в функции callback на стороне JS, откуда был вызван AJAX запрос.
    Ответ написан
    Комментировать
  • Как распознавать в php слова (типо систем компьютерной алгебры)?

    @alexalexes
    Берете любую вузовскую методичку по дисциплине "Теория языков программирования и методов трансляции".
    Изучаете, с чем едят грамматики формальных языков, строите лексический анализатор, синтаксический анализатор, транслятор в свой машинный код, исполнитель машинного кода.
    На выходе у вас должна получиться вот такая штука:
    https://studfile.net/preview/937093/
    Ответ написан
    Комментировать