我有一个整数数组,如何在mysql查询(php)中使用每个整数?
我有一个充满随机内容项ID的数组。我需要运行一个mysql查询(数组中的id在WHERE子句中),使用数组中的每个id,按照它们在所述数组中出现的顺序。我该怎么做 这将是一个更新查询,用于数组中的每个ID。使用“in”子句 可能就是你想要的我有一个整数数组,如何在mysql查询(php)中使用每个整数?,php,mysql,arrays,Php,Mysql,Arrays,我有一个充满随机内容项ID的数组。我需要运行一个mysql查询(数组中的id在WHERE子句中),使用数组中的每个id,按照它们在所述数组中出现的顺序。我该怎么做 这将是一个更新查询,用于数组中的每个ID。使用“in”子句 可能就是你想要的 $ids = array(2,4,6,8); $ids = implode($ids); $sql="SELECT * FROM my_table WHERE id IN($ids);"; mysql_query($sql); 否则,你怎么了 $ids =
$ids = array(2,4,6,8);
$ids = implode($ids);
$sql="SELECT * FROM my_table WHERE id IN($ids);";
mysql_query($sql);
否则,你怎么了
$ids = array(2,4,6,8);
foreach($ids as $id) {
$sql="SELECT * FROM my_table WHERE ID = $id;";
mysql_query($sql);
}
您可以执行如下操作,但是需要非常小心,数组只包含整数,否则可能会导致SQL注入 如果可以的话,您真的不想通过多次查询来获取内容。像这样的事情可能就是你想要的
foreach ($array as $key = $var) {
if ((int) $var <= 0) {
unset($array[$key]);
}
}
$query = "SELECT *
from content
WHERE contentid IN ('".implode("','", $array)."')";
$result = mysql_query($query);
foreach($array as$key=$var){
如果((int)$var与几乎所有的“如何从PHP内部执行SQL”问题一样,您真的应该使用准备好的语句。这并不难:
$ids = array(2, 4, 6, 8);
// prepare an SQL statement with a single parameter placeholder
$sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);
// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
$stmt->bind_param("i", $ids[$i]);
$stmt->execute();
echo "Updated record ID: $id\n";
}
// done
$stmt->close();
根据需要为其他字段添加更多参数占位符
选择哪一个?
- 第一个变量以迭代方式处理可变数量的记录,多次命中数据库。这对于更新和插入操作非常有用
- 第二个变量也适用于数量可变的记录,但它只会访问数据库一次。这比迭代方法效率高得多,显然,您只能对所有受影响的记录执行相同的操作。这对于选择和删除操作,或者当您要用相同的数据更新多个记录时,非常有用
为什么要准备声明?
- 准备好的语句安全得多,因为它们使SQL注入攻击变得不可能。这是使用准备好的语句的主要原因,即使编写它们需要更多的工作。一个明智的习惯是:始终使用准备好的语句,即使你认为它“不是真的必要”。忽视会伤害你(或你的客户)
- 使用不同的参数值多次重复使用同一条准备好的语句比向数据库发送多个完整的SQL字符串更有效,因为数据库只需要编译一次语句,也可以重复使用它
- 只有参数值在
execute()
上发送到数据库,因此重复使用时需要传输的数据更少
在较长的循环中,使用准备好的语句和发送普通SQL之间的执行时间差异将变得明显。请接受Tomalak对语句的评论
但是,如果您不希望使用mysqli,则可以始终使用intval()来防止注入:
$ids = array(2, 4, 6, 8);
for ($i = 0; $i < count($ids); $i++)
{
mysql_query("UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = " . intval($ids[$i]));
}
$ids=array(2,4,6,8);
对于($i=0;$i
这是一个仅供管理员使用的功能,所以除了我自己,没有人会执行它。我需要对数组中的每个ID运行更新查询。他说这将成为一个更新语句。不过,在你的答案发布后。OP为什么要查询从我的表中选择*(2468)
?这是我见过的最奇怪的php语法。必须循环一系列这些函数。在第二种方法中,我们在哪里为数组的所有值指定数据类型?上面的解决方案对我不起作用。答案是从2008年开始的。是不是php从那时起就大幅更改了mysqli API?您可以不再需要ref()
函数使用splat操作符(在PHP5.6中引入)$stmt->bind_param(…$args)
$ids = array(2, 4, 6, 8);
for ($i = 0; $i < count($ids); $i++)
{
mysql_query("UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = " . intval($ids[$i]));
}
$values_filtered = array_filter('is_int', $values);
if (count($values_filtered) == count($values)) {
$sql = 'update table set attrib = 'something' where someid in (' . implode(',', $values_filtered) . ');';
//execute
} else {
//do something
}