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

    @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 комментария
  • Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    @alexalexes
    Нужно. Хотя бы вставить решение простой капчи вида:
    2 + 8 = ?

    Если боты позарятся на ваше творение, и будут обходить решалку, то поставить уже капчу с изображением на своем модуле. Если и ее будут ломать, то воспользоваться сторонними капча API.
    Ответ написан
    1 комментарий
  • Как сделать несколько вложенных джоинов?

    @alexalexes
    Сначала напишите чистый SQL:
    select n.*, -- атрибуты новости
               p1.*, -- атрибуты автора
               p2.*, -- атрибуты исполнителя
               s.* -- атрибуты статуса новости
    from news n
    join status s on s.statusId = n.statusId
    left join people p1 on p1.peopleId = n.authorId
    left join people p2 on p2.peopleId = n.executorId
    where p1.fullName like :search
           or p2.fullName like :search

    Потом откройте документацию по ORM и перепишите в методологии ORM.
    Сначала попробуйте простой запрос:
    select *
    from news

    Потом посмотрите, как делать join и работать с псевдонимами таблиц:
    select n.*, -- атрибуты новости
               s.* -- атрибуты статуса новости
    from news n
    join status s on s.statusId = n.statusId

    Потом как с where работать:
    select n.*, -- атрибуты новости
               s.* -- атрибуты статуса новости
    from news n
    join status s on s.statusId = n.statusId
    where s.statusId = :statusId

    Потом, как лайкать:
    select n.*, -- атрибуты новости
               p1.*, -- атрибуты автора
               p2.*, -- атрибуты исполнителя
               s.* -- атрибуты статуса новости
    from news n
    join status s on s.statusId = n.statusId
    left join people p1 on p1.peopleId = n.authorId
    where p1.fullName like :search

    И в заключение, как к лайкам добавить OR (самый первый запрос).
    Ответ написан
    Комментировать
  • Как правильно загружать картинки?

    @alexalexes
    Я нажимаю добавить картинку, она уходит на сервер, там ей присваивается новое уникальное имя,

    ... которое сервер тут же передает клиенту, как только файл гарантировано сохранился в хранилище (да, не обязательно, чтобы это был каталог сервера, он может загрузить файл через api облака, например, сам являясь клиентом системы хранения файлов).
    На клиенте, в скрытом поле вы собираете коллекцию уникальных имен файлов (идеально, если это будут id/guid/или другой род хеша).
    Когда пользователь удаляет файл, который был успешно отправлен серверу, можно отправить запрос, чтобы файл с таким-то идентификатором можно удалить, или поставить на удаление в очередь, если зачистка не сразу происходит.
    Когда пользователь сабмитит форму, тогда серверу передаются уникальные идентификаторы файлов, по которым сервер уже либо перемещает файлы на постоянное хранение, либо меняет их статус (файлы связывают с идентификатором поста, например).
    Те, файлы, которые остались в статусе черновика, скажем, в течение недели, можно зачистить скриптом, запускаемым по расписанию.
    Ответ написан
    Комментировать
  • Как передать значение переменной из JS в PHP без перезагрузки страницы?

    @alexalexes
    В php скриптах не обязательно всегда отдавать клиенту html-текст, тем более в виде статики (за пределами тегов <? ?>).
    А если вы еще используете ajax, обращаясь к тем же скриптам, что формируют полную html страницу, то можно отдавать ответ гораздо гибче (отдавать только чистые данные, без html в случае AJAX, и в остальных случаях - html оснастку, чтобы браузер нарисовал начальное состояние страницы):
    <?php
        if(isset($_POST['checkout']))
        {
          // получили параметр, который используется в AJAX - отдаем только данные (числа, строки, или json объекты)
           echo 'posted:'.$_POST['checkout'];
        }
       else
       {
         // не получили специфичных для ajax параметров - отдаем клиенту обычный HTML
          echo '<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <div><?php echo $test ?></div>    
        <script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
        <script type="text/javascript" src="script.js"></script>
    
    </body>
    </html>';
       }
    ?>

    На этом строят API своей системы.
    Ответ написан
    Комментировать
  • Как исключить конкретный лейбл из генератора PDF?

    @alexalexes
    <?php echo $field_label == "название лейбла" ? "": $field_label; ?>

    А вообще, нужно искать источник, откуда берется перечень полей, и исправлять его. А не делать костыли в шаблоне вывода.
    Ответ написан
    2 комментария
  • Как отфильтровать многомерный массив при помощи значений в одномерном массиве?

    @alexalexes
    $filtered_arr = array_filter($arr, function ($el) use ($arr2) { 
                return !in_array($el['number'], $arr2);
            }
        });

    В фильтрующей функции на return вы подаете выражение, которое можно перевести или трактовать как булевый результат true/false, по которому вы должны оставить поданный внутрь функции элемент $el в $filtered_arr.
    PS: Будьте осторожны с in_array - эта функция чувствительна к типу данных элемента и элементов массива, она их сравнивает как ===. Это на случай, если у вам в сравнении будут якобы числа, например, вместо 1010 будет '1010'.
    Ответ написан
    5 комментариев
  • Как отслеживать выход из сети?

    @alexalexes
    Чтобы реализовать вашу идею, нужен стек, где сервер выступает в роли ведущего по части отправки http-запроса клиенту. Сервер PHP, обычно, выступает в роли ведомого - когда клиент соизволит сделать запрос, тогда сервер может проанализировать, жив ли клиент. В случае с WebSocket можно на стороне сервера понять, закрылось ли соединение, не дожидаясь внятного ответа от клиента.
    Сервер PHP может в WebSocket, но реализации у него кривые. На эту роль идеально подходят NodeJS + WebSocket.
    С PHP вы только можете отслеживать, когда последний раз клиент отправлял запрос - если больше условных 10 минут назад, то он скорее мертв, чем жив.
    Ответ написан
    Комментировать
  • Некоторые бинарные строки не определяются по оператору LIKE, проблема не дебажится, в чём может быть причина?

    @alexalexes
    Вероятно, проблема в состоянии индекса на поле info_hash_v2 (вы же используете индексы в базе для ускорения поиска?). Запустите перерасчет индекса для устранения глюка.

    PS:
    $info_hash_where = "WHERE tor.info_hash = '$info_hash' OR tor.info_hash_v2 LIKE '$info_hash%'";

    Ай-ай-ай. Склейка параметров запроса с текстом запроса, ой не хорошо. Не хотите познакомиться с подготовленными запросами?
    Или нормально исследуйте класс объекта DB, вдруг там есть нормальный метод bind_param, а то вдруг используете инструмент не до конца по назначению.
    Ответ написан