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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Главное чувак не палясь рассылает спам, а потом вдруг "ой, какая-то подозрительная активность!"
    Ответ написан
    Комментировать
  • Почему не работает 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 это ещё цветочки - она тебе таблицу вообще изуродует, если ты передашь неподходящие, по её мнению данные.
    Ответ написан
    Комментировать
  • Почему после установки не совпадает структура папок Laravel?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    гайды-то небось от 5 версии, если вообще не 4-й
    исправить просто - смотреть не "гайды", а документацию
    Ответ написан
    6 комментариев
  • Что делать с кодировкой тела сообщения 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, а какую-то ерунду. Но это НЕ делается путем выброса стандартного исключения. Это делается либо на этапе валидации входящих данных, либо - выбросом специального исключения, которое потом можно поймать в контроллере и вывести пользователю.
    • системные вообще никак не трогать руками. А дать фреймворку самому их обработать. На этапе разработки он выведет подобное и красивое сообщение об ошибке с кучей информации, а на боевом сервере аккуратно запишет ошибку в лог и покажет пользователю стандартную страничку "что-то пошло не так".



    Не принимай резкость этого текста персонально - просто это реально проблема с писателями на пэхапе в целом.
    Ответ написан
  • Можно ли полноценно заменить bat или bash другим языком?

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

    или речь о самой командной оболочке.
    но в этом случае смысл несколько ускользает.
    но в принципе возможно. в линуксе оболочки вообще принято менять как перчатки.
    как минимум есть csh, синтаксис которой напоминает С
    сейчас погуглил - вроде есть Xonsh и ipython

    с виндой думаю сложнее, тем кроме цмд и АС вряд ли можно что-то прикрутить
    Ответ написан
    6 комментариев
  • Сколько и каким образом "отлавливать" исключений (ошибок) при запросе?

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

    То есть ошибки, после которых продолжение работы бесполезно, вообще никак не отлавливать не надо. Ларавель сама за тебя все отловит и напишет. Потому что в ней уже все оформлено, и отлов и обработка. И не надо туда лезть руками.

    Дальше, если ошибка не критическая и продолжение работы возможно, отлавливать трай кетчем.

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

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