由于 SQLite3Result::numRows 不可用,请使用
<?php
if ($res->numColumns() && $res->columnType(0) != SQLITE3_NULL) {
// 有行
} else {
// 零行
}
?>
因为当有零行时
* SQLite3Result::fetchArray 将返回 '1'
* SQLite3Result::numColumns 将返回 '1'
* 列 '0' 的列类型将是 SQLITE3_NULL
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
一个用于处理 SQLite 3 扩展结果集的类。
由于 SQLite3Result::numRows 不可用,请使用
<?php
if ($res->numColumns() && $res->columnType(0) != SQLITE3_NULL) {
// 有行
} else {
// 零行
}
?>
因为当有零行时
* SQLite3Result::fetchArray 将返回 '1'
* SQLite3Result::numColumns 将返回 '1'
* 列 '0' 的列类型将是 SQLITE3_NULL
根据 https://php.net/manual/en/sqlite3result.columntype.php, 以及我的经验,columnType() 不会返回除 SQLITE3_NULL 之外的任何内容。因此,注释中建议的用于识别列是否为 NULL 的测试是不正确的。
正确的方法似乎是测试 if ($result->fetchArray())[0] == null。
我使用以下代码来获取 num_rows
<?php
...
$nrows = 0;
$result->reset();
while ($result->fetchArray())
$nrows++;
$result->reset();
return $nrows;
...
?>
回复 jan at bootfinder dot co dot uk (评论 #115891) 关于获取 num_rows...
怎么样(未测试)... ?
<?php // 如果需要,请在前后进行清理
for ( $nrows = 0; isarray($result->fetchArray()); ++$nrows );
return $nrows;
?>
这是一段代码片段,可以帮助您编写一个也缺少的 fetchObject 函数
<?php
function fetchObject($sqlite3result, $objectType = NULL) {
$array = $sqlite3result->fetchArray();
if(is_null($objectType)) {
$object = new stdClass();
} else {
// 不会调用此类的构造函数
$object = unserialize(sprintf('O:%d:"%s":0:{}', strlen($objectType), $objectType));
}
$reflector = new ReflectionObject($object);
for($i = 0; $i < $sqlite3result->numColumns(); $i++) {
$name = $sqlite3result->columnName($i);
$value = $array[$name];
try {
$attribute = $reflector->getProperty($name);
$attribute->setAccessible(TRUE);
$attribute->setValue($object, $value);
} catch (ReflectionException $e) {
$object->$name = $value;
}
}
return $object;
}
?>
大量借鉴了 Bergmann 的 Object Freezer
https://github.com/sebastianbergmann/php-object-freezer/blob/master/Object/Freezer.php