WOW!这是一个技术博客耶!

  • 分类文章 php
  • php检测png图片是否完好

    <?php

    $filename = ‘./D243375_0.png’;

    $filename = realpath($filename);

    if (!file_exists($filename)) {
    die(“圖片不存在~!”);
    }

    $size = getimagesize ($filename);

    $file_extension = strtolower(substr(strrchr($filename,”.”),1));

    if(“image/png” != $size['mime'] || $file_extension != “png”){
    die(“這不是一張完整的png圖片~”);
    }

    $img = @imagecreatefrompng ($filename);

    if($img){
    ob_start(“output_handler”);

    imagepng($img);

    ob_end_flush();
    }else{
    die(“不能正確的創建png圖形,請檢查png圖形是否完好~”);
    }

    function output_handler($img) {
    header(‘Content-type: image/png’);
    header(‘Content-Length:’.strlen($img));
    return $img;
    }
    ?>


  • 一个另类的php文件上传的简单例子

    <?
    $data    = file_get_contents(“D:\works\logo.png”);             //原文件路徑
    $ifp        = fopen(“test.png”, “wb” );                           //打開新文件,如果不存在則創建文件
    fwrite( $ifp, $data);                      //将原文件的流写入到新的文件中
    fclose( $ifp );                            //關閉文件操作流
    ?>

    这样做虽然简单,但是会覆盖源文件,而且我感觉有时候用文件函数会出现不可预料的事件~


  • php计算程序运行的时间

    <?
    class SpendTime {
    static function Start($sTransName) {
    SpendTime::$arrStartTimes [$sTransName] = microtime ( true );
    }

    static function End($sTransName) {
    SpendTime::$arrSpendTimes [$sTransName] = microtime ( true ) – SpendTime::$arrStartTimes [$sTransName];
    }

    static function PrintTime() {
    echo “<pre>”;
    print_r ( SpendTime::$arrSpendTimes );
    echo “</pre>”;
    }

    static $arrStartTimes = array ();
    static $arrEndTimes = array ();
    static $arrSpendTimes = array ();
    }
    ?>

     

    使用方法,如计算出echo 的执行时间:

    SpendTime::Start(‘echo’);

    echo ‘龙哥博客’;

    SpendTime::End(‘echo’);

    SpendTime::PrintTime();

     

     


  • php报表之jpgraph柱状图实例

    jpgraph是php中一个非常非常强大的第三方报表工具,据说能完成一切你想要的图形…

    新手初识jpgraph肯定会遇到各种各样的问题,比如乱码什么的,本案例是jpgraph3.0.7制作,也经过本人的多次实验,解决乱码问题

    <?php

    $datay=array();      //纵坐标数据

    $datax=array();     //横坐标数据

    foreach ($usernums as $key => $value){
    $datay[] = $value;
    $datax[] = $userids[$key];
    }

    require_once (‘jpgraph-3.0.7/jpgraph/jpgraph.php’);
    require_once (‘jpgraph-3.0.7/jpgraph/jpgraph_bar.php’);

    // Create the graph. These two calls are always required
    $graph = new Graph(800,600);    //图像高宽
    $graph->SetScale(“textlin”);

    $graph->xaxis->SetTickLabels($datax);

    $graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,10);
    $graph->xaxis->SetLabelAngle(30);

    $graph->yaxis->scale->SetGrace(20);
    $graph->xaxis->scale->SetGrace(20);
    // Add a drop shadow
    $graph->SetShadow();

    // Adjust the margin a bit to make more room for titles
    $graph->img->SetMargin(40,30,20,40);

    // Create a bar pot
    $bplot = new BarPlot($datay);

    // Adjust fill color
    $bplot->SetFillColor(‘orange’);
    $bplot->value->Show();
    $bplot->value->SetFont(FF_ARIAL,FS_BOLD,10);
    $bplot->value->SetAngle(45);
    $bplot->value->SetFormat(‘%d’);
    $graph->Add($bplot);

    // Setup the titles
    $graph->title->Set(iconv(“UTF-8″, “gb2312″,”用户消费报表图”));
    $graph->xaxis->title->Set(iconv(“UTF-8″, “gb2312″,”用户姓名”));
    $graph->yaxis->title->Set(iconv(“UTF-8″, “gb2312″,”用户订单数量”));

    $graph->xaxis->title->SetFont(FF_SIMSUN,FS_BOLD);
    $graph->yaxis->title->SetFont(FF_SIMSUN,FS_BOLD);
    $graph->title->SetFont(FF_SIMSUN,FS_BOLD);

    // Display the graph
    $graph->Stroke();

    ?>

    效果图:

    jpgraph下载地址:http://down.qiannao.com/space/file/bingxingke/share/2010/6/29/jpgraph-002d3.0.7.tar.gz/.page


  • PHP定界符用法

    1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
    2.在PHP定界符中的任何特殊字符都不需要转义;
    3.PHP定界符中的PHP变量会被正常的用其值来替换。

    PHP中的定界符格式是这样的:

    <<<Eof
    ……
    Eof;

    看起来很简单,但是其中有许多地方需要注意。

    首先在<<<之后的字符Eof是自己定义的,随便什么都是可以的,但是结尾处的字符一定要和他一样,他们是成对出现的,就像{}这样的——这是最基本的。

    在PHP定界符使用的过程中,第二个需要注意的问题——也是最经常出现问题的地方:

    结尾的一行(如上例的Eof;),一定要另起一行,并且改行除了Eof;这个定界符结尾标识之外不能有任何其他字符,前后都不能有,包括空格。如果在本行最前或者最后出现空格,制表符的话,你会收到一个这样的错误信息:
    Parse error: parse error, unexpected $end in……,提示你语法错误;

    第三个需要注意的是,如果在定界符中间出现有PHP的变量,你只需要像在其它字符串中输出一样写就行了,例如

    <<<Eof
    hello{$name}
    Eof;

    变量$name之所以要用{}括起来是要告诉PHP解析器这是一个PHP变量,其实不用也是可以的,但是有可能会产生歧义,例如你的变量后面刚好不是一字母或者特殊符号什么的会怎么样呢?千万不能有这样的写法

    <<<Eof
    hello<?php echo $name?>
    Eof;

    这样的情况,你同样会收到一个语法错误的信息。先便是一个战地测试过的PHP定界符的正确写法。里面包含了,html和javascript的代码:

    <?php
    $name = 'kitty';
    echo <<<Eof
    <table height="20">
    	<tr><td>
    	{$name}<br/>
    	<script>
    	var p='hello world';
    	document.writeln(p);
    	</script>
    	</td></tr>
    </table>
    Eof;
    ?>

  • php时间戳与字符串的相互转换

    php date()函数的第二个参数是int类型的,如果是字符串类型的,结果就会变成1970-01-01 xx:xx:xx,那么如何将两种类型的时间互转呢?查了下php 的API,原来有这么个函数,它就是strtotime()…

    <?php
    date_default_timezone_set(“prc”);

    $stringtime = date(“Y-m-d H:i:s”,time());

    echo $stringtime.”<br/>”;

    echo strtotime($stringtime).”<br/>”;

    echo date(“Y/m/d G:i:s A”,strtotime($stringtime));
    ?>

    运行结果:

    2010-06-21 17:29:32
    1277112572
    2010/06/21 17:29:32 PM


  • php 加密解密类(含公钥)

    以下代码由龍哥收集整理并改写部分内容,下载就表明出处~

    <?php
    class  Crypt{

    protected $key = “”;    //公钥

    private function keyED($txt,$encrypt_key)
    {
    $encrypt_key = md5($encrypt_key);
    $ctr=0;
    $tmp = “”;
    for ($i=0;$i<strlen($txt);$i++)
    {
    if ($ctr==strlen($encrypt_key)){
    $ctr=0;
    }
    $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
    $ctr++;
    }
    return $tmp;
    }

    public function encrypt($txt,$key=”")
    {
    if(empty($key)){
    $key=$this->key;
    }
    srand((double)microtime()*1000000);
    $encrypt_key = md5(rand(0,32000));
    $ctr=0;
    $tmp = “”;
    for ($i=0;$i<strlen($txt);$i++)
    {
    if ($ctr==strlen($encrypt_key)){
    $ctr=0;
    }
    $tmp.= substr($encrypt_key,$ctr,1) .
    (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
    $ctr++;
    }
    return $this->keyED($tmp,$key);
    }

    public function decrypt($txt,$key=”")
    {
    if(empty($key)){
    $key=$this->key;
    }

    $txt = $this->keyED($txt,$key);
    $tmp = “”;
    for ($i=0;$i<strlen($txt);$i++)
    {
    $md5 = substr($txt,$i,1);
    $i++;
    $tmp.= (substr($txt,$i,1) ^ $md5);
    }
    return $tmp;
    }

    public function setKey($key)
    {
    if(empty($key)){
    return null;
    }
    $this->key=$key;
    }

    public function getKey()
    {
    return $this->key;
    }

    }
    $string = “http://www.52blogger.com”;
    $crypt= new Crypt();
    $crypt->setKey(“http://www.52blogger.com”);
    $enc_text = $crypt->encrypt($string,$crypt->getKey());
    $dec_text = $crypt->decrypt($enc_text,$crypt->getKey());
    echo “加密前 : $string <br/>\n”;
    echo “加密后 : $enc_text <br/>\n”;
    echo “解密后 : $dec_text \n”;
    ?>

    执行结果:

    加密前 : http://www.52blogger.com
    加密后 : hSzQ’Z* kP~y(WpVs=6Q3gZbR5QkhtZ(f=Zm
    解密后 : http://www.52blogger.com

    注意的是:每次加密后的字符串都不一样,另外还需要公钥才能解密,如果公钥不对,解密的结果与明文是不一致的.可惜的是,此方法貌似不支持中文~


  • 简单的php pdo类

    <?php

    /*

    数据库类文件  DataBase.php

    */

    class DataBase {
    private static $dsn = ‘mysql:host=localhost;dbname=test’;   //主机地址,数据库名
    private static $user = ‘root’;   //用户名
    private static $password = ‘root’;  //密码
    private static $persistent = true;  //默认打开可持续连接
    private static $linkState = ‘off’;  //数据库连接状态
    private static $DBObejct = array();  //数据数组

    public static function toLink() {
    if (self::$linkState == ‘on’) {
    return self::$DBObejct['db'];
    } else {
    $db = new PDO(self::$dsn,self::$user,self::$password,array(PDO::ATTR_PERSISTENT => self::$persistent));
    self::$DBObejct['db'] = $db;
    self::$linkState = ‘on’;
    return $db;
    }
    }
    }
    ?>

    <?php

    /*

    model层:Model.php

    注:此方法只适用于原生的sql语句,并没有集成查询方法,查询结果等等
    */

    class Model {
    private $object;
    public function __construct() {
    $db = DataBase::toLink();
    $db -> query(“set names utf8″);
    $this -> object = $db;
    }
    public function query($sql) {
    if(strpos($sql,’select’) !== false) {
    return $this -> object -> query($sql);
    }
    if(strpos($sql,’insert’) !== false) {
    return $this -> object -> exec($sql);
    }
    if(strpos($sql,’update’) !== false) {
    return $this -> object -> exec($sql);
    }
    if(strpos($sql,’delete’) !== false) {
    return $this -> object -> exec($sql);
    }
    }
    }
    ?>


  • php PDO的学习

    PDO为何物?
    POD(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。我是配置在windows下做开发用的。

    PDO的目标

    提供一种轻型、清晰、方便的 API
    统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
    通过 PHP 脚本提供可选的较大程度的抽象/兼容性。

    安装PDO
    我这里是WINDOWS下开发用的PDO扩展,要是你要在Linux下安装配置,请到别的地方寻找。
    版本要求:php5.1以及以后版本的程序包里已经带了;php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;手册上说5.0之前的版本不能运行PDO扩展。配置:
    修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)把extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。往下还有
    ;extension=php_pdo.dll
    ;extension=php_pdo_firebird.dll
    ;extension=php_pdo_informix.dll
    ;extension=php_pdo_mssql.dll
    ;extension=php_pdo_mysql.dll
    ;extension=php_pdo_oci.dll
    ;extension=php_pdo_oci8.dll
    ;extension=php_pdo_odbc.dll
    ;extension=php_pdo_pgsql.dll
    ;extension=php_pdo_sqlite.dll各各扩展所对应的数据库是:
    Driver name Supported databases
    PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
    PDO_FIREBIRD Firebird/Interbase 6
    PDO_INFORMIX IBM Informix Dynamic Server
    PDO_MYSQL MySQL 3.x/4.x
    PDO_OCI Oracle Call Interface
    PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
    PDO_PGSQL PostgreSQL
    PDO_SQLITE SQLite 3 and SQLite 2
    你要使用哪种数据库,只要把相应的扩展前的注释符号”;”去掉就可以了。

    注:很多新手不能使用PDO的原因就是因为;extension=php_pdo_mysql.dll pdo没有打开,因为php.ini文件默认是关闭PDO的,还要值得注意的是,一般php.ini在c:/windows/下面,一开始我就改错了,一直不能使用,郁闷了好久~别忘记重启apache哦~

    练习下吧:
    < ?php
    $dbms=’mysql’; //数据库类型 oracle 用ODI,对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
    $host=’localhost’; //数据库主机名
    $dbName=’test’; //使用的数据库
    $user=’root’; //数据库连接用户名
    $pass=”; //对应的密码
    $dsn=”$dbms:host=$host;dbname=$dbName”;
    //

    try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$dbh
    echo “连接成功
    “;
    /*你还可以进行一次搜索操作

    foreach ($dbh->query(‘Select * from FOO’) as $row) {
    print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
    }
    */
    $dbh = null;
    } catch (PDOException $e) {
    die (“Error!: ” . $e->getMessage() . ”
    “);
    }
    //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
    $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

    ?>

    数据库查询:
    上面我们已经进行了一次查询,我们还可以使用如下的查询:
    < ?php
    $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //设置属性
    $rs = $db->query(“Select * FROM foo”);
    $rs->setFetchMode(PDO::FETCH_ASSOC);
    $result_arr = $rs->fetchAll();
    print_r($result_arr);
    ?>

    以上因为用到setAttribute()方法,放上那两个参数,把字段名强制转换成大写。下面列出多有PDO::setAttribute()的参数: PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数):

    PDO::CASE_LOWER: 强制列名是小写.

    PDO::CASE_NATURAL: 列名按照原始的方式

    PDO::CASE_UPPER: 强制列名为大写.

    PDO::ATTR_ERRMODE: 错误提示.

    PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.

    PDO::ERRMODE_WARNING: 显示警告错误.

    PDO::ERRMODE_EXCEPTION: 抛出异常.

    PDO::ATTR_ORACLE_NULLS (不仅仅是ORACLE有效,别的数据库也有效): )指定数据库返回的NULL值在php中对应的数值。

    PDO::NULL_NATURAL: 不变.

    PDO::NULL_EMPTY_STRING: Empty string is converted to NULL.

    PDO::NULL_TO_STRING: NULL is converted to an empty string.

    PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requires bool.

    PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requires array(string classname, array(mixed constructor_args)).

    PDO::ATTR_AUTOCOMMIT (available in OCI, Firebird and MySQL): Whether to autocommit every single statement.

    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (available in MySQL): Use buffered queries.

    例子中的$rs->setFetchMode(PDO::FETCH_ASSOC);是PDOStatement::setFetchMode(),对返回类型的声明。
    有如下:
    PDO::FETCH_ASSOC — 关联数组形式
    PDO::FETCH_NUM — 数字索引数组形式
    PDO::FETCH_BOTH — 两者数组形式都有,这是缺省的
    PDO::FETCH_OBJ — 按照对象的形式,类似于以前的 mysql_fetch_object()

    更多返回类型声明(PDOStatement::方法名)看手册。

    ★插入,更新,删除数据,

    $db->exec(“Delete FROM `xxxx_menu` where mid=43″);

    简单的总结一下上面的操作:

    查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
    PDO::query()主要是用于有记录结果返回的操作,特别是Select操作,
    PDO::exec()主要是针对没有结果集合返回的操作,比如Insert、Update、Delete等操作,它返回的结果是当前操作影响的列数。
    PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。

    获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。
    PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。
    PDOStatement::fetch() 是用来获取一条记录,
    PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。

    另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
    PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行Delete、Insert、Update操作影响的结果集,对PDO::exec()方法和Select操作无效。


  • 一个简单的php分页程序

    <?php
    function page($sql,$url,$onceRows = 8,$b = true,$add = “?”){
    global $db;
    /* 分页程序初始化 */
    if (!isset($_GET['pageNum']) || $_GET['pageNum'] == 0) {
    $pageNum = 1;
    } else {
    $pageNum = $_GET['pageNum'];
    }
    /////设置一次读取行数,算出需要的页面数/////
    $startRow = ($pageNum – 1) * $onceRows;

    if(!$b){                 //根据$b的值返回的是分页还是查询结果
    $lists = $db -> query($sql.” LIMIT “.$startRow.”,”.$onceRows);

    $arr = array();

    while($list = $lists -> fetch(PDO::FETCH_ASSOC)){
    $arr[] = $list;
    }
    return $arr;
    }else{
    $res = $db -> query($sql);

    $rows = $res -> rowCount();
    if (is_float($rows / $onceRows)) {
    $pageSum = intval($rows / $onceRows) + 1;
    } else {
    $pageSum = $rows / $onceRows;
    }

    $haspre = false;   //是否有上一页

    $hasnext = false; //是否有下一页

    /////处理各种情况下的上一页,下一页/////
    switch ($pageNum) {
    case 1:
    $backPage = 1;
    if (($pageNum + 1) > $pageSum) {
    $nextPage = $pageSum;
    } else {
    $nextPage = $pageNum + 1;
    $hasnext = true;
    }
    break;
    case $pageSum:
    $backPage = $pageNum – 1;
    $nextPage = $pageSum;
    $haspre = true;
    break;
    default:
    $backPage = $pageNum – 1;
    $nextPage = $pageNum + 1;
    $haspre = true;
    $hasnext = true;
    }

    $str = “<center>”;
    /////动态生成页码部分/////
    if($res -> rowCount() > 0){

    $str .= ‘<div id=”pageNum”>’;

    if($pageNum != 1){
    $str .= ‘<a style=”margin-right:5px;” href=”‘.$url.$add.’pageNum=1″>首页</a>’;
    }
    if($haspre){
    $str .= ‘<a href=”‘.$url.$add.’pageNum=’.$backPage.’”>上一页</a>’;
    }
    for ($i = 1;$i <= $pageSum;$i ++ ) {
    $str .= ‘<a style=”margin-left:5px;’;
    if ($i == $pageNum) {
    $str .= ‘color:red;’;
    }
    $str .= ‘” href=”‘.$url.$add.’pageNum=’.$i.’”>’.$i.’</a>’;
    }
    if($hasnext){
    $str .= ‘<a style=”margin-left:5px;” href=”‘.$url.$add.’pageNum=’.$nextPage.’”>下一页</a>’;
    }
    if($pageNum != $pageSum){
    $str .= ‘<a style=”margin-left:5px;” href=”‘.$url.$add.’pageNum=’.$pageSum.’”>最后一页</a>’;
    }
    $str .= ‘</div>’;
    }

    $str .= “</center>”;

    return $str;
    }
    }
    ?>

    如果您有任何的意见,建议,龍哥欢迎您的留言~



  • dinamic_sidebar 4 none

©2012 龙哥博客 文章 (RSS) and 评论 (RSS) 加载博客产生 28 个查询,用时 0.340 秒