jiazhizhongphp@163.com 发布的文章

PHP通用检测函数集合

这些函数都要测试才能使用,不保证个个都能使用,很多好的代码函数都可以在phpcms,dedecms,帝国cms中查找。

// ※CheckMoney($C_Money) 检查数据是否是99999.99格式
// ※CheckEmailAddr($C_mailaddr) 判断是否为有效邮件地址
// ※CheckWebAddr($C_weburl) 判断是否为有效网址
// ※CheckEmpty($C_char) 判断字符串是否为空
// ※CheckLengthBetween($C_char, $I_len1, $I_len2=100) 判断是否为指定长度内字符串
// ※CheckUser($C_user) 判断是否为合法用户名
// ※CheckPassword($C_passwd) 判断是否为合法用户密码
// ※CheckTelephone($C_telephone) 判断是否为合法电话号码
// ※CheckValueBetween($N_var, $N_val1, $N_val2) 判断是否是某一范围内的合法值
// ※CheckPost($C_post) 判断是否为合法邮编(固定长度)
// ※CheckExtendName($C_filename,$A_extend) 判断上传文件的扩展名
// ※CheckImageSize($ImageFileName,$LimitSize) 检验上传图片的大小
// ※AlertExit($C_alert,$I_goback=0) 非法操作警告并退出
// ※Alert($C_alert,$I_goback=0) 非法操作警告
// ※ReplaceSpacialChar($C_char) 特殊字符替换函数
// ※ExchangeMoney($N_money) 资金转换函数
// ※WindowLocation($C_url,$C_get=”",$C_getOther=”") PHP中的window.location函数

<?php 
// 函数名:CheckMoney($C_Money) 
// 作 用:检查数据是否是99999.99格式 
// 参 数:$C_Money(待检测的数字) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckMoney($C_Money) { 
    if (!ereg("^[0-9][.][0-9]$", $C_Money)) return false; 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckEmailAddr($C_mailaddr) 
// 作 用:判断是否为有效邮件地址 
// 参 数:$C_mailaddr(待检测的邮件地址) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckEmailAddr($C_mailaddr) { 
    if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$",  $C_mailaddr)) $c_mailaddr))  { 
        return false; 
    } 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckWebAddr($C_weburl) 
// 作 用:判断是否为有效网址 
// 参 数:$C_weburl(待检测的网址) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckWebAddr($C_weburl) { 
    if (!ereg("^http://[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$", $C_weburl)) { 
        return false; 
    } 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckEmpty($C_char) 
// 作 用:判断字符串是否为空 
// 参 数:$C_char(待检测的字符串) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckEmptyString($C_char) { 
    if (!is_string($C_char)) return false; //是否是字符串类型 
    if (empty($C_char)) return false; //是否已设定 
    if ($C_char=='') return false; //是否为空 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckLengthBetween($C_char, $I_len1, $I_len2=100) 
// 作 用:判断是否为指定长度内字符串 
// 参 数:$C_char(待检测的字符串) 
// $I_len1 (目标字符串长度的下限) 
// $I_len2 (目标字符串长度的上限) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckLengthBetween($C_cahr, $I_len1, $I_len2=100) { 
    $C_cahr = trim($C_cahr); 
    if (strlen($C_cahr) < $I_len1) return false; 
    if (strlen($C_cahr) > $I_len2) return false; 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckUser($C_user) 
// 作 用:判断是否为合法用户名 
// 参 数:$C_user(待检测的用户名) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckUser($C_user)  { 
    if (!CheckLengthBetween($C_user, 4, 20)) return false; //宽度检验 
    if (!ereg("^[_a-zA-Z0-9]*$", $C_user)) return false; //特殊字符检验 
    return true; 
} 

// 函数名:CheckPassword($C_passwd) 
// 作 用:判断是否为合法用户密码 
// 参 数:$C_passwd(待检测的密码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckPassword($C_passwd) { 
    if (!CheckLengthBetween($C_passwd, 4, 20)) return false; //宽度检测 
    if (!ereg("^[_a-zA-Z0-9]*$", $C_passwd)) return false; //特殊字符检测 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckTelephone($C_telephone) 
// 作 用:判断是否为合法电话号码 
// 参 数:$C_telephone(待检测的电话号码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckTelephone($C_telephone) { 
    if (!ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $C_telephone)) return false; 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckValueBetween($N_var, $N_val1, $N_val2) 
// 作 用:判断是否是某一范围内的合法值 
// 参 数:$N_var 待检测的值 
// $N_var1 待检测值的上限 
// $N_var2 待检测值的下限 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckValueBetween($N_var, $N_val1, $N_val2) { 
    if ($N_var < $N_var1 ││ $N_var > $N_var2) { 
        return false; 
    } 
    return true; 
} 

// 函数名:CheckPost($C_post) 
// 作 用:判断是否为合法邮编(固定长度) 
// 参 数:$C_post(待check的邮政编码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckPost($C_post) { 
    $C_post=trim($C_post); 
    if (strlen($C_post) == 6) { 
        if(!ereg("^[+]?[_0-9]*$",$C_post)) { 
            return true;; 
        }else { 
            return false; 
        } 
    }else { 
        return false;; 
    } 
}

//----------------------------------------------------------------------------------- 
// 函数名:CheckExtendName($C_filename,$A_extend) 
// 作 用:上传文件的扩展名判断 
// 参 数:$C_filename 上传的文件名 
// $A_extend 要求的扩展名 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckExtendName($C_filename,$A_extend) { 
    if(strlen(trim($C_filename)) < 5) { 
        return 0; //返回0表示没上传图片 
    } 
    $lastdot = strrpos($C_filename, "."); //取出.最后出现的位置 
    $extended = substr($C_filename, $lastdot+1); //取出扩展名 
    for($i=0;$i{ 
        //转换大小写并检测 
        if (trim(strtolower($extended)) == trim(strtolower($A_extend[$i]))) { 
            $flag=1; //加成功标志 
            $i=count($A_extend); //检测到了便停止检测 
        } 
    } 
    if($flag<>1) { 
        for($j=0;$j{ 
            $alarm .= $A_extend[$j]." "; 
        } 
        AlertExit('只能上传'.$alarm.'文件!而你上传的是'.$extended.'类型的文件'); 
        return -1; //返回-1表示上传图片的类型不符 
    } 
    return 1; //返回1表示图片的类型符合要求 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckImageSize($ImageFileName,$LimitSize) 
// 作 用:检验上传图片的大小 
// 参 数:$ImageFileName 上传的图片名 
// $LimitSize 要求的尺寸 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckImageSize($ImageFileName,$LimitSize) { 
    $size=GetImageSize($ImageFileName); 
    if ($size[0]>$LimitSize[0] ││ $size[1]>$LimitSize[1]) { 
        AlertExit('图片尺寸过大'); 
        return false; 
    } 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:Alert($C_alert,$I_goback=0) 
// 作 用:非法操作警告 
// 参 数:$C_alert(提示的错误信息) 
// $I_goback(返回到那一页) 
// 返回值:字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function Alert($C_alert,$I_goback=0) { 
    if($I_goback<>0) { 
        echo " "; 
    } else { 
        echo " "; 
    } 
} 

// 函数名:AlertExit($C_alert,$I_goback=0) 
// 作 用:非法操作警告 
// 参 数:$C_alert(提示的错误信息) 
// $I_goback(返回到那一页) 
// 返回值:字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function AlertExit($C_alert,$I_goback=0) { 
    if($I_goback<>0) { 
        echo " "; 
        exit; 
    } else { 
        echo " "; 
        exit; 
    } 
} 
//----------------------------------------------------------------------------------- 
// 函数名:ReplaceSpacialChar($C_char) 
// 作 用:特殊字符替换函数 
// 参 数:$C_char(待替换的字符串) 
// 返回值:字符串 
// 备 注:这个函数有问题,需要测试才能使用 
//----------------------------------------------------------------------------------- 
function ReplaceSpecialChar($C_char) { 
    $C_char=HTMLSpecialChars($C_char); //将特殊字元转成 HTML 格式。 
    $C_char=nl2br($C_char); //将回车替换为 
    $C_char=str_replace(" "," ",$C_char); //替换空格为 
    return $C_char; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:ExchangeMoney($N_money) 
// 作 用:资金转换函数 
// 参 数:$N_money(待转换的金额数字) 
// 返回值:字符串 
// 备 注:本函数示例:$char=ExchangeMoney(5645132.3155) ==> $char='¥5,645,132.31' 
//----------------------------------------------------------------------------------- 
function ExchangeMoney($N_money) { 
    $A_tmp=explode(".",$N_money ); //将数字按小数点分成两部分,并存入数组$A_tmp 
    $I_len=strlen($A_tmp[0]); //测出小数点前面位数的宽度 
    if($I_len%3==0) { 
        $I_step=$I_len/3; //如前面位数的宽度mod 3 = 0 ,可按,分成$I_step 部分 
    } else { 
        $step=($len-$len%3)/3+1; //如前面位数的宽度mod 3 != 0 ,可按,分成$I_step 部分+1 
    } 
    $C_cur=""; 
    //对小数点以前的金额数字进行转换 
    while($I_len<>0) { 
        $I_step--; 
        if($I_step==0) { 
            $C_cur .= substr($A_tmp[0],0,$I_len-($I_step)*3); 
        } else { 
            $C_cur .= substr($A_tmp[0],0,$I_len-($I_step)*3).","; 
        } 
        $A_tmp[0]=substr($A_tmp[0],$I_len-($I_step)*3); 
        $I_len=strlen($A_tmp[0]); 
    } 
    //对小数点后面的金额的进行转换 
    if($A_tmp[1]=="") { 
        $C_cur .= ".00"; 
    } else { 
        $I_len=strlen($A_tmp[1]); 
        if($I_len<2) { 
            $C_cur .= ".".$A_tmp[1]."0"; 
        } else { 
            $C_cur .= ".".substr($A_tmp[1],0,2); 
        } 
    } 
    //加上人民币符号并传出 
    $C_cur="¥".$C_cur; 
    return $C_cur; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:WindowLocation($C_url,$C_get="",$C_getOther="") 
// 作 用:PHP中的window.location函数 
// 参 数:$C_url 转向窗口的URL 
// $C_get GET方法参数 
// $C_getOther GET方法的其他参数 
// 返回值: 字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function WindowLocation($C_url,$C_get="",$C_getOther="") { 
    if($C_get == "" && $C_getOther == "") 
    if($C_get == "" && $C_getOther <> "") {
        $C_target=""window.location='$C_url?$C_getOther='+this.value"";
    } 
    if($C_get <> "" && $C_getOther == "") {
        $C_target=""window.location='$C_url?$C_get'"";
    } 
    if($C_get <> "" && $C_getOther <> "") {
        $C_target=""window.location='$C_url?$C_get&$C_getOther='+this.value"";
    } 
    return $C_target; 
} 

MySQL · 8.0.0新特性 · ROLE

摘要: Role功能可以说是一个期待已有的功能,这从它的Worklog号(WL#988)就可以看出来,这是个相当早并且呼声很高的需求了。 所谓Role,可以认为是一个权限的集合,这个集合有一个统一的名字,就是Role名,你可以为多个账户赋予统一的某个Role的权限,而权限的修改可以直接通过修改Role来实

Role功能可以说是一个期待已有的功能,这从它的Worklog号(WL#988)就可以看出来,这是个相当早并且呼声很高的需求了。

所谓Role,可以认为是一个权限的集合,这个集合有一个统一的名字,就是Role名,你可以为多个账户赋予统一的某个Role的权限,而权限的修改可以直接通过修改Role来实现,而无需每个账户逐一GRANT权限,大大方便了运维和管理。

Role可以被创建,修改和删除,并作用到其所属于的账户上。

1、举个简单的例子。创建如下测试表
1.1.jpg

2、创建Role,拥有t1表的查询权限:
1.2.jpg

3、创建一个账户,并将role的权限赋给它
1.3.jpg

4、以rw_user1登录
1.4.jpg

5、然而此时并不能直接获得t1表的查询权限, 你需要手动进行选择哪些role在账户连接上来时被激活,如下:
1.5.jpg

6、修改role的权限,会直接作用到对应的账户上:
1.6.jpg

7、增加了两个系统表来维护Role信息,一个是mysql.default_roles表,用于展示账户使用的默认role信息,一个是role_edges,用于展示已创建的role信息
1.7.jpg

8、新增函数用于显示当前账户使用的role:
1.8.jpg

如何使用点击官方文档
如果你对具体怎么实现感兴趣,可以参阅commit 19ff587febb635f4518a78bdd5dffbfd9058c9aa

安装MySql 5.7 教程

1、下载MySQL安装包:

wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz

2、安装依赖包:

MacOX: brew install cmake
       brew install boost
       brew install homebrew/dupes/ncurses
LINUX: yum -y install cmake  
       yum -y install bison  
       yum -y install ncurses-devel  

mysql5.7.1.jpg

mysql5.7.2.jpg

3、解压mysql安装包 并编译安装

#创建mysql用户以及相关目录
groupadd mysql              #所以在这里我们要建一个msyql的用户和组   
groupadd mysql              #所以在这里我们要建一个msyql的用户和组   
useradd -g mysql mysql -s /usr/sbin/nologin   
mkdir /usr/local/mysql5.7           #创建目录   
mkdir /usr/local/mysql5.7/data

$ tar -zxf mysql-5.7.17.tar.gz
$ cd mysql-5.7.17
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.7 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/Cellar/boost/1.62.0 -DMYSQL_UNIX_ADDR=//usr/local/mysql5.7/data/mysql.sock -DMYSQL_USER=mysql -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1

#编译完成后开始安装
sudo make && make install 

4、安装成功后 配置MySQL
mysql5.7.3.jpg

#复制默认配置文件到 MySQL安装根目录下
sudo cp support-files/my-default.cnf /usr/local/mysql5.7/my.cnf
sudo vim /usr/local/mysql5.7/my.cnf

#配置文件内容
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
basedir =/usr/local/mysql5.7/
datadir =/usr/local/mysql5.7/data
log-error =/usr/local/mysql5.7/log/mysql.err
pid-file =/usr/local/mysql5.7/mysql.pid
port =3309
#server_id = .....
socket =/usr/local/mysql5.7/data/mysql.sock

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#skip-grant-tables

#保存配置文件后 初始化数据库
bin/mysqld --initialize --basedir=/usr/local/mysql5.7/ --datadir=/usr/local/mysql5.7/data --user=_mysql

5、启动MySQL服务

sudo support-files/mysql.server start
如果启动报错 请修改 /usr/local/mysql5.7 根目录 /usr/local/mysql5.7/log 和 /usr/local/mysql5.7/data 文件夹权限 和 拥有者为 _mysql

6、修改默认密码

sudo vim my.cnf # 将其中的 skip-grant-tables 选项前 # 好去掉 保存并退出
sudo support-files/mysql.server restart 重启MySQL服务
#进入MySQL 
bin/mysql -uroot -p -P3309 -S/usr/local/mysql5.7/data/mysql.sock
#修改默认密码 并新建用户
UPDATE user SET authentication_string = password('123456') WHERE User = 'root';
flush privileges;
#新建用户
SET PASSWORD = PASSWORD('123456'); # root 用户密码
CREATE USER 'jiazhizhong'@'%' IDENTIFIED BY 'jia980709'; 
GRANT ALL ON *.* TO 'jiazhizhong'@'%';
flush privileges;
exit;
#重新启动MySQL服务
sudo support-files/mysql.server restart 

7、MySQL安装中遇到的错误 及 解决办法
7.1、遇到这个错误 是你没安装 boost 或没指定 boost 路径 (-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/Cellar/boost/1.62.0)
mysql5.7 安装.jpg

7.2、遇到下面这个错误是在 执行 mysql -uroot -p123456 命令或者是重启MySQL服务时遇到,将 my.cnf 文件中 socket 地址配置正确即可
    **Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock**

7.3、这个错误是在命令行下登录进入MySQL后执行sql语句时报错,这个错误需要你执行 (SET PASSWORD = PASSWORD('123456'); # root 用户密码)这条sql 设定下root密码即可
    **ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.**

8、查看MySQL配置文件路径

#如果是linux系统,使用:

#第一种
sudo find / -name my.cnf
#第二种
sudo mysql --help | grep my.cnf

MYsql主从复制与同步

①主服务器配置:
打开MySQL配置文件my.cnf,在[mysqld]下面添加以下参数:

log-bin=mysql-bin //开启MYSQL二进制日志
server-id=1 //服务器ID不能重复
expire-logs-days = 7 //只保留7天的二进制日志,以防磁盘被日志占满

修改完配置文件后进入主数据库执行以下命令:

(1)、GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.1.3' IDENTIFIED BY '123';
(2)、show master status;

②从服务器配置:

打开MySQL配置文件my.cnf,修改在[mysqld]下面的参数:

将 server-id=1 改为 server-id=2

修改完配置文件后进入从数据库执行以下命令:

(1)、change master to master_host='192.168.86.128', master_user='reps', master_password='123', master_log_file='mysql-bin.000004', master_log_pos=563; 登录从库的MySQL
(2)、slave start; //启动从库连接
(3)、show slave status\G; //查看连接情况,是不是两个YES,两个YES为成功

ssh免登录配置

设置SSH公钥认证(不需要每次都输入口令)方法

本地机器(192.168.0.240):

$ssh-keygen -t dsa

注意:密码(passphrase)设为空(要求输入密码时直接按"Enter"键)

再把生成的id_dsa.pub(公共密钥保)拷贝到你要访问的机器上去并保存为authorized_keys.
$scp /home/zengxiaolong/.ssh/id_dsa.pub jiazhizhong@192.168.0.239:~/.ssh/authorized_keys

注: 远端机器(239)需要以jiazhizhong身份使用ssh进行过远程登录!

本地机器(192.168.0.240):

$ssh jiazhizhong@192.168.0.239
如果没有提示让输入密码,那就OK!

注: 不需输入密码
jiazhizhong ------------> jiazhizhong
192.168.0.240 192.168.0.239

做了以上配置后,在本地机器执行scp的时候按tab,就可以自动补齐你要访问的机器上的目录名(只可惜反应速度慢,需要耐心等待,似乎意义不是很大)

注:authorized_keysk已经存在被授权的机器,别把之前的覆盖掉