Определенно не открывайте новое соединение для каждого оператора SQL. Это очень расточительно, потому что вы можете выполнить много запросов во время одного запроса PHP, и есть некоторые издержки, связанные с открытием нового сокета и аутентификацией пользователя MySQL. Это не так плохо, как накладные расходы для Oracle или других баз данных, но это то, что вы должны попытаться минимизировать, где это возможно.
Но вы не можете определить константу для вашего dbh.
http://php.net/define говорит:
... разрешены только скалярные и нулевые значения. Скалярными значениями являются целые, плавающие, строковые или логические значения.
Другими словами, экземпляр объекта или массив не является допустимым значением для константы:
<?php
define('DB', new stdClass());
Warning: Constants may only evaluate to scalar values
in test_define_constant_object.php on line 3
Вы можете сделать свой $ dbh глобальным, но многие разработчики PHP не рекомендуют использовать глобальные.
Вы также можете использовать Шаблон реестра , который в основном является классом глобального массива, который вы можете использовать вместо отдельных глобальных переменных. Сделайте это в загрузочном коде для вашего скрипта, чтобы он запускался только один раз за запрос:
Zend_Registry::set("dbh", new PDO(...));
Тогда в твоих функциях:
$dbh = Zend_Registry::get("dbh");
$s = $dbh->prepare("...");