0

我在设计用于将固定装置插入体育联盟数据库的表单时遇到了一些问题。

上一页包含一个通过 _POST "area"/"division"/"season" 定义的表单,并包含一组灯具字段的迭代(到十个)循环,这些字段被定义为具有数组名称,如“hometeam[$i ]"、"awayteam[$i]" 等等。

在处理灯具输入的页面上,我需要从 $_POST 数组中提取表单的每个单独迭代——即“hometeam[1]”“awayteam[1]”等等——并将其插入到MYSQL 数据库在移动到下一个之前。我对 foreach 和 if 子句完全不知所措,所以我认为最好在这里问。

<?php
$a=1;
while($a<11){
foreach($_POST as $key){
if(is_array($key))
{foreach($key as $value1=>$value2){
    if($value1=$a){
    if($_POST='hometeam')$home_id=$value2;
    else if($_POST='awayteam')$away_id=$value2;
    else if($_POST='day')$day=$value2;
    else if($_POST='month')$month=$value2;
    else if($_POST='year')$year=$value2;
    else if($_POST='hour')$hour=$value2;
    else if($_POST='mins')$mins=$value2;}
    $date = ($year . "-" . $month . "-" . $day);
    $time = (($hour) . ":" . ($mins) . ":00");
    $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id'";
    if($hour != "00"){
$enter_result = mysql_query($enter_query);
}}}

}
$a++;
}
?>

如果有人能指出我在这里公然出错的地方,我将不胜感激。我敢肯定这并不意味着这么难,但我很慌张,看不到我输入的内容,而且我不确定我的知识是否准确。

在数组上运行 print_r 会得到以下结构:

Array ( [area] => 1 [season] => 2 [division] => 1 [hometeam]
=> Array ( [1] => 17 [2] => 2 [3] => 12 [4] => 17 [5] => 17
[6] => 17 [7] => 17 [8] => 17 [9] => 17 [10] => 17 ) [awayteam]
=> Array ( [1] => 6 [2] => 4 [3] => 10 [4] => 17 [5]

其中相同的 10 倍结构继续索引为主队、客队、日、月、年、小时、分钟的数组。

4

2 回答 2

0

您也可以使用 php 变量来创建其他 php 变量。
因此,要将 post 变量转换为相应的变量,请将变量放在“${$variable}”

中,如果可以的话,我还建议您将年、月、日作为任何日期字符串传递并
使用date(" Ymd",strtotime($dateStr))来格式化它。

您还可以使用 php date 和 mktime 来格式化您的时间,而不是连接 date("H:i:00",mktime($hour,$mins))

另外,确保你清理你的输出 http://www.php-developer.org/best-practices-when-sanitizing-post-to-prevent-mysql-and-xss-attacks/

for ($ix=0; $ix<11; $ix++) {
    foreach ($_POST as $key=>$stat) {
        // If it is an array, extract value according to index ($ix)
        /* Update
        if(is_array($stat))
            ${$key}=sanitize_str($key[$stat][$ix]);
        else
            ${$key}=sanitize_str($key[$stat]);
        */
        //UPDATE!
        if(is_array($stat))
            ${$key}=sanitize_str($stat[$ix]);
        else
            ${$key}=sanitize_str($stat);
    }
    // If you pass date as separate values
    $date = $year."-".$month."-".$day;
    // If you pass date as a sting, use
    // $date=date("Y-m-d",strtotime($date));
    $time = $hour.":".$mins.":00");

    $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) 
                VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id')";
    if($hour != "00"){
        $enter_result = mysql_query($enter_query);
    }
}

function sanitize_str($data){
    $data=trim($data);
    $data=htmlspecialchars($data);

    $data = mysql_real_escape_string($data);
    return $data;
}

我还没有完全测试过这个,但它应该可以工作。
在 ${$key} 行中,如果 $key 是值“hometeam”,则 ${$key} 变为 ${hometeam},这与说 $hometeam 相同

于 2012-08-02T03:52:03.250 回答
0

$_POST是一个关联数组,因此可以通过键名访问其值,例如$_POST['hometeam']. 这将包含每个值的数组hometeam[]

我看到的第二件事是您需要记住 = 运算符用于分配值,而 == 用于比较。所以 if ($value = $a) 会将 $a 分配给 $value 并返回结果,而不是逻辑测试。

您应该考虑用选择块替换 if/else 的大链。但这是可选的,我将其保留在您的示例中。

我最后的建议是,你不必有空格,它确实可以在代码不能正常工作时更容易审查代码。

我还没有测试过这段代码,但这就是我将如何修改你所拥有的。

<?php
    $a=1;
    while ($a<11) {
        foreach ($_POST as $key => $value) {
            if (isarray($value)) {
                foreach ($value as $value1 => $value2) {
                    if ($value1 == $a){
                        if ($key == 'hometeam') { $home_id = $value2; }
                        else if($key == 'awayteam') { $away_id = $value2; }
                        else if($key == 'day') { $day = $value2; }
                        else if($key == 'month') { $month = $value2; }
                        else if($key == 'year') { $year = $value2; }
                        else if($key == 'hour') { $hour = $value2; }
                        else if($key == 'mins'){ $mins = $value2;}
                        $date = ($year . "-" . $month . "-" . $day);
                        $time = (($hour) . ":" . ($mins) . ":00");
                        $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$home_id', '$away_id', '$date', '$time', '$league_id')";
                        if ($hour != "00"){
                            $enter_result = mysql_query($enter_query);
                        }
                }
            }

        }
        $a++;
    }
?>

我希望这至少能让你走上正轨。

编辑:我已经对此进行了一些重构。它不会检查表单上返回的内容(这是一个安全问题),但这超出了这个问题的范围。

<?php
    $a=1;
    while ($a<11) {

        $date = ($_POST['day'][$a] "-" . $_POST['month'][$a] . "-" . $_POST['day'][$a]);
        $time = ($_POST['hour'][$a] . ":" . $_POST['mins'][$a] . ":00");
        $hometeam = $_POST['hometeam'][$a];
        $awayteam = $_POST['awayteam'][$a];
        $enter_query = "INSERT INTO matches (home_id, away_id, date, time, league_id) VALUES ('$hometeam', '$awayteam', '$date', '$time', '$league_id')";
        if ($_POST['hour'][$a] != "00"){
            $enter_result = mysql_query($enter_query);
        }
        $a++;
    }
?>

我看不到league_id 来自哪里。如果它是 $_POST 的一部分,您可以以相同的方式引用它(如果它不是数组,则不要使用 [$a])。

于 2012-08-02T03:27:05.823 回答