Использование sqlite эффективно с php - PullRequest
0 голосов
/ 06 декабря 2010

Я портирую через небольшое приложение php для использования sqlite, и это первый раз, когда я использую sqlite с php, и это было давно, так как я в последний раз что-то кодировал с php (это был php4 к тому времени). Проблема у меня сейчас заключается в том, что, очевидно, с sqlite вам нужно вызывать объект sqlite3 несколько раз, так как он, очевидно, не устанавливает постоянное соединение с базой данных, поэтому мой код сейчас заполнен

$db = new SQLite3('test.db');

в каждой функции кода. это эффективно? Есть ли лучший и более чистый способ сделать это?

другая проблема, с которой я сталкиваюсь, - это если я использую sqlite внутри, скажем, include / functions.php, он пытается найти test.db внутри этого include / dir, когда должен использовать корень приложения. как я могу это исправить эффективно?

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Вы должны установить соединение снова, только если ваша переменная $db выходит за рамки или иным образом уничтожается. Если вы создадите переменную внутри функции, она выйдет из области видимости, как только выйдет из функции, что заставит вас воссоздать переменную / соединение в следующей функции.

Таким образом, в той или иной форме вам нужно будет создать переменную в области, доступной везде, где требуется соединение с базой данных. Самый простой, но самый уродливый - создать его в глобальном масштабе. Лучшим способом было бы создать статический класс, который содержит соединение и может возвращать обработчик соединения по запросу. Другой способ - использовать внедрение зависимостей, в основном это означает, что вы передаете дескриптор соединения в каждую функцию или объект, где это необходимо.

Правильный ответ зависит от вашей существующей архитектуры.

0 голосов
/ 06 декабря 2010

Код

<?php
class SQL {
    private $db;

    function __construct() {
        try {
           /*** connect to SQLite database ***/
            $db = new PDO("sqlite::memory:");
            $db->exec("CREATE TABLE blog (Id INTEGER PRIMARY KEY, text TEXT)");   
            $this->db = $db;
            /*** a little message to say we did it ***/
            echo 'database created in memory';
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
    }

    function add($text) {
        $this->db->exec("INSERT INTO blog(text) VALUES ('$text')");
    }

    function get() {
        $res = array();
        $result = $this->db->query('SELECT text FROM blog');
        foreach ($result as $row) {
            $res[] = $row['text'];
        }

        return $res;
    }
}
?>

<?php
$sql = new SQL();
$sql->add('hello');
print_r($sql->get());
?>

<?php
$sql = new SQL();
$sql->add('hello');
$sql->add('world');
print_r($sql->get());
?>

Выход:

php sql.inc 

database created in memoryArray
(
    [0] => hello
)

database created in memoryArray
(
    [0] => hello
    [1] => world
)

Как видите, не обрызгивая $db =.

P.S .: Вы должны использовать PDO , потому что это лучше, чем просто позвонить new SQLite3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...