MySQL数据表生成Wiki格式数据字典

<?php
$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名
$dbName='joyous';    //使用的数据库
$user='test';      //数据库连接用户名
$pass='123456';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";

$table = array(
    't_user' => '用户表',
    't_user_info' => '用户扩展信息表',
 
);
try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
    $dbh->query('set names utf8');
    foreach ($table as $k => $v) {
        echo "### {$k}({$v})\n\n";
        $res = $dbh->query("SHOW FULL FIELDS FROM {$k}");
        $res->execute();
        $result = $res->fetchAll();
        echo "| 参数名称 | 类型 | 非空约束 | 备注说明|\n| ------ | ------ | ------ | ------ |\n";
        foreach ($result as $row)
        {
            echo "|{$row[0]}|{$row[1]}|{$row[3]}|{$row[8]}|\n";
        }
        echo "\n\n";
    }
} catch (PDOException $e) {
    echo $e->getMessage();
}

对比文件内容

需求从A文件当中查找不存在B文件当中的内容

方案1、

diff -B a.txt b.txt |awk '/</{print $2}'

#如果文件过大diff会超出内存就没法玩了~

方案2、

sort a.txt b.txt b.txt | uniq -u > c.txt
#排序并去重

方案3、

awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}'  a.txt b.txt > c.txt

其他命令参考:

#拆分文件
split -l 5000000 -d -a 3 c.txt
将c.txt按照每个文件500w行拆分,后缀是数字,并且后缀长度是3

坑爹的BOM

场景:开发小程序使用wx.request请求数据时提示Cannot read property of ‘xxxx’ undefined……..

原因:request返回的数据会默认会经过JSON.parse函数转换为Object,如果返回内容带有BOM就会影响转换

解决办法:

1.服务器端返回数据去除BOM(一般的IDE都有这样的功能)

2.编写兼容代码(在小程序内wx.request设置dateType:’text’,然后将返回的res.data进行去除字符res.data.trim()处理之后调用JSON.parse转换)

小程序wx.uploadFile失败的问题排查记录

现象:部分安卓(华为meta9)下用canvas画图之后使用wx.canvasToTempFilePath保存文件,然后再使用wx.uploadFile上传到服务器,上传图片失败

尝试方案:

1、canvasToTempFilePath延迟执行(怀疑是不是生成图需要时间,就加了延迟执行) ,结果:还是不能上传

2、设定header(网上有说编码的问题,我设置了header)
 header: {
      ‘content-type’: ‘multipart/form-data’
    },
结果:还不能上传

3、服务器记录的日志当中看到华为上传的FILE是这样的

最终解决方案:

服务器端判断上传文件类型,通过file_put_contents写入到文件

结果:成功

备注:

这个图片导出同样是安卓机器,在小米5导出是这样的

而且华met9上是这样的

PHP取余的那些事

1、百分号取余

$val=9.45; 
$result=$val*100;
echo intval($result);   //这里输出944
echo $result%100;    //这里输出44
echo fmod(floatval($result),100);  //这里输出45

解释:因为php默认对变量进行取整进行取余运算的

2、取余溢出

<?php
$num1 = 1494313163777;
$num2 = 9999;
//直接计算取余会出错,出现负数 -8779
echo $num1 % $num2;

//解决方案:
$num1 = floatval($num1);
$luck_num = fmod($num1, $num2);
//显示38正确
echo $luck_num;

SSI说明

一、SSI
Server Side Include,是一种基于服务端的网页制作技术,大多数(尤其是基于Unix平台)的web服务器如Netscape Enterprise Server等均支持SSI命令。
它的工作原因是:在页面内容发送到客户端之前,使用SSI指令将文本、图片或代码信息包含到网页中。对于在多个文件中重复出现内容,使用SSI是一种简便的方法,将内容存入一个包含文件中即可,不必将其输入所有文件。通过一个非常简单的语句即可调用包含文件,此语句指示Web服务器将内容插入适当网页。而且,使用包含文件时,对内容的所有更改只需在一个地方就能完成。

二、Nginx配置
ssi: 默认值off,启用ssi时将其设为on
ssi_silent_errors: 默认值off,开启后在处理SSI文件出错时不输出错误提示”[an error occurred while processing the directive]”。
ssi_types: 默认是text/html,所以如果需支持html,则不需要设置这句,如果需要支持shtml则需要设置:ssi_types text/shtml
三个参数可以放在http, server或location作用域下

三、Apache配置
AddType text/html .shtml .html
AddOutputFilter INCLUDES .shtml .html
Options Indexes FollowSymLinks INCLUDES IncludesNOEXEC

四、file和virtual
file可以包含一些指令,virtual不可以

五、语法
<!–#include virtual=”test.html” –>

&lt;!--#include file="test.html"--&gt;

参考:http://man.chinaunix.net/newsoft/ApacheManual/howto/ssi.html

http://nginx.org/en/docs/http/ngx_http_ssi_module.html

Composer

Composer是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件。

如果A依赖B的版本是1.0.0,如果C依赖B的版本是2.0.0,项目当中是否没导入同一包用不同版本的。

PHP的自动加载可以使用__autoload()和spl_autoload_register()两种机制,但官方推荐使用和spl_autoload_register
更多参考:http://php.net/manual/zh/language.oop5.autoload.php

Composer提供了四种自动加载的方式,分别是PSR-0、PSR-4、生成classmap以及直接包含files。
PSR-0要求目录名称和命名空间层层对应,会导致目录结构容易变得比较深。虽然已被官方废弃,但因为主流框架都已实现psr-0,因此composer仍然使用psr-0来向下兼容。按照PSR-0的规则,当试图自动加载 “Foo\Bar\Baz” 这个class时,那么会去寻找”src/Foo/Bar/Baz.php”。

psr-4方式,是composer推荐使用的一种方式,也是psr-0的替代方案,因为在PSR-0中目录结构要与命名空间层层对应,无法插入一个单独的目录。

classmap方式,则是通过配置指定的目录或文件,然后在Composer安装或更新时,它会扫描指定目录下以.php或.inc结尾的文件中的class,生成class到指定file path的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中

files方式,就是手动指定供直接加载的文件