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

    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 комментария
  • Как включить файл в функции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НЕ СЛЕДУЕТ вообще заниматься такими вещами, как включить файл в функции. кроме совсем редких специальных случаев. Файл надо прочитать отдельно, и потом передать его содержимое в функцию в качестве параметра.

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

    поэтому данный код переписать так

    class ClassName 
    {
        protected $config;
        public function __construct($config)
        {
            $this->config = $config;
        }
        public function FunctionName()
        {
        }
    }
    $config = require __DIR__."../config.php";
    $obj = new ClassName($config);
    $obj->FunctionName();
    Ответ написан
    Комментировать
  • Как более производительней вносить и выводить из базы данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Оставь всё как есть, ничего руками не трогай.
    Ответ написан
    2 комментария
  • Как я могу улучшить свой php код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я остановлюсь на одном аспекте этого кода, но совершенно анекдотическом.

    Такое ощущение что все пэхапешники практически поголовно - потомки контрабандистов. Ну или мешочников, которые в китае покупают сумку за три копейки, везут в Хабаровск, вешают ценник "Луй Витон" и продают за пять. И даже если купят Настоящий Louis Vuitton, то все равно сдерут бирку и нацарапают шариковой ручкой другую. И это совершенно не укладывается в голове.

    Главной своей задачей он почему-то считают взять сообщение об ошибке, которое УЖЕ есть в РНР - актуальное, информативное, подробное, полезное, содержащее всю информацию, которая нужна для исправления проблемы... и замазать его шариковой ручкой, выдав вместо него бессмысленные каракули, которые никому не нужны.

    То есть они одновременно совершают бессмысленную работу - кропотливо создают сообщение об ошибке, когда оно и так уже есть, и при этом ещё и занимаются вредительством - удаляя всю полезную информацию которая могла бы помочь в исправлении проблемы.

    Этот твой код выглядит так, как будто тебя кто-то заставил выучить правило - "любой блок кода надо завернуть в try catch!" Причём доходит до анекдота - если уж совсем не знаешь, что делать внутри catch... то тупо делаешь throw. Зачем тогда вообще делать try? "А шоб було!".

    Вот взять самую первую проверку, ! file_exists($fileName). Если её выкинуть, то при попытке открыть несуществующий файл ты получишь подробное сообщение - КАКОЙ файл пытаешься открыть, и ПОЧЕМУ конкретно это не получилось. То есть сообщение об ошибке УЖЕ есть, и в миллион раз информативнее. И какой смысл повсюду втыкать file_exists - ЗАГАДКА. Загадка почище тайны египетских пирамид. Там хотя бы понятно, зачем их городили.

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

    Самое забавное, что все писатели, которые старательно выводят "Error saving language", совершенно не представляют себе - для кого они это делают. Для пользователя? Если он даже и увидит это сообщение (за что надо отдельно по рукам бить), то он и так знает, что проблема с сохранением языка - он этим и занимался. Не говоря уже про 'Unable to open file'. Какое филе? Почему унабле? Что с этим делать?
    Для программиста? Вместо подробного системного сообщения об ошибке читать эти загадки, серьёзно?

    В общем выкидывай все эти бессмысленные проверки. Ты работаешь с фреймворком, а не клепаешь на коленке. фреймворк писали не дураки, он прекрасно обработает все ошибки сам.

    И забудь ради бога это дурацкое правило, оборачивать любой блок кода в трай кетч. Вместо него запомни другое:

    Надо обязательно различать пользовательские и системные сообщения об ошибках:
    • пользовательские выдавать пользователю, только тогда когда он может что-то сделать. Например: проверить файл на валидность и выдать пользователю сообщение что он прислал не CSV, а какую-то ерунду. Но это НЕ делается путем выброса стандартного исключения. Это делается либо на этапе валидации входящих данных, либо - выбросом специального исключения, которое потом можно поймать в контроллере и вывести пользователю.
    • системные вообще никак не трогать руками. А дать фреймворку самому их обработать. На этапе разработки он выведет подобное и красивое сообщение об ошибке с кучей информации, а на боевом сервере аккуратно запишет ошибку в лог и покажет пользователю стандартную страничку "что-то пошло не так".



    Не принимай резкость этого текста персонально - просто это реально проблема с писателями на пэхапе в целом.
    Ответ написан