Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Что конкретно делает эта функция mysqli_real_escape_string()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQL инъекции, уже облажался.

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

    Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
    SELECT * FROM table WHERE name='vasya'
    Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
    SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'

    Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
    Поэтому кавычки надо экранировать.
    SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'

    никаких ошибок не выдаст.
    Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки,
    SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'

    то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
    Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений.

    Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в которых слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
    Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

    Но читатель уж сучит ножками в нетерпении - а что же SQL инъекции, о которых так долго говорили большевики? Не может же быть, чтобы они были совсем не при чем. Окей, в качестве побочного эффекта, строка, в которой экранированы спецсимволы (слеш и кавычка), не пропустит инъекцию. Но здесь следует понимать две вещи:

    1. Строки надо форматировать в любом случае, независимо от того, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна.
    2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью.

    То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

    Нашлись умные люди, которые придумали, что колупаться вручную с форматированием переменных для SQL запроса - это долго, неудобно, и можно что-то забыть или перепутать. И пусть лучше БД сама этим занимается. И придумали вместо переменных подставлять в запрос специальные маркеры, а сами переменные передавать отдельно. А БД уже потом сама разберется, что и как форматировать.

    В принципе, mysqli умеет так делать, но не так удобно как PDO. Поэтому при возможности вместо нее лучше использовать PDO:
    $stmt = $pdo->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->execute(["Vasya", "Д'Артаньян"]);
    $rows = $stmt->fetchAll();
    - и получить, в итоге, готовый массив с данными, которые вернула БД.
    Если же возможности нет, то кода придется написать чуть побольше
    $stmt = $mysqli->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->bind_param("ss", ...["Vasya", "Д'Артаньян"]);
    $stmt->execute();
    $rows = $stmt->fetch_all(MYSQLI_ASSOC);


    Но при этом всё равно никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. Просто, быстро, лаконично и безопасно.
    Ответ написан
    4 комментария
  • Объединение запросов SQL, в один запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    требуется оптимизации в один запрос

    Не требуется.
    Никакой "оптимизации" это не даст.

    Если на пальцах, то просто забудь про любые "оптимизации". Вместо этого наладь дела с join. Это не прибавит оптимзации, но зато будет примерно в 100500 раз полезнее
    Ответ написан
    Комментировать
  • Как вместить несколько условий в if (Оператор &&)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если вы пока еще не очень хорошо понимаете, как пользоваться тернарным оператором, то лучше использовать обычный оператор условного перехода
    if ($_POST['ans'] == 'ans1' && $_POST ['farb'] == 'farb1' && $_POST ['seit'] == 'seit1')
        $folder = 'Folder_A4_SW_EIN';
    } else {
        $folder = 'img7';
    }
    Ответ написан
    Комментировать
  • Как подключить файл из корневой папки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для ответа на этот вопрос следует научиться отличать пути в файловой системе от путей на виртуальном веб-сайте.
    И все сразу встанет на свои места. Для этого читаем здесь: phpfaq.ru/newbie/paths

    По прочтении сразу станет ясно, что /folder2/b.php не будет работать по определению, а вот ../folder2/b.php писать не следует, но сработать по идее должно. И если не сработало, то твои представления о структуре каталогов не соответствуют реальности.

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

    Скорее всего, проблема в регистре букв. Который dirname учитывает, а накаляканое от руки folderfolder - нет
    Ответ написан
  • Что нужно знать для написания регистрации/авторизации на PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. Формы, метод ПОСТ
    2. Хэширование паролей.
    3. Базовый SQL - INSERT, SELECT
    4. ПДО с подготовленными выражениями
    5. Сессии

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

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

    Ссылки
    - Хэширование пароля https://php.net/password_hash
    - INSERT с помощью ПДО https://phpdelusions.net/pdo_examples/insert
    - Пророверка пароля https://phpdelusions.net/pdo_examples/password_hash
    - Сессии https://www.php.net/manual/ru/session.examples.bas...
    Ответ написан
    Комментировать
  • Почему не идут данные в бд после отправки формы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед соединением с БД надо написать строчку

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    после этого пхп будет всегда сообщать, почему запрос не был выполнен
    Ответ написан
    2 комментария
  • Как безопасно загружать данные из базы данных с помощью AJAX?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    JSON
    Ответ написан
    Комментировать
  • Парсил каталог товаров оптовика, заблочили, как быть?

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

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

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

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

    То есть вместо стандартного подхода мы усложняем код, чтобы в итоге получить проблему. Я искренне не понимаю, какой в этом смысл
    Ответ написан
    2 комментария
  • Как отправить несколько вложений PHP mail?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Три простых шага для решения данной проблемы:

    1. Посмотреть на календарь и уточнить, какой сейчас век на дворе.
    2. Аккуратно выделить этот код, и нажать клавишу Del
    3. Скачать phpmailer
    4. Забыть все эти кустарные ковыряния как страшный сон.

    В итоге код должен получиться примерно таким:

    require 'PHPMailerAutoload.php';
    $mail = new PHPMailer;
    $mail->setFrom('from@example.com', 'First Last');
    $mail->addAddress('whoto@example.com', 'John Doe');
    $mail->Subject = 'PHPMailer file sender';
    $mail->msgHTML("My message body");
    // Attach uploaded files
    $mail->addAttachment($filename1);
    $mail->addAttachment($filename2);
    $r = $mail->send();

    следует понимать, что отправка почты - это не просто копирование в свой скрипт каких-то определенных сочетаний символов, которые случайно сработали в прошлом веке у автора какой-либо допотопной статьи. Это гораздо более сложный процесс, который включает множество нюансов. И поэтому отправку почты надо не лепить вручную на ходу из навоза и палок, а доверить проверенному и отлаженному решению.
    Ответ написан
    Комментировать
  • Где найти расположение конфигурации php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вся конфигурация смотрится в phpinfo() (или php -i для консоли).

    От попадания в спам директива sendmail_path не поможет
    Ответ написан
  • Как защитить php файл от пользователей?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я понимаю что это ну очень сложно, но учимся осваивать программу Гуголь
    https://www.google.com/search?q=тостер+сравнить+да...
    Ответ написан
    Комментировать
  • Как правильно вывести ссылку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Оторвать руки тому, кто записывает такие ссылки в базу. Потом заставить его все исправить.
    После этого просто выводить как есть.
    Ответ написан
    2 комментария
  • Как делать запись html текста в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    До того, как этот вопрос закроют как дубль, скопирую свой ответ.

    Развернутый ответ на этот вопрос дан здесь: Правильный способ хранения HTML-кода в MySQL

    100500 страниц читать не надо. Надо прочесть три (это если сообразительности не хватает экстраполировать принципы выполнения одного типа запроса на остальные)

    - как соединяться с PDO
    - как делать запросы INSERT
    - как делать запросы UPDATE
    Ответ написан
    7 комментариев
  • Как передать переменную содержащую Html и выполнить SQL запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Больше всего в таких топиках поражают ответы. "Экранируйте". "addslashes". Странно, что не предлагают еще каменным молотком на гранитной глыбе HTML выбивать.

    Развернутый ответ на этот вопрос дан здесь: Правильный способ хранения HTML-кода в MySQL

    Конкретная реализация зависит от того, что лежит в $this->DB

    Помимо всего прочего, такой HTML никогда не хранят в БД. Сохранять такие отформатированные сообщения в базе данных неверно по тысяче причин. Это бессмысленно и вредно. Все украшения надо добавлять при выводе, а в БД хранить только исходные данные.
    Ответ написан
  • Как можно защитить PHP, не замедлив его?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ваш код никому не нужен.
    Ответ написан
    Комментировать
  • Почему всем так нужен Doctrine, если он много не умеет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Доктрина большая. Есть DBAL, есть квери билдер, есть ORM.

    Конкретно мы используем в качестве ORM. Потому что работать с объектами удобно.
    За удобство приходится платить.

    Про "самый сложный фреймфорк" и "идола" - это, разумеется, детский лепет.
    Ответ написан
  • Возможно ли при проверке empty обрезать лишние символы strip tagom?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это будет бессмысленно. Функцию empty() применять для существующих переменных нет смысла. ЕЕ применяют только для переменных, которые теоретически могут не существовать.

    Поэтому имеет смысл писать только так
    if (strip_tags($_COOKIE['text'])))
    {
        ок
    }
    Ответ написан
    Комментировать
  • Можно ли хранить SQL запрос в переменной сессии PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это совершенно бессмысленно.

    Вообще, есть простое правило: не следует усложнять код на пустом месте.
    Любой код должен всегда решать кокретную, существующую проблему. "Я тут подумал" - это не проблема. Поэтому решать её не надо.
    Ответ написан
    Комментировать