我也被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脚本
- 创建表,如果不存在腿…
- 删除现有行
- 插入一些新行
- 读取表格并将其打印为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"文件夹中。我还需要做什么?问题:
- 在dbc1.php的风格优于dbc2.php?为什么或者为什么不呢? SQLite数据库文件真的像声称的那样可移植吗?
- 我可以有一个指针到PHP5-SQLite3教程?
- 为什么我从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扩展的产物