【问题标题】:How to use SQLite3 in a portable fashion with PHP(5.4.x)如何通过 PHP(5.4.x) 以可移植方式使用 SQLite3
【发布时间】:2013-01-01 11:28:00
【问题描述】:

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

我有一个运行 PHP 5.2.17 的 Web 主机提供商,安装了 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"; 回声“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());

} ?>

大家新年快乐:)

【问题讨论】:

  • 常量字符串似乎没有被张贴......他们在这里:
  • In my php.ini file, I have both extensions "php_pdo_sqlite.dll" and "php_sqlite3.dll" uncommented。你也有 php_pdo.dll 未注释吗?这些也应该在 php.ini 中按此顺序加载。 php_sqlite3.dll, php_pdo.dll, php_pdo_sqlite.dll.
  • 在我的版本(5.4.10)中,没有这样的文件:php_pdo.dll(在ext文件夹中),并且php.ini中也缺少文件名(我检查了两个开发和生产版本)。
  • 看起来 PHP 至少在 Windows 上运行良好,不再使用 php_pdo.dll,所以你在那里看起来不错。

标签: php sqlite


【解决方案1】:

dbc1.php 中的样式是否优于 dbc2.php?为什么或为什么不?

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

您应该使用SQLite3 class 或 PDO,如您的第一个示例(“dbc1”)所示。

SQLite 数据库文件真的像声称的那样可移植吗?

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

我可以指点 PHP5-SQLite3 教程吗?

因为你最好的选择是使用 PDO,所以你真的想要一个 PDO 教程。唯一的就是 MySQL。我们经常推荐this tutorial for users coming from the mysql_ functions,但也有人推荐this other PDO tutorial。阅读两者,只需使用 SQLite 兼容的 SQL 而不是 MySQL 风格的 SQL。

SQLite 站点有一个comprehensive syntax section,详细说明了它可以做什么和不了解什么。在大多数情况下,您可以放弃反引号并让事情正常工作。 SQLite 也不喜欢将索引创建与表创建捆绑在一起,但许多其他数据库也不喜欢。

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

这是一个既安装了旧的 SQLite 2 扩展又安装了 SQLite 3 PDO 扩展的工件。

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多