sqlite, pdo, косяк!?

KorP

Новичок
Простите за столь сумбурное название темы, но я даже не знаю как это двумя словами описать. Есть класс по работе с БД, пользуюсь им в проекте уже фиг знает сколько, тут решил допилить поддержку postgre и sqlite. Если с postgre и mysql всё работает нормально, как и должно, то с sqlite возник косяк. Если я вызываю метод непосредственно из файла с классом (это уже опытным пут>м вчера отлавливал) - всё в порядке, но если работать, как заведено у меня, что методы класса вызываются из различных частей системы, получаю:
Fatal error: Call to a member function execute() on a non-object.
Пишу в классе перед execute - var_dump($stmt); Получаю всё верно:
object(PDOStatement)#3 (1) { ["queryString"]=> string(49) "SELECT `val` FROM `settings` WHERE `key` = :param" }
При этом bindParam ни на что не жалуется и всё в порядке. При этом повторюсь- при такой же схеме работы с
postgre и mysql - всё в порядке. Подскажите плиз где я туплю, может уже просто глаз замылился и бревно не вижу!?

Портяночка кода (вытащил тока главное).
 

fixxxer

К.О.
Партнер клуба
Fatal error: Call to a member function execute() on a non-object.
там еще файл и номер строки

Пишу в классе перед execute - var_dump($stmt); Получаю всё верно
пиши внимательнее, так не может быть.
вот прямо
var_dump($stmt); // выводит PDOStatement
и сразу строго после fatal error? то есть если после этого поставить еще контрольный var_dump до него не дойдет? да ну.

$object = __CLASS__;
self::$instance = new $object;
лол

new self
 

KorP

Новичок
там еще файл и номер строки
65 строка кода на пастебине
пиши внимательнее, так не может быть.
вот прямо
var_dump($stmt); // выводит PDOStatement
и сразу строго после fatal error? то есть если после этого поставить еще контрольный var_dump до него не дойдет? да ну.
Мистика?
PHP:
$stmt = Database::getInstance()->dbh->prepare("SELECT `val` FROM `settings` WHERE `key` = :param");
        var_dump($stmt); //object(PDOStatement)#3 (1) { ["queryString"]=> string(49) "SELECT `val` FROM `settings` WHERE `key` = aram" }
        $stmt->bindParam(':param', $param);
        if ($stmt->execute()) //Fatal error: Call to a member function execute() on a non-object.
        {}
 

Вурдалак

Продвинутый новичок
Установи xdebug, чтобы видеть трейс после fatal error.

Мы тебе не верим.
 

KorP

Новичок
Поставил xdebug (правда с 5.4 он у меня почему то не сдружился, пришлось откатиться до 5.3), тут действительно var_dump($stmt); возвращает false, но почему? Сейчас проверил на другом методе, где запрос совершенно простой:
и в базе напрямую он отрабатывается нормально, без ошибок, но почему тогда об него спотыкается execute()? Не создаётся соединение с БД, но тогда почему отрабатывает без ошибок prepare()? И ведь с postgre и mysql по той же схеме всё работает прекрасно
php -q settings.php
bool(false)
PHP Fatal error: Call to a member function execute() on a non-object in /home/share/www/TorrentMonitor/class/Database.class.php on line 89
PHP Stack trace:
PHP 1. {main}() /home/share/www/TorrentMonitor/include/settings.php:0
PHP 2. Database::getAllSetting() /home/share/www/TorrentMonitor/include/settings.php:6

Fatal error: Call to a member function execute() on a non-object in /home/share/www/TorrentMonitor/class/Database.class.php on line 89

Call Stack:
0.0002 632016 1. {main}() /home/share/www/TorrentMonitor/include/settings.php:0
0.0026 1054752 2. Database::getAllSetting() /home/share/www/TorrentMonitor/include/settings.php:6
settings.php просто вызывает метод getAllSetting(), сам метод крайне примитивный (89 строка в Database.class.php, на которую он жалуется это соответственно if ($stmt->execute()))
PHP:
    public static function getAllSetting()
    {
        $stmt = Database::getInstance()->dbh->prepare("SELECT * FROM `settings`");
        var_dump($stmt);
        if ($stmt->execute())
        {
            foreach ($stmt as $row)
            {
                $resultArray[] = array("{$row['key']}" => "{$row['val']}");
            }
            if ( ! empty($resultArray))
                return $resultArray;
        }
        $stmt = NULL;
        $resultArray = NULL;
    }
 

KorP

Новичок
Всё, отбой, косяк найден, надо было просто проветрить мозг. Фигня в том, что был указан относительный путь в БД, соответственно он её создавал не там где надо, и в принципе файл БД есть, а он пустой, указал абсолютный путь до файла и всё срослось. Спасибо всем, кто наводил на умные мысли.
 
Сверху