Ответы пользователя по тегу PHP
  • Делал форму обратной связи, вроде написал все правильно, но выводит ошибку заполните все поля, хотя все заполнил. Как быть?

    @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 недостаточно для определения, что на рисунке есть что-то круглое.
    Предложенное решение прокатит, если фоновая область будет идеально одного оттенка без полутонов, чтобы чувствительности заливки фона хватило пометить его как прозрачный (что метод и предлагает).
    Ответ написан
    Комментировать
  • Как решить проблему с 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/
    Ответ написан
    Комментировать
  • Как обойти sql запрос в циклах по группировкам?

    @alexalexes
    Пока не обозначите две вещи:
    1) По каким критериям будете искать школы или учеников.
    2) Какие и в какой форме выводить данные.
    Не будет точного плана, как оптимально составить запрос или несколько запросов, чтобы перейти от условий 1 к результату 2.
    Чем конкретно опишите входные и выходные данные, тем оптимальней можно получить запрос(ы) для решения этой задачи.
    Ответ написан
    Комментировать
  • Как пофиксить баг с постоянным выводом данных из БД?

    @alexalexes
    Прошлые данные выдаются из сессии PHP.
    <?php foreach ($_SESSION['arr'] as $gorod) : ?>
                <tr>
                    <td><?php echo $gorod['id']; ?></td>
                    <td><?php echo $gorod['name']; ?></td>
                    <td><?php echo $gorod['area']; ?></td>
                    <td><?php echo $gorod['population']; ?></td>
                </tr>
            <?php endforeach; ?>

    А вывод всех городов отрабатывает вот этот случай:
    } else if (empty($name)) {
    	$mysql = "SELECT * FROM city";

    Сервер PHP какой получил код, те условия и отработал. Никакой магии тут нет, разбирайтесь, что хотели получить или изменить.
    Ответ написан
    Комментировать
  • Как использовать часть URL как переменную?

    @alexalexes
    Типичный кейс, как использовать GET-параметры, если известен их список допустимых значений.
    <?php
    // список допустимых значений переменной $channel
    $allow_channel_list =  ["svm.sport" , "svm.music" ,  "svm.loop"];
    // значение по умолчанию
    $default_channel = "svm.best";
    // если в GET-параметрах присутствует ключ channel и значение по ключу входит в список допустимых значений...
    if(isset($_GET['channel']) && in_array($_GET['channel'], $allow_channel_list))
    {
    // ..., то переменная равняется этому значению  
      $channel = $_GET['channel'];
    }
    else // иначе, берем значение по умолчанию
      $channel = $default_channel;
    ?>
    
    <!DOCTYPE html>
    <html>
       <head>
          <title><?php echo $channel; ?></title>
    <!-- ... БЛА-БЛА-БЛА -->
    
    <?php
    // <!-- ... БЛА-БЛА-БЛА -->
    
    ?>

    Использовать так:
    test.php?channel=svm.best
    Ответ написан
    2 комментария