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()函数发送电子邮件。

