【问题标题】:Separate Iterations of arrayed _POST variables数组 _POST 变量的单独迭代
【发布时间】:2012-08-02 03:02:22
【问题描述】:

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

上一页包含一个表单,它通过_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 倍结构继续使用索引为主队、客队、日、月、年、小时、分钟的数组。

【问题讨论】:

  • 每个$_POST变量是不是一个以团队id为索引的数组?
  • 没有。前几个 $_POST 变量根本不是数组。我已更新问题以包含在 $_POST 数组上运行 print_r 的结果。
  • 您在查询后忘记了)。此外,您正在使用mysql并且没有清理您的输入。见MySQLimysqli_real_escape_string
  • 感谢您对消毒物品的提醒。安全方面不是我一直关注的事情,但我会改变它。

标签: php if-statement foreach


【解决方案1】:

$_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])。

【讨论】:

  • 我很欣赏这些指针,尤其是等价校正!对代码进行了这些更新后,它不再返回十个警告,但插入仍然不起作用。我想我可以通过说:foreach($_POST['hometeam'] as $value1 => $value2,并为每个排列的 $_POST 变量重复。
  • @AdamKnott 我刚刚添加了一些重构代码,它更简单并且应该可以工作。我很想知道您在尝试将项目插入表格时遇到了什么错误。
  • @Nicholsophy 感谢重构代码,我知道您要做什么,但我不确定发生了什么。它将值“Array[1,2,3] 插入到 home_id 和 away_id 下的三个记录中,并将正确的数据插入到日期和时间字段中。有什么想法吗?
  • $league_id 元素来自页面更上方的定义,其中 SELECTS * FROM Leagues WHERE division=$_POST['division'] 等等(无论如何现在都可以!)
  • 忽略我的评论:日期和时间不起作用,它们工作得很好。
【解决方案2】:

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

如果可以的话,我还建议您将您的年、月、日作为任何日期传递 string
使用 date("Y-m-d",strtotime($dateStr)) 对其进行格式化。

您还可以使用 php date 和 mktime 来格式化您的时间而不是 concatinating 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 是一样的

【讨论】:

  • 这将返回“警告:非法偏移类型”围绕“${$key}=sanitize_str($key[$stat]);”
  • 已更新。将“if(is_array(${$key}))”更改为 if(is_array($stat))
  • 仍然警告同样的事情,但只是一次而不是 10 次,并且解释为致命错误:不能将字符串偏移量用作数组(同一行)
猜你喜欢
  • 2010-09-27
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多