Задать вопрос

Коннект к БД из функций (PHP)

Вопрос, наверное, очень нубский, но я не знаю и не могу найти способ как правильно его решить. Заключается он в следующем.

Есть, допустим, такая иерархия файлов на сервере:
/
     index.php
     db.php
+  /fns
            functions.php
            ...
+  /profile
            index.php
            ...


Каждый из index.php получает доступ к БД посредством инклуда db.php, также в них инклудится functions.php. В functions.php мне нужно использовать доступ к базе из db.php.

Отсюда и сам вопрос: как? Как вызвать подключение $db внутри функций, которые лежат в functions.php? Сразу попытался инклудить файл коннекта к базе в сами функции, но так как в инклудах не рекомендуется использовать прямые пути, а лишь относительные, то естественно, возникает проблема с неверными путями.
  • Вопрос задан
  • 5753 просмотра
Подписаться 5 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 5
MarcusAurelius
@MarcusAurelius
автор Impress Application Server для Node.js
Варианты:

1. Сделайте статический класс db в db.php и в нем сделайте все функции «public static function» например: db::connect, db::query, db::freeCursor, db::getLasInserttId и т.д. и тогда вообще не нужно будет указатель на объект БД куда-то передавать в другие модули.

2. Сделайте у себя в проекте FrontController — то есть, единую точку входа, все URL переадресуйте на нее и вместо того, чтобы потом подключать все модули в каждом php файле — подключайте их один раз централизовано из одного файла, а там и с путями проблем не будет.

3. Сделайте в том файле, который устанавливает свзяь в БД переменную $db = db::connect(dbHost,dbName,dbUser,dbPassword); только объявляйте ее не внутри функции, а в теле php кода и потом во всех функциях, где нужно доступаться к пишите global $db; и далее $db->MethodName…

4. Прочтите все же что-то по областям видимости в PHP

5. Или возьмите готовый фреймворк, где эти задачи решены, а когда Вас от движка стошнит, а это рано или поздно случится, то к этому времени, Вы уже разберетесь как делать не нужно )
Ответ написан
Комментировать
«Каждый из index.php получает доступ к БД посредством инклуда db.php, также в них инклудится functions.php. В functions.php мне нужно использовать доступ к базе из db.php.»
— Мне кажется, что Вы либо используете очень старые книжки, либо видеоуроки быдлокодера Евгения Попова. Без обид…

Добавьте в начале index.php следующие функции:
// Процедура записи в лог фаил для записи ошибок
function writelog($typelog, $log_text) {
$log = fopen('logs/'.$typelog.'.txt','a+');
fwrite($log, "$log_text\r\n");
fclose($log);
}

// Процедура подключения к базе данных. Вызываете её, когда Вам нужно подключение
function dbconnect() {
global $database;
if (!isset($database)) {
$database = mysql_connect ("localhost", "**","****");
mysql_select_db("***", $database);
}
}

// Функция выполнения запросов с логированием ошибок
function sql_query($query) {
$return = mysql_query($query);
$error = mysql_error();
if ($error=='') {
return $return;
}
else {
writelog('sql_error', date("y.m.d H:m:s")."\t".$error);
return false;
};
}
Ответ написан
@DorBer
Например синглтон или просто статический метод. В итоге может быть что-то типа DB::getConnection();
Ответ написан
@Artqookie Автор вопроса
Спасибо всем за советы, особенно . Решилось синглтоном.
Ответ написан
golotyuk
@golotyuk
Если для подключения Вы используете mysql_connect и mysql_select_db, то Вам ничего не нужно, чтобы работать с базой данных из functions. Главное, чтобы подключение (db.php) включалось раньше, чем functions.php. Можете смело использовать mysql_connect внутри функций (она будет использовать глобальный ресурс подключения, который будет доступен везде).

Детальнее по Вашим вопросам советую почитать:
- Работа PHP и MySQL
- Организация кода
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы