所有由zhufenghua发布的文章

mysql find_in_set函数

–FIND_IN_SET(子集,合集(要么等于子集,要么子集在合集逗号分隔部分里面))

已知 bind_module 是字符串,多个存储例如: 1,2,3,4,5,6,7,8,9 ,也是一个空字符串。

select * from student1 where FIND_IN_SET("1",`bind_module`)

此时,如果 bind_module=1 ,或者该集合里包含 1,条件就匹配。

如果要取反,可以在 FIND_IN_SET 前取反,使用 ! 符号,例如 :

select * from student1 where !FIND_IN_SET("1",`bind_module`)

FILD_IN_SET 和 IN 的一些用法:

已知一个查询,返回字段 $str = ‘1,2,3,4’

则要查询另一个表id为1 或 2 或 3 或 4的数据。

此时不能使用 where id in($str),因为如果使用 in 则会强制转为int,也就是相当于 where id in(1)

in 时一般是单列,可以多行,例如:

column
1
2
3
4
5

如果返回的是 ‘1,2,3,4,5’ 这样的字符串格式,则明显不能用 in ,怎么办呢?用以下sql:

where FILD_IN_SET(`id`, '1,2,3,4,5');

也就是说:where id in(1,2,3,4,5) 相当于 where FILD_IN_SET(id, ‘1,2,3,4,5’) 。

php静态方法不利于扩展

因为php没有静态代码块。

如果希望在所有的静态方法前添加一个公共方法做切点,就比较困难。

如果使用的是oop的实例方法,那么可以在构造方法中执行一些公共代码。

例如:

// api 基类
class api{
public function __construct()
{
!defined("IsApi") && define("IsApi",true);
}
}

php 单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。

单例模式分3种:懒汉式单例(需要时才去实例化对象)、饿汉式单例(在类加载时即创建该单例对象。)、登记式单例(挂载到其他变量中作为子节点)。

单例模式有以下3个特点:

1.只能有一个实例。

2.必须自行创建这个实例。

3.必须给其他对象提供这一实例。

那么为什么要使用PHP单例模式?

PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

class Single {
    private $name;//声明一个私有的实例变量
    private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
    }
    static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
        static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
        if(!self::$instance) self::$instance = new self();
            return self::$instance;
    }
    public function setname($n){ $this->name = $n; }
        public function getname(){ return $this->name; }
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning');
echo $oa->getname();//good morning
echo $ob->getname();//good morning

php 工厂模式

工厂模式是常用的实例化对象模式之一,用工厂方法代替new对象。

使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

<?php
header('Content-Type:text/html;charset=utf-8');
/**
 *简单工厂模式(静态工厂方法模式)
 */
/**
 * Interface people 人类
 */
interface  people
{
    public function  say();
}
/**
 * Class man 继承people的男人类
 */
class man implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是男人<br>';
    }
}
/**
 * Class women 继承people的女人类
 */
class women implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是女人<br>';
    }
}
/**
 * Class SimpleFactoty 工厂类
 */
class SimpleFactoty
{
    // 简单工厂里的静态方法-用于创建男人对象
    static function createMan()
    {
        return new man();
    }
    // 简单工厂里的静态方法-用于创建女人对象
    static function createWomen()
    {
        return new women();
    }
}
/**
 * 具体调用
 */
$man = SimpleFactoty::createMan();
$man->say();
$woman = SimpleFactoty::createWomen();
$woman->say();

判断是否为ajax请求

比较规范的ajax,比如 jquery 都会携带一个请求头:

x-requested-with

所以判断请求头是否存在即可。

if (request.getHeader("x-requested-with") != null    
    && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {    
    out.print("该请求是 AJAX 异步HTTP请求。");    
}else{     
    out.print("该请求是传统的 同步HTTP请求。");    
}    

如果为 ajax,但可能没有该请求头。因为它并不是规范字段。

以axios为例,就是在代码中封装的:

拦截request,设置全局请求为ajax请求 axios.interceptors.request.use((config) => { config.headers[‘X-Requested-With’] = ‘XMLHttpRequest’ return config }) 

附 php 判断 ajax 代码:

!defined("requestHeader") && define("requestHeader",getallheaders());  // 取得所有请求头
/**
 * 判断是否为ajax请求
 */
function isAjax(){
    if(requestHeader['X-Requested-With']){  // 判断是否存在ajax请求头
        return true;
    }else{
        return false;
    }
}
!defined("IsAjax") && define("IsAjax",isAjax());

php函数灵活定义

函数定义,必要参数每个给予参数位,其余函数可再次封装

例如 curl 函数,已知必须 url ,其他函数不定,此时可使用 array 再次封装,其他参数从 $param 中获取:

/** 基础的 curl,默认 Get 请求
 * @param $url
 * @param array $param 参数
 * @return bool|string
 */
function easy_curl($url,$param=array()){
    $ch = curl_init($url);
    // 通用设置
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    // 是否设置自定义请求头
    $requestHeader = $param['requestHeader'] ?: array("User-Agent: pan.baidu.com");
    if($requestHeader){
        curl_setopt($ch,CURLOPT_HTTPHEADER,$requestHeader);
    }
    // 是否为post
    $postData = $param['postData'];
    if($postData){
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
    }
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}