0

我也被 SQLite 的宏伟主张所吸引。然而,就像许多其他软件一样,我遇到了过时的问题,并且不太容易关注好心开发人员的文档和博客。没有更多的抱怨,这里是环境的问题和细节:

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

关于这个问题,我想创建一个带有几个表的数据库,并在家庭计算机和远程主机之间来回传输它(数据文件)。我正在尝试创建一个 PHP 脚本来

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

不知何故,我组成了这个文件 dbc1.php,它在远程服务器上运行良好。类似的文件 dbc2.php 在“如果不存在”子句上失败,然后在其他语句上失败,如果数据库文件是由 dbc1.php 创建的,则甚至无法读取该文件。错误信息是:

file is encrypted or is not a database

如果我移动文件,dbc2.php 将创建它,但无法获取插入的行。本地主机版本抱怨说

“在第 14 行调用 C:\Web\php\dbcheck.php 中未定义的函数 sqlite_libversion()”

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

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

预先感谢您的回复。下面是 3 个 PHP 文件,虽然我希望使用 1 个单独的文件来执行操作。

<html>

用 PHP 测试 SQLite

'; 回声“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 版本:" . php版本()。'
'; 回声“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());

} ?>

大家,新年快乐 :)

4

1 回答 1

0

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 扩展的工件。

于 2013-01-01T03:28:00.160 回答