2013-02-22 4 views
1

Мой класс базы данных отлично работает, и я называю это следующим образом: $db = new Database('user', 'pass', 'db', 'host');. В верхней части моего сценария я определяю эту базу данных, но позже в скрипте я пытаюсь использовать соединение внутри функции, но похоже, что $db не является глобальным, поэтому моя функция не может получить к нему доступ. У меня есть возможность создать новое соединение класса базы данных внутри каждой функции в моем скрипте, но я действительно хотел бы получить доступ к $db в качестве глобальной точки доступа.php доступ к классу db изнутри функции

Вот код:

require_once('database_class.php'); 

$db = new Database('user', 'pass', 'db', 'host'); 



// I can reach the $db here and make the $db->PDO->'statement'(); 



function userExists($user) { 

    $bool = false; 

    // But in here I can't access $db... 
    $query = $db->PDO->query('SELECT * FROM login WHERE username = "$user"'); 

    $result = $query->fetch(); 

    if ($result) { 

     // User exists 
     $bool = true; 

    } 

    return $bool; 

} 
+1

Исследование о Singleton шаблон. Он в основном используется для таких целей, как ваш. –

+0

Не совсем «ответ», а то, что я в основном делаю, - это методы (функции) класса, которые просто открывают соединение, выполняют запрос, закрывают соединение, а затем обрабатывают и возвращают данные. Может быть, какой-то специалист, который говорит, что лучше оставить соединение открытым, но я никогда не замечал влияния на производительность, делая это :) – 2013-02-22 15:50:28

ответ

1

Поместите глобальные $ дб в начале функции следующим образом:

function userExists($user) { 
     global $db; 

    // Rest of code here 

Переменные в функции существуют только локально по умолчанию в PHP. Чтобы использовать переменную, объявленную вне функции, которая не передается в качестве аргумента (например, $ user), вам нужно использовать глобальную переменную, как показано выше.

+0

Но когда переменная определена вне функции, она автоматическая «глобальная» или как? – Dimser

+0

Либо передать его как аргумент функции, либо объявить переменную глобальной. –

+2

@PhilipJensBramsted, когда он определен вне функции, он глобальный, но область действия внутри функции. Добавляя ключевое слово 'global', вы добавляете эту переменную в область вашей функции. – Mahdi

1

Возможно, вы можете просто изменить свои функции, чтобы принять аргумент $ db var в качестве аргумента. например :

function userExists($user, $db) { 
    ... 
} 

объекты передаются по ссылке по умолчанию (см here), так что вы не будете неосторожно делать копии объекта $ дб с каждым вызовом.

+0

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

0

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

функция userExists ($ USER, $ DB) {// codecodecode}

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