Безжировая структура: запрос БД - не объект

Мы следуем руководству по началу работы на github, все прошло хорошо, но мы застряли на соединении с БД. .

Мы создали объект $db:

    $db=new DB\SQL(
    'mysql:host=localhost;port=3306;dbname=liselore',
    'jow',
    ''
);

И мы настроили контроллер:

$f3->route('GET /',
function($f3) {

    $f3->set('result',$db->exec('SELECT achternaam FROM test1'));

    $template = new Template;
    echo $template->render('views/homepage.html');

    }
);

$f3->run();

Однако мы получаем эту ошибку:

Internal Server Error

Fatal error: Call to a member function exec() on a non-object

• fatfree-master/index.php:32 

Я думаю, что ошибка связана с неустановленным объектом $db. Однако у нас есть набор php-pdo, я только что проверил через phpinfo().

Любая помощь будет отличной, спасибо...


person Liz    schedule 12.11.2013    source источник
comment
попробуйте добавить global $db; после этой строки function($f3) { - у вас проблема с областью действия   -  person Latheesan    schedule 12.11.2013
comment
Спасибо за ваш ответ, но все переменные, установленные с помощью метода $f3-›set, являются глобальными, см.: github.com/bcosca/fatfree#framework-variables   -  person Liz    schedule 12.11.2013
comment
Мы используем тот же код, что и в примерах из руководства: github.com/bcosca/fatfree#databases< /а>   -  person Liz    schedule 12.11.2013
comment
Вы используете замыкание, вам нужно использовать function($f3) use ($db) {   -  person naththedeveloper    schedule 12.11.2013
comment
Странно, если я перенесу создание нового объекта db/sql «внутри функции», тогда все заработает... есть мысли по этому поводу?   -  person Liz    schedule 12.11.2013


Ответы (2)


Вы используете замыкание, что означает, что переменная $db больше не находится в < href="http://php.net/manual/en/language.variables.scope.php" rel="nofollow noreferrer">область. Вам нужно использовать use ключевое слово, чтобы указать PHP разрешить использование переменной из родительской области.

$f3->route('GET /', function($f3) use ($db) {
    $f3->set('result', $db->exec('SELECT achternaam FROM test1'));

    $template = new Template;
    echo $template->render('views/homepage.html');
});

$f3->run();
person naththedeveloper    schedule 12.11.2013

Вы уже сказали:

все переменные, установленные с помощью метода $f3->set, являются глобальными

и да, это обычная практика сохранять такие объекты в этих переменных фреймворка. Так что просто попробуй

$f3->set('DB', $db=new DB\SQL('mysql:host=localhost;port=3306;dbname=liselore','jow',''));

и используйте это везде:

$f3->set('result',$f3->get('DB')->exec('SELECT achternaam FROM test1'));
person ikkez    schedule 12.11.2013