如何创建单页PHP表单提交

时间:2016-01-14 23:00:24

标签: php html forms

我正在尝试创建一个联系表单,以便人们可以在网站上留言。基本上我希望它是一个单页过程,同一页面上出现成功或错误消息。但是,我是PHP的初学者,所以我不确定从目前所处的位置去哪里。

到目前为止,我已经提交了要提交的表单,但即使没有字段丢失,也总是返回缺少的字段。页面也会重新加载并返回页面顶部。提交表单后,是否有办法让表单在提交表单后不返回页面顶部?

这是HTML表单,基本上它是一个单页网站,分为不同的幻灯片。在表单提交后,我希望页面保留在slide4上,其中将显示表单和成功/错误消息。

    <div id="slide4">
       <div class="slidetitle">Contact Me</div>
           <div class="content">

           <form action="index.php" method="POST" id="contactform" target="_self">
                    <input type="hidden" name="postid" value="<?php $postid?>">
                    <table>
                    <tr><td><b>First Name:</b></td><td><input type="text" name="firstName" size="45" value="<?php $firstName?>"></td></tr>
                    <tr><td><b>Last Name:</b></td><td><input type="text" name="lastName" size="45" value="<?php $lastName?>"></td></tr>
                    <tr><td><b>Email:</b></td><td><input type="email" name="email" size="45" value="<?$email?>"></td></tr>
                    <tr><td><b>Phone:</b></td><td><input type="tel" name="phone" size="45" value="<?$phone?>"></td></tr>
                    <tr><td><b>Content:</b></td><td><textarea name="content" form="contactform" rows="10" cols="100"><?php echo $content; if (empty($content)){ echo "Enter text here...";} ?></textarea></td></tr>
                    <tr><td colspan=2 style="text-align: center"><input type=submit name="submit1" value="Leave me a message"></td></tr>
                    </table>
                </form>

                <div id="contactoutput">
                    <?php $output ?>
                </div>
            </div>
    </div>

这是在实施Frank建议的更改后的表单的更新PHP。

<?php
$firstName = "";
$lastName= "";
$email = "";
$phone = "";
$content = "";
$errMsg = "";
?>
<?php $errMsg ?>
<?php
if (isset($_POST['submit1'])) {

// ==========================
//validate user input

// set up the required array
$required = array("firstName","lastName","email","phone","content"); // note that, in this array, the spelling of each item should match the form field names

// set up the expected array
$expected = array("firstName","lastName", "email","phone","content","postid"); // again, the spelling of each item should match the form field names


$missing = array();

foreach ($expected as $field){
    // isset($_POST[$field]):  Note that if there is no user selection for radio buttons, checkboxes, selection list, then $_POST[$field] will not be set

    // Under what conditions the script needs to record a field as missing -- $field is required and one of the following two (1)  $_POST[$field] is not set or (2) $_POST[$field] is empty

    //echo "$field: in_array(): ".in_array($field, $required)." empty(_POST[$field]): ".empty($_POST[$field])."<br>";

    if (in_array($field, $required) && (!isset($_POST[$field]) || empty($_POST[$field]))) {
        array_push ($missing, $field);

    } else {
        // Passed the required field test, set up a variable to carry the user input.
        // Note the variable set up here uses a variable name as the $field value.  In this example, the first $field in the foreach loop is "title" and a $title variable will be set up with the value of "" or $_POST["title"]
        if (!isset($_POST[$field])) {
            //$_POST[$field] is not set, set the value as ""
            ${$field} = "";
        } else {

            ${$field} = $_POST[$field];

        }

    }

}

//print_r ($missing); // for debugging purpose

/* add more data validation here */
// ex. $price should be a number

/* proceed only if there is no required fields missing and all other data validation rules are satisfied */
$stmt = $conn->stmt_init();

$sql = "Insert Into msg_table16 (firstName, lastName, email, content, phone, postid) values (?, ?, ?, ?, ?, ?)";

if($stmt->prepare($sql)){

    // Note: user input could be an array, the code to deal with array values should be added before the bind_param statement.

    $stmt->bind_param('ssssii',$firstName, $lastName,$email,$content,$phone,$postid);
    $stmt_prepared = 1; // set up a variable to signal that the query statement is successfully prepared.
}


if ($stmt_prepared == 1){
    if ($stmt->execute()){
        $output = "<p>The following information has been saved in the database:<br><br>";
        foreach($_POST as $key=>$value){
            $output .= "<b>$key</b>: $value <br>"; //$key (form field names) may not be very indicative (ex. lname for the last name field), you can set up the form field names in a way that can be easily processed to produce more understandable message. (ex. use field names like "Last_Name", then before printing the field name, replace the underscore with a space.  See php solution 4.4)
        }
    } else {
        //$stmt->execute() failed.
        $output = "<p>Database operation failed.  Please contact the webmaster.";
    }
} else {
    // statement is not successfully prepared (issues with the query).
    $output = "<p>Database query failed.  Please contact the webmaster.";
}

} else {
// $missing is not empty
$output = "<p>The following required fields are missing in your form submission.  Please check your form again and fill them out.  <br>Thank you.<br>\n<ul>";
foreach($missing as $m){
    $output .= "<li>$m";
}
$output .= "</ul>";
}
?>

总而言之,为什么当我将它们全部填入时,表单返回的字段会丢失,所以不应该有任何遗漏。如何提交表单而不重新加载并返回页面顶部? 如果有任何我没有提前发布的必要信息,我很抱歉,如果你们需要更多代码片段请告诉我。谢谢你们!

2 个答案:

答案 0 :(得分:2)

试图制作一些代码。但是有一些事情你真的需要看一看:

  1. 您在html中缺少一些结束标记,例如您错过了</div>&amp; </form>标记。
  2. 您可以将所有PHP代码放在页面顶部。从您的角度分离您的逻辑是最佳做法。
  3. 正确的php开始和结束标记如下所示:<?php ... ?>而非<= or <?
  4. 正确的PDO连接如下所示

    <?php try { $db = new PDO("pgsql:dbname=pdo;host=localhost", "username", "password" ); echo "PDO connection object created"; } catch(PDOException $e){ echo $e->getMessage(); } ?>

  5. 如果要连接ul以输出错误,则必须执行以下操作:

    <?php $str = '<ul>'; $str .= '<li></li>'; $str .= '<li></li>'; $str .= '</ul>'; ?&GT;

  6. 您获得的错误的基础是由上述点引起的。 Goodluck并问你是否还有其他问题。

答案 1 :(得分:1)

关闭表单标记怎么样:

&#13;
&#13;
<div id="slide4">
  <div class="slidetitle">Contact Me</div>
  <div class="content">
    <form action="index.php#slide4" method="POST" id="contactform">
      <input type="hidden" name="postid" value="<?=$postid?>">
      <table>
        <tr>
          <td><b>First Name:</b>
          </td>
          <td>
            <input type="text" name="firstName" size="45" value="<?=$firstName?>">
          </td>
        </tr>
        <tr>
          <td><b>Last Name:</b>
          </td>
          <td>
            <input type="text" name="lastName" size="45" value="<?$lastName?>">
          </td>
        </tr>
        <tr>
          <td><b>Email:</b>
          </td>
          <td>
            <input type="email" name="email" size="45" value="<?$email?>">
          </td>
        </tr>
        <tr>
          <td><b>Phone:</b>
          </td>
          <td>
            <input type="number" name="phone" size="45" value="<?$phone?>">
          </td>
        </tr>
        <tr>
          <td><b>Content:</b>
          </td>
          <td>
            <textarea name="content" form="contactform" rows="10" cols="100">
              <?php echo $content; if (empty($content)){ echo "Enter text here...";} ?>
            </textarea>
          </td>
        </tr>
        <tr>
          <td colspan=2 style="text-align: center">
            <input type=submit name="submit1" value="Leave me a message">
          </td>
        </tr>
      </table>
    </form>  <!-- MISSING !! -->
  </div>
</div>
&#13;
&#13;
&#13;