簡體   English   中英

我的表格有問題嗎?

[英]Is there something wrong with my form?

我的表單正常工作,所有錯誤和一切正常。 但是如果您有錯誤,它會刷新頁面並刪除在單擊提交按鈕之前插入的任何文本,並且您必須重新輸入所有信息。 有任何解決這個問題的方法嗎?

我認為這與在表單操作中不使用$ _SERVER [“ PHP_SELF”]有關。 相反,我有動作=“”

我這樣做是因為需要使用相同信息刷新的頁面在其url(monthly_specials_info.php?date = Dec10)中有一個變量,該變量是從最后一頁放入的。

我試過用

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

它產生了正確的網址。 但是當提交表單時(包含錯誤),文本都被刪除了..任何想法?

表格代碼:

echo '    <div id="specialsForm"><h3>Interested in this coupon? Email us! </h3>
                                            <form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">
                                              Name: <input name="name" type="text" /><br />
                                              Email: <input name="email" type="text" /><br />
                                              Phone Number: <input name="phone" type="text" /><br /><br />
                                              Comment: <br/>
                                              <textarea name="comment" rows="5" cols="30"></textarea><br /><br />
                                              <input type="submit" name="submit" value="Submit Email"/>
                                            </form></div>
                                            <div style="clear:both;"></div><br /><br />';

和vaildator:

if(isset($_POST['submit'])) {

                                                $errors = array();
                                                if (empty($name)) {
                                                    $errors[] = '<span class="error">ERROR: Missing Name </span><br/>';
                                                }
                                                if (empty($phone) || empty($email)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!is_numeric($phone)) {
                                                    $errors[] = '<span class="error">ERROR: You must insert a phone number or email</span><br/>';
                                                }
                                                if (!preg_match('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/', strtoupper($email))) {
                                                    $errors[] = '<span class="error">ERROR: Please Insert a valid Email</span><br/>';
                                                }
                                                if ($errors) {
                                                    echo '<p style="font-weight:bold;text-align:center;">There were some errors:</p> ';
                                                    echo '<ul><li>', implode('</li><li>', $errors), '</li></ul><br/>';
                                                } else {
                                                    mail( "email@hotmail.com", "Monthly Specials Email",
                                                        "Name: $name\n".
                                                        "Email: $email\n".
                                                        "Phone Number: $phone\n".
                                                        "Comment: $comment", "From: $email");
                                                    echo'<span id="valid">Message has been sent</span><br/>';
                                                }
}

第一:你不能信任'。$ _ SERVER它可以被修改。 小心點!

第二:您可以(應該嗎?)使用隱藏字段而不是在操作中指定它?

但是如果您有錯誤,它會刷新頁面並刪除在單擊提交按鈕之前插入的任何文本,並且您必須重新輸入所有信息。 有任何解決這個問題的方法嗎?

您可以使用ajax對其進行修復(我相信普通的舊HTML會產生這種副作用嗎?)。

瀏覽器不必(p)填寫表格。 有些這樣做是為了方便,但您不能依靠它。

如果再次顯示表單,您可以設置輸入的值,如下所示:

$value = isset($_POST['foo']) : $_POST['foo'] : '';
echo '<input type="text" value="'. $value .'" name="foo" />';

當然,您應該檢查並清理POSTed數據,然后將其包含在HTML中,以免打開任何XSS漏洞。

如果您希望表單提交到同一頁面,則無需設置操作,沒有它也可以使用。 另外,我建議您以這種方式發送日期:

<input type="hidden" name="date" value="'.$date.'"/>

首先,一些一般性的變化:

更改

<form method="post" action="'.$_SERVER["PHP_SELF"].'?date='.$date.'">

<form method="post" action="'.$_SERVER["PHP_SELF"].'">
    <input type="hidden" name="data" value="'.$date.'" />

你原來問題的答案:

如果array_key_exists('whatever', $_POST);則用$_POST['whatever']設置每個input元素value屬性array_key_exists('whatever', $_POST);

例如:名稱字段

<input type="text" name="name" value="<?php echo array_key_exists('name', $_POST) ? $_POST['name'] : ''; ?>" />

驗證器和html代碼內部存在一些大問題以及我要更改的事實,部分原因是,您要問的是:如何使編譯后的表單不會在輸入標簽后刪除輸入標簽中的所有文本刷新。

基本上不了解你的項目,提交的字符串的位置,如果它們存儲在數據庫或其他地方,那么這個頁面在你的項目上下文中意味着什么我不能寫一個特定的腳本,使得在將來重新加載時記住提交的字符串頁面,但要澄清一些事情:

如果存在一個定義為<form></form>且使用<input type="submit"/> (這應該足夠,而無需提供名稱name="submit" ),則該頁面為刷新,並且不會自動記住你以前提交的輸入。 要做到這一點,你有兩個選擇:

  1. 使用Ajax(將Jquery作為ajax的好框架),這將使您無需刷新頁面即可提交表單。 我選擇它作為第一種方式,因為它被所有人過度使用,並且它將變得越來越多,因為它是新的並且它運作順暢。
  2. 制作一個php腳本,允許您檢查輸入是否已經提交; 如果答案是true ,則恢復值並通過以下方式獲取它們: <input type="text" value="<?php echo $value ?>"/>

另請注意,您不需要'.$_SERVER["PHP_SELF"].'?date='.$date.' ?date='.$date.' 足夠。

瀏覽器不會為您重新填充表單,尤其是在進行POST時。 由於您沒有使用填充了value=""塊的字段構建表單,因此瀏覽器只會為您渲染空字段。

一個非常基本的表單處理腳本看起來像這樣:

<?php

if ($_SERVER['REQUEST_METHOD'] = 'POST') {
    # do this only if actually handling a POST
    $field1 = $_POST['field1'];
    $field2 = $_POSt['field2'];
    ...etc...

    if ($field1 = '...') {
       // validate $field1
    }
    if ($field2 = '...') {
       // validate $field2
    }
    ... etc...

    if (everything_ok) {
        // do whatever you want with the data. insert into database?
        redirect('elsewhere.php?status=success')
    } else {
       // handle error condition(s)
    }
} // if the script gets here, then the form has to be displayed

<form method="POST" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
<input type="text" name="field1" value="<?php echo htmlspecialchars($field1) ?>" />
<br />
<input type="text" name="field2" value="<?php echo htmlspecialchars($field2) ?>" />
etc...
<input type="submit" />
</form>

?>

請注意,最后一位使用htmlspecialchars() ,其中正在輸出表單字段。 考慮到有人在字段中輸入html元字符( "<> )的情況。如果出於某種原因必須顯示表單,這些字符將被輸出到html中並“破壞”該表單。瀏覽器會以不同的方式“中斷”。有些人不會關心,有些人(*咳嗽* IE *咳嗽*)會在地板上使用barf位。通過使用htmlspecialchars() ,這些元字符將被“轉義”以便它們將成為正確顯示並且不破壞表格。

同樣,如果要輸出大塊HTML,並可能在其中嵌入PHP變量,那么最好閱讀HEREDOC 它們是一個特殊的構造,充當多行雙引號字符串,但是你可以免於進行任何引用轉義。 它們使代碼更具可讀性,當您跳入/跳出“字符串模式”以輸出變量時,不必擔心選擇正確的引號類型或正確的引號數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM