php笔记(一)

PHP笔记

数组方法

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ['1' => 1], ['1' => 1]];
# 是否在数组里
in_array(1, $arr);
# 抛出最后元素
array_pop($arr);
# 去重
array_unique($arr);
# 搜索键名,返回布尔值
array_search('1', $arr);
# 函数对关联数组按照键值进行升序排序
asort($arr);
#函数对关联数组按照键值进行降序排序
arsort($arr);
# 函数对关联数组按照键进行升序排序
ksort($arr);
#函数对关联数组按照键值行降序排序
krsort($arr);
# 转字符串
implode(',', $arr);

cookie


# 设置cookie
setcookie('test', 24 * 3600);
$_COOKIE['test'];
# 删除cookie
setcookie('test', time() - 1);

session

session_start();
# 设置session
$_SESSION['test'] = 1;
# 删除session
unset($_SESSION['test']);

mysqli

class MysqliConnect
{
    public function __construct($host, $user, $pwd, $db)
    {
        try {
            $con = new mysqli($host, $user, $pwd, $db);
            $con->set_charset('utf8mb4');
            if (mysqli_connect_error()) {
                throw new Exception('连接失败');
            }
            return $con;
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }
}

$con = new MysqliConnect('localhost', 'root', '110609yan', 'blog');

pdo


class PdoConnect
{
    public function __construct($host, $user, $pwd, $db)
    {
        try {
            $pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pwd);
            $pdo->exec("set names utf8mb4");
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }
}

$pdo = new PdoConnect('localhost', 'root', '110609yan', 'blog');

三元运算符

$type = 1;
echo $type == 1 ? 'one' : $type == 2 ? 'two' : 'three';//输出two
echo $type == 1 ? 'one' : ($type == 2 ? 'two' : 'three');///输出one

正则表达式

/**
 * 正则表达式
 * Author: czl
 * Date: 2020/1/3
 * Time: 12:47
 */

/**
 * 原子
 * \d  包含所有数字[0-9]
 * \D  除所有数字外[^0-9]
 * \w  包含所有英文字符下划线,数字[a-zA-Z_0-9_]
 * \W  除所有英文字符下划线,数字外 [^a-zA-Z_0-9_]   
 * \s   包含空白区域如回车、换行、分页等 [\f\n\r]
 * */

/**
 * 元字符
 * *  匹配前一个内容的0次1次或多次
 * .  不包含回车换行以外的字符
 * + 匹配前一个内容的1次或多次
 * ?匹配前一个内容的0次或1次
 * |  选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配)
 * ^  匹配字符串首部内容
 * $  匹配字符串尾部内容
 * \b 匹配单词边界,边界可以是空格或者特殊符合
 * \B 匹配除带单词边界意外内容
 * {m} 匹配前一个内容的重复次数为M次
 * {m,} 匹配前一个内容的重复次数大于等于M次
 * {m,n} 匹配前一个内容的重复次数M次到N次
 * ( ) 合并整体匹配,并放入内存,可使用\1 \2…依次获取
 */

/**
 * 运算符
 * ( )  圆括号因为是内存处理所以最高
 * ? +  { } 重复匹配内容其次
 * ^ $ \b 边界处理第三
 * |  条件处理第四
 * 最后按照运算顺序计算匹配
 */

/**
 * 修正符
 * i 正则内容在匹配时候不区分大小写(默认是区分的)
 * m 在匹配首内容或者尾内容时候采用多行识别匹配
 * S 将转义回车取消是为单行匹配如. 匹配的时候
 * x 忽略正则中的空白
 * A 强制从头开始匹配
 * D 强制$匹配尾部无任何内容 \n
 * U 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束,
 * 常用在采集程序上的正则表达式
 */

错误提示

ini_set('display_errors', 1);
error_reporting(E_ALL);

thinkphp

# 获取env配置
$this->env();

# 视图渲染
return $this->fetch('/index');//当前路径 下的view
return $this->fetch('admin/index');//某控制器下的view
return $this->fetch('admin@index/index');//模块下的

# 视图过滤
$this->filter(function ($content) {
    return $content . '1';
});
return $this->fetch();
}

# model ->select
User::select();//对象 ->user_id === ['user_id']

# model get
User::get(1);//对象

# Db select
Db::name('user')->select();//数组

# 获取字段值
Db::name('user')->where('user_id', '1')->value('user_id');

# 列 第二个参数代表按照那个索引
Db::name('user')->column('user_mark', 'user_id');

# 清除链式option
$query->removeOption(true);//这里清除option true代表全部去除

# 强制覆盖
Db::name('user')->insert(['user_mark' => 1], true);//replace用法

# 批量插入
Db::name('user')->insertAll([
    [
      'user_mark' => 1
    ],
    [
      'user_mark' => 1
    ]
])

# update中包含主键是可以直接更新的,省去where
$query = Db::name('user');
$query->get(1);
$query->update([
   'user_id' => 1,
            'user_mark' => 99
 ]);

# raw 表达式更新 UPPER转换成大写
Db::name('user')->update([
   'user_id' => 1,
   'user_nickname' => Db::raw('UPPER(user_nickname)'),
   'user_integration' => Db::raw('user_integration +100')
]);

# setField
Db::name('user')->where('user_id', 1)->setField('user_nickname', Db::raw('UPPER(user_nickname)');

# delete写法
Db::name('user')->delete(2);
//删除全部
Db::name('user')->delete(true);

# model-get
User::get(1);

# Destroy
User::destroy(1); #软
Db::name('user')->delete(1);
# 闭包查询
User::destroy(function ($query) {
$query->where('user_id', 2);
});

# save
$user = User::get(4);
$user->user_mark = 4;
$user->force()->save();

# raw
$user->user_mark = ['inc', 1];
b::name('user')->update([
     'user_id' => 4,
     'user_mark' => Db::raw('user_mark +!')
]);
Db::name('user')->update([
      'user_id' => 4,
      'user_mark' => ['inc', 1]
]);

# isUpdate
$user = new User([
     'user_mark' => 1
      ]);
$user->isUpdate(true)->save();*/

# 查找
$user = User::all([4,5,6]);
$user = User::all('5,6,7');

# model-原始值
$user->getData();//全部的原始值

秒杀


# 未优化代码 此时left_num字段未设置为无符号的(unsigned),只能通过查询出的left_num判断,会出现超卖
/*$goods = Db::name('goods')->where([['goods_id' => 1]])->find();
if ($goods['left_num'] > 0) {
    $goods['left_num']--;
    Db::name('goods')->where([['goods_id' => 1]])->update([['left_num' => $goods['left_num']]]);
    die($goods['left_num']);
} else {
    die('售馨');
}*/

# 优化一 将left_num字段设置为无符号的(unsigned),这样update时就能通过行锁控制,不出现并发超卖
/*$goods = Db::name('goods')->where([['goods_id' => 1]])->find();
if ($goods['left_num'] > 0) {
    $goods['left_num']--;
    if (Db::name('goods')->where([['goods_id' => 1]])->update([['left_num' => $goods['left_num']]])) {
        die($goods['left_num']);
    } else {
        die('error');
    }
} else {
    die('售馨');
}*/

# 优化二 启动事务,锁住操作的行,但是会阻塞
/*try {
    Db::startTrans();
    $goods = Db::name('goods')->where([['goods_id' => 1]])->find();
    if ($goods['left_num'] > 0) {
        $goods['left_num']--;
        if (Db::name('goods')->where([['goods_id' => 1]])->update([['left_num' => $goods['left_num']]])) {
            echo $goods['left_num'];
            Db::commit();
            exit;
        } else {
            die('售馨');
        }
    } else {
        die('售馨');
    }
} catch (Exception $e) {
    Db::rollBack();
}*/

# 优化三 非阻塞排他锁
/*$fp = fopen(dirname(__FILE__) . "/lock.txt", "w+");
if (!flock($fp, LOCK_EX)) {
    echo "系统繁忙,请稍后再试";
    exit;
}
$goods = Db::name('goods')->where([['goods_id' => 1]])->find();
if ($goods['left_num'] > 0) {
    $goods['left_num']--;
    Db::name('goods')->where([['goods_id' => 1]])->update([['left_num' => $goods['left_num']]]);
    flock($fp, LOCK_UN);# 释放锁
    die($goods['left_num']);
} else {
    die('售馨');
}*/

# 优化四 redis
/*$redis = \ms\Redis::getInstance();
if (!$redis->rPop('store')) {
    echo "售馨";
    exit;
}
$goods = Db::name('goods')->where([['goods_id' => 1]])->find();
$goods['left_num']--;
Db::name('goods')->where([['goods_id' => 1]])->update([['left_num' => $goods['left_num']]]);
echo $redis->lLen('store');*/

格式化日期

echo date('Y-m-d H:i:s',strtotime('-1 day')); //输出前一天日期
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值