English 中文(简体)
用我方言中的一种阵容:`WHERE . IN(.)'。 查询[复制]
原标题:Use an array in a mysqli prepared statement: `WHERE .. IN(..)` query [duplicate]

我们有疑问:

SELECT * FROM somewhere WHERE `id` IN(1,5,18,25) ORDER BY `name`;

http://www.ohchr.org。

https://stackoverflow.com/questions/330268/i-have-an-array-of-integers-how-do-i-use-each-one-in-a-mysql-query-in-php/330280#330280>adviced,准备一份声明并多次发出:

$stmt = $mysqli->prepare( SELECT * FROM somewhere WHERE `id`=?; );
foreach ($ids as $id){
    $stmt->bind_params( i , $id);
    $stmt->exec();
}

但现在我不得不以人工方式对结果进行分类。 我是否有任何冰 alternatives替代物?

最佳回答

您可以这样做:

$ids = array(1,5,18,25);

// creates a string containing ?,?,? 
$clause = implode( , , array_fill(0, count($ids),  ? ));


$stmt = $mysqli->prepare( SELECT * FROM somewhere WHERE `id` IN (  . $clause .  ) ORDER BY `name`; );

call_user_func_array(array($stmt,  bind_param ), $ids);
$stmt->execute();

// loop through results

用你的话来说,每id子就用一刀子,你用我的头巾进行分类。

问题回答

如果存在同样的问题,除了七年前的“@sled”的答复之外,这里有可能没有制定<编码> 用户_func_array(array($stmt, oblig_param ),美元; 步骤,但只要求约束——一次:

$ids = array(1,5,18,25);

// creates a string containing ?,?,? 
$bindClause = implode( , , array_fill(0, count($ids),  ? ));
//create a string for the bind param just containing the right amount of s 
$bindString = str_repeat( s , count($ids));

$stmt = $mysqli->prepare( SELECT * FROM somewhere WHERE `id` IN (  . $bindClause .  ) ORDER BY `name`; );

$stmt->bind_param($bindString, ...$ids);
$stmt->execute();

我认为这是最简单的答案:

$ids = [1,2,3,4,5];
$pdos = $pdo->prepare("SELECT * FROM somwhere WHERE id IN (:"
        . implode( ,: , array_keys($ids)) . ") ORDER BY id");

foreach ($ids as $k => $id) {
    $pdos->bindValue(":". $k, $id);
}

$pdos->execute();
$results = $pdos->fetchAll();

长期以来,你们的众多伊德人并不含有具有非法性质的关键或关键人物,这给我们带来了危险。

为了执行安全我方格利的质询任务,要把大量现成的价值观纳入地壳体,准备的声明是执行的专业技术。

让我们假设,即将输入的数据有效载荷是用户提供的数据——这意味着我们不能保证数据的完整性,也不能保证数据量。 事实上,预期的数据阵列可能空。 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));

专题资源:

我补充说,一种缓慢和amp的解决方案,尽管如此,它却利用为纽约若干阵列项目准备的声明:(a) 3项声明是普遍性的,可在任何地方重复使用。

  1. CREATE TEMPORARY TABLE `ids`( `id` INT );
  2. INSERT INTO `ids` VALUES(?); this will insert your IDs
  3. SELECT `id` FROM `ids` LEFT JOIN .... ; use data from other tables to sort the ids list
  4. SELECT `id` FROM `ids`; select everything back

否则,你就不得不使用<代码>IN(?,?,?,?,......,或人工分类。 最好的想法是使用简单的MySQL-queries,或设法以你喜欢的方式将身份证清单分类。

您是否考虑用JOIN和WHERE条款重新撰写你原来的询问,以便你需要避免在《家庭、社会、文化权利国际公约》条款中加入。 我在座谈了同样的问题,在审查了可能的解决办法之后,我找到了一种新办法。

Copied from my response here 如何使用《设计书》编写载有本条款的声明?

1. 指定持有人

$values = array(":val1"=>"value1", ":val2"=>"value2", ":val2"=>"$value3");
$statement =  SELECT * FROM <table> WHERE `column` in(: .implode( , : ,array_keys($values)). ) ORDER BY `column` ;

使用吗?

$values = array("value1", "value2", "$value3");
$statement =  SELECT * FROM <table> WHERE `column` in( .trim(str_repeat( , ? , count($values)),  ,  ). )  ORDER BY `column` ;

另一种选择是使用PHP混合功能处理结果,但这是“manual”的。

See this: Sort Object in PHP





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签