Symfony Doctrine и prepared statements

pr1

Новичок
Привет друзья. Изучаю Symfony, просьба объяснить один момент.

В Doctrine подготовленные выражения разве не используются?
Например:

PHP:
    /**
     * @Route("/page/{slug}", name="show_page")
     */
    public function show(Page $page)
    {
        return $this->render('page/show.html.twig', [
            'page' => $page
        ]);
    }
В логах mysql значения подставляются напрямую. Или же это эмуляция в PDO?
SQL:
SELECT t0.id AS id_1, t0.title AS title_2, t0.slug AS slug_3 FROM page t0 WHERE t0.slug = 'test'
Тоже самое с $this->repository->find($value) и т.д.

Прописал в параметр всякие UNION и т.д, но там вроде экранируется все, если в WHERE число, приводится к int. Но все таки, есть ли возможность указать, чтобы использовались именно подготовленные запросы?

Никак не могу найти ответ в документации.
 

Фанат

oncle terrible
Команда форума
Ты запусти подготовленный запрос из mysqli и посмотри лог mysql.

Это фишка мускуля - он все подготовленные запросы конвертит в SQL автоматом
 

pr1

Новичок
Ты запусти подготовленный запрос из mysqli и посмотри лог mysql.

Это фишка мускуля - он все подготовленные запросы конвертит в SQL автоматом
Вызов из mysqli
PHP:
$mysqli = new mysqli("localhost", "root", "", "testo");
$stmt = $mysqli->prepare('SELECT * FROM page WHERE slug = ?');
$stmt->bind_param("s", $slug);
$stmt->execute();
Лог mysql:
SQL:
Connect    root@localhost on testo using TCP/IP
Prepare    SELECT * FROM page WHERE slug = ?
Execute    SELECT * FROM page WHERE slug = 'test'
Close stmt
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Хм. Mea culpa. Я был уверен что тупо пишет SQL.
Тогда получается что эмуляция в ПДО

Можешь еще релевантный код доктрины привести? У тебя в примере твиг
 

pr1

Новичок
Хм. Mea culpa. Я был уверен что тупо пишет SQL.
Тогда получается что эмуляция в ПДО

Можешь еще релевантный код доктрины привести? У тебя в примере твиг
Имеется ввиду прямой запрос через repository?
Код:
    /** @var PageRepository $repository  */
    private $repository;

    public function __construct(PageRepository $repository)
    {
        $this->repository = $repository ;
    }
    
    /**
     * @Route("/page/{value}", name="show_page")
     */
    public function show($value)
    {
        $page = $this->repository->findBy(['slug' => $value]);
        return $this->render('page/show.html.twig', [
            'page' => $page
        ]);
    }
Тоже самое
SQL:
Connect    root@localhost on testo using TCP/IP
Query    SELECT t0.id AS id_1, t0.title AS title_2, t0.slug AS slug_3 FROM page t0 WHERE t0.slug = 'test'
 

pr1

Новичок
В общем не знаю насколько правильное решение, только вчера начал изучать Doctrine и Symfony. Эмуляцию смог убрать в файле config/packages/doctrine.yaml
YAML:
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        options:
            20: false
20 это номер PDO::ATTR_EMULATE_PREPARES
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
зачем? авторы драйвера mysql не просто так ее включили по умолчанию
 

pr1

Новичок
Возможно я параноик, но все же предпочитаю это дело доверить самой СУБД.
 

AmdY

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

Фанат

oncle terrible
Команда форума
так драйвер писала команда mysql, это и есть сама субд
Откуда дровишки? В смысле информация?

Насколько я это понимаю, драйвер, писанный в mysql - это mysqlnd. И как мы все знаем, он прекрасно работает с подготовленными выражовываниями в mysqli. То есть про нестабильность без эмуляции тоже как-то верится с трудомм.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
это был риторический вопрос? :) драйвер для 4ки давно выбросили, сейчас есть только mysqlnd
 

Фанат

oncle terrible
Команда форума
это был риторический вопрос? :) драйвер для 4ки давно выбросили, сейчас есть только mysqlnd
И я об этом. команда mysql писала libmysql/mysqlnd, но биндинги к ней и эмуляцию писал Wes.
Соответственно, "включили эмуляцию по умолчанию " не команда mysql, а Wes.
 

Фанат

oncle terrible
Команда форума
Я правильно понимаю, что при эмуляции там под капотом mysql_real_escape_string?
Если не вдаваться в детали, то да.
То есть эмулированные препареды столь же безопасны, как и родные.
 

AmdY

Пью пиво
Команда форума
вы только не забывайте, что в доктрине дата мэпер со своими обёртками поверх pdo.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Если не вдаваться в детали, то да.
То есть эмулированные препареды столь же безопасны, как и родные.
Родные препареды не зависят от выбранных кодировок, конечно, поэтому они всегда экранируют правильно. Ну и родные препареды значительно быстрее на батчах.
 
Сверху