繁体   English   中英

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

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

我也被SQLite的宏伟主张所吸引。 但是,就像其他许多软件一样,我已经过时了,亲切的开发人员很难遵循这些文档和博客。 没有更多的麻烦,这里是环境的问题和细节:

我有一个运行PHP 5.2.17,已安装SQLite版本2.8.17的Web主机提供程序。 phpinfo()输出表明(在pdo_sqlite部分下),SQLite版本为3.3.7。 在家里,我有运行PHP 5.4.10的Apache服务器。 phpinfo()在两个站点上都能正常工作。 家用笔记本电脑说(在sqlite3下)版本是3.7.7.1。

关于这个问题,我想创建一个带有几个表的数据库,然后在家用计算机和远程主机之间来回传送它(数据文件)ftp。 我正在尝试创建一个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 \\ n测试SQLite;“回显” 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(); 回显“ PHP版本:”。 phpversion()。 '
'; 回显“ 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数据库,否则不应在现代代码中使用它。

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

SQLite数据库文件是否如所声称的那样真正可移植?

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

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

因为最好的选择是使用PDO,所以您实际上确实需要PDO教程。 仅有的是MySQL。 我们经常向来自mysql_函数的用户推荐本教程 ,但是有些人也推荐其他PDO教程 两者都读,只使用兼容SQLite的SQL而不是MySQL风格的SQL。

SQLite网站有一个综合的语法部分 ,详细介绍了它的作用和不理解的地方。 在大多数情况下,您可以抛开反引号,使一切正常运行。 SQLite还不喜欢将索引创建与表创建捆绑在一起,但是许多其他数据库也不喜欢。

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

这是既安装了旧的SQLite 2扩展,又安装了SQLite 3 PDO扩展的人工产物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM