如何使用从MySQL到iOS的循环PHP语句获取数据?

时间:2019-01-26 09:01:23

标签: php mysql swift

我的系统由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的数量是可变的。

我认为在这段代码中,我需要两个循环语句。

  1. 要基于多个id(id的数量是可变的)获取多个数据
  2. 要将这些数据附加到数组中

当范围未定义时,我不知道如何使用循环语句。

如何在PHP中使用循环语句,如何重新排列这些代码?

1 个答案:

答案 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

另请参阅hereherehere,以进一步了解方法为什么要这样做


重要提示:

  • MySQL中的数字列(通常为id列)不需要使用'引号。
  • 在使用预处理语句之前,您可以将变量typecast转换为整数((int)$var)以限制风险。
  • 最好指定所需的列,而不要使用*包罗万象。
  • 您的$_POST数据应为数组$_POST['ids'][...]
  • 每天吃五块不同的水果或蔬菜。
  • 从不信任用户输入!