doudun5009 2016-01-14 23:00
浏览 33
已采纳

如何创建单页PHP表单提交

I'm trying to create a contact form so people can leave messages on a website. Essentially I want it to be a single page process with a success or error message appearing on the same page. However, I'm a beginner in PHP so I'm not sure where to go from where I'm currently stuck at.

So far I've gotten the form to submit but always returns with missing fields even though no fields are missing. Also the page reloads and returns to the top of the page. Is there a way, after form submission, to have it not return to the top of the page after form submission?

Here's the HTML form, essentially it's a single page website segmented into different slides. Upon form submission I want the page to stay on slide4 where the form and success/error message will be.

    <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>

And here's the Updated PHP for the form after implementing the changes Frank suggested.

<?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>
<ul>";
foreach($missing as $m){
    $output .= "<li>$m";
}
$output .= "</ul>";
}
?>

So in summary, why is the form returning that fields are missing when I would fill them all in so there shouldn't be any missing. AND How do I have the form submit and not reload and return to the top of the page? I apologize if there is any required information that I did not post in advance, if you guys need anymore code snippets please let me know. Thank you guys!

  • 写回答

2条回答 默认 最新

  • douzhao7445 2016-01-14 23:36
    关注

    Just tried to make something of your code. But there are a few things you really need to take a look at:

    1. You are missing some closing tags in your html, for example you are missing a </div> & </form> tag.
    2. You can put all your php code at the top of your page. It's a best practice to seperate your logic from your view.
    3. Proper php opening and closing tags looks like the following : <?php ... ?> not <= or <?
    4. A proper PDO connection looks like this

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

    5. If you want to concatenate a ul to output your errors you will have to do that the as follow:

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

    The foundation of the errors you are getting are caused by points like the above. Goodluck and ask if you have any more questions.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决