=========php输出的字符串编码和header头信息声明的编码不一致时输出乱码=========
下面这个函数就是实现这样功能的,它无需要知道传过来的字符串是GBK编码还是UTF8编码。代码如下:
function getSafeStr($str){
$s1 = iconv('utf-8','gbk',$str);
$s0 = iconv('gbk','utf-8',$s1);
if($s0 == $str){
return $s1;
}else{
return $str;
}
}
==========一个判断字符串编码的函数=========
function getcode($str)
{
$s1 = iconv('utf-8','gbk',$str);
$s0 = iconv('gbk','utf-8',$s1);
if($s0 == $str){
return 'utf-8';
}else{
return 'gbk';
}
}
===========php 存数组到文件============
if(isset($_POST['sub'])){
$cfg = array(‘contact’=>$_POST['contact']); //把数据存入数组
file_put_contents(‘./data/contact.cache’,serialize($cfg));
//把数组序列化之后,写到contact.cache里,
$this->redirect('other/contact');//跳转
}
else{
$fp = fopen('./data/contact.cache','r');//读
$cf = unserialize(fread($fp,filesize('./data/contact.cache')));//反序列化,并赋值
$this->assign('cfg',$cf);//送到前台模板
$this->display('other/contact');
}
=======thinkphp 3.2.3 使用模型单独传入连接参数连接别的数据库=========
模型
<?php
namespace Home\Model;
use Think\Model\MongoModel;
class TestModel extends MongoModel{
protected $trueTableName = "tp_test";
protected $dbName = "cache_data";
protected $_idType = self::TYPE_INT;
protected $_autoinc = true;
}
function test(){
$connection = C('mongo'); //mongo连接参数
$Mongo = new Model\TestModel('test','tp_',$connection);
$aa = $Mongo->select();
var_dump($aa);
}
==============**Thinkphp 验证码**=================
*一、实例化生成验证码的类(该方法放到IndexController里面便于访问)*
[php] view plaincopy
/**
*
*验证码生成
*/
public function verify_c(){
$Verify=new\Think\Verify();
$Verify->fontSize=18;
$Verify->length=4;
$Verify->useNoise=false;
$Verify->codeSet='0123456789';
$Verify->imageW=130;
$Verify->imageH=50;
//$Verify->expire=600;
$Verify->entry();
}
二、前台需要生成验证码的图片src属性指向
[html] view plaincopy
<p class="top15 captcha" id="captcha-container">
<input name="verify" width="50%" height="50" class="captcha-text" placeholder="验证码" type="text">
<img width="30%" class="left15" height="50" alt="验证码" src="{:U('Home/Index/verify_c',array())}" title="点击刷新">
</p>
三、写完上面的后,页面初始化的验证码就可以出现了,下面要写的就是点击验证码图片后,刷新出新的验证码图片(通过jquery修改图片的src属性来完成,请求的处理函数一样,只是在请求后加一个随机数,区别上一张图片的请求)
[javascript] view plaincopy
//验证码生成
var captcha_img=$('#captcha-container').find('img')
var verifyimg=captcha_img.attr("src");
captcha_img.attr('title','点击刷新');
captcha_img.click(function(){
if(verifyimg.indexOf(' ')>0){
$(this).attr("src",verifyimg+'&random='+Math.random());
}else{
$(this).attr("src",verifyimg.replace(/\.*$/,'')+''+Math.random());
}
});
四、校验验证码输入是否正确
a.在common目录下的function.php里加入全局函数
[php] view plaincopy
/**
*验证码检查
*/
function check_verify($code,$id=""){
$verify=new\Think\Verify();
return$verify->check($code,$id);
}
b.在表单提交的controller对应的处理方法里添加检查代码
[php] view plaincopy
//检查验证码
$verify=I('param.verify','');
if(!check_verify($verify)){
$this->error("亲,验证码输错了哦!",$this->site_url,9);
}
到此tp3.2验证码的使用就可以了。
=======================================文件上传====================================
class UploaderController extends XXXX_Controller {
public function index() {
$files = array();
$success = 0; //用户统计有多少张图片上传成功了
foreach ($_FILES as $item) {
$index = count($files);
$files[$index]['srcName'] = $item['name']; //上传图片的原名字
$files[$index]['error'] = $item['error']; //和该文件上传相关的错误代码
$files[$index]['size'] = $item['size']; //已上传文件的大小,单位为字节
$files[$index]['type'] = $item['type']; //文件的 MIME 类型,需要浏览器提供该信息的支持,如"image/gif"
$files[$index]['success'] = false; //这个用于标志该图片是否上传成功
$files[$index]['path'] = ''; //存图片路径
// 接收过程有没有错误
if($item['error'] != 0) continue;
//判断图片能不能上传
if(!is_uploaded_file($item['tmp_name'])) {
$files[$index]['error'] = 8000;
continue;
}
//扩展名
$extension = '';
if(strcmp($item['type'], 'image/jpeg') == 0) {
$extension = '.jpg';
}
else if(strcmp($item['type'], 'image/png') == 0) {
$extension = '.png';
}
else if(strcmp($item['type'], 'image/gif') == 0) {
$extension = '.gif';
}
else {
//如果type不是以上三者,我们就从图片原名称里面去截取判断去取得(处于严谨性)
$substr = strrchr($item['name'], '.');
if(FALSE == $substr) {
$files[$index]['error'] = 8002;
continue;
}
//取得元名字的扩展名后,再通过扩展名去给type赋上对应的值
if(strcasecmp($substr, '.jpg') == 0 || strcasecmp($substr, '.jpeg') == 0 || strcasecmp($substr, '.jfif') == 0 || strcasecmp($substr, '.jpe') == 0 ) {
$files[$index]['type'] = 'image/jpeg';
}
else if(strcasecmp($substr, '.png') == 0) {
$files[$index]['type'] = 'image/png';
}
else if(strcasecmp($substr, '.gif') == 0) {
$files[$index]['type'] = 'image/gif';
}
else {
$files[$index]['error'] = 8003;
continue;
}
$extension = $substr;
}
//对临时文件名加密,用于后面生成复杂的新文件名
$md5 = md5_file($item['tmp_name']);
//取得图片的大小
$imageInfo = getimagesize($item['tmp_name']);
$rawImageWidth = $imageInfo[0];
$rawImageHeight = $imageInfo[1];
//设置图片上传路径,放在upload文件夹,以年月日生成文件夹分类存储,
//rtrim(base_url(), '/')其实就是网站的根目录,大家自己处理
$path = rtrim(base_url(), '/') . '/upload/' . date('Ymd') . '/';
//确保目录可写
ensure_writable_dir($path);
//文件名
$name = "$md5.0x{$rawImageWidth}x{$rawImageHeight}{$extension}";
//加入图片文件没变化到,也就是存在,就不必重复上传了,不存在则上传
$ret = file_exists($path . $name) ? true : move_uploaded_file($item['tmp_name'], $serverPath . $name);
if($ret === false) {
$files[$index]['error'] = 8004;
continue;
}
else {
$files[$index]['path'] = $path . $name; //存图片路径
$files[$index]['success'] = true; //图片上传成功标志
$files[$index]['width'] = $rawImageWidth; //图片宽度
$files[$index]['height'] = $rawImageHeight; //图片高度
$success ++; //成功+1
}
}
//将图片已json形式返回给js处理页面 ,这里大家可以改成自己的json返回处理代码
echo json_encode(array(
'total' => count($files),
'success' => $success,
'files' => $files,
));
}
}
/***********************分割***************************************/
//这里我附上ensure_writable_dir()函数的代码
/**
* 确保文件夹存在并可写
*
* @param string $dir
*/
function ensure_writable_dir($dir) {
if(!file_exists($dir)) {
mkdir($dir, 0766, true);
chmod($dir, 0766);
chmod($dir, 0777);
}
else if(!is_writable($dir)) {
chmod($dir, 0766);
chmod($dir, 0777);
if(!is_writable($dir)) {
throw new FileSystemException("目录 $dir 不可写");
}
}
}
==============================判断全路径($url)是否图片===============================
PHP 图片上传,如果不做任何判断的话,随便一个文件如 rar,zip,php,java等文件改个文件名,改个后缀就能以图片形式上传的服务器,往往会造成极大的危害!
工具/原料
PHP
apache / nginx / iis
phpstorm / netbeans / notepad++ / editplus
方法/步骤
第一种方法:如果是只是单纯判断是否是图片格式的话,我使用 getimagesize 方法
$filename //远程url(全路径)
function checkIsImage($filename){
$alltypes = '.gif|.jpeg|.png|.bmp';//定义检查的图片类型
if(file_exists($filename)){
$result= getimagesize($filename);
$ext = image_type_to_extension($result);
return stripos($alltypes,$ext);
}else{
return false;
}}
第二种方法比较强大一些,能判断多种格式
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 7790:
$fileType = 'exe';break;
case 7784:
$fileType = 'midi'; break;
case 8297:
$fileType = 'rar'; break;
case 255216:
$fileType = 'jpg';break;
case 7173:
$fileType = 'gif';break;
case 6677:
$fileType = 'bmp';break;
case 13780:
$fileType = 'png';break;
default:
$fileType = 'unknown';
}
return $fileType;
}
第三种方法:
PHP gd类库函数提供了一个exif_imagetype() 函数, 用来读取图像的第1个字节, 还会对图片的签名做检查。 如果格式不对,会返回false。 其实啊, 这个方法和第一种方法有异曲同工之妙。 但是因为这个是库函数,效率要比第一种方法高得多。
此函数用法很简单,传入路径,然后通过判断是否等于某个常量, 例如 gif格式的IMAGETYPE_GIF
第四种方法:php重绘
效率很低的一种方法,但也是一种思路: 把传输过来的文件,不论什么文件都以resource 类型绘到图片中去, 如果是图片,能还原出来。如果不是图片,那绘画不出来,而且里面的危险代码也没有了。
===============================php下载网址导航==========================
<?php
$content='
[InternetShortcut]
URL=http://www.9973.com/
IDList=[{000214A0-0000-0000-C000-000000000046}]
IconIndex=1
HotKey=0
Prop3=19,2';
header("Content-type:application/octet-stream");
header("Content-Disposition: attachment; filename=9973网址导航.url;");
echo $content;
通过浏览器请求,就能下载到一个可以放到桌面的网址导航了