说明

以下整理的文档是本人2017年从事php开发到目前遇到的问题的部分整理,因为上家公司有改错本这个东西,偶然间翻开,整理了一部分,后续遇到问题会持续更新,最新更新的内容会放到最前面。

php开启错误信息

error_reporting(E_ALL);
ini_set(‘display_errors’,true);

手写shffle

$a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
for($i=0;$i<count($a);$i++){$op=rand(-1,1);$index= $i+ mt_rand(0,count($a)-1) * $op;if($index<0){$index=0;}if($index >= count($a)){$index=count($a)-1;}$temp=$a[$index];$a[$index]=$a[$i];$a[$i]=$temp;//遍历,随机交换当前循环的位置和其他位置$index的元素
}
exit(json_encode($a));

读取csv文件

function readcsv()
{$file = "./budan/elbt_yiyuan.csv";setlocale(LC_ALL, 'zh_CN');$file = fopen($file, 'r');$list = [];while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容,如果不全为空if (array_filter(mb_convert_encoding($data, 'utf-8', 'gbk'))) {$list[] = mb_convert_encoding($data, 'utf-8', 'gbk'); //中文乱码问题解决}}fclose($file);$mapping = $list[0];unset($list[0]);//转换key,$data = [];foreach ($list as $k => $v) {$tmp = [];foreach ($mapping as $i => $key) {$tmp[$key] = $v[$i];}$data[$k] = $tmp;}return $data;
}

MySql中varchar类型排序

最近一个项目中,需要对用户的订单金额进行排序,但是金额在数据库中是varchar并不是decimal,按照思路很容易的写出来sql


select * from
(
SELECTbuyer as uid,FORMAT(sum(make_profit),2) as total
FROMbuyer_order
where buyer_state=1
GROUP BY buyer
)a order by a.total desc limit 50里面根据买家分组,外层查询分组后的求和数据


按照第一个字符串排序,使用lpad,填充左边的字符串为0,当 长度不足10的时候,我们左边全部填充为0。这样子比较的时候就不会以第一个字符串大小来比较了。

select * from
(
SELECTbuyer as uid,FORMAT(sum(make_profit),2) as total
FROMbuyer_order
where buyer_state=1
GROUP BY buyer
-- )a order by a.total desc limit 50
)a order by LPAD(LOWER(a.total), 10,0) desc limit 50

sha1算法

/*** 计算 HMAC-SHA1的值* @param $str* @param $key* @return string*/
function get_sh1_sign($str, $key)
{if (!function_exists('hash_hmac')) {$signature = base64_encode(hash_hmac("sha1", $str, $key, true));} else {$blocksize = 64;$hashfunc = 'sha1';if (strlen($key) >$blocksize){$key = pack('H*', $hashfunc($key));}$key = str_pad($key, $blocksize, chr(0x00));$ipad = str_repeat(chr(0x36), $blocksize);$opad = str_repeat(chr(0x5c), $blocksize);$hmac = pack('H*', $hashfunc(($key ^ $opad) . pack('H*', $hashfunc(($key ^ $ipad) . $str))));$signature = base64_encode($hmac);}return $signature;
}

Layui点击图片放大

 <img src="xxxxx" width="100" onclick="show_img(this)"/>
<script>//图片放大function show_img(t) {layer.open({type: 1,skin: 'layui-layer-rim', //加上边框area: ['80%', '80%'], //宽高shadeClose: true, //开启遮罩关闭end: function (index, layero) {return false;},content: '<div style="text-align:center"><img src="' + $(t).attr('src') + '" /></div>'});}
</script>

导出数据库

mysqldump -u用户名 -p密码 -h 127.0.0.1 数据库 > /tmp/*.sql

yii2从2.0.16升级到2.0.40

框架内部升级的时候是小写的,windows下不区分大小写,不产生影响,linux下会出现找不到文件的问题

解决方法:
1.本地git检查大小写 git config core.ignorecase false ,改为大写提交
2.删除小写提交,然后新建大写,在提交。

Linux编辑/etc/profile导致命令不能使用

①:把文件恢复过来,最好有备份。如果没有那么将刚动过的改动删了。
②:重新指定环境变量,export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
③:这时候source命令应该是可以重新使用了,source /etc/profile 将环境变量再次改回来

mysql bin-log相关操作


-- 查看bin-log配置
show variables like '%log_bin%';
show variables like '%binlog_format%';-- 查看所有的bin-log文件
show BINARY logs; -- 查看binlog的详情,主要用于获取start-pos和end-pos
show binlog events in 'mysql_bin.000056';-- 查看bin_log,根据start-pos和end-pos 用于恢复数据使用
mysqlbinlog --start-position=22377 --stop-position=22740  -v -v ../data/mysql-bin.000056

bin-log恢复数据

执行一次更新

查看pos

cmd下进入mysql的bin目录执行:
D:\wamp\mysql\bin>mysqlbinlog --start-position=22740 --stop-position=23235 -v -v …/data/mysql-bin.000056

查看nickname被改之前,是一个手机号,那么我们就可以根据规则来修改数据

mysql查看用户授权

select user from mysql.user;
show grants for 用户名

获取文件后缀名

$ext = pathinfo($file, PATHINFO_EXTENSION );

判断系统平台

//是否为windows平台
strpos(strtolower(PHP_OS), 'win') === 0

切割字符串(cut between A and B)

    /*** 切割字符串* @param $str* @param $leftStr string 开始字符串* @param $rightStr string 结束字符串* @return bool|string*/public function cutStr($str, $leftStr, $rightStr){$left = strpos($str, $leftStr);$right = strpos($str, $rightStr, $left);if ($left < 0 or $right < $left) return '';return substr($str, $left + strlen($leftStr), $right - $left - strlen($leftStr));}

生成批量insert语句

/*** * @param $tableName string 表名* @param $arr array 数组* @return string string sql*/
function buildBatchInsertSql($tableName, $arr)
{//左右括号list($left_space, $right_space) = ['(', ')'];//闭包中处理数组中的字段增加 `` 避免关键字$field = array_map(function ($item) {return "`$item`";}, array_keys(reset($arr)));//获取values之前的字段$field_str = $left_space . trim(implode(',', $field), ',') . $right_space;//存放最终values的数组$value_arr = [];foreach ($arr as $k => $v) {$value = $left_space . implode(',', array_map(function ($item) {return is_numeric($item) ? $item : "'$item'";}, array_values($v))) . $right_space . ',';$value_arr[] = rtrim($value, ',');}$value_str = implode(',', $value_arr);$sql = "insert into  {$tableName}  {$field_str}  values $value_str";return $sql;
}

array_column常见用法

$arr = [['name' => '张三', 'age' => 10],['name' => '王五', 'age' => 8],['name' => '王麻子', 'age' => 10],['name' => '李四', 'age' => 12],
];
$data = array_column($arr, 'name');//["张三","李四"]
$data=array_column($arr,'age','name');//{"张三":10,"李四":12}
$data=array_column($arr,null,'name');//{"张三":{"name":"张三","age":10},"李四":{"name":"李四","age":12}}

二维数组 根据某一个key的值进行排序

array_multisort(array_column($arr, 'age'), SORT_ASC, $arr);
//结果
//[{"name":"王五","age":8},{"name":"张三","age":10},{"name":"李四","age":12}]

二维数组根据某一个值进行分组

/*** 二维数组根据某一个值进行分组,适合快速的根据某些状态进行分组* @param $data array* @param $key string* @param $arr [value1=>show_name1,value2=>show_name2]* @return array*/
function sortDataByField($data, $key, $arr)
{//获取所有的value$values = array_unique(array_column($data, $key));$result = [];foreach ($values as $v) {$val = [];foreach ($data as $kk => $vv) {if (isset($data[$kk][$key])) {if ($vv[$key] == $v) {unset($data[$kk][$key]);//如果需要保留分组的字段,可以注释掉这一行$val[] = $data[$kk];}}}if (in_array($v, array_keys($arr))) {$result[$arr[$v]] = $val;}$diff = array_diff(array_keys($arr), $values);if (!empty($diff)) {foreach ($diff as $item) {$result[$arr[$item]] = null;}}}return $result;
}$res = sortDataByField($arr, 'age', [10 => 'super', 8 => 'small', 12 => 'large']);
//运行结果
{"super":[{"name":"张三"},{"name":"王麻子"}],"small":[{"name":"王五"}],"large":[{"name":"李四"}]}

将字符串转换成二进制

/*** 将字符串转换成二进制* @param  $str string* @return string*/
function strToBin($str)
{//1.列出每个字符$arr = preg_split('/(?<!^)(?!$)/u', $str);//2.unpack字符foreach ($arr as &$v) {$temp = unpack('H*', $v);$v = base_convert($temp[1], 16, 2);unset($temp);}return join(' ', $arr);
}echo strToBin("a");

二进制转为字符串

/*** 将二进制转换成字符串* @param $str string* @return string*/
function binToStr($str)
{$arr = explode(' ', $str);foreach ($arr as &$v) {$v = pack("H" . strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16));}return join('', $arr);
}echo binToStr('1100001');

获取新旧数据对比,一般用于修改日志记录

$old = ['name' => '张三', 'age' => '10'];//修改之前的数据
$new = ['name' => '张三', 'age' => '20'];//修改后的数据
$comment_field = ['name' => '姓名', 'age' => '年龄'];//字段对应的中文/*** 获取新旧数据对比,一般用于修改日志记录* @param $old* @param $new* @param $comment_field* @return array*/
function getOldNewDiff($old,$new,$comment_field)
{$diff_arr = array_diff_assoc($old, $new);$diff=[];//最终存放的修改记录foreach ($diff_arr as $k => $v) {if (isset($comment_field[$k])) {$diff[]= $comment_field[$k] . '由' . $old[$k] . ' 修改为: ' . $new[$k];}}return $diff;
}
var_dump(getOldNewDiff($old,$new,$comment_field));

javascript中md5

在线地址:
https://blog-static.cnblogs.com/files/7qin/md5.js

//调用
hash = hex_md5(“123456”);


###  常用在线cdn地址
[jq2.0-百度cdn](http://libs.baidu.com/jquery/2.0.0/jquery.min.js)### php配置文件
* 错误相关* ini_set('display_errors',1); * error_reporting(E_ERROR);* 表单上传* file_uploads   =   on   ;是否允许通过HTTP上传文件的开关。默认为ON即是开* upload_max_filesize   =   8m   即允许上传文件大小的最大值。默认为2M* post_max_size   =   8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M* max_execution_time   =   600 ;每个PHP页面运行的最大时间值(秒),默认30秒* max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒* memory_limit   =   8m   ;每个PHP页面所吃掉的最大内存,默认8M* max_input_vars = 1000  用来限制提交的表单数量了### 时区```javascript
date_default_timezone_set("Etc/GMT+08");//设置北京时区
date_default_timezone_get();//获取时区

字符串中字母转大写(解决自带函数中文乱码问题)

/**** @param $str string 字符串包含中文* @return string*/
function mb_str2upper($str)
{$b = str_split($str, 1);$r = '';foreach ($b as $v) {$v = ord($v);if ($v >= 97 && $v <= 122) {$v -= 32;}$r .= chr($v);}return $r;
}$a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';
echo 'origin string:' . $a . "\n";
echo 'result string:';
$r = mb_str2upper($a);
var_dump($r);

微信支付二维码生成

测试地址:http://paysdk.weixin.qq.com/example/qrcode.php?data=

2018-7-23 使用的时候发现通过这个地址已经无法生成了,最开始我以为是代码出了问题,后面发现,是官方已经废除了测试地址的使用。去掉example即可,最好的是自己在服务器后端实现生成二维码的方法,demo中也有。这里知识记录最开始自己踩过的坑。

ThinkPHP 迁移到Linux runtime无法生成

  • 文件目录权限改为可以写入
  • 注意代码运行所属组,做好设置为www
  • vim /etc/selinux/config 修改为:selinux=disabled

百度编辑器无法使用

解决:
使用textarea作为容器,不使用div。
使用百度编辑器的时候要使用textarea作为容器,使用其他的作为容器样式无法加载出来,后台接收的时候使用$_POST,不能使用I(),会过滤特殊字符。

微信公众平台

微信开发的APPID对应的APPSecret不在展示,每次都会重置,因此要做好记录

ThinkPHP5 事务提交异常

在事务执行中千万不要使用助手函数db(),就是被这玩意坑死了,最开始没有想到它回去重新执行数据库连接!!事务 必须在同一个连接才会生效

ThinkPHP3 修改数据库结构不生效

需要删除runtime下的缓存,因为早期的tp3是缓存了数据库结构在缓存中的。

php发送long类型数据,会自动转为科学计数法

PHP 数字超过一定长度时,会自动转换为 科学计数法 的形式,如 1.2345678912346E+16;
如何
避免转换,让它原样展示呢?
不过,可以用PHP函数 number_format() 来格式化数字,参考代码如下:
$str=number_format(12345678912,0, ‘’, ‘’);

接收long类型转为科学计数法

使用json_decode的时候使用后面两个参数,
json_decode($data, true,512, JSON_BIGINT_AS_STRING)

Excel导出长数字会变为科学计数法

使用yum安装apache

使用yum安装了Apache之后,必须要安装httpd-tools使用源码安装php的时候要调用配置一个关联httpd和php关联,在配置文件中生成libphp5.so。Apache才可以正常的引用的php模块。

php不再支持HTTP_RAW_POST_DATA

原来系统一些地方,使用$GLOBALS[‘HTTP_RAW_POST_DATA’]来获取数据,
解决方案$data = $GLOBALS[‘HTTP_RAW_POST_DATA’];
改为:$data = file_get_contents(‘php://input’);
特别注意:特别提醒,
如果你的微信支付,小程序支付,app支付中,
以前使用HTTP_RAW_POST_DATA来获取微信支付异步处理结果的,
升级到php7后,
一定要记得按照上面的方法改过来,
否则有些功能使用不了。

MySQL中分组查询问题

问题:
[Err] 1055 - Expression #1 of SELECT list is not in
GROUP BY clause and contains nonaggregated column ‘repair.order_info.id’
which is not functionally dependent on columns in GROUP BY clause; this is
incompatible with sql_mode=only_full_group_by

解决:
MySQL 5.7,实现检测功能的依赖。如果启用了ONLY_FULL_GROUP_BY
SQL模式(默认),MySQL拒绝选择列表查询,条件,或命令列表是指非聚合列既不是GROUP
by子句中指定功能也不依赖他们。(5.7之前,MySQL不检测功能的依赖和ONLY_FULL_GROUP_BY在默认情况下不启用。
ONLY_FULL_GROUP_BY,对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列必须在GROUP BY后面出现否则就会报错,或者这个字段出现在聚合函数里面。
查看:
select
@@GLOBAL.sql_mode

解决:
关闭严格模式
set
sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;

JQ为未来元素绑定事件

问题:
在input=file选择多个文件后,把图片追加页面预览的时候,无法为新增的图片绑定事件。

解决方案:

  • 在早期的Jq中如果想要为未来元素绑定事件,必须把绑定代码写在生成代码那里
  • 在Jquery1.7以后,可以使用on的形式来绑定未来

Float类型比较大小问题

$sum = "12300.00";
$a  = "10000.30";
$b  = "2000.30";
$c  =  "299.40";
$sum = (float) $sum;
$s = (float) ($a+$b+$c);
var_dump($sum, $s);
var_dump($sum==$s);结果是:
float(12300)
float(12300)
bool(false)

要比较两个浮点数的大小,可以用bccomp(参数1,参数2,小数位)来比较。

微信小程序四种跳转方式

  • wx.navigateTo(OBJECT) 小程序中左上角有一个返回箭头,可返回上一个页面,也可以通过方法 wx.navigateBack 返回原页面.
  • wx.redirectTo(OBJECT) 左上角没有返回箭头,不能返回上一个页面
  • wx.switchTab(OBJECT) 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
  • wx.reLaunch(OBJECT) 关闭所有页面,打开到应用内的某个页面。
    跟wx.redirectTo 一样左上角不会出现返回箭头

小程序上拉刷新

  • 需要在入口 app.json 中进行配置下拉的权限, {“enablePullDownRefresh”: true}
  • 在需要使用的页面js中的onPullDownRefresh 方法中进行调用下拉刷新的样式和实现
  • 小程序图片上传,通过 wx.chooseImage 对文件进行选择配置,可以上传 [‘album’, ‘camera’] 本地和拍照 的图片,通过步骤一的返回参数 obj.tempFilePaths 来获取需要上传的文件地址, 通过 wx.uploadFile 对文件进行服务器的上传

wx.request 以post提交参数,服务端接收不到data参数

以post 提交参数时,需要模拟出 header:{“content-type” : “application/x-www-form-urlencoded” } 头,否则服务端无法获取数据。在官方文档上没有说明

小程序获取位置信息

  • 使用 wx.getLocation(object) 获取经纬度
  • 申请 百度/腾讯 ak 嘛,对经纬度 进行置换

小程序授权登录和获取用户信息

通过wx.login获取临时登录凭证code

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

发送验证到服务器进行登录信息和用户信息的置换

phpinfo 和 php -m 显示扩展不同

在php -m 中能看到的话, 说明你只在php -i|grup php.ini 中添加了扩展文件;还得 在phpinfo(). 这个模式下面看到他加载的配置文件位置,然后也加上.so文件

phpmyadmin 前面没有编辑框

原因:数据表没有主键,那么无法在phpmyadmin中进行数据编辑;
需要在线编辑的情况,那么需要新增主键

工作中php遇到的问题以及常用函数整理(持续更新)相关推荐

  1. networkx常用函数总结(持续更新)

    一.库函数 networkx常用函数总结 用途 函数 读取文件/生成图 创建无向图 G = nx.Graph() 创建有向图 G = nx.DiGraph() 读取gml文件 G=nx.read_gm ...

  2. SAP HR 常用函数*持续更新中...

    1.1   DAY_ATTRIBUTES_GET                      获取两个日期间的每一天的属性值 1.2   FIMA_DAYS_AND_MONTHS_AND_YEARS   ...

  3. Oracle 常用函数总结(持续更新)

    LOWER:大写转小写 select LOWER('Hello Java') from dual 运行结果:hello java UPPER:小写转大写 select UPPER('Hello Jav ...

  4. Excel 数据分析之Power Pivot常用函数(持续更新)

    目录 RELATED函数 RELATEDTABLE RANK.EQ COUNTROWS CALCULATE DIVIDE RELATED函数 RELATED(ColumnName) RELATED(返 ...

  5. python常用函数(持续更新)

    1.abs() abs是 absolute 的缩写,它会返回数字的绝对值. abs(-3.14) 3.14 2.any() any()函数用于判断给定的可迭代参数是否全部为False.如全为False ...

  6. 常用软件整理(持续更新)

    1,SqlDbx qlDbx Professional Edition V3.30破解版,有3个文件,支持多窗口模式,版本低了些,但已经够用 SqlDbxV330破解版下载 转载于:https://w ...

  7. python 中os.path 的一些路径常用函数

    python 中os.path 的一些路径常用函数 import os path = 'AAA/BBB/ccc.txt' aa=os.path.dirname(path) #返回文件路径 print( ...

  8. mysql数据库 常用函数_《MySQL数据库》常用函数整理

    原标题:<MySQL数据库>常用函数整理 以下内容,是我整理出来的比较常用的字符串函数,数值函数,日期函数. 第一类:字符串函数 1.conv(n,from_base,to_base):对 ...

  9. linux常用指令(持续更新)

    linux常用指令(持续更新) 基本访问指令: 直接进入用户的home目录: cd ~ 进入上一个目录: cd - 进入当前目录的上一层目录: cd .. 进入当前目录的上两层目录: cd ../.. ...

最新文章

  1. centos6.5 rsync+inotify同步配置笔记
  2. oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除
  3. 数据库设计(三)概念数据模型
  4. 为了梦想开始历练之清除浮动篇
  5. 警惕开源代码库中的安全隐患
  6. 权威预测:未来一年,企业云服务将会如何发展?
  7. django-模型类字段选项
  8. 【Clickhouse】Clickhouse Live View
  9. Hibernate标准查询
  10. Python 实现N的多次方
  11. macOS High Sierra 10.13.6 英伟达显卡Nvidia显卡 失效处理方案
  12. openresty ngx_lua常用指令
  13. 再聊聊Python中文社区的翻译
  14. ps铅笔素描效果教程
  15. Shiro(三) Shiro核心原理分析
  16. vivado batch mode
  17. 优矿量化实验室———转自知乎
  18. Revit初试水之点击按钮打开网页
  19. 利用pyhton爬虫(案例3)--X房网的小房子们
  20. python实现网页微信登录_网站微信登录-python 实现

热门文章

  1. vue项目配置nginx页面跳转正常,接口报200,但是没数据(很抱歉,如果没有启用JavaScript,XXX无法正常工作)
  2. IntelliJ IDEA 快捷键大全(Mac版)
  3. AspNet2.0页面生命周期的各个事件细节
  4. 那堪春景媚,送君千万里
  5. 中医治感冒方法的整理(待完善)
  6. 分享10款小白也能做起来的平衡车设计资料
  7. 计算机基础知识中真值是什么,计算机中什么叫机器数,什么叫真值
  8. 1290 越狱(逆向思维-快速幂)
  9. Game Center,移动游戏社交平台的勘探报告
  10. SpringCloud搭建NetFilx-Eureka(小白专属)