我正在移植一个小的PHP应用程序来使用sqlite,这是我第一次使用sqlite与php并且它已经有一段时间了,因为我最后用php编写了一些东西(当时是php4)。 我现在遇到的麻烦是,显然使用sqlite需要多次调用sqlite3对象,因为它显然没有与数据库建立永久连接,所以我的代码现在填充了
$db = new SQLite3('test.db');
代码中的每个函数。这有效吗?有没有更好更清洁的方法呢?
我遇到的另一个问题是,如果我在内部使用sqlite说include / functions.php它会尝试在这个include / dir中查找test.db,当它应该使用app root时。我怎么能有效地解决这个问题?
答案 0 :(得分:1)
如果$db
变量超出范围或以其他方式销毁,则只需再次建立连接。如果在函数内部创建变量,函数退出后它将超出范围,迫使您在下一个函数中重新创建变量/连接。
因此,在某种形式或类型中,您需要在可在任何需要数据库连接的任何位置访问的作用域中创建变量。最简单但最丑陋的是在全局范围内创建它。更好的方法是创建一个保存连接的静态类,并可以根据请求返回连接处理程序。另一种方法是使用依赖注入,这意味着你将连接句柄传递给需要它的每个函数或对象。
正确的答案取决于您现有的架构。
答案 1 :(得分:0)
<?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