【发布时间】:2016-04-13 01:16:17
【问题描述】:
我能够绑定int、str、bool 和null 类型的值,但我无法绑定数组类型。
我已经尝试了这两个功能,即bindValue 和bindParam,但它们都不起作用。
我怎样才能做到这一点?
// a helper function to map Sqlite data type
function getArgType($arg) {
switch (gettype($arg)) {
case 'double': return SQLITE3_FLOAT;
case 'integer': return SQLITE3_INTEGER;
case 'boolean': return SQLITE3_INTEGER;
case 'NULL': return SQLITE3_NULL;
case 'string': return SQLITE3_TEXT;
default:
throw new \InvalidArgumentException('Argument is of invalid type '.gettype($arg));
}
}
$sql = "SELECT * FROM table_name WHERE id IN (?)";
$params = [[10, 9, 6]]; // array of array
$dbpath = '/path/to/sqlite.sqlite';
$db = new SQLite3($dbPath, SQLITE3_OPEN_READONLY);
$stmt = $db->prepare($sql);
try {
foreach ($params as $index => $val) {
if (is_array($val)) {
/************* I am stuck here *************/
$ok = $stmt->bindParam($index + 1, $val);
// Using bindValue also didn't worked!
} else {
$ok = $stmt->bindValue($index + 1, $val, getArgType($val));
}
if (!$ok) {
throw new Exception("Unable to bind param: $val");
}
}
} catch (Exception $ex) {
// NO exception is thrown from bindValue() or bindParam()
$reason = "Error in binding statement. " . $ex->getMessage();
die($reason);
}
$result = $stmt->execute();
$data = [];
while ($row = $result->fetchArray($mode)) {
$data[] = $row;
}
var_dump($data);
编辑:我已经尝试用参数数组中所需数量的问号替换单个 ?,但只有当我的数组少于 1000 时它才有效价值观!我认为这是 PHP 中 SQLite3 中如何准备语句的限制。
【问题讨论】:
-
不熟悉 SQLLite,但我相信您需要在查询中的每个值处放置一个占位符(例如,在当前示例中为 3
?s)。然后绑定数组中的每个值;或在execute中传递数组。 -
@chris85:只有当数组的元素少于 1000 个时才会起作用。我想要一个适用于所有情况的解决方案。谢谢。
-
您达到的极限是
PHP还是sqllite?您是否尝试获取 +1000POST值? -
它的 sqlite 限制。 sqlite.org/limits.html 见第 9 点
-
我很好奇为什么你需要过滤超过 1000 个值...