繁体   English   中英

Foreach循环只显示api数组中的最后一项

[英]Foreach loop only showing last item in array in api

我正在为我的 android 应用程序制作一个 CRUD API,这个 API 需要做的就是检查数据库中有关不确定传入用户 ID 的信息,并将查询结果返回给应用程序(CRUD 中的 R)。 我已经获得了 API 来查询和输出单个项目数组和数组中的最后一个项目。

我的代码:

$jsonobj = '{"code":"ascaasease","code":"ascaesease","code":"onetoelevn"}';
//mock json
$obj = json_decode($jsonobj);
foreach($obj as $key => $value) {
    $sql = "SELECT code, header, body FROM `messages` WHERE code= '$value'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
        while($row = mysqli_fetch_assoc($result)) {
        $response['code'] = $row["code"];
        $response['header'] =  $row["header"];
        $response['body'] = $row["body"];
        $array_push[] = $response;
        }
    }
    mysqli_close($conn);
}
$return = array("resoponse"=>array("check"=>"check"),"array"=>$array_push);
echo json_encode($return);

在此配置中,它只会输出数组中的最后一项(“code”、“onetoelevn”)。 如果格式化被删除,并且您告诉脚本只回显响应,它仍然只显示数组中的最后一项。

如果您能告诉我如何对数组中的每个项目运行 SQL 查询,我将不胜感激。

首先,您的模拟 JSON 已损坏。 它包含重复的属性。

如果您必须使用循环(您不必),您可以在循环之前准备语句并在其中执行。 然后使用get_result()fetch_all()获取数据。

mysqli

//mysqli connection
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('localhost', 'user', 'password', 'db_name');
$conn->set_charset('utf8mb4'); // always set the charset

$jsonobj = '[ "ascaasease", "onetoelevn"]';
//mock json
$obj = json_decode($jsonobj);

$stmt = $conn->prepare('SELECT code, header, body FROM messages WHERE code=?');
$stmt->bind_param('s', $value);

$array_push = [];
foreach ($obj as $key => $value) {
    $stmt->execute();
    $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    $array_push = array_merge($array_push, $data);
}
$return = array("resoponse" => array("check" => "check"), "array" => $array_push);
echo json_encode($return);

如果您不必使用循环,则可以使用WHERE IN()

$jsonobj = '[ "ascaasease", "onetoelevn"]';
//mock json
$obj = json_decode($jsonobj);

$wherein = str_repeat(',?', count($obj) - 1);
$stmt = $conn->prepare("SELECT code, header, body FROM messages WHERE code IN(? $wherein )");
$stmt->bind_param(str_repeat('s', count($obj)), ...$obj);
$stmt->execute();
$array_push = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

$return = array("resoponse" => array("check" => "check"), "array" => $array_push);
echo json_encode($return);

PDO

当然,如果您使用 PDO,所有这些都会更简单。 如果还不算太晚,是否可以考虑切换到 PDO 而不是使用 mysqli?

选项1:

// PDO connection
$pdo = new PDO("mysql:host=localhost;dbname=db_name;charset=utf8mb4", 'user', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

$jsonobj = '[ "ascaasease", "onetoelevn"]';
//mock json
$obj = json_decode($jsonobj);

$stmt = $pdo->prepare('SELECT code, header, body FROM messages WHERE code=?');

$array_push = [];
foreach ($obj as $key => $value) {
    $stmt->execute([$value]);
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $array_push = array_merge($array_push, $data);
}
$return = array("resoponse" => array("check" => "check"), "array" => $array_push);
echo json_encode($return);

选项 2:

$jsonobj = '[ "ascaasease", "onetoelevn"]';
//mock json
$obj = json_decode($jsonobj);

$wherein = str_repeat(',?', count($obj) - 1);
$stmt = $pdo->prepare("SELECT code, header, body FROM messages WHERE code IN(? $wherein )");
$stmt->execute($obj);
$array_push = $stmt->fetchAll(PDO::FETCH_ASSOC);

$return = array("resoponse" => array("check" => "check"), "array" => $array_push);
echo json_encode($return);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM