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

说明

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

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中进行数据编辑;
需要在线编辑的情况,那么需要新增主键

猜你喜欢

转载自blog.csdn.net/abc8125/article/details/113759115