php只提交填充表单的数组的最后一个值

时间:2015-01-26 02:41:17

标签: php mysql arrays forms indexing

我希望首先从mysql查询填充表单,然后使用户能够从表单中的文本输入字段更新多个表行中的某些值,从而挣扎于单页表单。

代码的目的是通过引用行ID来更新字段。

但由于某种原因,我只能更新表单中的最后一行(数组的最后一行)。我已经包含了一些故障排除代码,以查看ID变量是什么,它总是作为数组的最后一次迭代出现。我想我要么在while循环中覆盖ID变量,要么覆盖for循环。

我尝试将POST /更新移动到第二个文件但得到相同的结果。任何想法/建议将不胜感激

这是代码减去数据库连接:

$saveClicked = $_POST["saveClicked"];


{   //  SAVE button was clicked 
    if (isset($saveClicked)) {
        unset($saveClicked);


        $ID = $_POST["ID"]; 

        $win = $_POST["Winner"];
        $winScr = $_POST["WinnerScore"];
        $losScr = $_POST["LoserScore"];         


        $tschedule_SQLupdate = "UPDATE tschedule SET ";

        $tschedule_SQLupdate .=  "Winner = '".$win."', ";
        $tschedule_SQLupdate .=  "WinnerScore = '".$winScr."', ";
        $tschedule_SQLupdate .=  "LoserScore = '".$losScr."' ";
        $tschedule_SQLupdate .=  "WHERE ID = '".$ID."' ";   


        if (mysql_query($tschedule_SQLupdate))  {   

        echo '<p> the number of mysql affected rows is '.mysql_affected_rows().'</p>';
        echo 'this is the value for post id '.$ID;

        } else {
            echo '<span style="color:red; ">FAILED to update the game.</span><br /><br />';
            echo mysql_error();

        }               
    }   
//  END:  SAVE button was clicked   ie. if (isset($saveClicked))
}


{   //  Get the details of all associated schedule records
    //      and store in array:  gameArray  with key >$indx  

        $indx = 0;

        $tschedule_SQLselect = "SELECT * ";
        $tschedule_SQLselect .= "FROM ";
        $tschedule_SQLselect .= "tschedule ";
        $tschedule_SQLselect .= "WHERE week = 1 ";

        $tschedule_SQLselect_Query = mysql_query($tschedule_SQLselect); 

        while ($row = mysql_fetch_array($tschedule_SQLselect_Query, MYSQL_ASSOC)) {

            $gameArray[$indx]['ID'] = $row['ID'];
            $gameArray[$indx]['Date'] = $row['Date'];
            $gameArray[$indx]['week'] = $row['week'];
            $gameArray[$indx]['Favorite'] = $row['Favorite'];               
            $gameArray[$indx]['Line'] = $row['Line'];
            $gameArray[$indx]['Underdog'] = $row['Underdog'];
            $gameArray[$indx]['OU'] = $row['OU'];
            $gameArray[$indx]['Winner'] = $row['Winner'];
            $gameArray[$indx]['WinnerScore'] = $row['WinnerScore'];
            $gameArray[$indx]['LoserScore'] = $row['LoserScore'];   
            $indx++;             
        }

        $numGames = sizeof($gameArray);

        mysql_free_result($tschedule_SQLselect_Query);          
}

{   //      Output 

            echo '<form name ="postGame" action="'.$thisScriptName.'" method="post">';      

                echo '<table border="1">';
                    echo '<tr>
                               <th>ID</th>
                                <th class="date">Date</th>
                                <th class="num">Week</th>
                                <th>Favorite</th>
                                <th class="num">Line</th>
                                <th>Underdog</th>
                                <th class="num">OU</th>
                                <th>Winner</th>
                                <th>WScore</th>
                                <th>LScore</th>
                                <th>Save</th>   
                            </tr>   ';  

    for ($indx = 0; $indx < $numGames; $indx++) {
    $thisID = $gameArray[$indx]['ID'];
    $saveLink = '<input type = "submit" value = "Save" />';

            $fld_ID = '<input type="text" name="ID" value="'.$thisID.'"/>';

            $fld_saveClicked = '<input type="hidden" name="saveClicked" value="1"/>';


            echo $fld_ID;
            echo $fld_saveClicked;
                        echo '<tr>
                                    <td>'.$gameArray[$indx]['ID'].'</td>
                                    <td>'.$gameArray[$indx]['Date'].'</td>
                                    <td>'.$gameArray[$indx]['week'].'</td>
                                    <td>'.$gameArray[$indx]['Favorite'].'</td>
                                    <td>'.$gameArray[$indx]['Line'].'</td>
                                    <td>'.$gameArray[$indx]['Underdog'].'</td>
                                    <td>'.$gameArray[$indx]['OU'].'</td>
                                    <td><input type="text" size =5 name="Winner">'.$gameArray[$indx]['Winner'].'</td>
                                    <td><input type="number" size=5 name="WinnerScore">'.$gameArray[$indx]['WinnerScore'].'</td>
                                    <td><input type="number" size=5 name="LoserScore">'.$gameArray[$indx]['LoserScore'].'</td>
                                    <td>'.$saveLink.'</td>
                                </tr>   ';      

                    }

                    echo '</table>';

                echo '</form>';

echo' <a href ="../schedules/schedView.php">View Schedule</a>';     

}

3 个答案:

答案 0 :(得分:1)

您为每行中的每个字段使用相同的名称,因此当您发布表单时,只能访问最后一个字段。对这样的字段使用数组表示法:

<input type="text" size =5 name="Winner[]">
                                       ^^

这将为您提供$_POST['Winner']的数组,而不是单个值。对其他<input>元素执行相同操作。

此外,在提交表单后处理表单的代码只处理一个值。您需要修改它以循环遍历这些数组。

警告:

  • 不要将mysql_*()用于新代码 - 它已被删除。立即切换到mysqli_*()PDO
  • 您的代码易受SQL注入攻击。使用mysql_real_escape_string()(或等效的mysqli)或更好的方式转义输入变量,切换到预准备语句。

答案 1 :(得分:1)

经过一些研究后,我想我明白这两个答案已经分享得更好了。但是我选择了一个不同的路径并解决了我的问题 - 我直接在每行周围包装了表单标记:

    echo '<form name ="postGame'.$indx.'" action="'.$thisScriptName.'" method="POST">';     
    $fld_saveClicked = '<input type="hidden" name="saveClicked" value="1"/>';   
    echo $fld_saveClicked;  
    $fld_ID = '<input type="text" name="ID" value="'.$thisID.'"/>';
    echo $fld_ID;               
    echo '<tr>
            <td>'.$gameArray[$indx]['ID'].'</td>
            <td>'.$gameArray[$indx]['Date'].'</td>
            <td>'.$gameArray[$indx]['week'].'</td>
            <td>'.$gameArray[$indx]['Favorite'].'</td>
            <td>'.$gameArray[$indx]['Line'].'</td>
            <td>'.$gameArray[$indx]['Underdog'].'</td>
            <td>'.$gameArray[$indx]['OU'].'</td>
            <td><input type="text" size=5 name="Winner" id="Winner">'.$gameArray[$indx]['Winner'].'</td>
            <td><input type="number" size=5 name="WinnerScore" id="WinnerScore">'.$gameArray[$indx]['WinnerScore'].'</td>
            <td><input type="number" size=5 name="LoserScore" id="LoserScore">'.$gameArray[$indx]['LoserScore'].'</td>
            <td><button type="submit" />Save</button></td>
        </tr></form>';          

                    }

关键的故障排除步骤之一是使用var_dump来验证$ _POST实际包含的数据。我知道有几种方法可以做到这一点,包括Hobo和Syed共享的响应,以及使用javascript,但我很高兴我能用php实现我的目标。

答案 2 :(得分:-1)

您的For循环正在表单中存储数组的最后一个值。

$fld_ID = '<input type="text" name="ID" value="'.$thisID.'"/>';

将ID值存储为HTML格式的数组,并在发布表单时获取所有ID值并使用相同的mysql更新查询进行更新。

您的赢家和输家得分也会返回最后一个数组值。