我的系统由3个组件组成。
ios-PHP-MySQL
如果ios用户选择了多个“ id”,
然后,ios应用将这些选定的“ id”请求发布到服务器,
然后,服务器根据MySQL中选定的“ id”查找数据。
最后,服务器将这些数据传递给ios应用。
这些是我尝试过的PHP语句。
<?php
$id_0 = $_POST['0'];
$id_1 = $_POST['1'];
$id_2 = $_POST['2'];
$id_3 = $_POST['3'];
...
$id_n = $_POST['n'];
$conn = mysqli_connect('address', 'user', 'password', 'database');
$sql = "SELECT * FROM firstname WHERE id = '$id_0'";
if ($result = mysqli_query($conn, $sql)) {
$resultArray = array();
$tempArray = array();
while($row = $result->fetch_object()) {
$tempArray = $row;
array_push($resultArray, $tempArray);
}
} else {
}
mysqli_close($conn);
?>
要获取多个“ id”数据,我发现我需要使用循环语句。
但是问题是,所选ID的数量是可变的。
我认为在这段代码中,我需要两个循环语句。
当范围未定义时,我不知道如何使用循环语句。
如何在PHP中使用循环语句,如何重新排列这些代码?
答案 0 :(得分:2)
我确定这个问题是重复的,但是我找不到确切的来源。
您当前的方法意味着您需要为每次迭代运行一个完整的MySQL查询。
因此,查询结果将永远不会更改迭代包含的内容。您可以简单地对其进行修改以使用MySQL IN
一次加载所有变量:
第1步)获取所有值并将它们放置在单个数组中。
$new = []; //new array
foreach ($_POST as $key=>$id){
// Check it is a numeric key
// Check id value is valid to avoid importing other POST values
if((int)$key == $key && (int)$id == $id){
$new[] = $id;
}
}
上面的代码块必须停止使用$_POST['button']
中的值或其他不应包含的已发布数据。如果您可以澄清已发布的数据,例如将所有id
保存到$_POST['id']
数组本身,则可以删除此步骤。
步骤2)清空null / void或重复值的数组。
$new = array_unique($new);
第3步)将数组转换为SQL内部的字符串
$arrayString = implode(',',$new);
步骤4)将字符串插入SQL IN子句:
$sql = "SELECT * FROM firstname WHERE id IN (" . $arrayString . ") ORDER BY id";
简化和简化:
$new = []; //new array
foreach ($_POST as $key=>$id){
if((int)$key == $key && (int)$id == $id){
$new[] = $id;
}
}
$new = array_unique($new);
$sql = "SELECT * FROM firstname WHERE id IN (" .
implode(',',$new) . ") ORDER BY id";
上面的SQL查询将为您提供一个数组数组,每个数组各不相同。您可以根据需要对其进行排序,排序并在PHP中将其输出。
另请参见:This Q&A。
正如其他人所言,您确实应该使用Prepared Statements with MySQLi。
另请参阅here,here和here,以进一步了解方法和为什么要这样做。
id
列)不需要使用'
引号。 (int)$var
)以限制风险。*
包罗万象。$_POST
数据应为数组$_POST['ids'][...]
。