https://www.bilibili.com/video/av15525720/?p=1
浏览器通过表单元素将用户的选择或者输入的数据提交给后台服务器语言.
为什么使用表单传值?
动态网站的特点就是后台根据用户的需求定制数据.所谓的"需求"就是用户通过当前的选择或者输入的数据信息,表单就是这些数据的承载者.
例如
例如
①get传输的数据主要用来获取数据,不改变服务器上资源:get只用来获取数据
②post传输的数据主要用来增加数据,改变服务器上资源:post会改变服务器上数据内容
③传输方式上post必须使用form表单,而get可以使用form表单和url
④get传输数据可以在url中对外可见,而post不可见:get传值会在浏览器地址栏上全部显示.:?数据名=数据值&数据名2=数据值2...
⑤get和post能传输的数据大小不同.get为2k,post理论上无限制.(事实上get和post本身没有数据长度限制,但是浏览器厂家做了限制)
⑥get和post能够传输的数据格式有区别: get传输简单数据(数值/字符串);post可以提交复杂数据(二进制等)
$_GET,$_POST,$_REQUEST三个都是php超全局预定义数组,表单元素的"name"属性的值作为数组的下标,而value属性对应的值就是数组的元素值
$_GET方式:接收get方式提交的数据
$_POST方式::接收post方式提交的数据
$_REQUEST方式:接收post或get提交的所有数据
1. $_REQUEST所存储数据的内容:将$_GET和$_POST合并存储到一个数组
2. $_REQUEST方式和$_POST,$_GET的联系:如果get和post有同名的数组元素(下标),post会覆盖get(php数组元素下标具有唯一性),这个可以在php.ini中进行配置.应避免出现这种情况!
*应避免get和post同时存在相同name属性,否则$_REQUEST中post会覆盖get的数据.
如图所示,第1个数组存储get数据;第2个数组存储post数据;第3个数组存储request数据
复选框:通常是将一类内容以同样(同名)的形式传递给后台,数据库存储通常是一个字段存储.
复选框的特点:选中才会提交.(没选中不会提交)
1. 在浏览器端,checkbox的name属性的值不论什么都会被浏览器毫无保留的提交.
2. 在php后台中,$_POST和$_GET都会对同名name属性进行覆盖(如果有重名)
解决方案:浏览器不识别[](浏览器不认为有特殊性),但是PHP认为[]有特殊性:系统自动认为该符号是数组的形式,所以php就会自动的将同名的但是带有[]的元素组合到一起形成一个数组.
如上图代码,用户点击了篮球和乒乓球,后台php接受到POST数据.注意同名name属性须跟[],以便PHP系统自动将同名name属性归入1个数组中去..
radio button:多个选择项,但只能选1个.
①name属性使用同名即可,因为只能选中1个,所以不会造成重复name属性提交;
②后台接受数据也不用额外处理;
③数据库存储只需要1个字段存储普通数据即可(数字或者字符串)
如上图.如果单选按钮中至少必须让用户选择一项,则可设置默认选项,即指定属性checked="checked"
④php拿到数据后,组织sql直接存储到数据表即可
①表单中那么属性使用数组:名字加[](一组复选框使用一个名字[])
②后台接收到数据之后,是1个数组(数组不能存储到数据库),
③php需要将数组转换成指定格式的字符串:使用分隔符分隔每一个元素并且形成字符串.
④php组织sql存储到数据库中
⑤补充:如果需要取出该数据,则可以使用explode函数,将该字符串变成数组....
如上图代码,用户点击了复选框(name="hobby[]")里的篮球和足球选项,递交给后台php,.php代码首先获得hobby数组,然后将hobby数组每个元素用分隔符分隔,再合并成一个字符串$hobby_string(此时该用户的兴趣字符串是:篮球|足球).这时候就可以存入数据库中了.
假设我们从数据库里取出"兴趣"字段(字符串),使用explode将兴趣字符串分割为数组.,代码如下图.
3. 其他常规同名表单项的数据处理
除了radio button和checkbox复选框,很少会出现同名表单项.如果非要使用同名的来进行管理,那么可以采用CheckBox来操作.
①表单中同名增加[]
②php接收数组处理
③php转换成有格式的字符串
④数据库字符串存储.
*复选框不选中就提交,就就不会产生该数据的数组(例如$_POST['hobby']),此时就会出错..因此在php接收复选框(单选框)数据的时候,应该先判断是否存在该数据,如果存在则接收,不存在则令其等于空数组,请使用如下代码.假如代码直接写成$hobby=$_POST['hobby'];就可能因为用户没点任何一项,不存在$_POST['hobby']而出错!
1.method属性:表单提交方式必须为post
2. enctype属性:form表单属性,主要是规范表单数据的编码方式.
3. 上传表单:file表单.
*php中有一个预定义变量$_FILES是专门用来存储用户上传的文件的.
想一想:如果html提交页面中表单没有enctype属性或者enctype属性不正确,会有什么后果呢?
$_FILES参考手册 POST方法上传参考手册
1. name:上传文件在用户(浏览器端)电脑上的名字.
2. tmp_name:文件上传到服务器后,操作系统临时保存的路径和文件名.
3. type: MIME类型(文件类型).
4. error:文件上传的错误号码,上传正确返回UPLOAD_ERR_OK
即
0.其他的错误代码见参考手册.
5. size:文件大小
文件上传之后会保存到$_FILES中,那么访问文件信息的形式就是
1. 判断文件是否为上传的文件is_uploaded_file();判断文件是否是通过 HTTP POST 上传的
格式:is_uploaded_file ( string $filename
) : bool
filename:
要检查的文件名。
是返回 TRUE,
否则
返回 FALSE
。
2. 移动文件:move_uploaded_file()
格式:move_uploaded_file ( string $filename
, string $destination
) : bool
filename:
上传的文件的文件名。destination:
移动文件到这个位置。
成功时返回 TRUE
。
如上两个图片代码.1个是html表单;1个是php脚本.
php脚本中处理上传,主要使用两个函数:is_uploaded_file()函数判断该文件是否为上传文件,如果是,使用move_uploaded_file()函数保存到服务器指定路径.
当商品需要上传多个图片进行展示的时候:那么需要使用多文件上传
针对一个内容但是不同文件说明:同名表单
当商品需要进行多个维度图片说明的时候:需要使用多文件上传
针对是不同内容所以表单名字不一样:批量解决问题
将表单名字形成一个数组,而且同时将文件对应的5个要素:name,tmp_name,site,type,error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的:例如name[0],type[0]是属于同一个文件
每个文件都会形成一个属于自己独立的5个元素的数组
按照表单名字从$_FILES中取出直接使用(明确知道表单中有多少文件) ;如果不确定文件表单中文件数量和表单名字,可以通过$_FILES数组遍历获取.
以上html和php代码演示批量上传不同名表单:使用foreach遍历$_FILES全局变量.
想办法得到一个文件对应的五元素数组.从$_FILES中把对应的name, tmp_name, size, error, type挨个取出来,然后存放到不同的数组中.
https://www.bilibili.com/video/av15525720/?p=13视频
如上图html,php演示,得到|$images数组,之后可遍历该数组完成上传代码,;和不同名文件批量上传遍历代码相同.(这里是不是太麻烦了?)
这样的代码感觉比较麻烦,查阅PHP.net官网https://www.php.net/manual/zh/features.file-upload.multiple.php #20评论得到一个函数,稍作修改,
function rearrange( $arr ){
foreach( $arr as $userfile => $all ){
foreach( $all as $p => $val ){
foreach($val as $n =>$v){
$new[$n][$p] = $v;
}
}
}
return $new;
}
演示如下:
批量上传-同名表单
';
print_r($_FILES);
//两种批量上传方式:同名表单
//源函数来自https://www.php.net/manual/zh/features.file-upload.multiple.php #20评论
//将函数修改后,该函数将同名表单中的$_FILES数组转化成不同名表单的数组
/*原来的$_FILES结构
$_FILE['userfile']['name'][0-n]
$_FILE['userfile']['type'][0-n]
$_FILE['userfile']['tmp_name'][0-n]
$_FILE['userfile']['error'][0-n]
$_FILE['userfile']['size'][0-n]
函数将$_FILES数组转化为==>
$arr[0-n]['name']
$arr[0-n]['type']
$arr[0-n]['tmp_name']
$arr[0-n]['error']
$arr[0-n]['size']
*/
function rearrange( $arr ){
foreach( $arr as $userfile => $all ){
foreach( $all as $p => $val ){
foreach($val as $n =>$v){
$new[$n][$p] = $v;
}
}
}
return $new;
}
$arr=rearrange($_FILES);//调用函数转化$_FILES结构
print_r($arr);//观察$arr数组结构
//现在就可以像不同名表单那样遍历数组上传了.
//不同名文件批量上传处理方式:遍历
foreach($arr AS $file)
{//$file就是一个完整的上传文件信息
if(is_uploaded_file($file['tmp_name'])){//如果是上传文件
move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name']);
echo $file['name'].'保存成功.
';
}else{
echo $file['name'].'上传失败.
';
}
}
1.PHP上传功能封装函数
2. 判断文件是否有效
3. 判断保存路径是否有效
4. 判断文件上传的过程中是否有错误 参考手册
UPLOAD_ERR_OK:
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE:
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE:
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL:
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE:
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR:
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE:
其值为 7,文件写入失败。PHP 5.1.0 引进。
5. 文件类型的处理:通过MIME匹配即可
6. 文件格式的处理:后缀名的问题
7. 文件大小的处理:
8. 移动到指定目录:
8. 命名冲突的处理:
注意:网站上传时文件名是一定要进行随机化重命名的.代码红框中随机字符串是4位字母,也可以自己指定随机字符串位数.