一些php功能函数

这篇博客介绍了几个PHP的实用函数,包括用于处理字符串编码、存储数组到文件、ThinkPHP模型连接数据库以及验证码的生成和验证。此外,文章还强调了图片上传的安全性,提供了四种方法检查上传文件是否为有效图片,包括getimagesize、exif_imagetype和资源重绘等,以防止恶意文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

=========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;

通过浏览器请求,就能下载到一个可以放到桌面的网址导航了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值