PHP(10)表单传值
一、传值方式
-
HTTP传输规则有六种:HEAD、GET、PUT、POST、DELETE、OPTIONS。
-
HTTP协议的传输规则
传输规则 描述 HEAD 通过发送HTTP请求来从服务器获取数据(不带任何数据,很少使用) GET 与HEAD一样,但是GET通常是通过自身携带数据来获取服务器数据 POST 直接提交数据给服务器 PUT 指定服务器端存储位置来提交数据(HTML不支持) DELETE 通过指定数据来删除服务器的数据(很少使用) OPTIONS 获取URL所支持的方法(极少使用) -
传值方式通常使用 GET 和 POST 两种方式。
二、PHP接收表单数据
- 在PHP中,提供了三种数据接收方式:
- $_GET:接收用户 GET 方法提交的数据
- $_POST:接收用户 POST 方法提交的数据
- $_REQUEST:接收用户 GET 和 POST 提交的数据
1. $_GET
专用于接收 GET 方法提交的数据,是一个超全局预定义数组,表单名字作为数组下标,表单值作为数组元素值。
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
</head>
<body>
<a href="index.php?k=123&v=456">GET 传值</a>
</body>
</html>
<?php
echo $_GET['k'];
echo $_GET['v'];
2. $_POST
专用于接收POST方式提交的数据,与 $_GET 形式一样
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="index.php" method="post">
key: <input type="text" name="k">
value: <input type="text" name="v">
<input type="submit" name="检索">
</form>
</body>
</html>
<?php
echo "key:" . $_POST['k'];
echo "value:" . $_POST['v'];
三、文件上传
- 需要明确告知HTTP协议使用到了文件上传,这时候需要在表单form中使用属性 enctype,enctype 是关于表单内容处理的属性。
- PHP接收:使用 $_FILES 来接受文件。
- 文件上传后,在PHP端会保存文件的5个信息:
- name:文件在客户端的文件名字
- type:文件类型
- tmp_name:文件在服务器端操作系统接收后保存的临时文件名
- error:错误代码
- size:文件大小(字节)
1. 文件上传函数封装
index.php
<?php
/*
* @param1 array $file,要上传的文件信息,包含5个元素
* @param2 string $path,存储位置
* @param3 string $error,错误信息
* @param4 array $type=array(),MIME类型限定
* @param5 int $size = 2000000,默认2M
* @return mixed,成功返回文件名字,失败返回false
* */
function fileUpload($file, $path, &$error, $type = array(), $size = 2000000)
{
// 文件本身是否有限
if (!isset($file['error'])) {
$error = '文件无效';
return false;
}
// 路径是否有效
if (!is_dir($path)) {
$error = '存储路径无效';
return false;
}
// 判断文件本身上传是否成功
switch ($file['error']) {
case 1:
case 2:
$error = '文件超过服务器允许大小';
return false;
case 3:
$error = '文件只有部分成功';
return false;
case 4:
$error = '用户没有选择要上传的文件';
return false;
case 6:
case 7:
$error = '服务器操作失败';
return false;
}
// 判定类型是否符合
if (!empty($type) && !is_array($file['type'], $type)) {
$error = '当前上传的文件类型不符合';
return false;
}
// 大小判定
if ($file['size'] > $size) {
$error = '文件大小超过当前允许范围,当权允许的大小是:' . (string)($size / 1000000) . "M";
return false;
}
// 转存文件
$newFileName = getNewName($file['name']);
if (@move_uploaded_file($file['tmp_name'], $path . '' . $newFileName)) {
return $newFileName;
} else {
$error = '文件上传失败';
return false;
}
}
function getNewName($filename, $rand = 6): string
{
// 时间日期部分
$newName = date('YmdHis');
// 增加随机部分
$old = array_merge(range('a', 'z'), range("A", "Z"));
shuffle($old);
for ($i = 0; $i < $rand; $i++) {
$newName .= $old[$i];
}
return $newName . strstr($filename, '.');
}
// 调用文件上传
$file = $_FILES['file'];
$res = fileUpload($file, 'UPLOAD/', $error);
if ($res) {
echo '文件上传成功';
} else {
echo $error;
}
index.html
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="">
<input type="submit" name="检索">
</form>
</body>
</html>