PHP HTML表单Form
在本教程中,我们将学习HTML表单是如何工作的,以及如何用PHP从HTML表单获取并处理数据。
HTML表单由可输入数据并将其提交给web服务器的HTML输入元素组成。
这些输入元素包括文本输入框、密码框、复选框、单选按钮、文件选择组件、提交按钮等。
HTML表单由开始标记<form>
开始,以结束标记</form>
结束,如下所示:
<form action="script.php" method="post"> </form>
这里,<form>
标签有两个重要的属性:
action
:action属性可以是绝对URL(例如http://localhost/phpcontact.php) )或者相对URL(/contact.php),当用户提交表单时,数据将提交到该URL。- method:method属性指定web浏览器如何发送表单数据。你可以使用POST或GET。POST方法允许您发送大量数据,而GET方法对于通过URL发送少量数据及保存为标签非常有用。
要在PHP中从HTML表单读取数据,需要使用以下超全局变量之一:
$_GET
数组包含使用GET方法的表单的字段名及其值的列表。$_POST
数组包含使用POST方法的表单的字段名及其值的列表。$_REQUEST
数组包含$_GET和$_POST方法中的表单字段名和值,同时还有$_COOKIE超全局数组中的值。
下图是我们要创建的一个HTML联系人表单:
在contact表单中,我们将使用POST方法,因此需要从$_POST数组中读取表单数据。
例如,我们可以从$_POST数组中读取name字段值,如下所示:
$_POST['name']
我们应该始终不信任用户提交的数据, 每次都要验证用户提交给服务器的数据,以防止恶意用户试图入侵网站。PHP提供了一个非常方便的函数filter_var(),它不仅可以从数据中删除任何非法字符,还可以检查数据是否为有效形式。
以下示例演示如何从表单中的的“name”字段中删除任何非法字符:
<?php if($_POST['name'] != ''){ $name = filter_var($_POST['name'],FILTER_SANITIZE_STRING); }
要检查电子邮件的格式是否正确,可以使用下面的代码段:
$email = filter_var($_POST['email'],FILTER_SANITIZE_STRING); if(!filter_var($email,FILTER_VALIDATE_EMAIL)){ // 无效的电子邮件地址 }
我们使用了两次filter_var()函数:
- 首先,我们从表单字段email的值中删除了所有非法字符。
- 然后,我们检查了电子邮件的格式是否正确。
为了使表单更美观,我们使用了Twitter Bootstrap框架。https://getbootstrap.com/docs/3.4/css/
<?php define('MAIL_TO', '[email protected]'); $errors = array(); $name = ''; $email = ''; $subject = ''; $message = ''; /** * 验证表单数据 * @return boolean 如果没有发生错误,则返回true,否则返回false */ function validate_form() { global $errors, $name, $email, $subject, $message; // 验证名字 if ($_POST['name'] != '') { $name = filter_var($_POST['name'], FILTER_SANITIZE_STRING); if ($name == '') { $errors[] = '名字无效'; } } else { $errors[] = '请输入名字'; } // 验证邮箱 if ($_POST['email'] != '') { $email = filter_var($_POST['email'], FILTER_SANITIZE_STRING); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = '电子邮箱无效'; } } else { $errors[] = '请输入电子邮箱'; } // validate subject if ($_POST['subject'] != '') { $subject = filter_var($_POST['subject'], FILTER_SANITIZE_STRING); if ($subject == '') { $errors[] = '标题无效'; } } else { $errors[] = '请输入标题'; } // validate message if ($_POST['message'] != '') { $message = filter_var($_POST['message'], FILTER_SANITIZE_STRING); if ($message == '') { $errors[] = '输入的内容无效'; } } else { $errors[] = '请输入内容'; } if (count($errors)) { return false; } else { return true; } } /** * 显示字段值 * @param string $fieldName */ function display_value($fieldName) { echo isset($_POST[$fieldName]) ? $_POST[$fieldName] : ''; } /** * * @param array $errors array of errors */ function display_message($errors) { if (!isset($_POST['submit'])) { return; } // 向用户显示消息 if (count($errors) === 0) { ?> <div class="alert alert-success"> <p>谢谢你!您的信息已经发送。</p> </div> <?php } else { ?> <div class="alert alert-block alert-error fade in"> <p>发生了下列错误:</p> <ul> <?php foreach ($errors as $error) { echo "<li>$error</li>"; } ?> </ul> </div> <?php } } /** * 开始表单处理 */ function start_form() { global $errors, $name, $email, $subject, $message; $mail_msg = ''; // 如果用户提交了表单 if (isset($_POST['submit'])) { // 验证表单 if (validate_form()) { $mail_msg .= 'From: ' . $name . "\n"; $mail_msg .= 'Email: ' . $email . "\n"; ; $mail_msg .= 'Message: ' . $message . "\n"; // 发送电子邮件到MAIL_TO电子邮件地址 if (!@mail(MAIL_TO, $subject, $mail_msg)) { $errors[] = '发送电子邮件失败'; } } } } // 开始表单处理 start_form(); ?> <!DOCTYPE html> <html> <head> <title>联系表单</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css"> </head> <body> <div class="container"> <form action="contact.php" method="POST" class="form-horizontal"> <fieldset> <legend>PHP联系表单演示</legend> <?php display_message($errors); ?> <div class="control-group"> <label for="name" class="control-label">名字:</label> <div class="controls"> <input type="text" name="name" id="name" value="<?php display_value('name') ?>" class="input-xlarge" placeholder="Name"/> </div> </div> <div class="control-group"> <label for="email" class="control-label">邮箱:</label> <div class="controls"> <input type="email" name="email" id="email" value="<?php display_value('email') ?>" class="input-xlarge" placeholder="Email"/> </div> </div> <div class="control-group"> <label for="subject" class="control-label">标题:</label> <div class="controls"> <input type="text" name="subject" id="subject" value="<?php display_value('subject') ?>" class="input-xlarge" placeholder="Subject" /> </div> </div> <div class="control-group"> <label for="message" class="control-label">内容:</label> <div class="controls"> <textarea rows="7" cols="25" name="message" id="message" class="input-xlarge"><?php display_value('message') ?></textarea> </div> </div> <div class="control-group"> <div class="controls"> <input type="submit" name="submit" value="发送" class="btn"> <input type="reset" name="reset" value="重置" class="btn"> </div> </div> </fieldset> </form> </div> </body> </html>
首先,我们定义了一个全局变量列表,我们可以在整个函数中使用:
<?php define('MAIL_TO','[email protected]'); $errors = array(); $name = ''; $email = ''; $subject = ''; $message = '';
其次,在validate_form()函数中,我们检查所有的表单字段。如果发生任何错误,我们将在$errors全局数组中记录错误。
第三,如果字段值存在于$_POST数组中,则display_value()函数将显示字段值。我们使用display_value()函数来保留后续请求之间的字段值,以防发生错误。这有助于用户再次填写表单字段时能节省时间,。
第四,display_message()函数将根据$errors全局数组来决定是显示错误还是成功的消息。
第五,start_form()函数检查用户是否提交了表单。如果是,它将通过调用validate_form()函数来验证表单。如果一切正常,它将使用mail()函数发送电子邮件。