Класс базы данных PHP Slim framework не работает

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

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

    require_once "libary.php";
    require 'Slim/Slim.php';
    \Slim\Slim::registerAutoloader();

    $app = new \Slim\Slim();

    $app->get('/login/:username/:password', function ($username, $password) {
  //check the login details against the db...
    echo "I SEE THIS";
    $query = "select * from sometable";
    $db->query($query);
    echo "I DONT SEE THIS";

    });
    $app->run();

person Mrk Fldig    schedule 08.10.2012    source источник
comment
У вас включены отчеты об ошибках? Вы можете столкнуться с ошибками памяти, выбрав слишком много — попробуйте добавить LIMIT 1 в конец этого запроса для отладки.   -  person Mike B    schedule 09.10.2012
comment
Привет Майк, на самом деле в реальном коде я выбираю из таблицы, которая имеет только одну строку, хорошая идея, хотя, как ни странно, 2 месяца назад я буквально провел целый день, прежде чем понял, что мне не хватает памяти   -  person Mrk Fldig    schedule 09.10.2012
comment
Где устанавливается $db? Похоже, вы не создаете его экземпляр, это может быть проблемой.   -  person philwinkle    schedule 09.10.2012
comment
Привет, Фил, ну, весь мой сайт рухнул бы, если бы $db не работал, как определено в library.php   -  person Mrk Fldig    schedule 09.10.2012
comment
1. Включить отчеты об ошибках. 2. Исправить ошибку.   -  person PeeHaa    schedule 09.10.2012
comment
Извините, я должен был сказать, что отчеты об ошибках выводятся нашими подпрограммами ведения журналов в разные журналы, т.е. (предупреждение, информация, исключения). Вот интересная вещь, хотя, если я var_dump $db перед определением $app->get, он работает нормально, но изнутри он равен нулю.   -  person Mrk Fldig    schedule 09.10.2012


Ответы (3)


Извините за медленный ответ, довольно неловко, но все, что нужно было, это вставить одну строку кода в эту встроенную функцию:

ГЛОБАЛЬНЫЕ $ дб

Я предположил (ошибочно), что переменная будет видна внутри функции, поскольку она была определена в нашей библиотеке.

Спасибо

Марк

person Mrk Fldig    schedule 29.10.2012

Вы можете избежать использования GLOBAL с помощью ключевого слова use (PHP >= 5.3.0):

$app->get('/login/:username/:password', function ($userstrong textname, $password) use ($db) {
    //check the login details against the db...
    echo "I SEE THIS";
    $query = "select * from sometable";
    $db->query($query);
    echo "I DONT SEE THIS";
});
person Drinkynet    schedule 26.02.2014

Вы также можете внедрить свою базу данных в приложение как singleton таким образом:

$app->container->singleton('db', function () use ($dbcfg){
    return new \myDatabaseClass($dbcfg);
});

и тогда он всегда будет доступен для вас здесь:

$app->db->query();

Дополнительные сведения см. здесь: http://docs.slimframework.com/#DI-Overview.

person Drinkynet    schedule 26.03.2014
comment
Спасибо за то, что это было некоторое время назад, поэтому с тех пор я узнал намного больше PHP, но это все еще полезно! - person Mrk Fldig; 29.03.2014