php冷门小知识

1、当数据库里某个字段是存的多个值用逗号拼接的,类似于“1,2,3,4,5”;如果你想通过sql查这个字段包含1的数据,怎么查?我来告诉你。tp5.1的框架里面的where条件是这样写的:

点击查看代码,控制器先use think\Db;

$where[] = [‘‘,‘exp‘,Db::raw("FIND_IN_SET(".$param[‘field‘].",type)")];

注:其中field是传过来的值,type是数据库里的字段名。

2、通过某个字段给数组排序,如果不方便用sql排序的话可以用这个。

点击查看代码
$last_names = array_column($userData,‘patrol‘);
array_multisort($last_names,SORT_DESC,$userData);

注:array_column()函数是取出数组中的的"patrol"(自定义字段)一列,然后通过array_multisort()函数排序。SORT_DESC倒序排,$userData是要排序的数组。

3、通过两个字段给数组排序,如果不方便用sql排序的话可以用这个

点击查看代码
//控制器里的代码
   usort($informations, array(‘\app\admin\model\QuestionLibraryList‘,‘cmp_sequence_score‘));
//模型里的方法
    public static function cmp_sequence_score($a, $b)
     {
         if ($a[‘is_home_top‘] == $b[‘is_home_top‘]) {
             return ($a[‘update‘] > $b[‘update‘]) ? -1 : 1;
         }
         return ($a[‘is_home_top‘] > $b[‘is_home_top‘]) ? -1 : 1;
     }
注:\app\admin\model\QuestionLibraryList 是模型路径 ,cmp_sequence_score是排序的方法,$informations是要排序的数组,$a和$b是默认参数,不需要变,“is_home_top”是第一个排序值,“update”是第二个排序值。
4、sql里使用if判断
点击查看代码
    /**
     * @param $db     数据库名
     * @param $table  表名
     * @param $field  字段
     * @param $where  条件
     * @param $order  排序
     * @param int $limit 取得数据条数
     * @param int $start 数据取得起始位置
     * @param string $keyField 把返回结果的指定的字段值作为二维数组的key
     */
    public static function getRecord($db, $table, $field = ‘*‘, $where = ‘‘, $limit = 1, $start = 0, $order = ‘‘, $group = ‘‘, $keyField = ‘‘)
    {
        if ($limit == 1) {
            $data = Db::connect($db)
                ->table($table)
                ->field($field)
                ->where($where)
                ->group($group)
                ->order($order)
                ->find();
        } else {
            if ($limit == 0) {
                $data = Db::connect($db)
                    ->table($table)
                    ->field($field)
                    ->where($where)
                    ->group($group)
                    ->order($order)
                    ->select();
            } else {
                $data = Db::connect($db)
                    ->table($table)
                    ->field($field)
                    ->where($where)
                    ->group($group)
                    ->order($order)
                    ->limit($start, $limit)
                    ->select();
            }
            $ret = [];
            if (!empty($keyField) && !empty($data)) {
                foreach ($data as $k => $v) {
                    $ret[$v[$keyField]] = $v;
                }
                $data = $ret;
            }
        }
        return $data;
    }
    
    $is_read = Main::getRecord(‘db_grid_game‘,‘t_notice_bind_user‘,‘count(if(is_read = 1,true,null)) as count,notice_id‘,‘‘,0,‘‘,‘‘,‘notice_id‘,‘notice_id‘);

    
获取is_read等于1的数据数量。
5、处理返回数据兼容utf-8格式的代码
点击查看代码
    if (!headers_sent()) {
        header(‘Content-Type:application/json;charset=utf-8‘);
    }

6、数据库查询优化,缩短接口请求时间

点击查看代码
1游标
        $cursor = Db::connect(‘db_grid‘)
            ->table(‘t_event_log‘)
            ->field(‘count(event_log_id) as count,appraise‘)
            ->where($where)
            ->group(‘appraise‘)
            ->cursor();
        foreach($cursor as $cursor_key => $cursor_value){
            $estimer_count[$cursor_key] = $cursor_value;
        }

2分块
     $master = array();
            $chunk = Db::connect(‘db_grid‘)
                ->table(‘t_event‘)
                ->field(‘event_id, status‘)
                ->where($map)
                ->chunk(10000, function ($events) use (&$master) {
                    foreach ($events as $event_value) {
                        $master[] = $event_value;
                    }
                });

注:$events是所查出的数据库数据,再按块存到$master里,再返回$master;

结束语:好了,今日知识点就分享到这里。谢谢大家支持。

 

php冷门小知识

上一篇:jquery绑定事件如何传递参数


下一篇:js 深拷贝