Ответ 1
Это ошибка определения области видимости. Вы делаете $DBH
глобальную переменную. Поэтому, когда вы вводите функцию, глобальная переменная недоступна. У вас есть 5 реальных опций.
1. Используйте глобальное ключевое слово
function doSomething() {
global $DBH;
//...
Это не очень хорошая идея, так как это делает техническое обслуживание и тестирование PITA. Представьте, что вы пытаетесь отладить этот вызов функции. Теперь вам нужно выяснить, где $DBH
определено, чтобы выяснить, что происходит...
2. Сделайте $DBH
параметр для функции
function doSomething(MySQLi $DBH) {
У него есть преимущество быть явным. Но это все еще не очень хорошо, так как вызывающий код должен отслеживать глобальную переменную.
3. Создайте функцию, чтобы "получить" объект $DBH
function getDBH() {
static $DBH = null;
if (is_null($DBH)) {
$DBH = new mysqli(...);
}
return $DBH;
}
function doSomething() {
$DBH = getDBH();
}
Преимущество этой проблемы состоит в том, чтобы полностью решить проблему глобальных переменных. Но также трудно иметь несколько соединений или повторно использовать какой-либо код для других подключений.
4. Создайте класс для переноса доступа к базе данных
class Database {
public function __construct($host, $user, $pass) {
$this->DBH = new MySQli($host, $user, $pass);
}
public function doSOmething() {
$this->DBH->foo();
}
}
Это инкапсулирует все для вас. Весь доступ к базе данных будет проходить через один класс, поэтому вам не нужно беспокоиться о доступе к глобальной переменной или о чем-либо еще.
5. Используйте предварительно построенный класс/фреймворк
Это лучший вариант, так как вам не нужно беспокоиться о том, чтобы сделать это самостоятельно.
Классы доступа к базам данных:
- Быстрый поиск Google, чтобы вы начали
- Doctrine ORM - Полная библиотека доступа к базе данных с полным ORM (Object Mapping)
- ADODB - библиотека доступа к базам данных с агностикой
- Pear MDB2 - Другая библиотека доступа к базе данных
Полные рамки:
- Zend Framework
- Литиевая инфраструктура
- Идентификатор кода
- (на самом деле есть намного больше, я больше не собираюсь перечислять листинг, так как этот вопрос все вместе...)
Действительно, выбор бесконечен. Найдите то, что вам нравится, и придерживайтесь его. Это действительно облегчит вашу жизнь...
Удачи!