2012-02-20 81 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

相關問題