如何在PHP中以可移植的方式使用SQLite3 (5.4.x)


How to use SQLite3 in a portable fashion with PHP(5.4.x)

我也被SQLite的宏伟声明所吸引。然而,就像许多其他软件一样,我也遇到过一些过时的、不那么容易理解的开发者的文档和博客。没有更多的抱怨,这里是环境的问题和细节:

我有一个web主机提供商运行PHP 5.2.17,安装SQLite版本2.8.17。phpinfo()输出显示(在pdo_sqlite节下)SQLite版本为3.3.7。在家里,我有Apache服务器运行PHP 5.4.10。Phpinfo()在两个站点都可以正常工作。家用笔记本电脑显示(在sqlite3下)版本是3.7.7.1。

关于这个问题,我想创建一个包含几个表的数据库,并在家用计算机和远程主机之间来回ftp它(数据文件)。我试图创建一个PHP脚本

  1. 创建表,如果不存在腿…
  2. 删除现有行
  3. 插入一些新行
  4. 读取表格并将其打印为Html表格

我编了这个文件dbc1.php,它在远程服务器上运行良好。类似的文件dbc2.php在"if not exists"子句上失败,然后在其他语句上失败,甚至不能读取由dbc1.php创建的数据库文件。错误信息是:

file is encrypted or is not a database

如果我移动文件,dbc2.php将创建它,但不能获取插入的行。本地主机版本报错

"在C:'Web'php'dbcheck.php第14行调用未定义函数sqlite_libversion() "

在我的php.ini文件中,我有两个扩展名"php_pdo_sqlite.dll"answers"php_sqlite3.dll"未注释,并检查这两个dll文件都存在于"ext"文件夹中。我还需要做什么?问题:

  1. 在dbc1.php的风格优于dbc2.php?为什么或者为什么不呢?
  2. SQLite数据库文件真的像声称的那样可移植吗?
  3. 我可以有一个指针到PHP5-SQLite3教程?
  4. 为什么我从phpinfo()和sqlite_libversion()得到不同的版本号?

提前感谢您的回复。下面是3个PHP文件,尽管我希望使用一个单独的文件来执行操作。

<html>

用PHP测试SQLite

";echo "SQLite版本:"。sqlite_libversion()。'

,

    $db = new PDO('sqlite:dbname.db');      echo "[SQLite] DB opened<br/>";
    $db -> exec ($qc0);                     echo "[SQLite] table created<br/>";
    $db -> exec ($qr1);                     echo "[SQLite] Rows deleted<br/>";
    $db -> exec ($qi1); $db -> exec ($qi2);
    $db -> exec ($qi3); $db -> exec ($qi4); echo "[SQLite] Rows inserted<br/>";
    try {
            $rowsOfTable = $db -> query ($qr5);
            print "'t<table border='0' cellspacing='4' cellpadding='4''n" .
                            "'t't'tstyle='padding-top:20px;'>'n";
            print "'t't<tr><td>Creation</td><td>Legs</td></tr>'n";
            foreach ($rowsOfTable as $row) {
                    echo "'t't<tr>'n" .
                            "'t't't<td>" . $row['name'] . "</td>'n" .
                            "'t't't<td align='right'>" . $row['count'] . "</td>'n" .
                            "'t't</tr>'n";
            }
            print "'t</table>'n";
    } catch (PDOException $ex) {
            die ($ex->getMessage());
    }

?>

下面是同一台Unix服务器上不起作用的文件:

<html>

用PHP测试SQLite' n";echo "SQLite版本:"。sqlite_libversion()。"
' n";

    try {
            $db = new SQLiteDatabase('./dbname.db', 0644, $error);
            echo "SQLite DB opened<br/>'n";
            $db -> queryExec ($qc0, $error);        echo "[SQLite] table created<br/>'n";
            $db -> queryExec ($qr1, $error);        echo "[SQLite] Rows deleted<br/>";
            $db -> queryExec ($qi1, $error);
            $db -> queryExec ($qi2, $error);
            $db -> queryExec ($qi3, $error);
            $db -> queryExec ($qi4, $error);        echo "[SQLite] Rows inserted<br/><br/>";
            if ($tableFromDB = sqlite_query ($db, $qr5, SQLITE_BOTH, $error)) {
                    print "'t<table border='2' cellpadding='4'>'n";
                    while ($row = $tableFromDB -> fetch()) {
                            print "'t't<tr>'n" .
                                    "'t't't<td>" . $row['name'] .
                                    "</td><td>" . $row['count'] . "</td>'n't</tr>'n";
                    }
                    print "'t</table>'n";
            } else {
                    echo "Cannot query DB table: $error'n";
    }} catch (Exception $ex) {
            die ($error);
    }

?>

最后,我试图在笔记本电脑上运行的代码:

<html>

用PHP测试SQLite

phpinfo ();echo "PHP version: "。phpversion()。"
";echo "SQLite版本:"。sqlite_libversion()。'

,

    $db = new PDO('sqlite:dbname.db');      echo "[SQLite] DB opened<br/>";
    $db -> exec ($qc0);                     echo "[SQLite] table created<br/>";
    $db -> exec ($qr1);                     echo "[SQLite] Rows deleted<br/>";
    $db -> exec ($qi1); $db -> exec ($qi2);
    $db -> exec ($qi3); $db -> exec ($qi4); echo "[SQLite] Rows inserted<br/>";
    try {
            $rowsOfTable = $db -> query ($qr5);
            print "'t<table align='center' border='0' cellspacing='4' cellpadding='4''n" .
                            "'t't'tstyle='padding-top:20px;'>'n";
            print "'t't<tr><td>Creation</td><td>Legs</td></tr>'n";
            foreach ($rowsOfTable as $row) {
                    echo "'t't<tr>'n" .
                            "'t't't<td>" . $row['name'] . "</td>'n" .
                            "'t't't<td align='right'>" . $row['count'] . "</td>'n" .
                            "'t't</tr>'n";
            }
            print "'t</table>'n";
    } catch (PDOException $ex) {
            die ($ex->getMessage());

}?>

祝大家新年快乐

dbc1.php的风格优于dbc2.php吗?为什么或者为什么不呢?

第二个示例("dbc2")中使用的类和函数来自旧的SQLite 2函数。SQLite2是旧的,扩展实际上已经被推到了PECL。你不应该在现代代码中使用它,除非你需要读取SQLite2数据库。

您应该使用SQLite3类或PDO,如第一个示例("dbc1")所示。

SQLite数据库文件真的是可移植的吗?

可以,但不是在主要版本之间。您可以在任何机器和平台之间移植SQLite3数据库文件并使其正常工作。

我可以有一个指针到PHP5-SQLite3教程?

因为你最好的选择是使用PDO,你真的需要一个PDO教程。唯一存在的是MySQL。我们经常向使用mysql_函数的用户推荐本教程,但有些人也推荐其他PDO教程。阅读这两本,只需使用sqlite兼容的SQL而不是mysql风格的SQL。

SQLite网站有一个全面的语法部分,详细说明了它能理解什么和不理解什么。在大多数情况下,您可以丢弃反引号并使其正常工作。SQLite也不喜欢将索引创建与表创建捆绑在一起,但许多其他数据库也不喜欢。

为什么我从phpinfo()和sqlite_libversion()得到不同的版本号?

这是安装了旧的SQLite 2扩展同时也安装了SQLite 3 PDO扩展的产物