Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Почему возникает ошибка при ограничении доступа к профилю для незарегистрированных юзеров?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо понимать что слово "ютубер" это синоним слова "криворукий идиот".
    И проблемы в этом коде куда более серьёзные, чем банальная ошибка, которая лечится с помощью isset()

    Куда важнее две ДЫРИЩИ в этом коде, при наличии которых что ограничивай - что не ограничивай, но по сайту будет ходить кто захочет и как захочет.

    Во-первых, этот код вообще ничего не ограничивает. Потому что после отправки заголовка Location надо всегда принудительно завершать работу скрипта. потому что сама по себе отправка заголовка это, разумеется, не делает. И клиент может тупо заголовок проигнорировать и вместо редиректа получить саму страницу.
    Во-вторых, разумеется банальнейшая SQL инъекция, с помощью которой кто угодно сможет залогиниться под кем угодно, вообще не зная ни одного пароля
    Ответ написан
    9 комментариев
  • Почему в базу данных попадает путь без слэшей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что данные в БД надо добавлять по-человечески, а не как пацаны в подворотне показали.

    Данные в БД надо всегда отправлять отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);

    И скажи спасибо что у тебя просто слеши пропали, а не всю базу шутники удалили
    Ответ написан
  • Как сделать несколько запросов в секунду на страницу сайта, чтобы сработал php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Объясните кто-нибудь этому горемыке, что его за такие шутки возьмут за ушко да на солнышко. И большого пинка под зад.
    Ответ написан
    Комментировать
  • Почему вместо кириллицы знаки вопросов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Давно пора запилить аналог вот этого ответа.
    А то же ведь раз в три дня один и тот же вопрос - кракозябры, вопросики, ромбики.
    И везде одна и та же ересь про "meta charset" в ответах.

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

    В Mysql
    • Кодировка, которую надо выставлять, называется utf8mb4
    • Что там стоит на "всей БД" абсолютно без разницы. Кодировка должна быть указана для таблиц (в отдельных случаях - для поля) при создании. Проверить можно командой SHOW CREATE TABLE table_name

    В PHP
    • Должна быть быть выставлена кодировка соединения с БД
      • в PDO через DSN $dbh = new PDO('mysql:host=...;charset=utf8mb4');
      • в mysqli $mysqli->set_charset('utf8mb4');


    В браузере
    Для того, чтобы браузер корректно отображал кодировку, её надо указать HTTP заголовках.
    • Либо default_charset = "utf-8" в php.ini.
    • Либо руками в коде header('Content-Type: text/html; charset=utf-8');

    Проверять в консоли разработчика: вкладка Сеть, кликаем на запрос, смотрим заголовки
    Ответ написан
    Комментировать
  • Как правильнее сделать такой функционал?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Решение очевидное - все нестандартные интервалы записать в массив, и проходить по нему
    Проверять надо разумеется одновременно дату и время, а не по отдельности
    Начни с 1 января - там самый простой интервал.
    и дальше продолжай добавлять.

    потом проходишь по массиву и сравниваешь текущее время с интервалами. если входит - то ставим флаг и выходим из цикла
    Ответ написан
    1 комментарий
  • Какие недостатки у такой авторизации?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Есть такая русская пословица, "дурная голова ногам покоя не даёт".
    Вот она про это "изобретение".
    Ответ написан
    Комментировать
  • Как в for прописать 2 условия?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начинающие программисты действительно часто путают логические И и ИЛИ, которые отличаются от бытовых И и ИЛИ.
    Результат логического ИЛИ будет true если любой из операндов вернул true

    А здесь нужно выполнять цикл, пока оба условия выполняются, и прекратить, если хоть одно стало false. То есть, нужно логическое И
    Ответ написан
    Комментировать
  • Почему не работает execute()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что надо правильно соединяться.
    ПДО только в 8-ке начал по умолчанию сообщать об ошибках, а во всех остальных версиях ему надо об этом сказать, при создании соединения.

    И убрать этот дурацкий if с дурацким done.
    Ответ написан
  • Как безопасно отправлять пользовательский текст в базу POST запросом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед тем как что-то куда-то добавлять надо сначала разобраться что ты делаешь.
    В частности понять что браузер, веб-сервер, и база данных - это разные вещи, и для каждой нужна своя обработка данных.

    В-первых, POST запросом ничего добавить в базу нельзя.
    База вообще ничего не знает про пост запросы. POST запросом можно отправить текст только в РНР.
    А РНР уже будет добавлять в БД.

    Про HTML база данных тоже ничего не знает. Поэтому "htmlspecialchars" к базе данных не имеет никакого отношения. И делать это для добавления в БД не нужно. Это функцию надо применять при выводе данных в браузер, а не при сохранении в базу данных.

    Вот теперь, когда мы разобрались что у нас где, можно наконец ответить на твой вопрос

    Для безопасного добавления данных в БД из РНР, надо отправлять их отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    И не важно - пользовательский у тебя текст, или какой-то другой, POST у тебя запрос, или вообще никакого запроса не было - все эти вещи к работе с БД из РНР не имеют никакого отношения. Важно только то, что данные всегда отправляются в БД отдельно от запроса.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $name, $text, $message, $date);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
    $sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$name, $text, $message, $date]);

    А дураков, которые сами не знают, как текст в базу сохранить, слушать не надо.
    Ответ написан
    Комментировать
  • Как обновлять данные каждую секунду в базе данных пока пользователь находится на странице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Забыть про эту нелепую фантазию и заняться чем нибудь полезным.
    Ответ написан
    Комментировать
  • Почему выводит пустой массив из объекта в PHP, MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    тебе этот код выводит array(0) { } потому что в таблице testformyself, которая располагается в БД, с которой соединяется этот РНР скрипт, нет записей.

    Проблема в том, что у тебя отключены сообщения об ошибках РНР. Чего делать ни в коем случае нельзя.
    Надо во-первых, включить режим выдачи ВСЕХ ошибок (E_ALL), а во-вторых - включить отображение ошибок на экране, что удобно для режима разработки.
    Ответ написан
  • Как это работает?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это называется autoload.
    тупейшая магия которая по имени класса пытается заинклюдить файл, по заданным тобой правилам
    кури spl_autoload_register
    Ответ написан
    Комментировать
  • Как устранить ошибку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    во втором варианте ты require забыл, молодец
    а вообще попробуй обновить композер, новая версия лучше работает с памятью
    Ответ написан
    Комментировать
  • Приведение строки в одинарных ковычках к двойным?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Господи, не нужно ничего ни к чему приводить.
    Надо просто перестать использовать функцию mysqli_real_escape_string. Надо перестать быть дикарём, который украшает нижнюю часть тела перьями, потому что так предки делали.
    А начать хоть немного думать. И понимать смысл своих действий.
    И тогда не придется снимать перья с одно места функцией stripcslashes
    Ответ написан
    Комментировать
  • Как в redbean заменить с id на кастомный id?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не использовать идиотскую библиотеку редбин.
    C id это ещё цветочки - она тебе таблицу вообще изуродует, если ты передашь неподходящие, по её мнению данные.
    Ответ написан
    Комментировать
  • Что делать с кодировкой тела сообщения imap_body?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Курить multipart/form-data
    Ну и сразу накуривается https://github.com/php-mime-mail-parser/php-mime-m...
    Ответ написан
  • Как изменить размер картинки и загрузить в папку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо почитать что делает функция imagecopyresized.
    а потом почитать, как сохранить результат ее работы в файл
    Ответ написан
    Комментировать
  • Как вывести подобный json массив из mysql с помощью php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Наверное, сначала раскодировать джейсон, который ты запихал зачем-то в бд?
    Ответ написан
  • Маршрутизация, как правильно вернуть изображение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Минусы в том что на такую ерунду как показ картинки расходуется такой ценный ресурс как тред РНР-FPM.
    Не говоря уже о том, что "приводить к стандартам" - это, как я понимаю, и вовсе конкретная нагрузка на процессор и память

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

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