工作总结第二十四天
2018-01-31 12:04
204 查看
一,PHP MySQL PDO 为 IN 操作符 绑定参数
经常需要进行这样的查询(php + MySQL)?
但是在使用 PDO 并将其作为参数的时候就比较麻烦。按照一般的想法,我们这样做
?
?
1、find_in_set 法
?
?
if (! function_exists('array_column')) { function array_column(array $input, $columnKey, $indexKey = null) { $array = array(); foreach ($input as $value) { if ( ! isset($value[$columnKey])) { trigger_error("Key \"$columnKey\" does not exist in array"); return false; } if (is_null($indexKey)) { $array[] = $value[$columnKey]; } else { if ( ! isset($value[$indexKey])) { trigger_error("Key \"$indexKey\" does not exist in array"); return false; } if ( ! is_scalar($value[$indexKey])) { trigger_error("Key \"$indexKey\" does not contain scalar value"); return false; } $array[$value[$indexKey]] = $value[$columnKey]; } } return $array; } }
三,无刷新附件上传
发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向。以一个简单的demo做说明:
![](http://files.jb51.net/file_images/article/201512/201512030931331.png)
html如下所示,请求的路径action为"upload",其它的不做任何处理:
?
![](http://files.jb51.net/file_images/article/201512/201512030931332.gif)
可以看到默认情况下,form请求upload的同时重定向到upload。但是很多情况下是希望form请求像ajax一样,不会重定向或者刷新页面。像上面的场景,当上传完成之后,将用户选择的头像显示在当前页面。
解决办法第一种是使用html5的FormData,将form里面的数据封装到FormData对象里,然后再以POST的方式send出去。如下面代码所示,对提交按钮的单击事件做一个响应,代码第6行获取到form的DOM对象,然后第8行构造一个FormData的实例,第18行,将form数据发送出去。
?
?
![](http://files.jb51.net/file_images/article/201512/201512030931333.gif)
如果使用jQuery,可以把formData作为ajax的data参数,同时设置contentType: false和processData: false,告诉jQuery不要去处理请求头和发送的数据。
看起来这种提交方式跟ajax一样,但是其实并不是完全一样,form提交的数据格式有三种,如果要上传文件则必须为multipart/form-data,所以上面的form提交请求里的http的头信息里面的Content-Type为multipart/form-data,而普通的ajax提交为application/json。form提交完整的Content-Type如下:
"content-type":"multipart/form-data; boundary=------WebKitFormBoundaryYOE7pWLqdFYSeBFj"
除了multipart/form-data之外,还指定了boundary,这个boundary的作用是用来区分不同的字段。由于FormData对象是不透明的,调用JSON.stringify将会返回一个空的对象{},同时FormData只提供append方法,所以无法得到FormData实际上传的内容,但是可以通过分析工具或者服务收到的数据进行查看。在上面如果上传一个文本文件,那么服务收到的POST数据的原始格式是这样的:
------WebKitFormBoundaryYOE7pWLqdFYSeBFj
Content-Disposition: form-data; name="user"
abc
------WebKitFormBoundaryYOE7pWLqdFYSeBFj
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
这是一个文本文件的内容。
------WebKitFormBoundaryYOE7pWLqdFYSeBFj--
从上面服务收到的数据看出FormData提交的格式,每个字段以boundary隔开,最后以--结束。而ajax请求,send出去的数据格式是自定义的,一般都是以key=value中间用&连接:
?
user=abc&file=这是一个文本文件的内容
从这里可以看出POST本质上并不比GET安全,POST只是没有将数据放在网址传送而已。
考虑到FormData到了IE10才支持,如果要支持较低版本的IE,那么可以借助iframe。
文中一开始就说,默认的form提交会使页面重定向,而重定向的规则在target中指定,可以和a标签一样指定为"_blank",在新窗口中打开;还可以指定为一个iframe,在该iframe中打开。所以可以弄一个隐藏的iframe,将form的target指向这个iframe,当form请求完成时,返回的数据就会由这个iframe显示,正如上面在新页面显示的:"Recieved form data"。请求完成后,iframe加载完成,触发load事件,在load事件的处理函数里,获取该iframe的内容,从而拿到服务返回的数据了!拿到后再把iframe删掉。
在提交按钮的响应函数里,首先创建一个iframe,设置iframe为不可见,然后再添加到文档里:
?
?
?
POST Data:
this is a text
Headers:
Mail-Upload-name: content.txt
Mail-Upload-size: 15
可以推测它们应该是直接读取了input文件的内容,然后直接POST出去了。要实现这样的功能,可以借助FileReader,读取input文件的内容,再保留二进制的格式发送出去:
?
?
上面的实现需要考虑文件太大,需分段上传的问题。
关于FileReader的支持性,IE10以上支持,IE9有另外一套File API。
文章讨论了3种办法实现无刷新上传文件,分别是使用iframe、FormData和FileReader,支持性最好是的iframe,但是从体验的效果来看FormData和FileReader更好,因为这两者不用生成一个无用的DOM再删除,其中FormData最简单,而FileReader更加灵活。
下面给大家介绍iframe无刷新上传文件
?
如果没有设置该属性,就会像平常一样在本页重定向打开action中的url。
而如果设置为iframe的name值,即"upload"的话,就会在该iframe内打开,因为CSS设置为隐藏,因而不会有任何动静。若将display:none去掉,还会看到服务器的返回信息。
?
相关文章推荐
- 工作安排及总结 2014 08 15
- 写在冬日——一个女程序员第十三年的工作总结
- 一周以来工作总结--关于位图索引
- 2007年述廉工作总结
- git 操作总结(整个工作流程)
- 工作总结数据库集群
- 正式入职1个半月的工作总结
- 第二冲刺阶段——个人工作总结10
- 2013年01月05日 工作总结
- 工作总结——项目经理适用期过后的总结文字
- [置顶] 网络工程师日常工作总结
- 2006.7.3工作总结!
- 【工作总结】书面方式回复注意遣词…
- 第二阶段个人工作总结(7)
- ActiveReports工作总结12——用Designer控件实现用户自定义报表印刷
- 转:十年总结(四):在北京的第一份工作和第一个项目
- 第二周工作总结
- 工作笔记之总结PCB 布局降低噪声的…
- 2016年12月9日工作总结(JNI问题,AudioTrack之回调,FFmpeg之Seek)
- 2.1周工作总结及计划表