【问题标题】:foreach array wise multi SQL query not working in PHPforeach 数组明智的多 SQL 查询在 PHP 中不起作用
【发布时间】:2021-06-02 05:01:11
【问题描述】:

我正在尝试在 PHP 中使用多个选中的复选框按值执行多个查询。 我遇到了麻烦,我的代码只执行一个复选框值查询,其余的被拒绝。

我在 StackOverflow 上查看了有关此问题的信息,我得到了很多关于 foreach 循环的线程,但在我的情况下,当我应用它时它不起作用。

请帮助我,我是第一次尝试 foreach 循环,所以我对此有点困惑。 我还有一个问题是我无法通过数组验证无效数据。 我如何解决这个问题?它仅适用于第一个检查值,但我想要所有选中的复选框。 我正在尝试从我在复选框中选择的那些特定 id 的数据库中获取数据。并在我下面提到的所有查询的数组中回显它-

在开发工具中看到的发送表单数据格式

referenceID[]: PO0203211
referenceID[]: PO203213

PHP

$checkbox = $_POST['referenceID'];
foreach ($checkbox as $chk) {
    $stmt = $con->prepare(
        "SELECT  * FROM `table` WHERE `ref` = :referenceid"
    );
    $stmt->execute([':referenceid' => $chk]);
    $stmt = $stmt->fetchAll();

    $response = [];
    $i = 1;
    foreach ($stmt as $data) {
        $response[] = [
            "slno" => $i,
            "name" => $data['name'],
            "orderid" => $data['address'],
        ];
        $i++;
    }
    echo json_encode($response);
    exit();
}

【问题讨论】:

  • $response 移动到第一个foreach 之前(否则它将在每次迭代时被覆盖)。然后将echoexit 移动到foreach 循环之后。如果你在 foreach 中有一个exit,它总是会在第一次迭代后退出脚本。
  • 您尝试过什么调试问题?预期的结果是什么?
  • 我会建议使用另一种方式。在这里,如果您有 100 个复选框,您将执行 100 个查询。也许最好“粘合”所有复选框值,然后使用“FIND_IN_SET”或“IN”操作仅执行一个查询。
  • @MagnusEriksson 谢谢你..它的工作......请给我机会投票给你。假设PO0203211 这在数据库中不可用我如何显示this is not availe in db 与每个循环的错误。
  • @Peter 你是对的,但你能帮助我如何在我的代码中应用你的想法。我是新手,就我而言,您的功能听起来很难理解。你是真的-请帮助我

标签: php sql arrays pdo foreach


【解决方案1】:

试试这个,当在 foreach 中使用exit() 时,代码不会继续,只会执行第一个元素。

编辑 1:

好的,我将更深入地解释如何优化这段代码。

您从选中的复选框中获得“id”标识符。

你可以使用 SQL IN() 来优化这个。

看看这个

$checkboxDivide = implode("','", $_POST['referenceID']);
$response = []; //Final Result

$stmt = [];
$query = mysqli_query($con, 
         "SELECT * FROM `table` WHERE `ref` IN('{$checkboxDivide}')"
);
while($stmt[] = mysqli_fetch_assoc($query));

//Delete empty last array
array_pop($stmt);

$i = 1;
foreach ($stmt as $data) {
    $response[] = [
        "slno" => $i,
        "name" => $data['name'],
        "orderid" => $data['address'],
    ];
    $i++;
}


echo json_encode($response);

【讨论】:

  • 请在您的答案中添加更多解释,以便其他人可以从中学习
  • 我如何验证.. 检查数据库中的数据是否可用 foreach。
  • @Satyam 我编辑我的答案,现在只优化一个查询,您可以检查它是否适合您,在这种情况下,请将我的答案标记为正确:)
  • @Satyam 请提供结果,编辑您的问题
【解决方案2】:

您在 foreach 中使用了 exit() 函数,这将终止当前脚本。见php manual on exit

我指的是

foreach ($checkbox as $chk) {}

不去

foreach ($stmt as $data) {}

脚本将在第一个 foreach 的第一个循环后终止。

尝试将其移出 foreach。

**由于@El_vanja 的评论而更新了答案

将您的 $response = []; 数组移出 foreach 循环。这会将数据保留在数组中,并且不会在 foreach 循环的每次迭代中重置数组。

【讨论】:

  • 仍然不起作用,因为$response = []; 是在循环内定义的,这将导致仅输出最后一个元素。它需要放在外面和前面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多