常用的PHP类库—PHP开发者必备

PDF 生成器

FPDF – 这量一个可以让你生成PDF的纯PHP类库。

Excel 相关

你的站点需要生成Excel?没有问题,下面这两个类库可以让你轻松做到这一点。

php-excel – 这是一个非常简单的Excel文件生成类。(用PHPExcel读取excel并导入数据库

PHP Excel Reader – 可以解析并读取XLS文件中的数据。

扩展阅读:

php-excel-reader读取excel内容存入数据库

使用php-excel-reader读取excel文件

E-Mail 相关

不喜欢PHP的mail函数?觉得不够强大?下面的PHP邮件相关的库绝对不会让你失望。

Swift Mailer – 免费的超多功能的PHP邮件库。

PHPMailer – 超强大的邮件发送类。(PHPMailer使用教程,使用PHPMailer发送邮件(含附件下载)

单元测试

如果你在使用测试驱动的方法开发你的程序,下面的类库和框架绝你能帮助你的开发。

SimpleTest – 一个PHP的单元测试和网页测试的框架。

PHPUnit – 来自xUnit 家族,提供一个框架可以让你方便地进行单元测试的案例开发。并可非常容易地分析其测试结果。

图表库

下面的类库可以让你很简的创建复杂的图表和图片。当然,它们需要GD库的支持。

pChart – 一个可以创建统计图的库。

Libchart – 这也是一个简单的统计图库。

JpGraph – 一个面向对象的图片创建类。jpGraph的应用及基本安装配置

Open Flash Chart – 这是一个基于Flash的统计图。

RSS 解析

解释RSS并是一件很单调的事情,不过幸好你有下面的类库可以帮助你方便地读取RSS的Feed。

MagpieRSS – 开源的PHP版RSS解析器,据说功能强大,未验证。

SimplePie – 这是一个非常快速,而且易用的RSS和Atom 解析库。

缩略图生成

phpThumb – 功能很强大,如何强大还是自己去体会吧。

支付

你的网站需要处理支付方面的事情?需要一个和支付网关的程序?下面这个程序可以帮到你。

PHP Payment Library – 支持Paypal, Authorize.net 和2Checkout (2CO)

OpenID

PHP-OpenID – 支持OpenID的一个PHP库。OpenID是帮助你使用相同的用户名和口令登录不同的网站的一种解决方案。如果你对OpenID不熟悉的话,你可以到这里看看:http://openid.net.cn/

对象关系映射ORM

ADOdb – 数据库抽象(adodb专题教程

Doctrine – 对象关系映射Object relational mapper (ORM) ,需要 PHP 5.2.3+ 版本,一个非常强大的database abstraction layer (DBAL).

Propel – 对象关系映射框架- PHP5

Outlet – 也是关于对象关系映射的一个工具。

本文转载自:phpddt

PHP中该怎样防止SQL注入?

本文由 伯乐在线 – rokety 翻译自 StackOverflow。欢迎加入技术翻译小组

 如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子:

PHP代码
  1. $unsafe_variable = $_POST['user_input'];    
  2. mysql_query("Insert INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')");  
因为用户的输入可能是这样的:
 
value'); Drop TABLE table;–
那么SQL查询将变成如下:
 
Insert INTO `table` (`column`) VALUES('value'); Drop TABLE table;–')
应该采取哪些有效的方法来防止SQL注入?
 
 
最佳回答(来自Theo):
 
使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:
 
1、使用PDO:
PHP代码
  1. $stmt = $pdo->prepare('Select * FROM employees Where name = :name');   
  2. $stmt->execute(array('name' => $name));     
  3. foreach ($stmt as $row) {  
  4.     // do something with $row  
  5. }

2、使用mysqli:

PHP代码
  1. $stmt = $dbConnection->prepare('Select * FROM employees Where name = ?');  
  2. $stmt->bind_param('s'$name);  
  3. $stmt->execute();  
  4. $result = $stmt->get_result();  
  5. while ($row = $result->fetch_assoc()) {  
  6.     // do something with $row  
  7. }  

注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:

PHP代码
  1. $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8''user''pass');  
  2. $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  
  3. $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
在上面的例子中,报错模式(ATTR_ERRMODE)并不是必须的,但建议加上它。这样,当发生致命错误(Fatal Error)时,脚本就不会停止运行,而是给了程序员一个捕获PDOExceptions的机会,以便对错误进行妥善处理。 然而,第一个setAttribute()调用是必须的,它禁止PDO模拟预处理语句,而使用真正的预处理语句,即有MySQL执行预处理语句。这能确保语句和参数在发送给MySQL之前没有被PHP处理过,这将使得攻击者无法注入恶意SQL。了解原因,可参考这篇博文:PDO防注入原理分析以及使用PDO的注意事项。 注意在老版本的PHP(<5.3.6),你无法通过在PDO的构造器的DSN上设置字符集,参考:silently ignored the charset parameter。
 
解析
 
当你将SQL语句发送给数据库服务器进行预处理和解析时发生了什么?通过指定占位符(一个?或者一个上面例子中命名的 :name),告诉数据库引擎你想在哪里进行过滤。当你调用execute的时候,预处理语句将会与你指定的参数值结合。 关键点就在这里:参数的值是和经过解析的SQL语句结合到一起,而不是SQL字符串。SQL注入是通过触发脚本在构造SQL语句时包含恶意的字符串。所以,通过将SQL语句和参数分开,你防止了SQL注入的风险。任何你发送的参数的值都将被当作普通字符串,而不会被数据库服务器解析。回到上面的例子,如果$name变量的值为 ’Sarah’; Delete FROM employees ,那么实际的查询将是在 employees 中查找 name 字段值为 ’Sarah’; Delete FROM employees 的记录。 另一个使用预处理语句的好处是:如果你在同一次数据库连接会话中执行同样的语句许多次,它将只被解析一次,这可以提升一点执行速度。 如果你想问插入该如何做,请看下面这个例子(使用PDO):
PHP代码
  1. $preparedStatement = $db->prepare('Insert INTO table (column) VALUES (:column)');  
  2. $preparedStatement->execute(array('column' => $unsafeValue));  

ECMall的一个登陆跳转Bug

  前几天在帮人做ECMall的易宝接口集成,第一次接触ECMall不熟悉支付插件的模式,也没时间去研究,而且这次集成的方式也不方便使用插件的模式,一时偷懒,直接在支付方式选择那写死了,支付结果返回验证也写在了同个app里,结果不知道为什么支付成功返回后老是会退出登陆,关键的问题来了,重新登陆后跳转回支付结果页面显示支付参数被篡改,仔细对比了一下支付成功返回的URL与登陆后的URL发现其中的参数原来有大写字母的,登陆成功后跳转回去的URL里的英文字母全部被转换成小写字母了,PHP变量名对大小写敏感,所以以RUL参数形式传递的数据就获取不到了,导致支付结果验证失败。

解析登陆过程代码,发现在文件app/frontend.base.php的login方法里有这么几行代码:

PHP代码
  1. /* 防止登陆成功后跳转到登陆、退出的页面 */  
  2. $ret_url = strtolower($ret_url);              
  3. if (str_replace(array('act=login''act=logout',), ''$ret_url) != $ret_url)  
  4. {  
  5.     $ret_url = SITE_URL . '/index.php';  
  6. }  

变量$ret_url是保存与传递登陆前的URL,用来登陆成功后跳转回登陆前的URL,在这里被小写化了。

将这几行代码改成这样:

PHP代码
  1. /* 防止登陆成功后跳转到登陆、退出的页面 */  
  2. if (str_replace(array('act=login''act=logout',), ''strtolower($ret_url)) != strtolower($ret_url)) {  
  3.     $ret_url = SITE_URL . '/index.php';  
  4. }  

这样一来就不会被转换成小写了。

php-cgi占用cpu 100%的故障排除方法

1、用top命令查看占用了大量CPU的进程

2、用命令ls -l /proc/进程ID/fd/查看耗时比较长的进程到底在干什么事情

3、用strace -p 进程ID 命令跟踪

4、将php-fpm.conf的超时时间设置成5s,然后超过5s的php-cgi的请求就会记录到php的慢日志中,设置如下:

XML/HTML代码
  1. <value name="request_slowlog_timeout">3s</value>  
  2. <value name="slowlog">logs/slow.log</value>  

设置完成,利用命令/usr/local/php/sbin/php-fpm restart重启php-fpm,过一会查看slow.log的内容发现如下内容:

XML/HTML代码
  1. script_filename =/htdocs/biglee.cn/test.php  
  2. [0x00007fffb060fd70] file_get_contents() /htdocs/biglee.cn/test.php:10  

这就是占用CPU的最终原因