Юра
Хм. А вы вот знали чем отличается обычный мускуль запрос от prepared statement запроса?
Юра
Такой вопросик на собесе вот с подковыркой задать )
Юра
Только не гуглить. Я сам не знал до сегодняшнего дня
Max
Dmitry
Иван
Иван
Andrey
Иван
а то что без лишних переживаний вставляешь из сырого ввода аргумент - это круто
Andrey
Alexey Mishurovskiy
В prepared можно пихать спокойно банные
Prepared готовится один раз и повторные запросы выполняются быстрее значительно.
Alexey Mishurovskiy
Вопрос на котором я завалил сертификацию - что будет, если в prepare отправить запрос с duplicate key то не будет exception
Иван
сколько раз я за годы повторно слал подготовленный запрос?
ну вот вчера добавлял набору пользователей набор ролей
принципиальной разницы с тем, что я сконкатенировал бы в один инсерт нет совсем
один инсерт было бы быстрее, чем в n*m
но главное - я не парился, что у меня на входе инты
Иван
Alexey Mishurovskiy
Юра
Да prepared statement парсится один раз и потом можео иего использовать меняя лишь параметры. Но еще prepared statements использует бинарный протокол передачи данных
Юра
обычный запрос все данные переводит в строку
Юра
Вот это для меня было удивлением
Юра
Наверное все клиенты под капотом всеравно используют prepared statement, ну либо гоняют строки по сети
Иван
если уж заглубляться в нюансы сетевых протоколов, то не каждая экономия полубайта выливается в экономию сетевого пакета
Юра
просто это еще дополнительно тратится процессор на перевод всего в строку
Юра
помимо размера пакета
Юра
если у тебя куча чисел например
Юра
ведь хранится оно не в виде строки
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.
Иван
а давайте ещё проверим, как быстрее массив на пустоту проверять
Alexey Mishurovskiy
Юра
не ну понятно что там экономия не сильная, но поверь есть компании где экономят каждый байт
Иван
ну в самом деле, было бы оно чутка медленнее, я бы всё равно писал так
Юра
особенно меня веселит когда используют обычный джсон зато пишут типо { "A": 123, "B": "some_data"}
Юра
а ты сиди и думаб что такое А и Б
Иван
Max
О какой безопасности вы вообще говорите, если на сервер базы данных всё равно уходит 1 запрос? Нет смысла говорить про “безопасные запросы” в контексте 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
В догонку в контексте базы, для нормальной работы с 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
Юра
А в чем требла. Jwt токе можно сгенерировать руками и отдать токен клиенту после успешной oauth авторизации
Alexey Mishurovskiy
Alexey Mishurovskiy
интересную статью нашел https://habr.com/ru/company/vk/blog/417031/
Юра
А лучше просто прикрути jwt рядом с oAuth
Юра
Юзер у тебя есть, отсалось только jwt прикрутить
Юра
И не городить огород
Юра
Чем сложноее система тем больше в ней дыр
Alexey Mishurovskiy
да вот как раз огород городить не хочу. oauth дает мне юзера с данными из внешней системы. дальше его надо как то авторизовать. пока не понимаю как.