2014-12-17 4 views
0

Я переехал в PDO и написал небольшую функцию для всех моих запросов (SELECT/DELETE/INSERT/UPDATE):Как избежать нескольких подключений к базе данных?

function pdo_query($query, $parameter) 
{ 

    try { 
     $db=new PDO("mysql:host=localhost;dbname=...","root",""); 
    } catch (PDOException $e) { 
     die("DB-Error!"); 
    } 
    $stmt = $db->prepare($query); 
    $stmt->execute($parameter); 
    if (substr($query,0,6)=="SELECT") { 
     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } else { 
     return $stmt->rowCount(); 
    } 

} 

я использую эту функцию несколько раз на некоторых страницах, и поэтому он производит несколько дБ/соединяют объекты.

Возможно ли установить соединение вне функции запроса?

Я думал, что это может работать, но это не делает:

global $db; 

try { 
    $db=new PDO("mysql:host=localhost;dbname=...","root",""); 
} catch (PDOException $e) { 
    die("DB-Error!"); 
} 

function pdo_query($query, $parameter) 
{ 
    $stmt = $db->prepare($query); 
    $stmt->execute($parameter); 
    if (substr($query,0,6)=="SELECT") { 
     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } else { 
     return $stmt->rowCount(); 
    } 
} 

Любые идеи?

+1

глобальные $ db также должны быть определены в вашей функции. –

+0

«Я думал, что это может сработать, но это не так» - пожалуйста, опишите, что произошло, т. Е. Эффект или сообщение об ошибке. –

ответ

0

Вы также должны использовать global $db; внутри своей функции. Но когда вы начинаете делать такие вещи, спросите себя: «Почему я не пишу OO-код»? Напишите класс, определите $db как статический член этого класса и инициализируйте его один раз в конструкторе.

Еще лучше сделать это в базовом классе, а затем расширить этот класс для различных таблиц, которые вам нужно запросить. Вы будете на пути ...

0

Ключевое слово global используется на уровне функции и сообщает функции, чтобы найти и использовать переменную из глобальной области. Для того, чтобы сделать эту работу, сделайте следующее:

function pdo_query($query, $parameter) 
{ 
    global $db; 
    $stmt = $db->prepare($query); 
    ... 

и ликвидация первоначальной глобальной декларации, так как она больше не нужно:

global $db; 

Наконец, рассмотрит герметизирующий все это в классе для истинно объектно-ориентированного программирование.

0

Нет необходимости использовать глобальные. Независимо от того, является ли ваша функция методом класса или просто функцией, она может принимать соединение с базой данных в качестве аргумента. Таким образом, вы можете создать соединение один раз и передать его в зависимости от того, какая функция ему нужна.

function pdo_query ($connection, $query, $parameter) { 
    $stmt = $connection->prepare($query); 
    $stmt->execute($parameter); 
    if (substr($query, 0, 6) == "SELECT") { 
     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } else { 
     return $stmt->rowCount(); 
    } 
} 

try { 
    $db=new PDO("mysql:host=localhost;dbname=...","root",""); 
} catch (PDOException $e) { 
    die("DB-Error!"); 
} 

$result = pdo_query($db, $the_query, $the_params); 
0

Для тех же проблем, я выбрал следующее решение:
- создать класс «Dbwrapper», имеющий PDO БД в качестве члена.
- конструктор инициализирует членов с полезной информацией ($this->host, ->user, ->password, ->db и т. Д.) И устанавливает логическую переменную $this->isconnected на значение false. Конструктор НЕ открывает соединение (*).
- connect() метод проверяет значение $this->isconnected: если не подключено, на самом деле открывает соединение (конкретизирует п.д.о. член) и, в случае успеха, устанавливает $this->isconnected истинные
- методы запросов начинаются с вызовом connect(), который просто делает. .. ничего, если он уже подключен, и подключается в противном случае.

Так что теперь мне просто нужно создать экземпляр нового объекта Dbwrapper и вызывать его методы запроса каждый раз, когда у меня есть запрос для выполнения, без каких-либо проблем с открытием БД, он выполняется прозрачно и только при необходимости.

Обратите внимание, что я решил определить класс оболочки вокруг объекта pdo. Вы можете также рассмотреть возможность получения собственного класса из pdo для добавления этой функции.

(*) как конструктор просто выполняет несколько переменных инициализаций и не открывает какое-либо соединение, я обычно создаю его один раз для всех в файле init.php (среди других определений переменных на сайте), который включен в каждый скрипт сайта.

Смежные вопросы