Как я могу использовать общий объект PDO для всех моих функций?Могу ли я определить соединение PDO как константу и использовать его? - PullRequest
0 голосов
/ 10 декабря 2011

Теперь я создаю объект dbo в каждой функции на моей странице php. может

define($dbh3, new PDO(...));//test

постановка на работу? я могу вызвать объект PDO как глобальную константу? Как я могу создать общее соединение pdo? Нужно ли создавать объект pdo в каждой функции?

Текущая ситуация:

$dbh = new PDO(...);
define($dbh3, new PDO(...));//test

function actorexists($name) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("...");
}

function login($name, $password) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("..."}
}

function actorbyname($name) {
  $dbh = new PDO(...);
  $s = $dbh->prepare("...;
}

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Определенно не открывайте новое соединение для каждого оператора 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("...");    
0 голосов
/ 10 декабря 2011

Я бы не стал определять объект как константу.Учитывая ваш пример, вы можете вставить его туда, где вам нужно.

function actorexists($pdo, $name) {
  $s = $pdo->prepare("...");
}

function login($pdo, $name, $password) {
  $s = $pdo->prepare("...");
}

function actorbyname($pdo, $name) {
  $s = $pdo->prepare("...");
}

$dbh = new PDO("...");
$exists = actorexists($dbh, 'foo');
$foo = actorbyname($dbh, 'foo');
...