Юра
Хм. А вы вот знали чем отличается обычный мускуль запрос от prepared statement запроса?
Юра
Такой вопросик на собесе вот с подковыркой задать )
Юра
Только не гуглить. Я сам не знал до сегодняшнего дня
Max
Хм. А вы вот знали чем отличается обычный мускуль запрос от prepared statement запроса?
В контексте php или вне мира php? А то там ответы разные будут
Дмитрий
Хм. А вы вот знали чем отличается обычный мускуль запрос от prepared statement запроса?
что значит обычный мускуль запрос? пример будет? SELECT * FROM `table` WHERE `name` = 'Уася' такой?
Andrey
Хм. А вы вот знали чем отличается обычный мускуль запрос от prepared statement запроса?
Prepared подготавливает запрос, а потом хоть 100штук отправь - разбора запроса не будет, будет сразу выполнение
Andrey
по большому счёту разница в защищённости
Скорее в скорости Защищённости может на стороне либы сделана быть
Иван
Скорее в скорости Защищённости может на стороне либы сделана быть
вот вообще насрать, по сравнению с самой операцией это ни о чём
Andrey
вот вообще насрать, по сравнению с самой операцией это ни о чём
Это если одна операция, а если их куча будет?
Иван
а то что без лишних переживаний вставляешь из сырого ввода аргумент - это круто
Иван
Это если одна операция, а если их куча будет?
не надо выдумывать синтетические случаи, если реальные про другое
Andrey
а то что без лишних переживаний вставляешь из сырого ввода аргумент - это круто
Насколько помню, некоторые драйвера эмулируют реальные prepared То есть их нет, а ты даже не знаешь об этом
Alexey Mishurovskiy
В prepared можно пихать спокойно банные Prepared готовится один раз и повторные запросы выполняются быстрее значительно.
Alexey Mishurovskiy
Вопрос на котором я завалил сертификацию - что будет, если в prepare отправить запрос с duplicate key то не будет exception
Иван
сколько раз я за годы повторно слал подготовленный запрос? ну вот вчера добавлял набору пользователей набор ролей принципиальной разницы с тем, что я сконкатенировал бы в один инсерт нет совсем один инсерт было бы быстрее, чем в n*m но главное - я не парился, что у меня на входе инты
Alexey Mishurovskiy
инсерт игнор
не совсем
Юра
Да prepared statement парсится один раз и потом можео иего использовать меняя лишь параметры. Но еще prepared statements использует бинарный протокол передачи данных
Юра
обычный запрос все данные переводит в строку
Юра
Вот это для меня было удивлением
Юра
Наверное все клиенты под капотом всеравно используют prepared statement, ну либо гоняют строки по сети
Иван
Да prepared statement парсится один раз и потом можео иего использовать меняя лишь параметры. Но еще prepared statements использует бинарный протокол передачи данных
но! основная выгода для разработчика не в скорости, а в безопасности ну сколько там сэкономлено электронов в самом деле? всё равно надо по сети передавать, хоть и немного меньше всё равно искать или записывать
Иван
если уж заглубляться в нюансы сетевых протоколов, то не каждая экономия полубайта выливается в экономию сетевого пакета
Юра
просто это еще дополнительно тратится процессор на перевод всего в строку
Юра
помимо размера пакета
Юра
если у тебя куча чисел например
Юра
ведь хранится оно не в виде строки
Vlad
Вот на счет скорости
Vlad
https://www.php.net/manual/ru/pdo.prepare.php#114616
Юра
еще бы сравнить такой цикл с препаред и обычным
Юра
вот что сказано по поводу обычного запроса
Юра
A row with the data for each column. NULL is sent as 0xfb everything else is converted into a string and is sent as Protocol::LengthEncodedString.
Иван
а давайте ещё проверим, как быстрее массив на пустоту проверять
Юра
не ну понятно что там экономия не сильная, но поверь есть компании где экономят каждый байт
Иван
ну в самом деле, было бы оно чутка медленнее, я бы всё равно писал так
Юра
особенно меня веселит когда используют обычный джсон зато пишут типо { "A": 123, "B": "some_data"}
Юра
а ты сиди и думаб что такое А и Б
Иван
не ну понятно что там экономия не сильная, но поверь есть компании где экономят каждый байт
а ещё мы обмазываемся валидаторами, а могли бы просто доверять вводу, ага
Max
О какой безопасности вы вообще говорите, если на сервер базы данных всё равно уходит 1 запрос? Нет смысла говорить про “безопасные запросы” в контексте PHP, поскольку драйверы это не умеют 🤷‍♂️
Юра
безопасность наверное имеется в виду экранизация?
Alexey Mishurovskiy
безопасность наверное имеется в виду экранизация?
Экранирование😂 экранизация PHP пахнет порно
Юра
но тут кстати я не вижу ничего в доке про экранизацию prepared statement так что возможно она далется клиентом автоматичеки
Юра
сорян да экранирование )
Юра
вообщем если у вас какой-то микросервис который крутится в фоне и не умирает, я бы всетаки юзал prepared statements
Юра
не тратится время на парсинг запроса
Иван
ну как бы да, но это накопление стейта и требует дисциплины
Иван
$queryObject = $this->connection->prepare( 'INSERT IGNORE INTO users_roles (user_id, role_id) VALUES (:userId, :roleId)' ); foreach ($userIds as $userId) { foreach ($roleIds as $roleId) { $queryObject->execute(['roleId' => $roleId, 'userId' => $userId]); } }
Юра
Еще лайфхак, если нужно очень много делать инсертов, там есть настройка, как часто делать flush на диск. Если увеличить эту опцию, то скорость возрастает в разы
Юра
Но правда и риск потери
Max
безопасность наверное имеется в виду экранизация?
Под безопасностью имеется ввиду работа подготовленных запросов так как они должны работать. Может я чего не знаю из обновлений драйверов под базы данных на PHP, но в классический prepared statement они не умели. Выше писали про то что они всегда делали эмуляцию и не более
Юра
Я так тюнил мускуль для счётчика посещений. Работало очень быстро
Юра
Давно ведь уже существуют
Max
Они давно это эмулируют и у меня нет оснований полагать что что-то поменялось
Max
Просто я изначально задавал вопрос — “В контексте php или вне мира php? А то там ответы разные будут” То что я знаю про драйверы под PHP — они всегда эмулировали функционал prepared statement и, в принципе, никогда этого не скрывали. Под эмуляцией имеется ввиду что не осуществляется следующее: prepared statement отправляет строку запроса и то что в нём должно исполняться — в двух разных запросах в базу. Первый дает возможность составить план запроса, а второй его исполнять. В мире драйверов PHP prepared часть не осуществляет запрос в базу. Выжимка из коммента к методу PDO::prepared() — Emulated prepared statements does not communicate with the database server so PDO::prepare does not check the statement. Ок, эмулирование не ходит на сервер базы, логично. Но при этом сам PDO по умолчанию создается с флагом PDO::ATTR_EMULATE_PREPARES => false — что якобы значит что никто никогда и не включал эмуляцию 🤷‍♂️ Вы можете провести исследование и потыкать PDO с флагом PDO::ATTR_EMULATE_PREPARES в разных значениях. И узнать сколько и каких запросов уйдёт на сервер базы данных
Max
В догонку в контексте базы, для нормальной работы с prepared statement по хорошему важно уметь делать не только сам PREPARE а и DEALLOCATE PREPARE, но, насколько я знаю, таких механизмов в мире PHP нету. А потому даже если в каких-то конфигурациях, с какими-то базами, с какими-то драйверами у вас и получится сделать prepared statement, то нормально работать с таким в ближайшее время у вас не факт что получится. Ну или я чего не знаю и тогда с удовольствием послушаю какие-то новости или инсайты. Потому, как по мне, ответ на вопрос “Чем отличается обычный мускуль запрос от prepared statement запроса?” — В мире PHP ничем не отличается 🙂 а в остальных случаях отправляет sql-выражение и данные для него в двух отдельных запросах на сервер базы данных
Юра
DEALLOCATE сделается автоматом когда конекшн сдохнет
Юра
он в скоупе конекшена находится
Юра
так что тут проблем нету
Юра
утечек не будет
Max
DEALLOCATE сделается автоматом когда конекшн сдохнет
Тоже слышал такое, но не уверен что это работает для всех популярных баз, это во-первых, а во-вторых, что делать с persistent connection? Не то что бы прям хорошо просто так разбрасываться ресурсами и плодить соединения
Al
связь m2m в доктрине InverseJoinColumn.referencedColumnName отлично работает для выборки но при сохранении игнорирует и записывает id вместо monolith_id кто сталкивался с таким?
Alexey Mishurovskiy
Всем привет. а как правильно склеить OAuth и jwt?
A
Есть бандл от php league - oauth server
A
Там уже есть jwt. Или речь про клиент?
Alexey Mishurovskiy
ну вообще задача авторизоваться черещ oauth а потом это все переправить в мобильное приложение с jwt
Alexey Mishurovskiy
Есть бандл от php league - oauth server
да, он у меня стоит и сою функцию выполняет, вот придумываю как это все с мобилкой завязать.
Юра
А в чем требла. Jwt токе можно сгенерировать руками и отдать токен клиенту после успешной oauth авторизации
Alexey Mishurovskiy
Alexey Mishurovskiy
интересную статью нашел https://habr.com/ru/company/vk/blog/417031/
Юра
А лучше просто прикрути jwt рядом с oAuth
Юра
Юзер у тебя есть, отсалось только jwt прикрутить
Юра
И не городить огород
Юра
Чем сложноее система тем больше в ней дыр
Alexey Mishurovskiy
да вот как раз огород городить не хочу. oauth дает мне юзера с данными из внешней системы. дальше его надо как то авторизовать. пока не понимаю как.