PHP的mysqli凡在(?,?,?...)(php mysqli WHERE IN (?,?,?

2019-07-21 08:52发布

据http://us2.php.net/manual/en/mysqli-stmt.bind-param.php ,不同的类型有:

i   corresponding variable has type integer
d   corresponding variable has type double
s   corresponding variable has type string
b   corresponding variable is a blob and will be sent in packets

但是,你怎么能处理这个问题:

->prepare("SELECT blabla FROM foo WHERE id IN (?)")

在哪里? 将ID列表。 可能有一个或多个项目:

$ids = "3,4,78";
->bind_param('s',$ids);

那可能吗?

我想使用准备好的语句,因为它会在一个循环中执行。

Answer 1:

正确的语法是

->prepare("SELECT blabla FROM foo WHERE id IN (?, ?, ?)")

对于数组中的3项,例如。 然后,你将不得不单独使用绑定的每一项bind_param()

如果你不具备阵列上的尺寸保证,你将不得不写了几个辅助函数用“?”的和绑定语句的正确数量来生成SQL。



Answer 2:

如果你有在大小每次您wanto绑定到一个电话不同的变量列表IN语句来,最简单的方法是编程生成SQL字符串,并使用循环绑定变量:

/**
 * @param  array  $values
 * @param  mysqli $db
 * @return mysqli_stmt
 */
function bindInValues(array $values, mysqli $db)
{
    $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)',
        implode(', ', array_fill(0, count($values), '?'))
    );
    $stmt = $db->prepare($sql);
    foreach ($values as $value) {
        $stmt->bind_param('s', $value);
    }
    return $stmt;
}

如果你喜欢call_user_func_array你可以使用动态方法调用,并沿着去无循环。

/**
 * @param  array  $values
 * @param  mysqli $db
 * @return mysqli_stmt
 */
function bindInValues(array $values, mysqli $db)
{
    $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)',
        implode(', ', array_fill(0, count($values), '?'))
    );
    $stmt = $db->prepare($sql);
    array_unshift($values, implode('', array_fill(0, count($values), 's')));
    call_user_func_array(array($stmt, 'bind_param'), $values);
    return $stmt;
}


Answer 3:

怎么样这样做:

$sql = sprintf("SELECT blabla FROM foo WHERE id IN(%s) ", $ids);
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
    $this->throwException();
}

if (!$stmt->execute()) {
    $this->throwException();
}

如果不好,请告诉我为什么,所以我可以从我的错误中学习。 谢谢!



Answer 4:

我想我找到了答案,我的问题:

->prepare("SELECT stuff FROM table_name WHERE id IN (?)");

$itemList = implode(',',$items);
$children->bind_param('s',$itemList);

似乎使用昏迷分隔值的字符串时工作正常。 我还在检查,如果结果是真准...



文章来源: php mysqli WHERE IN (?,?,? …)