完全相同的HTML,为什么它表现不同?

时间:2012-02-20 19:18:31

标签: php html forms

我有一个问题,我真的无法弄清楚如何解决。我有2个不同页面的同一个项目。它允许用户创建表单并将其提交到不同的网页。有两个版本,一个只是请求字段类型,名称和值,另一个允许用户手动输入完整的表单。

所以,正如我的问题所说,在第一种情况下它完美地工作,而在第二种情况下,它会回到同一页面,这让我发疯!我将代码放在最后,但现在重现错误的步骤。到目前为止,这是一个免费托管的页面,因为我将其用于测试目的:

  1. 转到http://saveyourself.vacau.com/form/
  2. 将其放在字段中(这实际上是此页面的测试帐户):

    • Page:http://newfutureuniversity.org/
    • 方法:“发布”
    • 名称1:“用户”
    • 价值1:“用户”
    • 类型1:“text”
    • 姓名2:“通过”
    • 价值2:“密码”
    • 类型3:“密码”
    • 姓名3:“登录”
    • 价值3:“1”
    • 类型3:“隐藏”。
  3. 按“显示表格”,表格将显示

  4. 现在查看该页面的源代码,然后从“<form...>”复制到“</form>
  5. 转到此页面http://saveyourself.vacau.com/form/manual/并将其粘贴到那里。
  6. 按“显示表格”,你应该在第3步之后得到完全相同的页面(检查html,它是100%相同,唯一的变化是地址,/ manual /)。
  7. 现在,这是诀窍。尽管两个页面都有完全相同的html,如果在步骤3之后按“发送表单”按钮,您将登录到新页面,但是如果您在步骤6之后按下“发送表单”按钮(在/表单/手册中) /),刷新该页面并删除您粘贴的表单。这怎么可能?据我所知,这里没有涉及PHP,因为在显示表单时,它只是简单的html,新页面应该处理整个PHP。所以,如果它收到相同的表格,它应该以同样的方式回答,对吗?在第二页中,它没有使用“$ _SERVER ['HTTP_REFERER'];” (访客来自哪里),也没有类似的东西。此外,还有0个javascript。我现在发布html以防万一,以及一些PHP(不要放太多代码)。

    所以问题是,有没有人知道为什么第二种形式不起作用?

    非常感谢你。

    HTML代码(步骤3或6后的两个页面都相同):

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
            <title>Send form</title>
            <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    </head>
    <body style="background: #DDFFFF; width: 80%; height:100%; margin: 0 10% 0 10%; text-align: center;">
    <h1>Send form</h1>
    
        <form action="http://newfutureuniversity.org/" method="POST">
            Web page: http://newfutureuniversity.org/<br>
            Method: POST<br><br>
            <table style="margin-left: auto; margin-right: auto;">
                                <tr>
                    <td style="text-align: right;">
                    User:</td><td><input type='text' name='User' value=''></td>
                    </tr>
                                    <tr>
                    <td style="text-align: right;">
                    Pass:</td><td><input type='password' name='Pass' value=''></td>
                    </tr>
                                    <tr>
                    <td style="text-align: right;">
                    Login:</td><td><input type='text' name='Login' value='1'></td>
                    </tr>
                            </table><br>
            <input type="submit" value="Send form">
        </form>
    </body>
    </html>
    

    工作页面的简化PHP代码(http://saveyourself.vacau.com/form/):

    //Header, body and others go before of this
    <?php
    if ($_POST['sent']==1&&empty($_POST['source'])) //If form is submited
        {
        $i = 1;
        ?>
        <form action="<?php echo $_POST['page']; ?>" method="<?php echo $_POST['method']; ?>">
            Web page: <?php echo $_POST['page']; ?><br>
            Method: <?php echo $_POST['method']; ?><br><br>
            <table style="margin-left: auto; margin-right: auto;">
                <?php 
                while (!empty($_POST['nam'.$i]))
                    { ?>
                    <tr>
                    <td style="text-align: right;">
                    <?php echo $_POST['nam'.$i].":</td><td><input type='".$_POST['typ'.$i]."' name='".$_POST['nam'.$i]."' value='".$_POST['val'.$i]; ?>'></td>
                    </tr>
                    <?php
                    $i++;
                    }
                ?>
            </table><br>
            <input type="submit" value="Send form">
        </form>
    <?php
        }
    
    
    elseif (!empty($_POST['source']))   //If user just wants to create a form and see the code
        {
        //I think this bit is irrelevant codereview, so I skipped it.
        }
    
    
    else        //Body of the first page shown
        { ?>
    <form method="post">
        Web page: <input type="text" name="page"> 
        Method to send: <select name="method"><option value="POST">Post</option><option value="GET">Get</option></select><br>
    
        <table style="border: 1px solid #AAA; margin-left: auto; margin-right: auto;">
            <tr>
                <td>Number</td>
                <td>Name</td>
                <td>Value</td>
                <td>Type</td>
            </tr>
    <?php for ($i = 1; $i <= 10; $i++)
        { ?>
            <tr>
                <td><?php echo $i; ?></td>
                <td><input type="text" name="nam<?php echo $i; ?>"></td>
                <td><input type="text" name="val<?php echo $i; ?>"></td>
                <td>
                <select name="typ<?php echo $i; ?>">
                    <option value="text">Text</option>
                    <option value="password">Password</option>
                    <option value="radio">Radio</option>
                    <option value="checkbox">Checkbox</option>
                    <option value="hidden">Hidden</option>
                    <option value="reset">Reset</option>
                    <option value="submit">Submit</option>
                </select>
                </td>
            </tr>
        <?php } ?>
        </table><br>
    
        Don't worry, a submit button is automatically added.<br>
        <input type="hidden" name="sent" value="1">
        <input type="submit" value="Show form">
        <input type="submit" name="source" value="Form code">
        </form><?php } ?>
    </body>
    </html>
    

    页面中的完整PHP代码无效(http://saveyourself.vacau.com/form/manual/):

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Send form</title>
        <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    </head>
    <body style="background: #DDFFFF; width: 80%; height:100%; margin: 0 10% 0 10%; text-align: center;">
    <h1>Send form</h1>
    
    <?php
    if ($_POST['sentbrr']==1)   //If form is submited
        echo stripslashes($_POST['code']);
    
    else    //First time
        { ?>
        <form method="post">
        Enter the code for the form manually<br>
        <textarea name="code" style="width: 100%; min-height: 450px;"></textarea><br>
        <input type="hidden" name="sentbrr" value="1">
        <input type="submit" value="Show form">
        </form>
        <?php
        } ?>
    
    </body>
    </html>
    

2 个答案:

答案 0 :(得分:6)

如果你看第二个(不工作)页面,你有:

<form method="post">

没有附加action=""属性。因此,您的表单不知道将表单提交到哪里。

答案 1 :(得分:2)

简答:这是浏览器的错(错误?)。

答案很长:不同浏览器的行为会有所不同。在IE9,Firefox和Safari上测试之后,这个问题似乎是一个web-kit bug。 这一假设也得到crbug.combugs.webkit.org

报告的数字“形式/行动”问题的支持。

研究

Kypros似乎是对的,但答案并不那么明显。

如果您转到有问题的页面(在提交表单时没有发送正确的“请求URL”),并尝试检查它(例如使用“chrome Developer Tools”),您将看到“行动“属性确实是空的。

这与显示属性设置正确的源代码视图形成对比!

似乎PHP(或浏览器?)通过消除实际DOM中的“action”字段来保护我们,尽管我无法找到原因。

为了验证这一点,我将代码更改为:

echo '<form action="http://newfutureuniversity.org/" method="POST">';
echo $_POST['code'];

..并粘贴在表格的其余部分。这提交得很好。它似乎不是来自“stripslashes”。您也可以将“action”作为另一个表单输入(而不是“代码”内部)传递,它也可以正常工作:

echo '<form action="'.$_POST['action'].'" method="POST">';
echo stripcslashes($_POST['code']);

在IE9中运行相同的场景后,“问题”似乎不存在!这让我觉得浏览器安全是罪魁祸首。假设它是chrome / web-kit的错误,我opened a bug in crbug.com,更新将在这里发布。