[英]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 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 而不是使用 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.