分类 PHP 下的文章

PHP判断SQL语句是否存在写操作


可用于的场景:
1.读写分离
2.给用户一个sql查询窗口时,略微安全一点

注:片段来自CI3.0

public function is_write_type($sql) {
  return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql);
}

php mail函数发邮件标题和发件人乱码问题解决办法


使用mail方法发信时,如果标题或发件人含有中文就会造成乱码,而正文不会。解决办法如下

首先在报文头加入声明

//如果你的网站是GBK,下面将utf-8改为gbk
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

然后在需要使用中文的地方将中文进行如下转移

//如果你的网站是GBK,下面将utf-8改为gb2312
//例如标题
$subject = "新密码通知信";
$subject = "=?UTF-8?B?".base64_encode($subject)."?=";
//例如发件人
$headers .= 'From: =?UTF-8?B?'.base64_encode("某某网站").'?=<service@apieye.com>' . "\r\n";

php 自设公式计算思路


背景简介:
1.由公式去计算一些数字,如工资计算
2.方便后期维护,易修改公式

鉴于上述两点,在程序中写死公式就显得不妥,于是有了下面的思路,使用字符串型的公式进行计算:
1.可以设置一些科目,如科目1、科目2
2.由1中设置的科目来编写公式(通过加减乘除以及任何php可以识别的数学方法),简单例子如可以设置为 "[科目1]+[科目2]"
3.计算时通过str_replace方法将科目变为程序中的变量
4.最终就生成了程序可以使用的公式如$p1+$p2
5.计算,使用eval方法 $result = eval("return $p1+$p2;");

其他说明:
仅用加减乘除会无法实现一些公式计算,如计算个人所得税不同基数公式不同,那么可以使用形如 "[税前工资]>3500?(xxx计算公式):0"这样的公式来进行计算。
某些环境会禁用eval,那么就需要开放。

缺点:
公式错误程序会报错,可编写方法验证公式语法的正确性。


ftp_connect方法无法连接FTP服务器的解决办法


最近做了个关于PHP连接FTP服务器的小功能,发现一些FTP服务器用客户端可以连接但是PHP程序却无法连接。再排出网络问题外,最后得出结论如下:

首先介绍一下连接FTP服务器的两种工作模式:

主动模式的ftp是这样的;客户端从一个任意的非特权端口连接到ftp服务器的命令端口(21),然后客户端开始监听端口,并发送ftp命令到ftp服务器。服务器从它自己的数据端口20连接到客户端指定的数据端口。
被动模式ftp中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口,并发送PORT P命令给客户端。然后客户端发起从本地端口到服务器的端口的连接用来传送数据。

这些ftp服务器并非直接建立在公网,而是建设在内网通过端口映射的方式可使公网访问。也就是说必须采用主动模式访问,因为服务端仅有21端口映射到了公网。而php_connect默认为被动模式,所以调用ftp_pasv方法即可,具体如下:

$conn = ftp_connect("ftp.testftp.com") or die("Could not connect");
ftp_login($conn,"admin","ert456");
ftp_pasv($conn,FALSE);
ftp_close($conn);