Это ошибка обзорное. Вы делаете $DBH
глобальной переменной. Поэтому, когда вы вводите функцию, глобальная переменная недоступна. У вас есть 5 реальных вариантов.
1. Используйте глобальное ключевое слово
function doSomething() {
global $DBH;
//...
Это не очень хорошая идея, так как это делает обслуживание и тестирование пита. Представьте, что вы пытаетесь отладить этот вызов функции. Теперь вы должны пойти узнать, где $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. Используйте предварительно построенный класс/рамки
Это самый лучший вариант, так как вам не нужно беспокоиться о том делать это самостоятельно.
Классы доступа к базе данных:
Полное рамочные:
Действительно, выбор бесконечен. Найдите то, что вам нравится, и придерживайтесь его. Это действительно облегчит вашу жизнь ...
Удачи!
Спасибо. Как я могу сделать это глобальным и все еще держать вещи в безопасности? Я бы обернул соединение в функцию и назначил ему переменную вроде функции connect() {new myqsli («host», «test», «123456», «dbname»)} $ DBH = new connect(); (Переменные соединения фактически скрыты в другом файле.) – mcbeav 2010-12-16 17:19:49
Да, я бы сделал какую-то функцию и захватил соединение оттуда. – Jim 2010-12-16 17:22:38