Php 为什么我的表单只将输入数据从foreach循环中的最后一个字段传递到数据库?

Php 为什么我的表单只将输入数据从foreach循环中的最后一个字段传递到数据库?,php,mysql,html,laravel,Php,Mysql,Html,Laravel,我正在尝试使用以下foreach循环从表单更新数据库中的某些数据: $players_ids = $_POST['player_ids']; foreach($players_ids as $player_id) { foreach($_POST['goals'] as $goals) { var_dump($goals); $updateGoals = \DB::table('stats')->where('i

我正在尝试使用以下foreach循环从表单更新数据库中的某些数据:

$players_ids = $_POST['player_ids'];

    foreach($players_ids as $player_id) {

        foreach($_POST['goals'] as $goals) {

            var_dump($goals);
            $updateGoals = \DB::table('stats')->where('id', $player_id)->update(['goals' => $goals]);
        }

        foreach($_POST['assists'] as $assists) {

            var_dump($assists);
            $updateAssists = \DB::table('stats')->where('id', $player_id)->update(['assists' => $assists]);
        }

        foreach($_POST['tackles'] as $tackles) {

            var_dump($tackles);
            $updateTackles = \DB::table('stats')->where('id', $player_id)->update(['tackles' => $tackles]);
        }

    }
表格如下:

@foreach($players as $player)    

<tr>
    <input type="hidden" name="player_ids[]" value="{{ $player->id }}">
    <input type="hidden" name="game_id" value="{{ $game->id }}">
    <td>{{ $player->fn }} {{ $player->ln }}</td>
    <td><input type="number" value="0" name="goals[]" placeholder="goals"></td>
    <td><input type="number" value="0" name="assists[]" placeholder="assists"></td>
    <td><input type="number" value="0" name="tackles[]" placeholder="tackles"></td>
</tr>

@endforeach
@foreach($players作为$player)
{{$player->fn}{{{$player->ln}
@endforeach
当我试图提交这些数据时,它只将foreach循环中最后一个玩家的数据传递给每个玩家,而不是将每个玩家的个人统计信息传递给数据库。因此,如果最终玩家有3个目标,每个人都会在数据库中获得3个目标。这显然不是我想要的功能


我知道不久之后,我会在更新数据库中的数据时遇到问题,因为我不想覆盖数据库中已有的内容,而是将传递的值添加到数据库中已有的值中,因此,如果有人对此有任何了解,我们将不胜感激。

您的表单有多个同名元素的副本。因此,它只使用具有该名称的最后一个元素


要使用一个值数组,您需要使用
[]
,就像您对
player\u id

所做的那样。您的表单有多个同名元素的副本。因此,它只使用具有该名称的最后一个元素


要使用一组值,您需要像对待
球员ID那样使用
[]
。发生这种情况的原因是,您正在使用为进球、助攻和铲球设置的最新值更新每个球员。(事实上,你正在用每一组进球、助攻和铲球来更新每个球员,这会导致很多疑问。)你可能需要改变你的输入,以便你确切地知道用什么来更新每个球员

这也将减少循环和查询

@foreach($players as $player)    
    <tr>
        <input type="hidden" name="player_ids[]" value="{{ $player->id }}">
        <input type="hidden" name="game_id" value="{{ $game->id }}">
        <td>{{ $player->fn }} {{ $player->ln }}</td>
        <td><input type="number" value="0" name="goals[{{ $player->id }}]" placeholder="goals"></td>
        <td><input type="number" value="0" name="assists[{{ $player->id }}]" placeholder="assists"></td>
        <td><input type="number" value="0" name="tackles[{{ $player->id }}]" placeholder="tackles"></td>
    </tr>
@endforeach


$players_ids = $_POST['player_ids'];
foreach ($players_ids as $player_id) {
    $updates = \DB::table('stats')->where('id', $player_id)->update([
        'goals' => $_POST['goals'][$player_id],
        'assists' => $_POST['assists'][$player_id],
        'tackles' => $_POST['tackles'][$player_id]
    ]);
}

一般来说,一个更好的方法是不让它们相加,然后你只需要使用
sum()
来计算每个球员有多少进球、铲球和助攻。然后,您可以对其进行额外的筛选,如按日期、按游戏等进行目标筛选。

发生这种情况的原因是,您正在使用目标、助攻和铲球的最新设置值更新每个球员。(事实上,你正在用每一组进球、助攻和铲球来更新每个球员,这会导致很多疑问。)你可能需要改变你的输入,以便你确切地知道用什么来更新每个球员

这也将减少循环和查询

@foreach($players as $player)    
    <tr>
        <input type="hidden" name="player_ids[]" value="{{ $player->id }}">
        <input type="hidden" name="game_id" value="{{ $game->id }}">
        <td>{{ $player->fn }} {{ $player->ln }}</td>
        <td><input type="number" value="0" name="goals[{{ $player->id }}]" placeholder="goals"></td>
        <td><input type="number" value="0" name="assists[{{ $player->id }}]" placeholder="assists"></td>
        <td><input type="number" value="0" name="tackles[{{ $player->id }}]" placeholder="tackles"></td>
    </tr>
@endforeach


$players_ids = $_POST['player_ids'];
foreach ($players_ids as $player_id) {
    $updates = \DB::table('stats')->where('id', $player_id)->update([
        'goals' => $_POST['goals'][$player_id],
        'assists' => $_POST['assists'][$player_id],
        'tackles' => $_POST['tackles'][$player_id]
    ]);
}

一般来说,一个更好的方法是不让它们相加,然后你只需要使用
sum()
来计算每个球员有多少进球、铲球和助攻。然后你就可以进行额外的筛选,比如按日期、按游戏等进行筛选。

好的,我已经更新了问题,以反映这一点以及我认为需要更改的内容,但它仍然不起作用。我已经在每个变量上运行了var_dump(),以确保它接收到每个变量的正确值,确实如此,但它仍然只是为每个人将最后一个玩家的数据输入数据库。var_dump()还显示它正在通过每个统计集的三个实例,如下所示:
string(1)“1”string(1)“3”string(1)“3”string(1)“2”string(1)“1”string(2)“34”string(2)“35”string(2)“33”string(1)“1”string(1)“3”string(1)“2”string(1)“2”string(1)”2”string(1)“1”string(1)”1”string(1)“1”string(1)”1”string(1)“1”string(2)“34”string(2)”35”string(2)string(2)“33”字串(1)“1”字串(1)“2”字串(1)“3”字串(1)“2”字串(1)“1”字串(2)”34”字串(2)“35”字串(2)”33”
对于每个实例,数组的索引是将它们分组在一起的内容。对于如此复杂的事情,您可能希望使用AJAX提交表单,而不是构建一个JSON对象数组来发送——这将更容易在服务器端进行管理。因此,我将此问题推迟了一段时间,同时添加了我正在构建的应用程序的其他方面,但是问题已经解决了,我又回到了这一点,需要找到一个解决方案。我该怎么做呢?我现在可以成功地创建游戏日志,但是如何将
gamelog
中的值添加到
stats
表中呢。我是否需要首先从
stats
表中检索值以添加从gamelog传递的值,或者我可以根据每个
player\u id
索引的数组中的这些值简单地“更新”表?真的很抱歉,我在学校打电话,以为这就是我解释每个模型/桌子是什么的问题。我将如何使用JSON构建一个数组,然后将其添加到数据库中已经存在的值中?好的,我已经更新了这个问题以反映这一点以及我认为需要更改的内容,但它仍然不起作用。我已经在每个变量上运行了var_dump(),以确保它接收到每个变量的正确值,确实如此,但它仍然只是为每个人将最后一个玩家的数据输入数据库。var_dump()还显示它正在通过每个统计集的三个实例,如下所示:
string(1)“1”string(1)“3”string(1)“3”string(1)“2”string(1)“1”string(2)“34”string(2)“35”string(2)“33”string(1)“1”string(1)“3”string(1)“2”string(1)“2”string(1)”2”string(1)“1”string(1)”1”string(1)“1”string(1)”1”string(1)“1”string(2)“34”string(2)”35”string(2)string(2)“33”字串(1)“1”字串(1)“2”字串(1)“3”字串(1)“2”字串(1)“1”字串(2)”34”字串(2)“35”字串(2)”33”
对于每个实例,数组的索引是将它们分组在一起的内容。对于这样复杂的事情,您可能希望使用AJAX提交表单,而不是构建一个JSON对象数组来发送——这将更容易在服务器端进行管理。因此,我将这个问题推迟了一段时间,同时添加了我正在构建的应用程序的其他方面,但已经没有问题了,现在又回到了这个问题上