php scope: объект класса не виден в функции - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть простой класс-оболочка mysqli, который я использую для операций с базой данных. Я определяю (создаю экземпляр?) Этот класс в верхней части кода, предположительно, где он должен быть доступен глобально, однако, когда я пытаюсь использовать эту ссылку на класс db в рекурсивной функции, xdebug говорит мне, что он находится вне области видимости - так В качестве исправления мне пришлось дважды определять базу данных, но это кажется плохой практикой. Может кто-нибудь сказать, что случилось или где я иду не так?

Код рекурсивно печатает вложенные комментарии из базы данных FYI.

Код выглядит следующим образом ...

<?php
require 'lib/mysqli.class.php';  // the pretty standard mysqli class
$config = array();$config['host'] = 'localhost';$config['user'] = 'root';$config['pass'] = '';$config['table'] = 'publicate';

$db = new DB($config);     // new instance of database
//$db->setFetchMode(2);      // fetch data by association (MYSQLI_ASSOC)

// Run a Query:
$db->query('SELECT * FROM comments WHERE parentid = 0');        

// Get the data:
$root_sql = $db->get();

recursive_categories($root_sql);

function recursive_categories($results)
{
     if(count($results))
     {
         echo "<ul>";
         foreach($results as $res)
         {
             echo "<li>" . "id=" . $res['id'] . ", pid=" . $res['parentid'] . ", content: " . $res['content'];


             //Rest of what ever you want to do with each row

             //Check this category for children ************************
             //2nd definition of DB ************************
             $config = array();$config['host'] = 'localhost';$config['user'] = 'root';$config['pass'] = '';$config['table'] = 'publicate';
             $db2 = new DB($config);     // new instance of database
             $db2->query("SELECT * FROM comments WHERE parentid  = " . $res['id']);
             $rows = $db2->get();

             recursive_categories($rows);

             //has to be after the inner loops
             echo "</li>";
         }
         echo "</ul>";
     }
}
?>

Спасибо.

1 Ответ

1 голос
/ 02 декабря 2011

Вам необходимо передать ваше соединение в $ db функции следующим образом:

function recursive_categories($results, $db)

Тогда оно будет доступно внутри области видимости переменной функции.

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

...