【问题标题】:Complex Server-Side Validation复杂的服务器端验证
【发布时间】:2011-11-06 10:38:33
【问题描述】:

你好 Stack Overflowites:

我这里有一个复杂的系统/表单,我已经完成了整个前端验证(使用 jQuery)....

我需要帮助验证(在服务器端使用 PHP)...我希望这可以成为我们一起工作的事情(因为我的大脑现在几乎要炸了)...我认为此时我只需要一些逻辑上的帮助......

您可以在此处查看我的表单:(此处查看 HTMLjQuery/源代码,因为它相当长) http://www.thesportinghub.com/lms/make-my-picks

如您所见,发生了很多事情,这非常激烈......这是我的基本验证请求:

1.) 在 17 周内,您只能选择同一支球队一次... 2.) 在比赛结束后的一周内,您无法选择球队...

围绕此时间表的所有信息都在一个 XML 文档中,该文档设置为以下格式(这只是 BIGGER XML 代码的 sn-p):

<week id="1">
        <matchup id="1" date="08/29/11" time="1:53 PM">
            <away city="New Orleans">Saints</away>
            <home city="Green Bay">Packers</home>
            <finalscore>
                <away>6</away>
                <home>0</home>
            </finalscore>
        </matchup>
        <matchup id="2" date="09/11/11" time="1:00 PM">
            <away city="Atlanta">Falcons</away>
            <home city="Chicago">Bears</home>
            <finalscore>
                <away></away>
                <home></home>
            </finalscore>
        </matchup>
</week>
    <week id="2">
        <matchup id="1" date="09/18/11" time="1:00 PM">
            <away city="Oakland">Raiders</away>
            <home city="Buffalo">Bills</home>
            <finalscore>
                <away></away>
                <home></home>
            </finalscore>
        </matchup>
        <matchup id="2" date="09/18/11" time="1:00 PM">
            <away city="Kansas City">Chiefs</away>
            <home city="Detroit">Lions</home>
            <finalscore>
                <away></away>
                <home></home>
            </finalscore>
        </matchup>
        <matchup id="3" date="09/18/11" time="1:00 PM">
            <away city="Baltimore">Ravens</away>
            <home city="Tennessee">Titans</home>
            <finalscore>
                <away></away>
                <home></home>
            </finalscore>
        </matchup>
</week>

那么,请告诉我我的逻辑是否在这里......或者在这种情况下你会做什么......

当表单提交时,我需要创建一个多维数组来存储提交的数据(在它进入我的数据库之前)...这个数组将包含选定的团队,无论他们被选中的哪一周,以及他们被选中的时间。

然后我将不得不以某种方式加载我的 XML(使用 SimpleXML 和 PHP)?每周确保在比赛结束后没有选择。

老实说,我现在真的是头破血流。我怀疑你们中有人在跟踪我吗?

你至少能引导我走向正确的方向吗?这是一个包含这么多东西的激烈脚本。所有前端验证都已完成。我只需要将提交的信息与 XML 进行比较,并确保我的所有漏洞都被覆盖。

更新:

到目前为止,这是我的 PHP 代码,但它并没有真正起作用...我只是展示它来帮助描绘我正在使用的图片。

  <?php 
    if( isset($_POST['submit']) ) {
    $schedule = "schedule.xml";

$xml = simplexml_load_file($schedule) or die ("Unable to load XML file!");
    date_default_timezone_set('US/Eastern');
    $time = date("h:i:s", time());
    $week1 = $_POST['Week_1'];
    $week2 = $_POST['Week_2'];
    $week3 = $_POST['Week_3'];
    $week4 = $_POST['Week_4'];
    $week5 = $_POST['Week_5'];
    $week6 = $_POST['Week_6'];
    $week7 = $_POST['Week_7'];
    $week8 = $_POST['Week_8'];
    $week9 = $_POST['Week_9'];
    $week10 = $_POST['Week_10'];
    $week11 = $_POST['Week_11'];
    $week12 = $_POST['Week_12'];
    $week13 = $_POST['Week_13'];
    $week14 = $_POST['Week_14'];
    $week15 = $_POST['Week_15'];
    $week16 = $_POST['Week_16'];
    $week17 = $_POST['Week_17'];

    foreach($xml->week as $week)
    {
    $week_number = $week['id'];

    foreach($week->matchup as $matchup)
    {
    $week_name = "Week_" . $week_number;
    $away_city = $matchup->away['city'];
    $home_city = $matchup->home['city'];
    $away_teamname = $matchup->away;
    $home_teamname = $matchup->home;
    $game_time = $matchup['time'];
    $game_date = $matchup['date'];
    $away_full = "{$away_city} {$away_teamname}";
    $home_full = "{$home_city} {$home_teamname}";
    $home_score = $matchup->finalscore->home;
    $away_score = $matchup->finalscore->away;

    date_default_timezone_set('US/Eastern');
    $game = "{$game_date} {$game_time}";

    ?>
    <div class="savedbox">
    <?php
    if (strtotime($game) <= time()) {
    ?>
    <strong>You cannot pick the <?php echo $away_full ?> or <?php echo $home_full ?>. Those teams have been locked for the respective week.</strong>
    <?php
    }
    }
    }
    ?>
    <?php

    if (count(array_unique($_POST))  ===  count($_POST)) {
    ?>
    <strong>Your picks have been saved!</strong><br/><br/>

    <strong>Week 1 Pick:</strong> <?php echo $week1 ?><br/>
    <strong>Week 2 Pick:</strong> <?php echo $week2 ?><br/>
    <strong>Week 3 Pick:</strong> <?php echo $week3 ?><br/>
    <strong>Week 4 Pick:</strong> <?php echo $week4 ?><br/>
    <strong>Week 5 Pick:</strong> <?php echo $week5 ?><br/>
    <strong>Week 6 Pick:</strong> <?php echo $week6 ?><br/>
    <strong>Week 7 Pick:</strong> <?php echo $week7 ?><br/>
    <strong>Week 8 Pick:</strong> <?php echo $week8 ?><br/>
    <strong>Week 9 Pick:</strong> <?php echo $week9 ?><br/>
    <strong>Week 10 Pick:</strong> <?php echo $week10 ?><br/>
    <strong>Week 11 Pick:</strong> <?php echo $week11 ?><br/>
    <strong>Week 12 Pick:</strong> <?php echo $week12 ?><br/>
    <strong>Week 13 Pick:</strong> <?php echo $week13 ?><br/>
    <strong>Week 14 Pick:</strong> <?php echo $week14 ?><br/>
    <strong>Week 15 Pick:</strong> <?php echo $week15 ?><br/>
    <strong>Week 16 Pick:</strong> <?php echo $week16 ?><br/>
    <strong>Week 17 Pick:</strong> <?php echo $week17 ?><br/>

    <?php
    } else {
    ?>
    <strong>Trying to pull a <em>fast one</em>? We don't think so. You can only pick the same team once. If you need more clarification of the rules, please visit <a href="how-to-play">How To Play</a>.</strong>
    <?php
    }
    ?>
    </div><br/>
    <?php
    }
    ?>

我还应该提到,这也将与一个 mySQL 数据库表相关联。我需要获取人们提交的所有信息并将其插入我设置的数据库表中。只有通过我上面列出的所有验证,它才会进入数据库。

我们将不胜感激。即使你只是给我一些关于如何开始的基本指示。

谢谢, 克里斯

【问题讨论】:

  • 对我能获得的任何帮助非常感兴趣,以便通过这个逻辑。我也可以提供任何和所有可能的代码 sn-ps...我有一个带有 jQ​​uery 前端验证的表单...它从 XML 中提取所有信息开始...现在在服务器端验证,我需要比较所有提交的信息(基于初始 XML 文档)并确保我的其他问题得到解决。 (同一队只能选一次……过了时间就不能选队了)……谢谢
  • 我想我离这儿很远了...我可能需要为每个 $_POST 作为 $key => $value 做一个 foreach 循环...我将如何实现这个?谢谢...
  • 没人帮忙吗?我努力成为一个清晰的沟通者......
  • 您的问题已经提出了一个小时。给它点时间。 :)
  • 嘿,你能告诉我你想在一个列表中完成的所有事情吗? IE。 1.加载多数组中的所有内容,2.有效,3.提交。谢谢

标签: php xml arrays validation foreach


【解决方案1】:
<?php 

if( isset($_POST['submit']) )
{
    $required_weeks = 17;
    $schedule = "schedule.xml";
    $xml = simplexml_load_file($schedule) or die ("Unable to load XML file!");
    date_default_timezone_set('US/Eastern');
    $time = date("h:i:s", time());

    foreach($xml->week as $week)
    {
        foreach($week->matchup as $matchup)
        {
            $away_city = $matchup->away['city'];
            $home_city = $matchup->home['city'];
            $away_teamname = $matchup->away;
            $home_teamname = $matchup->home;
            $game_time = $matchup['time'];
            $game_date = $matchup['date'];
            $away_full = $away_city . ' ' . $away_teamname;
            $home_full = $home_city . ' ' . $home_teamname;
            $home_score = $matchup->finalscore->home;
            $away_score = $matchup->finalscore->away;

            date_default_timezone_set('US/Eastern');
            $game = $game_date . ' ' . $game_time;

?>
<div class="savedbox">
<?php

            if (strtotime($game) <= time())
            {

?>
<strong>You cannot pick the <?php echo $away_full ?> or <?php echo $home_full ?>. Those teams have been locked for the respective week.</strong>
<?php

            }
        }
    }

    //if (count(array_unique($_POST))  ===  count($_POST))
    if (count(array_unique($_POST)) === $required_weeks)
    {

?>
<strong>Your picks have been saved!</strong><br/><br/>
<?php

        for($a = 1; $a <= $required_weeks; $a++)
        {

?>
<strong>Week <?php print $a; ?> Pick:</strong> <?php echo $_POST['Week_' . $a] ?><br/>
<?php

        }
    }
    else
    {

?>
<strong>Trying to pull a <em>fast one</em>? We don't think so. You can only pick the same team once. If you need more clarification of the rules, please visit <a href="how-to-play">How To Play</a>.</strong>
<?php

    }

?>
</div><br/>
<?php

}

?>

我已经稍微整理了您的代码(当您可以使用 $_POST 和更灵活的总周数时,无需使用 vars)但是您的代码看起来不错。

除了检查 17 个(在您的示例中)独特的选择并确保所有选项都在未来之外,您还需要检查/做其他事情吗?

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2011-01-01
    相关资源
    最近更新 更多