起因
今天我们想“抄”一个App,做成一个网页,通过 代理拦截了一些数据,发现有些数据根本没有请求网络。
那么,问题来了。怎么费事?
通过压缩工具找到了zip压缩包,原来,App 内置了一些数据。
发现里面有些资源,还有个 sqlite 的文件数据库
通过PHP 解析sqlite 文件
既然是数据库,PHP当然可以解析(连接)了。
首先我竟然想到的是,通过百度查找,罪过,我堕落了,还是成长了?,以前的我首先想到的是从自身知识搜寻解决思路的。
首先映入眼帘的是 sqlite3 这个类,正在我打算尝试一番的时候,提示我,没有 sqlite3 类,当我准备打开扩展的时候,发现了,pdo_sqlite 扩展。
我一想对啊,PDO 是连接数据库的通用驱动,我干嘛非要用 sqlite3 类呢。于是 又来到了百度。
下面是我,查询sqlite 数据库中所有的表的例子。
<?php
// 注意,这里数据库文件和当前PHP文是同一个文件夹
$dsn = 'sqlite:test.sqlite';
$pdo = new PDO($dsn);
$sql = "select * from sqlite_master where type='table'";
$stmt = $pdo-> query($sql);
if(!$stmt){
var_dump($pdo -> errorInfo());
exit;
}
$data = $stmt->fetchAll();
print_r($data);
上面得出的结果和下面类似
// 没有使用 返回时的标志,所以 键名和数字索引混排,最后面的sql 就是建立这个数据库时用的 sql 语句
Array
(
[0] => Array
(
[type] => table
[0] => table
[name] => TEST
[1] => TEST
[tbl_name] => TEST
[2] => TEST
[rootpage] => 2
[3] => 2
[sql] => CREATE TABLE "TEST" (
"destId" INTEGER NOT NULL DEFAULT 0 PRIMARY KEY,
"destName" TEXT NOT NULL DEFAULT ''
)
[4] => CREATE TABLE "TEST" (
"destId" INTEGER NOT NULL DEFAULT 0 PRIMARY KEY,
"destName" TEXT NOT NULL DEFAULT ''
)
)
)
既然使用的是PDO
,所以其他方法和操作MySql
一样。
插入数据
$sql = "INSERT INTO TEST (destId, destName) VALUES (:destId, :destName)";
$stmt = $pdo->prepare($sql);
$name = 'sunshine1';
$time = date('Y-m-d H:i:s');
$stmt->bindParam(':destId', 1);
$stmt->bindParam(':destName', 'test');
$stmt->execute();
更新数据
$sql = "UPDATE TEST SET name = :destName WHERE destId= :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':destName' => 'sunshine1_updated', ':id' => 1]);
删除数据
$sql = "DELETE FROM user WHERE destId = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 1]);
最后
这样就可以解析出sqlite数据库中的表的内容了,不过可以试试 Sqlite3 这个类,不过个人认为,还是使用PDO
比较好。
评论已关闭