Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中高效地使用sqlite_Php_Sqlite - Fatal编程技术网

在php中高效地使用sqlite

在php中高效地使用sqlite,php,sqlite,Php,Sqlite,我正在移植一个小的php应用程序来使用sqlite,这是我第一次在php中使用sqlite,自从我上次用php编写代码以来已经有一段时间了(当时是php4)。 我现在遇到的问题是,显然对于sqlite,您需要多次调用sqlite3对象,因为它显然没有与数据库建立永久连接,所以我现在的代码中充满了 $db = new SQLite3('test.db'); 在代码中的每个函数中。这有效吗?有没有更好更干净的方法 我遇到的另一个问题是,如果我在include/functions.php中使用sql

我正在移植一个小的php应用程序来使用sqlite,这是我第一次在php中使用sqlite,自从我上次用php编写代码以来已经有一段时间了(当时是php4)。 我现在遇到的问题是,显然对于sqlite,您需要多次调用sqlite3对象,因为它显然没有与数据库建立永久连接,所以我现在的代码中充满了

$db = new SQLite3('test.db');
在代码中的每个函数中。这有效吗?有没有更好更干净的方法


我遇到的另一个问题是,如果我在include/functions.php中使用sqlite,当它应该使用app root时,它会尝试在include/dir中查找test.db。如何有效地修复此问题?

如果
$db
变量超出范围或被破坏,则只需再次建立连接。如果在函数内创建变量,则函数一退出,变量就会超出范围,迫使您在下一个函数中重新创建变量/连接

因此,在某种形式下,您需要在一个范围内创建变量,该范围可以在任何需要数据库连接的地方访问。最简单但最丑陋的是在全球范围内创建它。更好的方法是创建一个静态类,该类保存连接,并可根据请求返回连接处理程序。另一种方法是使用依赖注入,这基本上意味着您将连接句柄传递到需要它的每个函数或对象中

正确答案取决于您现有的体系结构。

Code 正如您看到的那样,
$db=
没有喷洒


p.S:您应该使用它,因为它比只调用
new SQLite3

“因为它显然没有与数据库建立永久连接”-您为什么会这样想?@Dark Falcon:因为在代码中必须多次调用$db对象。我记得使用mysql时,您只需连接一次,会话一直处于活动状态,直到您关闭它。因此,使用Sqlite时也应该如此。确定你没有做错什么吗?@Dark Falcon:嗯,问题是我不知道如何让项目中的所有函数和php文件都能看到$db对象。我可以把它变成一个全局变量,但我已经读到了这是不安全的,而且是php的一个好做法,所以我很想听听一种更有效的解决方法。将全局变量用于数据库连接之类的东西没有什么错。也许你听到的危险是使用register_globals,这确实是不明智的。
<?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
)