使用SQLite3执行PRAGMA语句后无法获取返回值
SQLite3执行PRAGMA语句后无法获取返回值
嘿,我看你现在用ADOdb连接SQLite3,普通查询都能正常跑,但一执行PRAGMA语句就拿不到返回值是吧?我之前也碰到过类似的情况,给你梳理下问题出在哪以及怎么解决。
首先得先敲个警钟:你直接把$_GET['table']作为查询语句是严重的SQL注入风险,哪怕是测试环境也千万别这么干!后续一定要做严格的参数校验,或者改用预处理语句来避免这个问题。
回到PRAGMA的问题上:SQLite的PRAGMA语句分两种,一种会返回结果集(比如PRAGMA table_info(your_table)),另一种只是执行设置不返回数据(比如PRAGMA foreign_keys = ON),ADOdb对这两种的处理方式略有不同,而且你之前直接echo $result的方式根本不对——$result是ADORecordSet对象,直接输出只会显示对象的字符串标识,不是实际的查询结果。
给你两个场景的正确写法:
1. 处理返回结果集的PRAGMA语句
比如你要查看表结构的PRAGMA table_info,得遍历结果集来获取数据:
require_once 'ADOdb/adodb.inc.php'; $db = NewADOConnection('sqlite3'); $databasePath = 'test.db'; $db->Connect($databasePath); // 这里替换成你要执行的PRAGMA语句,千万别直接用GET参数! $query = "PRAGMA table_info(test_table)"; $result = $db->Execute($query); // 检查执行是否成功 if (!$result) { echo "执行出错:" . $db->ErrorMsg(); } else { // 遍历每一行数据 while (!$result->EOF) { // 可以打印整行字段,或者按字段名输出(比如$result->fields['name']) print_r($result->fields); $result->MoveNext(); } // 记得关闭结果集 $result->Close(); }
你也可以用GetArray()方法直接把结果转成数组,方便快速查看:
$rows = $result->GetArray(); print_r($rows);
2. 处理无返回结果的PRAGMA语句
像设置外键约束这类PRAGMA,只需要判断执行是否成功即可:
$success = $db->Execute("PRAGMA foreign_keys = ON"); if (!$success) { echo "PRAGMA执行失败:" . $db->ErrorMsg(); }
核心问题就是你之前没有正确处理ADORecordSet对象,直接输出对象肯定拿不到实际的PRAGMA返回值,按上面的方式遍历或者转数组就能解决啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

