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')); //输出前一天日期