为了执行安全我方格利的质询任务,要把大量现成的价值观纳入地壳体,准备的声明是执行的专业技术。
让我们假设,即将输入的数据有效载荷是用户提供的数据——这意味着我们不能保证数据的完整性,也不能保证数据量。 事实上,预期的数据阵列可能空。 The following snippet will show how to adopt a range of ids to the IN (
conditions in the WHERE
Clause of a prepared statement. 如果阵列中没有任何价值观,则编制的声明就没有好处,不应加以利用。
MySQLi的生成物体可立即通过foreach(
loop. 因此,无需改动<代码>fetch。 电话:只使用阵列合成物获得浏览数据。
各种女胎意味着 s将期望 in化价值。 当打电话bind_param()
时,第一个参数将是重复的i
特性的单一体。 对于一般用途而言,如果数据为示意图,或您可能具有各种数据类型(例如:分类、浮动/双重或插图),那么简单易用于重复使用<代码><>>>>代码>的特性而不是<代码>i。
守则: (
$ids = [1, 5, 18, 25]; // this could be, for example: $_GET[ ids ]
$count = count($ids);
$sql = SELECT name FROM somewhere ;
$orderBy = ORDER BY name ;
if ($count) {
$placeholders = implode( , , array_fill(0, $count, ? ));
$stmt = $mysqli->prepare("$sql WHERE id IN ($placeholders) $orderBy");
$stmt->bind_param(str_repeat( i , $count), ...$ids);
$stmt->execute();
$result = $stmt->get_result();
} else {
$result = $mysqli->query("$sql $orderBy"); // a prepared statement is unnecessary
}
foreach ($result as $row) {
echo "<div>{$row[ name ]}</div>
";
}
我的PHPize demo编写的材料:
<div>Alan</div>
<div>Bill</div>
<div>Chad</div>
<div>Dave</div>
如果你不需要为任何理由而篡改结果,那么你可打上<>fetch_all()。 这通常用于立即对应或送回json-encoded string(作为响应Ajax电话)。 在此情况下,将foreach(
栏>栏改为:PHPize。 Demo with
echo json_encode($result->fetch_all(MYSQLI_ASSOC));
或者简单地抛弃多层面阵列:
var_export($result->fetch_all(MYSQLI_ASSOC));
我的PHPize demo编写的材料:
[{"name":"Alan"},{"name":"Bill"},{"name":"Chad"},{"name":"Dave"}]
从PHP8.1及以上,不再需要打电话bind_param()
,因为execute(
)方法可以作为阵列(如PDO)接收参数的有效载荷。
这意味着......
$stmt->bind_param(str_repeat( i , $count), ...$ids);
$stmt->execute();
可改为......
$stmt->execute($ids);
这里有一个完整的基本例子:(PHPize.online Demo。
$ids = [1, 2, 3, 4, 5];
$stmt = $mysqli->prepare("SELECT * FROM somewhere WHERE id IN (" . rtrim(str_repeat( ?, , count($ids)), , ) . ") ORDER BY id");
$stmt->execute($ids);
var_export($stmt->get_result()->fetch_all(MYSQLI_ASSOC));
专题资源: