Php foreach循环只输入一条记录

Php foreach循环只输入一条记录,php,Php,如果我在填写两个必需的文本字段后只回显$Reasions,那么它将显示这两个字段的输入值。但是如果我尝试插入数据库,它只会插入一条记录,而不会插入第二条记录 function insert_lost_reasons($link){ if (isset($_POST['submit']) && isset($_SESSION['last_id'])) { $message = ""; foreach($_POST['name'] as $

如果我在填写两个必需的文本字段后只回显$Reasions,那么它将显示这两个字段的输入值。但是如果我尝试插入数据库,它只会插入一条记录,而不会插入第二条记录

function insert_lost_reasons($link){

    if (isset($_POST['submit']) && isset($_SESSION['last_id'])) {

        $message = "";
        foreach($_POST['name'] as $reasons) {
            if (empty($reasons)) {
                $message = "Please fill in all fields";
            }
        }

        if ($message) {
            echo error_message($message);

        } else {
            foreach($_POST['name'] as $reasons) {
                $stmt = $link->prepare("INSERT INTO `lost_time` (`ps_id`, `reason`) SELECT ?, `lost_time_reason_id` FROM `lost_time_reasons` WHERE `lost_time_desc` = ?");
                $stmt->bind_param("is", $_SESSION['last_id'], $reasons);
                $stmt->execute();
                $stmt->close();
                unset($_SESSION['token']);
                header("location: dash.php");
                exit();
            }
        }
    }
}

问题是您关闭会话并在第一个foreach循环中退出。等待所有循环,然后使用
headeer
功能跳转

header("location: dash.php");
exit();
改为这样做:

foreach($_POST['name'] as $reasons) {
    //Edit this for your usage
    $stmt = $link->prepare("INSERT INTO `lost_time` (`ps_id`, `reason`) SELECT ?, `lost_time_reason_id` FROM `lost_time_reasons` WHERE `lost_time_desc` = ?");
    $stmt->bind_param("is", $_SESSION['last_id'], $reasons);
    $stmt->execute();
}
$stmt->close();
unset($_SESSION['token']);
header("location: dash.php");
exit();

也许你应该这样写你的简历

else {
    foreach($_POST['name'] as $reasons) {
        $stmt = $link->prepare("INSERT INTO `lost_time` (`ps_id`, `reason`) SELECT ?, `lost_time_reason_id` FROM `lost_time_reasons` WHERE `lost_time_desc` = ?");
        $stmt->bind_param("is", $_SESSION['last_id'], $reasons);
        $stmt->execute();
    }
    $stmt->close();
    unset($_SESSION['token']);
    header("location: dash.php");
    exit();
}

您正在第一次迭代中重定向。

查看您的代码。想想它能做什么。
exit()
在哪里。什么时候调用它。您是否声称
INSERT…SELECT…
查询有效?我不认为应该这样做,因为您试图使用参数
作为列名,这不是合法的语法。正如@RiggsFolly指出的,您不能使用参数作为列名。为什么不显示错误呢。检查日志文件add
ini\u集('display\u errors',1);ini_集(“日志错误”,1);错误报告(E_全部);mysqli_报告(mysqli_报告错误| mysqli_报告严格)到脚本的顶部。这将强制任何
mysqli\uuu
错误生成一个您可以在浏览器上看到的异常,其他错误也将在您的浏览器上看到。@riggsfully,同样,语法是正确的,查询按照我的要求工作。Rishi的回答是正确的。您错过了SQL语法错误,即,
SELECT?,lost_time\u reason\u id FROM
您不能将参数用于列名称SELECT?这是正确的。Rishi的答案是正确的。我需要在foreach循环之外通过标题调用移动。@Jonathan请添加我在评论中建议的错误报告代码,只是为了逗我开心。如果这真的起作用,我们都需要了解它,因为它是
MYSQLI\uu
扩展和MYSQL本身的一个重大变化works@RiggsFolly,它确实有效。我通过PHP生成文本输入。如果用户键入3,则生成3个文本输入。然后,他们在每个文本字段中键入内容,并通过ajax/jquery在数据库中进行搜索。当他们点击其中一个项目时,记录显示在
  • 中,文本随后进入文本字段,但将id绑定到值,而不是文本值。选择?如您所见,是根据bind_paramas@Jonathan获得会话变量的值吗?我肯定说它可以正常工作。您错过了SQL语法错误,即
    SELECT?,lost_time\u reason\u id FROM
    您不能将参数用于列名您是对的,但我不知道是什么查询,因为它非常奇怪。我刚刚指出,
    close
    header
    部分应该在
    foreach
    循环之外完成。@RiggsFolly,SELECT?没有问题?。头调用需要移动到foreach循环之外。