Задать вопрос
  • Как залить php сайт без базы данных на хостинг?

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

    А ошибка 500 к заливке отношения не имеет, она может быть от чего угодно.
    Сам текст ошибки надо посмотреть в логе ошибок веб-сервера, прочитать, что там написано, и исправить
    Ответ написан
    4 комментария
  • Есть ли учебник по PHP в котором после каждой главы задаются задания?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сейчас выходит книга Джона Дакетта, PHP & Mysql.
    Там после многих примеров даются задания. Они, правда, дурацкие, типа "Упражнение. В шаге 5 в переменную $message добавьте название компании."
    Но они позволяют хотя бы не просто смотреть на готовые примеры, а как-то почувствовать их, заставляют зайти в папку с кодом, который прилагается к книге, и поиграться с ним, посмотреть, что будет, если изменить ту или иную команду.
    Но это не такие глобальные задания, типа "написать что-то своё, на основе полученной в главе информации".

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если говорить с практической точки зрения, то лично я бы не стал ковыряться в этом говнокоде, а выкинул его целиком. И сделал нормально:
    1. перед сохранением в базу текст вообще не трогал
    2. (опционально - валидация, которая не трогает текст, а может только выдать ошибку, что он не соответствует требованиям)
    3. перед выводом:
      • сделать ему htmlspecialchars()
      • и отрендерить в маркдаун, чтобы вместо этих пещерных <b> и <br> поддерживалось натуральное форматирование переводов строк, списков, выделения, и прочего.



    Ответ написан
    3 комментария
  • Почему не записываются данные в файл?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как все новички, вы оперируете понятием "может быть".
    "может быть сервер не принимает". "по крайне мере должно отправлять". "насчет РНР не уверен"
    Так делать никогда не надо.
    У вас есть все возможности узнать то, что происходит на самом деле. Факты.
    Вот фактами-то и надо всегда оперировать.
    Какая вам разница, "может ли быть такое, что backend не принимает"? Может. И чем вам это знание поможет?
    Вам не нужно знать абстрактно, вам нужно знать, принял ли ваш конкретный сервер ваши конкретные данные.
    А узнать это очень просто. Если "backend не принимает", то но выдаст ошибку. Все что вам нужно - это посмотреть, что он возвращает. Глазами.
    Плюс на всякий случай проверить, настроен ли backend на вывод ошибок.

    При работе с аякс запросами надо всегда держать открытой вкладку Сеть в инструментах разработчика в браузере.
    И смотреть, во-первых, что ваш фронт отправляет, а во-вторых - что сервер отвечает. Там вообще может быть 404. Поскольку никакого конкретного адреса вы на сервере не указали.
    Плюс если ответ сервера есть, то надо смотреть его содержимое на предмет ошибок.
    Ответ написан
    Комментировать
  • Что быстрее SQL или Javascript?

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

    Во-первых, заголовок у вопроса чудовищно некорректный. Это все равно что спросить, "что быстрее - пылесос или стиральная машина?"
    Во-вторых, ответ на вопрос "производить ли обработку данных в БД или же запросить все данные в клиентское приложение и обрабатывать там" совершенно очевиден: обработку данных следует производить в общем случае только в БД. Она для этого и придумана. Чтобы обрабатывать значительные объемы данных.

    Да, js тоже "может" обрабатывать большие объемы данных.
    Но чтобы значительный объем данных обработать, его сначала надо передать, полностью забив канал между сайтом и базой
    Чтобы значительный объем данных обработать, его надо сначала проиндексировать. Причем делать это каждый раз, а не использовать уже имеющийся набор индексов
    Чтобы значительный объем данных обработать, надо иметь значительный объем памяти или упасть из-за её недостатка
    Чтобы значительный объем данных обработать в многопоточном режиме (а сайт как раз является многопоточной системой), все вышеперечисленное надо умножить на количество посетителей сайта - при каждом запросе перегонять весь массив данных, выделять память, индексировать, считать. Если же вы оставляете все данные в памяти приложения, то их тогда надо как-то синхронизировать с БД. То есть вы себе собираете кучу проблем на пустом месте.

    Несомненно, из любого правила есть исключения. И бывают ситуации, когда приходится считать в приложении.
    Но на вопрос в общем виде ответ будет совершенно однозначный. Не "может так, может сяк", а только в БД.
    Ответ написан
    9 комментариев
  • Что будет, если убрать из URL уникальный id у новости в CMS?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сто раз уже обсуждалось.
    Заголовок не гарантирует не только уникальность, но и неизменность.
    В реальной жизни заголовки довольно часто редактируются.
    И "если убрать из URL уникальный id", то все ссылки, которые вели на статью, после редактирования превращаются в тыкву.
    Ответ написан
    4 комментария
  • Как загрузить файл по sftp в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Мне нетрудно скопировать пример из документации
    <?php
    $connection = ssh2_connect('shell.example.com', 22);
    ssh2_auth_password($connection, 'username', 'password');
    
    ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);

    И получить на 100% корректный и на 100% бесполезный ответ.
    Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.
    Ответ написан
    Комментировать
  • Почему с формы обратной связи на почту хостинга приходит пустое письмо?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Странно, какой разительный контраст с кодом из удаленного вопроса.
    Я уж хотел вспомнить молодость, поумиляться глубокомысленному коду $post = !empty($_POST) ? true : false;...
    Но с другой стороны, в удаленном коде было непонятно, почему вообще письмо уходит, а здесь уже гораздо ближе к реальности.
    обратить внимание надо, во-первых, на тег
    <form action="#" id="form_body" class="form">
    и посмотреть в примерах, что туда пишут.
    После этого вывести результат var_dump($_POST); и внимательно его изучить.
    После этого снова вернуться к форме и подумать, чего в ней не хватает

    Ну и разумеется выкинуть часть с else if ( $method === 'GET' ) {
    Ответ написан
    9 комментариев
  • Код php в другом блоке не отображает переменную из текущего блока?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    • Открываем исходный код страницы по Ctrl-U и с удивлением видим там свое <? $a=1; ?> прямо в браузере.
    • После этого вспоминаем, что простой открывающий тег РНР (в отличие от сокращенного echo) пишется как <?php
    • Исправляем первый блок
    • Всё работает


    В случае, если переменная все равно не видна, то скорее всего вы столкнулись с областью видимости переменных, обращаясь к переменной внутри функции, но от неграмотности вообразили, будто дело в "блоках".

    чтобы значение переменной было видно внутри функции, её надо передать в виде параметра
    function myfunc($a) {
        echo $a;
    }
    $a = 1;
    myfunc($a);


    Ну или присвоение значения переменной происходит внутри условия, которое не выполняется.

    Если выкладываете не реальный код, который у вас не работает, а какие-то каракули от балды, то всегда сначала протестируйте, сохраняется ли в этих каракулях ваша проблема
    Но лучше всегда выкладывать реальный код.
    Ответ написан
  • Как экранировать sql запрос внутри texarea?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень просто сделать.
    Надо всего лишь освоить подготовленные выражения.
    Например, почитав вот тут https://habr.com/ru/articles/662523/

    И все запросы, в которых участвуют переменные, выполнять только таким образом.
    А texarea там, или tinymce - это уже без разницы.
    Ответ написан
    1 комментарий
  • Телеграм бот, inline_keyboard - не отправляет запроса webhook на сервер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На чистом РНР (если закрыть все скобки в этом огрызке кода), все прекрасно отображается и отправляется.
    $resp = [
                'chat_id' => $chat_id,
                'text' => 'Вы находитесь в главном меню',
                'reply_markup' => json_encode([
                    'inline_keyboard' => [
                        [
                            [
                                'text' => 'refresh',
                                'callback_data' => 'LALALALA'
                            ]
                        ],
                        [
                            [
                                'text' => 'LALALALA',
                                'callback_data' => 'LALALALA'
                            ]
                        ]
                    ]])];
    $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp);
    file_get_contents($url);

    При условии, разумеется, что передается корректный chat_id. Но если будет неправильный chat id, то тогда клавиатура вообще не отобразится, и тогда именно это было бы проблемой, а не вебхук.

    Попробуйте сначала сформулировать, с чего вы взяли, что "не отправляет запроса вебхук на сервер".

    Но в целом, я предполагаю что главная ваша проблема, конечно же - в отсутствии логирования.
    Я не представляю, как вообще люди берутся писать ботов без базового логирования, которое включает
    1. Сырой инпут, который пришел на вебхук.
    2. Сырой запрос, отправленный в телегу
    3. Разумеется, все ошибки РНР.
    4. Разное другое отладочное логирование.
    Ответ написан
    9 комментариев
  • Почему кириллица неправильно отображается?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В заголовке Content-Type надо также указывать и кодировку.
    Разумеется, в Питоне указывать любую кодировку кроме UTF-8 совершенно бессмысленно.
    Соответственно, заголовок должен быть
    Content-Type: text/html; charset=utf-8
    Плюс в первом принте лишние символы.
    Я не очень понимаю, какой софт используется, но в целом вот такой код выведет в нужном порядке - заголовок, пустая строка, две строки одна под другой
    print("Content-Type: text/html; charset=utf-8\r\n")
    
    print("Hello world!<br>")
    print('Привет мир!')
    Ответ написан
    1 комментарий
  • Как осуществить поиск слов из БД со стороны пользователя?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Понимаете, ваш вопрос звучит так: "Я тут надеваю ботинки. Как осуществить завязывание шнурков?"
    Работа с БД - это 99% кода любого сайта. Тем более такие простые запросы.
    Получается, что вы в принципе не понимаете, как разрабатывать сайты, и вам надо учиться делать именно это.
    То есть, вам надо взять учебник или какое-нибудь руководство. И учиться разрабатывать сайты. А не спрашивать, "как осуществить поиск слов".

    Но чисто для примера, для всех современных версий РНР, будет работать такой код

    <?php
    $word = $_GET['word'] ?? '';
    
    if ($word) {
        require 'db.php';
        $sql = "select * from dictionary where word=?";
        $stmt = $db->prepare($sql);
        $stmt->execute([$word]);
        $row = $stmt->fetch_assoc(); //  для PDO  будет просто fetch()
        echo $row['translation'];
    }


    в db.php, соответственно, код подключения к БД. Взять можно, например, отсюда https://habr.com/ru/articles/662523/

    Чтобы в РНР появилась переменная $_GET['word'], надо сделать форму в HTML. Хотя бы про это, я надеюсь, вам не надо рассказывать?
    Ответ написан
    Комментировать
  • Функция move_uploaded_file выдает ошибку 0, что делать?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    0 - это не ошибка, а какая-то фигня.
    Ошибка - это Warning, который генерирует эта функция, если не может выполнить свою работу.
    Чтобы увидеть эту ошибку на экране, надо включить вывод ошибок РНР на экран, display_errors
    Если ошибки выводить на экран нельзя, то их надо смотреть в логе.

    Чтобы узнать, что делать, надо прочесть сообщение об ошибке
    Ответ написан
  • Почему при удалении куки возникает ошибка Warning: Cannot modify header information?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы решить эту проблему, надо научиться пользоваться интернетом.
    В частности, освоить такой сложный навык, как взять сообщение об ошибке, вставить в адресную строку своего браузера, и нажать enter
    И после этого с удивлением обнаружить, что объяснений этой ошибки существует несколько миллионов.
    Например https://ru.stackoverflow.com/questions/284578/

    И заодно не помешает научиться задавать вопросы. Чтобы не спрашивать про то, что вы и так знаете.
    Ответ написан
    4 комментария
  • Как хранить условия в БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хранить виде json, в котором предусмотрены поля для всех возможных критериев. Например weekday.
    При отображении считывать это поле и по нему вычислять скидку.
    Для поиска периодически производить перерасчет
    Пример не вижу смысла писать.
    Ответ написан
    Комментировать
  • Как закодировать 5-6 значное число в 3х символьную буквенно-числовую последовательность и с обратным декодированием?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну, три символа - это вы "очень много кушать", а 4 - без проблем
    php.net/base_convert
    Ответ написан
    Комментировать
  • Что делать если не работает редирект header?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сначала надо включить отображение ошибок (или научиться искать их в логах сервера)
    Затем собственно увидеть сообщение об ошибке и прочитать его
    Затем, поскольку оно довольно непонятное, найти любое из существующих объяснений этой ошибки, благо их понаписали уже десятки миллионов.
    Далее надо прочитать это объяснение и постараться понять, что такое НТТР заголовки и как с ними работать

    Cannot modify header information.... Как исправить?
    https://phpfaq.ru/newbie/headers
    https://ru.stackoverflow.com/questions/284578/cann...
    Ответ написан
    2 комментария
  • Как корректно обработать строку запроса типа catalog/aloe/aaaa, если третий параметр в роутинге не предусмотрен (только /)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "отображается без стилей" потому что надо всегда использовать абсолютные пути, а не относительные.
    Хотя странно, в этом случае должно косячить либо с одним параметром в урл, либо с двумя.
    Но абсолютные пути от корня сайта вместо всех этих точечек в HTML надо в любом случае прописать. Почитать что это такое можно здесь https://phpfaq.ru/newbie/paths
    Ответ написан
    1 комментарий
  • Ошибка при JSON.parse как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    А вы можете объяснить, зачем вам здесь вообще JSON.parse?
    И почему нельзя написать просто
    var dataJSONArray = <?= json_encode($u,JSON_UNESCAPED_UNICODE) ?>;
    Ответ написан
    1 комментарий