Я искал ответ на этот вопрос, но ничего не нашел. Являются ли вызовы в PDO :: prepare () кешированными или я должен кэшировать результат сам, т.е. если я делаю следующее
function foo () { $handle = PDO::prepare(...); /* do stuff with the handle */ }
будет ли инструкция prepare () кэшироваться PDO, чтобы быстро получить второй, третий и т. д. раз? Или лучше сделать это самостоятельно, например
function foo() { static $handle = null; if (!$handle) { $handle = PDO::prepare(...); } /* do stuff with the handle */ }
Существует кеш запросов MySQL . Но в целом вы должны обязательно сохранить идентификатор подготовленного оператора и повторно использовать его.
Два последующих вызова PDO::prepare()
(даже с одним и тем же SQL-запросом) должны возвращать два разных PDOStatement
(или дескриптора), чтобы избежать коллизий, особенно между предыдущими и текущими привязками, которые вы можете применить к нему. Стоимость создания PDOStatement с prepare()
в любом случае низкая. То, что вы можете захотеть кэшировать, – это результаты, возвращенные из одного и того же SQL-запроса, либо raw, либо созданные методом prepare (), и это функция вашей СУБД (например, MySQL), а не PHP.
Это зависит от вашего драйвера базы данных. С MySQL PDO будет создавать собственный подготовленный оператор по умолчанию. Вы можете отключить его, если хотите использовать фактический кеш запросов.
Если вы абсолютно должны повторять один и тот же запрос, тогда да, вы захотите сохранить этот дескриптор. Если вы используете эмулированные подготовленные заявления, тогда это не имеет никакого значения.