PHP - 如何在预准备语句中将数组替换为主机参数

Atu*_*hav 7 php sql sqlite

我能够绑定类型的值int,str,boolnull,但我无法绑定数组类型.
我已经试过这两种功能,即bindValuebindParam,但都没有奏效.我怎么能做到这一点?

// 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);
Run Code Online (Sandbox Code Playgroud)

编辑:我已经尝试用?param数组中的所需数量的问号替换单个,但是只有当我的数组的值少于1000时才能正常工作!我认为这是PHP中SQLite3中语句编写方式的限制.

man*_*niL 9

不幸的是,这是不可能的!您无法绑定数组.

对您来说最简单的解决方案是:

  1. ?使用数组中每个值的一个占位符()创建SQL查询
  2. 通过遍历数组来绑定每个值.

但是还有另外一种选择(例如子SELECT)

这里有更多信息(即使它是一个Java问题,它几乎是相同的主题/问题,因为在这种情况下数据库类型无关紧要)

编辑:通常,绑定参数的SQL限制设置为999,但您可以根据需要进行更改.