16. MySQL 8 PREPARED statement подготовленные запросы

Поделиться
HTML-код
  • Опубликовано: 1 июн 2019
  • Prepared SQL Statement - использование подготовленных запросов в MySQL позволяет избежать SQL-инъекций, упростить работу в операторами вставки, удаления, обновления и выборки данных

Комментарии • 29

  • @user-bo4bc9ts3e
    @user-bo4bc9ts3e 4 года назад +3

    Разобрался, спасибо! Оказалось действительно не сложно!

  • @alexeicodes
    @alexeicodes 3 года назад +1

    Отличное видео! Спасибо большое за подробное объяснение

  • @cirkumflexmu
    @cirkumflexmu 4 года назад +2

    Спасибо!

  • @Pacangotoff
    @Pacangotoff Год назад

    День добрый. Интересует вопрос по примеру суммы квадрата катетов. Prepare stmt1 from 'select SQRT(POW(?,2)+POW(?,2)) AS hypotenuse' - в видео этот пример составления подготовленного запроса понятен, но вопрос про символ вопроса, а именно значения, которые вносятся нами в виде переменных @a=3 и @b=4 и в дальнейшем которые будут подставляться вместо знака вопроса! Порядок подстановки вместо знака вопроса какой? Сразу 3 подставляется или сразу 4?? В зависимости от положения переменной а и b в алфавите, то есть а со значение 3 первой будет подставляться, a b со значением 4 второй по порядку??? Либо хаотично? Я дотошно вникаю в эти мелочи.

    • @HtmllabRu
      @HtmllabRu  Год назад +1

      Дмитрий, переменные подставляются в соответствии с порядком в EXECUTE/USING
      mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
      mysql> PREPARE stmt2 FROM @s;
      mysql> SET @a = 6;
      mysql> SET @b = 8;
      mysql> EXECUTE stmt2 USING @a, @b;
      Тут идут "a", потом "b", значит "а" подставится вместо первого, а "b" - на место второго вопросительного знака

  • @rosgrad7422
    @rosgrad7422 3 года назад +1

    хорошее видео! Но, к сожалению так и не нашёл в нём ответа на свой вопрос. Как использовать PREPARE и EXECUTE для динамических вопрос. Допустим у меня есть в БД таблица, в колонке, которой записываются sql-запросы. Из этой таблицы я могу извлекать записи SELECT query FROM query_table. Которая вернёт несколько строк вроде «SELECT * FROM table», «SELECT 2+3», «ALTER TABLE old_name RENAME new_name», и т.д. Вот как мне преобразовать эту выборку, чтобы подставить в PRAPARE / EXECUTE для пакетного выполнения команд?

    • @HtmllabRu
      @HtmllabRu  3 года назад +1

      Только если через курсоры pastebin.com/jJYU90uD. За основу myproc() взял процедуру из доков dev.mysql.com/doc/refman/8.0/en/cursors.html

    • @rosgrad7422
      @rosgrad7422 3 года назад +1

      @@HtmllabRu спасибо за пример, надеюсь он рабочий. Не получилось увидеть результата SQL из-за проблемы с настройкой директивы default-character-set, которая нужна для чтения/записи в данном примере. Беглый просмотр гугл по данной директиве не помог исправить ошибку, а ковырять прям датошно сервер сейчас недосуг

    • @HtmllabRu
      @HtmllabRu  3 года назад +1

      @@rosgrad7422 пример рабочий - перед отправкой проверил на сервере с настройкой secure-file-priv=C:/mysql/upload. После отработки кода и вызова процедуры создаются три файла в upload

  • @maxzhenzhera
    @maxzhenzhera 3 года назад +2

    Я ознакомился с SQL-инъекциями. У меня есть вопрос:
    Если мне нужно передавать параметры типа `id` в какой-то SELECT, то будет ли secure-но использовать USING (в команде EXECUTE)?
    Если в запросе кто-то допишет дополнительно условие и перепишет запрос с UNION, будет ли сей метод передачи безопасным?
    Я не идеально точно в этом разобрался, прошу извинение за поспешность, но что вы скажете по этому поводу?

    • @HtmllabRu
      @HtmllabRu  3 года назад +1

      Будет безопасным - подготовленные запросы защищают от SQL-инъекций: paiza.io/projects/QH3ijsYjIddfqtdcH1SR4Q?language=mysql

    • @maxzhenzhera
      @maxzhenzhera 3 года назад +1

      ​@@HtmllabRu Спасибо, теперь я в этом уверен точно. Я сейчас смотрю и практикуюсь прямо по вашему курсу. Благодарю за собранную полезную информацию в одном месте. Можете ли вы порекомендовать что-то ещё, чтобы после вашего курса продвинуть навыки SQL?
      - -
      и ещё вопрос уже не к теме видео: можете ли вы подсказать как можно выгрузить формат через обычный запрос (не команду в консоли, а так, чтобы можно было его использовать как мини-функцию, например в `EVENT` ).
      - -
      Спасибо за вашу обратную связь! Она умножает ваш труд в видео в несколько раз!

    • @HtmllabRu
      @HtmllabRu  3 года назад +3

      @@maxzhenzhera практика, чтение оф. документации, решение реальных задач 👍

    • @maxzhenzhera
      @maxzhenzhera 3 года назад

      @@HtmllabRu Спасибо за ваш ответ! Полностью с вами согласен!
      Прошу прощения, я там изменил сообщение и вы возможно не увидели его вторую часть, что я дополнил. А именно:
      и ещё вопрос уже не к теме видео: можете ли вы подсказать как можно выгрузить формат через обычный запрос (не команду в консоли, а так, чтобы можно было его использовать как мини-функцию, например в `EVENT` ).
      - -
      Спасибо за вашу обратную связь! Она умножает ваш труд в видео в несколько раз!

    • @HtmllabRu
      @HtmllabRu  3 года назад

      @@maxzhenzhera насколько знаю, SELECT из коробки не помогает это сделать, если только сами напишете функцию.

  • @bloodborn9632
    @bloodborn9632 4 года назад +1

    Добрый день. У меня ворос по примеру с подсчетом строк в табице страны, если я меняю переменную table на сити, то чтобы мне получить количество строк в таблице сити нужно установить опять все переменные и заного запрос составить, так как старый запрос возвращает число строк в таблице страны, а можно как то составить запрос, чтобы не нужно было заного запрос состовлять после установки новых значений переменных. А то не пойму в чем тогда соль, если при изменении таблицы приходиться каждый раз новый запрос подготавливать. Спасибо.

    • @HtmllabRu
      @HtmllabRu  4 года назад +2

      Асыл, по поводу изменений запрос при изменении таблицы, плюсы подготовленных запросов в оперативности отработки и защите от SQL-инъекций. Так приходится менять запросы так, чтобы было актуальное название таблицы.
      Чтобы не нужно было менять много величин, можно написать процедуру, которая будет принимать название новой таблицы, а выводить или возвращать количество строк.

    • @bloodborn9632
      @bloodborn9632 4 года назад

      @@HtmllabRu спасибо

  • @vitaltennis
    @vitaltennis 10 месяцев назад

    В этой конструкции:
    SET @table='country';
    SET @query= CONCAT ('SELECT count(*) FROM ', @table);
    PREPARE stmt2 FROM @query;
    EXECUTE stmt2;
    Если я захочу таблицу city, то мне нужно заново вызывать всю конструкцию, т.к. просто объявить SET @table='city'; не работает. Так и должно быть?

    • @HtmllabRu
      @HtmllabRu  10 месяцев назад +1

      Да, так и есть.

  • @Alexander-fq1bu
    @Alexander-fq1bu 4 года назад +6

    Звонок из школы:
    : Алло!
    : Добрый день! Это учитель информатики из школы вашего сына. У нас проблема...
    : БОЖЕ МОЙ! Он опять что-то сломал???
    : Типо того...
    : Вы правда назвали своего сына: Василий'); DROP TABLE Students;-- ?
    : Ну, да... мы его завем Дропик...
    : Б%@!!! МЫ ПОТЕРЯЛИ ВСЕ ДАННЫЕ О ШКОЛЬНИКАХ ЗА ПОСЛЕДНИЙ ГОД!!!

  • @asd-sl1kv
    @asd-sl1kv 3 года назад

    ничего не понял но очень интересно, у меня проблема: говнокожу на пхп по вечерам пока никто не видит, у меня есть строка с запросом в которую я вставляю переменные, в итоге переменные не видит сам код хотя кавычки разные использую, уже узнал такую особенность что одинарные кавычке здесь не видят внутри себя переменные, но если конкатенирую строки по кусочкам запрос собираю тоже ничего не получается, "SELECT * FROM users WHERE login = 'user' AND password = '236236' ; " знаю что такое не будет работать но как реализовать этот запрос чтобы из пхп его выполнять подскажите пожалуйста

    • @HtmllabRu
      @HtmllabRu  3 года назад +1

      Речь ведь идёт просто о формировании строки запроса?
      $login = 'user';
      $password = 236236;
      echo $sqlQuery = "SELECT * FROM users WHERE login = '$login' AND password = '$password'";
      вывод строки phpsandbox.io/n/old-king-krb7-3vzkq

  • @shynggyskasseke7023
    @shynggyskasseke7023 2 года назад

    Это типа функция или метод как на языках программирование?

    • @HtmllabRu
      @HtmllabRu  2 года назад +1

      больше похоже на экранирование: SQL-запрос подготавливается так, что в него не могут внедрены другие фрагменты SQL

  • @victordelacroix654
    @victordelacroix654 3 года назад

    Мне было бы проще разобраться с чем-то подобным...
    PREPARE stml1 FROM 'SELECT 2 + 4';
    EXECUTE stml1;
    DEALLOCATE PREPARE stmt1; или
    - освобождает память от запроса.
    Но не понял, как в моём пример воткнуть переменную на места 2 и 4, в которые я позже смогу вставлять разные значения. Как в первом примере видео через SET @a и SET @b.

    • @HtmllabRu
      @HtmllabRu  3 года назад +2

      PREPARE stml1 FROM 'SELECT ? "Первый" ,? "Второй"';
      SET @a = 1;
      SET @b = 'Hello';
      EXECUTE stml1 USING @a, @b;
      PREPARE stml1 FROM 'SELECT * from Test where id=? or title=?';
      SET @a = 1;
      SET @b = 'Hello';
      EXECUTE stml1 USING @a, @b;
      Не уверен, что ссылка будет вести на боевой пример, но попробую paiza.io/projects/FK0dOA3KrMDWC7PGxTTEAQ?language=mysql

    • @victordelacroix654
      @victordelacroix654 3 года назад

      @@HtmllabRu спасибо, понял. Ссылка норм сработала.