(小白)PHP进阶学习001 20201022
表单传值
- get传值
1、form表单
<form method="GET">表单元素</form>
2、a标签
<a href="www.***.cn/index.php/index.php?学科=PHP">
3、location对象的href属性
<script>location.href="www.***.cn/index.php/index.php?学科=PHP"</script>
4、location对象的assign()方法
<script>location.assign("www.***.cn/index.php/index.php?学科=PHP")</script>
和3的href功能差不多
- post传值
1、post表单方式的基本设定
<form method="POST">表单元素</form>
和GET差不多
2、post方式跟get方式的区别
1)get传输的数据主要用来获取数据,不改变服务器上的资源:
get只用来获取数据,post可以提交信息
2)post传输的数据主要用来增加数据,改变服务器上资源
3)传输方式上post必须使用form表单,而get可以使用form表单和URL
4)get传输数据可以在URL中对外可见,而post不可见
get传值最终会在浏览器的地址栏中全部显示?数据名=数据值
5)get和post能传输的数据大小不同,get为2k,post理论无限制,事实上get和post本身没有数据长度限制,但浏览器有所限制
6)get一般提交简单数据,post可以提交复杂数据
- php接收数据的三种方式
不管是 G E T / _GET/ GET/_POST/$_REQUEST,三个都是PHP超全局(没有范围限制)预定义数组,表单元素的“name”属性的值作为数组的下标,而value属性对应的值就是数组的元素值。
1、
G
E
T
方
式
:
接
收
G
E
T
方
式
提
交
的
数
据
2
、
_GET方式:接收GET方式提交的数据 2、
GET方式:接收GET方式提交的数据2、_POST方式:接收POST方式提交的数据
3、
R
E
Q
U
E
S
T
方
式
:
接
收
G
E
T
或
者
P
O
S
T
方
式
提
交
的
数
据
1
)
_REQUEST方式:接收GET或者POST方式提交的数据 1)
REQUEST方式:接收GET或者POST方式提交的数据1)_REQUEST所存储数据的内容:将
G
E
T
/
_GET/
GET/_POST合并存储到一个数组
2)
G
E
T
/
_GET/
GET/_POST/$_REQUEST联系:如果GET和POST中有同名数组元素(下标),POST会覆盖GET(PHP中数组元素下标具有唯一性),这个可以在php.ini中进行配置
将php文件放在apache的www文件夹下
<?php
echo '<pre>';
var_dump($_GET);
echo '<hr>';
var_dump($_POST);
echo '<hr>';
var_dump($_REQUEST);
浏览器打开:
http://localhost/myfirstWeb/test.php
得到了返回值,虽然是空的
用get方式传值:php
http://localhost/myfirstWeb/test.php?data=PHP
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" action="test.php">
<input type="text" name="username" value=""/>
<input type="password" value=""/>
<input type="submit" name="sub" value="submit"/>
</body>
</html>
此处没有给password name属性
获取数据如下:
这里因为password没有name,所以没有收到该值
尝试显示POST覆盖GET
<body>
<form method="POST" action="test.php?username=getusername2">
<input type="text" name="username" value=""/>
<input type="password" value=""/>
<input type="submit" name="sub" value="submit"/>
</body>
- PHP处理复选框数据
1、复选框表单项的命名方式
筛选框:通用是将一类内容以同样(同名)的形式传递给后台,数据库存储通常是一个字段存储
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" action="checkbox.php">
<input type="checkbox" name="hobby" value="bassketball"/>bassketball
<input type="checkbox" name="hobby" value="football"/>football
<input type="checkbox" name="hobby" value="tabletennis"/>tabletennis
</body>
</html>
选中才会提交
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" action="03checkbox.php">
<input type="checkbox" name="hobby" value="bassketball"/>bassketball
<input type="checkbox" name="hobby" value="football"/>football
<input type="checkbox" name="hobby" value="tabletennis"/>tabletennis
<input type="submit" name="btn" value="提交"/>
</body>
</html>
但这时候我明明选了两个,却只看到了一个数据,提交其实成功了,只是后台没有显示出来
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" action="03checkbox.php">
<input type="checkbox" name="hobby1" value="bassketball"/>bassketball
<input type="checkbox" name="hobby2" value="football"/>football
<input type="checkbox" name="hobby3" value="tabletennis"/>tabletennis
<input type="submit" name="btn" value="提交"/>
</body>
</html>
设置成hobby1/2/3
但这种方式并没有办法知道hobby1和hobby3是什么区别
其实在浏览器中,不论name值有多少个相同的,都会全部提交
只是在PHP中 $ _POST/$_GET会对同名name属性进行覆盖
浏览器不识别[]有特殊性,但PHP认为[]有特殊性,系统自动认为是数组,所以PHP自动会把含有[]的属性组合到一起成一个数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" action="03checkbox.php">
<input type="checkbox" name="hobby[]" value="bassketball"/>bassketball
<input type="checkbox" name="hobby[]" value="football"/>football
<input type="checkbox" name="hobby[]" value="tabletennis"/>tabletennis
<input type="submit" name="btn" value="提交"/>
</body>
</html>
<?php
//接收checkbox数据
header("Content-type:text/html;charset=utf-8");//告诉浏览器当前服务器返回的内容是text/html,同时需要浏览器用utf-8字符集解析
echo "<pre>";
print_r($_POST);
?>
和教程里的结果不同
再次更新后,没问题了,具体不知道原因,可能是浏览器缓存的之前信息
- 复选框的常见处理
1、单先按钮的数据处理
radio button:可以出现多个选择项,但是只能选择其中一个
PHP获取数据后,组织sql直接存储到数据表即可
2、多选按钮的数据处理
名字[],生成一个数组
PHP需要将数组转换成指定格式字符串:使用分隔符分隔每一个元素并形成字符串
implode(分隔符,数组);
<?php
header("Content-type:text/html;charset=utf-8");
$hobby=$_POST["hobby"];
//print_r($hobby);
$hobby_string=implode($hobby,'|');
echo $hobby_string;
?>
如果反过来,把字符串转成数组
用explode()
explode('|',$hobby_string);
如果筛选框中没有被选中的,那么筛选框不会被当作数据上传,所以这里在调用数据的时候,需要判断一下:isset()
<?php
header("Content-type:text/html;charset=utf-8");
$hobby=isset($_POST["hobby"])?$_POST["hobby"]:array();
//print_r($hobby);
$hobby_string=implode($hobby,'|');
echo $hobby_string;
?>
3、其它常规同名表单项的数据处理
文件上传
- 原理
原理
文件从用户本地电脑通过传输方式(WEB表单)保存到服务器所在电脑指定的目录下。
1、增加文件上传的表单,浏览器请求一个服务器的HTML脚本(包含文件上传表单)
2、用户从本地选择一个文件(点击上传框(按钮))
3、用户点击上传:文件通过物联网传输到服务器上
4、服务器操作系统会将文件保存到临时目录:是以临时文件格式保存(windows下tmp)
5、服务器脚本开始工作,判断文件有效
6、服务器脚本将有效文件 从临时目录移动到指定的目录下(完成)
- 表单写法
1、method属性:表单提交方式必须的POST
2、enctype属性:from表单属性,主要是规范表单数据的编码方式
3、上传表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="08file_upload.php">
<input type="file" name="image"/>
<input type="submit" name="btn" value="上传文件"/>
</body>
</html>
-
F
I
L
E
S
变
量
详
解
P
H
P
中
,
有
一
个
预
定
义
变
量
_FILES变量详解 PHP中,有一个预定义变量
FILES变量详解PHP中,有一个预定义变量_FILES是专门用来存储用户上传的文件的。
1、name 文件在用户(浏览器)电脑上实际存在的名字(实际用来保存后缀)
2、tmp_name上传到服务器后,操作系统保存的名字(实际给PHP后期使用)
3、type图片类型MIME(多功能互联网邮件扩展)类型,用来在计算机中客户端识别文件类型(确定软件)
4、error:文件上传的代号,用来告知应用软件(PHP)文件接收过程中(PHP后期根据代码执行)
5、size:文件大小(PHP根据实际需求来确定是否保存)
<?php
//接收checkbox数据
header("Content-type:text/html;charset=utf-8");//告诉浏览器当前服务器返回的内容是text/html,同时需要浏览器用utf-8字符集解析
echo "<pre>";
var_dump($_POST);
var_dump($_FILES);
?>
- 移动临时文件到目标位置
1、判断是否为上传的文件:is_uploaded_file()
<?php
//接收checkbox数据
header("Content-type:text/html;charset=utf-8");//告诉浏览器当前服务器返回的内容是text/html,同时需要浏览器用utf-8字符集解析
echo "<pre>";
//var_dump($_POST);
//var_dump($_FILES);
$file=$_FILES["image"];
if(is_uploaded_file($file["tmp_name"])){
echo "文件有效";
}else{
echo "文件上传失败!";
}
?>
2、移动文件:move_uploaded_file()
<?php
//接收checkbox数据
header("Content-type:text/html;charset=utf-8");//告诉浏览器当前服务器返回的内容是text/html,同时需要浏览器用utf-8字符集解析
echo "<pre>";
//var_dump($_POST);
//var_dump($_FILES);
$file=$_FILES["image"];
if(is_uploaded_file($file["tmp_name"])){
echo "文件有效";
if(move_uploaded_file($file['tmp_name'],"uploads/".$file["name"])){
echo "文件保存成功!";
}else{
echo "文件保存失败!";
}
}else{
echo "文件上传失败!";
}
?>
- 多文件上传
当商品需要上传多个图片进行展示的时候,那么需要使用多文件上传
针对一个内容但不同文件说明:同名表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="10multi_upload.php">
<input type="file" name="image[]"/>
<input type="file" name="image[]"/>
<input type="file" name="image[]"/>
<input type="submit" name="btn" value="上传文件"/>
</body>
</html>
当商品需要进行多个维度图片说明的时候,需要使用多文件上传
针对是不同内容,所以表单名字不一样,批量解决问题
多文件上传的$_FILES变量的数据结构形式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="10multi_upload.php">
<input type="file" name="head"/>
<input type="file" name="body"/>
<input type="file" name="foot"/>
<input type="submit" name="btn" value="上传文件"/>
</body>
</html>
对多文件信息进行处理
1、不同名多文件上传处理方式:按表单名字从$_FILES中取出即可使用
2、如果不确定表单中有多少个文件上传,可以通过遍历$_FILES的方式,取出
<?php
//接收checkbox数据
header("Content-type:text/html;charset=utf-8");//告诉浏览器当前服务器返回的内容是text/html,同时需要浏览器用utf-8字符集解析
echo "<pre>";
//print_r($_FILES);
foreach($_FILES as $file){
if(is_uploaded_file($file['tmp_name'])){
move_uploaded_file($file['tmp_name'],'uploads/'.$file["name"]);
}
}
?>
完成了图片的保存
同名文件遍历数组的方式
应该遍历$_FILES[“userfile”[任意一个要素]
如:name|tmp_name|size|error|type
if(isset($_FILES["image"]["name"])&&is_array($_FILES["image"]["name"])){
$images=array();
foreach($_FILES['image']['name'] as $k =>$file){
$images[]=array(
"name"=>$file,
"tmp_name"=>$_FILES["image"]["type"][$k],
"type"=>$_FILES["image"]["tmp"][$k],
"error"=>$_FILES["image"]["error"][$k],
"size"=>$_FILES["image"]["size"][$k]
);
};
};
print_r($images);
成功将
转化成: