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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Самое удивительное здесь в том, что два месяца назад вам, пусть и криво, но удавалось справиться с этой проблемой.
    Ну давайте попробуем ещё раз, заодно сделав этот код чуть более осмысленным

    <?php
    session_start();
    if (isset($_SESSION['user']['id'])) {
        header("Location: /profile.php");
        exit;
    }
    require_once __DIR__ . '/scr/connect.php';
    $connect = getDB();


    • Поскольку само проверяемое значение нигде не используется, а важно только его наличие, то присваивать его переменной нет смысла.
    • Поскольку нас интересует наличие значения в сессии, то и проверяем мы именно наличие, с помощью isset.
    • Детсадовский пустой if с else переписываем на нормальный, просто инвертировав условие.
    • Соединение с БД делаем уже ПОСЛЕ поверки, поскольку при редиректе оно оказывается бессмысленным.
    • После ридеректа добавляем принудительный выход, поскольку сам редирект, внезапно, работу скрипта не прекращает (кто бы мог подумать).


    Если же нам в дальнейшем коде понадобится переменная (например, в том же profile.php), то тогда имеет смысл присвоить его переменной, используя оператор приведения к null как сокращённую форму проверки и присвоения с помощью isset():

    <?php
    session_start();
    $idUser = $_SESSION['user']['id'] ?? null;
    if ($idUser === null) {
        header("Location: /login.php");
        exit;
    }
    require_once __DIR__ . '/scr/connect.php';
    $connect = getDB();
    Ответ написан
    Комментировать
  • Запрос на создание таблицы в clickhouse Yandex выдает ошибку 400 Bad Request, что не так с моим запросом?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как правильно меня поправили товарищи ниже, чтобы увидеть ответ сервера ,в котором может содержаться более подробное сообщение об ошибке, надо в контекст, в секцию http добавить элемент 'ignore_errors' => true,

    Плюс совсем уж очевидные косяки, которые бросаются в глаза:
    1. Нет такого слова - "chunck"
    2. У этого запроса нет контента. И, как следствие - у него нулевая длина (и непонятно, зачем заголовок вообще).
    2. Если метод POST, то логичнее отправлять данные не в строке запроса, а в теле запроса (но тогда и длину считать нормально, а не одной переменной, как сейчас).
    4. Если уж посылать враскоряку - методом POST, но в строке запроса - то данные надо форматировать по стандарту, а не то что сейчас:
    $url = sprintf('https://%s:8443/?%s', 
        $host, 
        http_build_query(['database'=>$db, 'query'=>$query])
    );
    Ответ написан
    Комментировать
  • Как объединить в один код 2 строчки $array[$key]?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам надо не "объединить эти строчки в одну," а добавить условие

    if (первая форма) {
        $array[$key]['ColorGroup'] = join(",", $row['ColorGroup']);
    } else {
        $array[$key] = array_merge(array("Nom1" => 0, "Abs" => 0, "Nom3" => 0, "MarkFirst" => 0, "MarkSecond" => 0, "MarkThird" => 0, "RingWcf" => 0, "RingWcf2" => 0, "RingMono" => 0), $row);
    }


    Какое условие сделать - мы не знаем, это вам решать. Например, в форме есть какое-то поле, которого нет в другом.

    И это будет работать только если отличие действительно только в этой строчке. В чём я сильно сомневаюсь
    Ответ написан
    Комментировать
  • Как вычислить результат математических операций в строке?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Есть ли готовая библиотека для решение данной задачи?

    Вагон
    и маленькая тележка
    Ответ написан
  • Можно ли в PHP вкладывать однострочные комментарии // в многострочные /* */?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Куча говорильни из-за примитивного вопроса.
    Какие ещё "внутренние стандарты"? Какой "бизнес"?
    Человек закомментировал кусок кода, увидел внутри комментарий и испугался, решил спросить.
    Ему надо сопли утереть и успокоить, а не развозить турусы на колёсах.
    Ответ написан
    Комментировать
  • Стоит ли использовать файловый сервер в проекте?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас вопрос не "стоит ли использовать", а "стоит ли воспользоваться случаем, чтобы освоить новую технологию".
    Тут надо выбирать между полученным опытом и кармой, которую подпортит человек, который будет поддерживать проект после вас - помянув недобрым словом за неоправданное усложнение.

    Но если уж мечтать, то я бы написал класс, который реализует все методы для работы с файлами на локальном диске
    После этого, если останется время и задор, то реализовал бы другой класс, для работы через облако.
    И унифицировал эти классы, написав для них интерфейс.
    При этом класс для работы с локальным диском придётся переделать, поскольку вылезут косяки неудачной абстракции.

    Почему не сначала интерфейс - просто потому что вы изначально не представляете себе все требуемые методы. Это будет видно только из практики.

    Таким образом вы и задачу решите оптимальным способом (локально), и опыт получите (причём в первую очередь в программировании), и гибкость добавите - если вдруг надо будет перейти на облако (причём не обязательно именно на это) то это будет проще сделать просто написав ещё один адаптер, но не трогая основной код
    Ответ написан
    3 комментария
  • Что входит в отладку скрипта на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В отладку входит два основных механизма:
    1. Включение полного отображения ошибок (или логирования, если на боевом сервере)
    2. Пошаговая трассировка с контролем состояния переменных (с использованием IDE или вручную через var_dump/die).

    В вашем случае, очевидно что не был выполнен пункт №1. Какой бы ни была причина проблем, РНР всегда выдаст ошибку. Так что в вашем случае надо было просто убедиться, что error_reporting=E_ALL, а display_errpos=1

    А вот нижеследующее утверждение не имеет смысла
    PHP данную ошибку не показывал, т.к. не использовалась функция проверки записи в директорию is_writable().

    РНР не нужны никакие функции, чтобы сообщить об ошибке. А is_writable() обычно используется как раз наоборот, чтобы подавить ошибку и дальше работать как ни в чём не бывало. Ну или в лучшем случае выбросить какую-нибудь бессмысленную ошибку типа "Не могу записать в файл", не говорящую ничего о реальной причине проблемы.
    Ответ написан
    4 комментария
  • Можно ли писать функции в текст?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Извратиться можно, но это будет именно извращение.
    Тем более что всё равно кроме функций понадобятся и управляющие конструкции - if, foreach.
    И решение давно придумано. РНР умеет встраиваться в HTML. Поэтому вместо того, чтобы писать разрозненные куски HTML в переменные, весь HTML пишется в один php файл, в котором делаются вставки на РНР. после того, как РНР выполнил всю бизнес-логику, пишется одна строчка, include 'template.php'; и дальше выводится весь HTML. Грубый пример такого файла
    <?php include 'top.php'; ?>
    <h2><?=$pagetitle?></h2>
    <ul>
    <?php foreach($links as $row): ?>
      <li>
        <a href="<?= htmlspecialchars($row['link']) ?>">
          <?= htmlspecialchars($row['name'])?>
        </a>
      </li>
    <?php endforeach ?>
    <ul>
    <?php include 'bottom.php'; ?>


    Ну и после такого колупания разработчик быстро приходит к идее использовать специпализированные шаблонные движки, такие как Twig. Но поскольку новичкам сложно осваивать столько нового за раз, лучше двигаться постепенно
    Ответ написан
    24 комментария
  • Подключние к базе данных из класса - насколько правильно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    меня есть подключение к базе данных

    и уже неправильное

    Учим основы:
    - на локальном сервере это вот try catch echo является бессмысленным: если убрать всю эту нелепую копипасту, РНР и сам выведет то же самое.
    - на боевом сервере этот код является вредным: внутренние ошибки РНР мы никогда не светим наружу. Пользователь их не поймёт, а для хакера они бесценны.
    Поэтому убираем бессмысленное try catch и оставляем только соединение
    $sql_connect = new PDO("mysql:host=". DB_HOST .";dbname=". DB_NAME. ";charset=utf8mb4", DB_USER, DB_PASS, $pdo_options);

    Опять же убрав из него нелепые кавычечьки.

    насколько правильный такой подход

    Этот подход практически идеальный

    Можно изменить подход так, что бы не использовать конструктор

    Можно, но не нужно.
    Сейчас всё чётко видно, откуда берётся соединение с БД, и где оно нужно. Одна переменная в конструкторе - это не то место, где надо лениться и изобретать способы её не писать. В будущем, когда освоите автоматический вызов классов - тогда оно будет подставляться само. Но всё равно через конструктор.
    Ответ написан
  • Требуется реальный пример как исправить ошибку с Warning: count(): Parameter must be an array or an object that implements Countable in ....?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    if (is_countable($this->_items) && count($this->_items))

    ну уж в таком-то варианте должно сработать
    Ответ написан
  • Где у меня ошибка при добавлении своего приложения в HestiaCP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    После долгих уговоров вы наконец-то смогли дать хоть какое-то описание проблемы, "500 даёт".
    Теперь хотя бы понятно, что вы пытаетесь сделать, и что видите в итоге.

    Вам надо найти, где у этой HestiaCP лог ошибок, и прочитать в нём текст ошибки.
    И на будущее освоить эту нехитрую премудрость - 500 ошибка в браузере означает, что в логе ошибок веб-сервера есть подробный текст с описанием ошибки. Дальше этот текст можно пытаться понять самому, можно скормить гуглю или ИИ, можно задать про него вопрос на том форуме, который имеет отношение к ошибке. Подсказка: здесь не форум поддержки HestiaCP и "кволтона".
    Ответ написан
  • После переезда на новый хостинг перестал работать сайт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В чём проблема, вам РНР говорит человеческим голосом: ошибка синтаксиса. У вас лишняя } в 114 строке.
    Надо смотреть файл целиком. Причём не тот, в котором скобка на 115 строке, а тот, в котором на 114.
    Проверяйте файл.

    А вся эта лирика - версия РНР, хостинг, "файл не менялся" не имеет к проблеме никакого отношения.
    Ответ написан
    4 комментария
  • Чем собирать статистику запросов от клиентов на сервере?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    > 100-300 за сутки для каждого. логи сервера не подходят для этого.

    довольно забавное заблуждение.
    Редис вам понадобится при нагрузках 100-300 в секунду. Для всего, что меньше, идеально подойдут текстовые логи. А вы заодно, освоите один из самых базовых навыков для работы с сервером.

    Логи пишете в файл. чтобы получить лог по определенному name пишете в консоли
    grep name log.txt
    Ну или при желании читаете в пхп и выводите в красивой табличке
    Ну или совсем лень, то можно писать в БД и выбирать запросами.
    Ответ написан
    Комментировать
  • Не приходят сообщения с контактной формы, Извините, данные не были переданы?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Перед отправкой формы нажимаете F12
    2. В открывшихся инструментах разработчика выбираете вкладку Сеть
    3. Отправляете форму
    4. Во вкладке Сеть появляется новая строчка. Нажимаете на неё и там появляется своя панелька на которой надо выбрать вкладку Ответ
    5. Нажимаем на эту вкладку и смотрим, что приехало с сервера. Если самому непонятно, то постим сюда

    Если там не будет ничего полезного, то надо смотреть логи сервера. Где-то в ISPManager-е должен быть раздел с логами, там нужен лог ошибок.
    Ответ написан
    2 комментария
  • Можно ли настроить запросы к php через вебсокет и http одновременно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется можно. Никаких нюансов в одновременной работе нет, поскольку тут нет никакой "одновременности". php-fpm и websocket - это два разных сервиса, которые могут располагаться на одном и том же сервере или на разных, но в любом случае никак не пересекаются. В добавление к текущему веб-серверу вы просто запускаете вебсокет сервер и посылаете на него вебсокет запросы из браузера.

    Ну то есть вам всего лишь надо осознать, что никакой одновременности нет, а дальше просто поставить вебсокет сервер, например workerman, и написать код, который по запросу будет соединяться с БД, получать нужную инфу и отправлять клиенту.

    1. Да.
    2. Как говорилось выше - можно. Любой сервер в сети по определению обеспечивает работу множества сервисов, количество которых ограничено только количеством свободных портов. Можно поставить два веб-сервера и пять вебсокет серверов.
    3. Нет, разумеется. unix сокет это как раз внутренняя кухня сервера, но мы же говорим о сетевом взаимодействии. А tcp взаимодействие nginx и php-fpm тут вообще не при чём.
    Ответ написан
    8 комментариев
  • PHP. Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В РНР разбираться не обязательно, надо минимально разбираться в поддержке софта.
    Варианты, по степени убывания идеальности
    1. Обновить версию Джюмлы
    2. В настройках пхп отключить ошибки E_DEPRECATED
    3. Залезть с грязными ногами в файл /var/www/u2340392/data/www/test.kaikova.ru/modules/mod_bt_contentslider/tmpl/default.php и на 26 строке при вызове функции trim() дописать ?? '' после имени переменной. Т.е
    -trim($var);
    +trim($var ?? '');
    Ответ написан
    Комментировать
  • Как называется такая вложенность в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Почему возникает ошибка (T_VARIBLE)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Когда пишет unexpected '$sql' (T_VARIABLE) это значит, что проблема в конце предыдущего выражения.
    Поднимаем глаза, смотрим на конец предыдущего выражения, и видим, что с ним не так.
    Ответ написан
    Комментировать
  • Помощь в PHP проверка данных из файла только выбранные значения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас файл создан под Уиндоуз, в которой в качестве разделителя строк используется последовательность \r\n
    Разбивая по \n, вы в конце каждой строки оставляете висеть символ \r, и в итоге при сравнении совпадает только последний элемент файла, после которого нет перевода строки

    Для чтения файлов в РНР есть специальная функция. Которая понимает любые переводы строк, и умеет их автоматически удалять.
    $array = file(JPATH_SITE.'/list.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    И всё сразу начнёт находиться.
    Ответ написан
    Комментировать
  • Как в PHP найти строку, которая содержит или не содержит символ?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "содержит или не содержит символ" (а точнее - предыдущее выражение) в регулярных выражениях обозначается знаком вопроса. Шаблон \. ?ru найдет как site.ru, так и site. ru
    Ответ написан
    Комментировать