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