2012-02-20 80 views
2

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

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

  1. 转到http://saveyourself.vacau.com/form/
  2. 在田地里将这个(这其实是一个测试帐户此页):

    • 页:http://newfutureuniversity.org/
    • 方法: “邮报”
    • 名称1: “用户”
    • 值1: “用户”
    • 类型1: “文本”
    • 名称2: “通过”
    • 值2: “密码”
    • 类型3: “密码”
    • 名称3: “登录”
    • 值3 :“1”
    • 类型3:“隐藏”。
  3. 按“显示表”,并在窗体将显示

  4. 现在看到页面的源代码,并从“<form...>”复制到“</form>
  5. 转到http://saveyourself.vacau.com/form/manual/此页并粘贴在那里。
  6. 按下“显示表单”,你应该完全到达步骤3后的相同页面(检查html,它是100%相同,唯一的变化是地址/ manual /)。

现在,这是诀窍。尽管两个页面都有完全相同的HTML,但如果在步骤3之后按下“发送表单”按钮,则会登录新页面,但如果在步骤6之后按下“发送表单”按钮(在/ form/manual /),该页面被刷新并且您粘贴的表单被删除。这怎么可能?据我所知,这里没有涉及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> 
+0

您使用的是哪种镀铬版本? – tutuDajuju 2012-02-20 20:30:23

+0

Google Chrome 17.0.963.46将它与Linux一起使用(deb包在Ubuntu 11下运行。10) – 2012-02-21 15:55:22

回答

2

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

长答案:行为在不同的浏览器中有所不同。在IE9,Firefox和Safari上测试之后,这个问题似乎是一个网络工具包错误。 这一假说也通过在crbug.com报道numerious“形式/动作”问题和bugs.webkit.org


研究支持:

Kypros似乎是对的,尽管答案不是那么明显。

如果您进入错误页面(表单提交时未发送正确的“请求URL”),并尝试检查它(例如使用“chrome开发人员工具”),您将看到表单“action”属性确实是空的。

这与显示属性设置正确的源代码视图相反!

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

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

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

..和形式的其余部分粘贴。这提交得很好。它似乎不是来自“stripslashes”。你也可以只通过在“行动”为另一种形式的输入(而不是内部的“代码”),它也只是工作:

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

后,我跑了IE9同样的情景 - “问题”似乎并不存在!这让我认为浏览器安全是罪魁祸首。假设这是Chrome/web-kit的一个bug,我opened a bug in crbug.com,更新将在这里发布。

+1

哇。这需要你付出很多努力,甚至打开一个错误报告。对此,我真的非常感激。但我并没有真正看到让用户手动编辑表单的一部分的一点,因为这就是创建第一页中的工具的原因,所以我可能会删除第二个。如果其他浏览器没有问题(我应该首先检查一下自己,但我认为这是页面的错误......),但我发现主要问题完全来自你们两个,以及更多信息。谢谢。 – 2012-02-21 15:50:35

+0

我以为这只是您为测试所做的一个页面。但没有问题,我真的好奇,有时间燃烧。 – tutuDajuju 2012-02-21 16:01:00

+0

是的,页面地址仅用于测试,但如果代码工作,我会把它放在更有用的地方。 – 2012-02-21 16:06:47

6

如果你看一下第二个(不工作)页面,您可以:

<form method="post"> 

与连接到它没有action=""属性。因此,您的表单不知道向何处提交表单。

+0

感谢您有耐心阅读这个问题! – Nirmal 2012-02-20 19:24:59

+0

我认为这个问题仍然没有答案:如果两个PHP脚本输出相同的HTML页面(上面)如何提交该页面上的表单的结果有不同的结果? – tutuDajuju 2012-02-20 19:29:00

+0

@Pypy,就像tutuDajuju所说的,如果我选择“查看源代码”,则设置action =“example.com”,但如您所述,当我检查元素时,操作是空的!这不是一个真正的帮助,但感谢您阅读并检查它。 – 2012-02-21 15:38:31

相关问题