据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);
那可能吗?
我想使用准备好的语句,因为它会在一个循环中执行。
正确的语法是
->prepare("SELECT blabla FROM foo WHERE id IN (?, ?, ?)")
对于数组中的3项,例如。 然后,你将不得不单独使用绑定的每一项bind_param()
如果你不具备阵列上的尺寸保证,你将不得不写了几个辅助函数用“?”的和绑定语句的正确数量来生成SQL。
如果你有在大小每次您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;
}
怎么样这样做:
$sql = sprintf("SELECT blabla FROM foo WHERE id IN(%s) ", $ids);
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
$this->throwException();
}
if (!$stmt->execute()) {
$this->throwException();
}
如果不好,请告诉我为什么,所以我可以从我的错误中学习。 谢谢!
我想我找到了答案,我的问题:
->prepare("SELECT stuff FROM table_name WHERE id IN (?)");
$itemList = implode(',',$items);
$children->bind_param('s',$itemList);
似乎使用昏迷分隔值的字符串时工作正常。 我还在检查,如果结果是真准...