PHP HTML表单Form


在本教程中,我们将学习HTML表单是如何工作的,以及如何用PHP从HTML表单获取并处理数据。

HTML表单由可输入数据并将其提交给web服务器的HTML输入元素组成。
这些输入元素包括文本输入框、密码框、复选框、单选按钮、文件选择组件、提交按钮等。

HTML表单由开始标记<form>开始,以结束标记</form>结束,如下所示:

1
2
<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字段值,如下所示:

1
$_POST['name']

我们应该始终不信任用户提交的数据, 每次都要验证用户提交给服务器的数据,以防止恶意用户试图入侵网站。PHP提供了一个非常方便的函数filter_var(),它不仅可以从数据中删除任何非法字符,还可以检查数据是否为有效形式。

以下示例演示如何从表单中的的“name”字段中删除任何非法字符:

1
2
3
4
<?php
if($_POST['name'] != ''){
$name = filter_var($_POST['name'],FILTER_SANITIZE_STRING);
}

要检查电子邮件的格式是否正确,可以使用下面的代码段:

1
2
3
4
5
$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/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

</td>

<?php
define('MAIL_TO', 'webmaster@theITroad.com');
$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>

首先,我们定义了一个全局变量列表,我们可以在整个函数中使用:

1
2
3
4
5
6
7
8
9
<?php
 
define('MAIL_TO','webmaster@example.com');
$errors = array();
 
$name = '';
$email = '';
$subject = '';
$message = '';

其次,在validate_form()函数中,我们检查所有的表单字段。如果发生任何错误,我们将在$errors全局数组中记录错误。

第三,如果字段值存在于$_POST数组中,则display_value()函数将显示字段值。我们使用display_value()函数来保留后续请求之间的字段值,以防发生错误。这有助于用户再次填写表单字段时能节省时间,。

第四,display_message()函数将根据$errors全局数组来决定是显示错误还是成功的消息。

第五,start_form()函数检查用户是否提交了表单。如果是,它将通过调用validate_form()函数来验证表单。如果一切正常,它将使用mail()函数发送电子邮件。


原文链接:https://codingdict.com/