浏览模式: 标准 | 列表2006年08月的文章

[置顶] 本站php相关整理资料集合

淡水河边整理的一些php的学习参考资料,方便大家学习php。如果想要查看tinybutstrong模板引擎的文章,请用tinybutstrong的标签查询。网上除了那个翻译不全的tbs中文手册,就只有淡水河边这里有一些小强(tinybutstrong)的中文参考资料了。都是淡水河边自己使用过程中摸索出来的,转载请保留链接。

» 阅读全文

Tags: 编程标准, 手册, tinybutstrong, div, css

只字片语

    我在想,在这个世界上,人是一种多么渺小的动物。肉体的伤害,心灵的伤害,都可以将他轻易击倒。而一个人只要能够活着,无论活得怎样,本身就是一种对命运的胜利。不知不觉磞出来的。记下,备忘

C#语言入门,visual c#速成版

http://msdn2.microsoft.com/zh-cn/library/zkxk2fwf.aspx

PHP分页显示制作详细讲解

1、前言

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。

2、原理

所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?

现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
……

这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。

3、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。

<?php
// 建立数据库连接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
      o&#114; die("Could not connect: " . mysql_error());
// 获取当前页数
if( isset($_GET["page"]) ){
   $page = intval( $_GET["page"] );
}
else{
   $page = 1;
}
// 每页数量
$PageSize = 10;
// 获取总数据量
$sql = "sel&#101;ct count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row["amount"];
// 记算总共有多少页
if( $amount ){
   if( $amount < $page_size ){ $page_count = 1; }               //如果总数据量小于$PageSize,那么只有一页
   if( $amount % $page_size ){                                  //取总数据量除以每页数的余数
       $page_count = (int)($amount / $page_size) + 1;           //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
   }else{
       $page_count = $amount / $page_size;                      //如果没有余数,则页数等于总数据量除以每页数的结果
   }
}
else{
   $page_count = 0;
}

// 翻页链接
$page_string = "";
if( $page == 1 ){
   $page_string .= "第一页|上一页|";
}
else{
   $page_string .= "<a href=?page=1>第一页</a>|<a href=?page=".($page-1).">上一页</a>|";
}
if( ($page == $page_count) || ($page_count == 0) ){
   $page_string .= "下一页|尾页";
}
else{
   $page_string .= "<a href=?page=".($page+1).">下一页</a>|<a href=?page=".$page_count.">尾页</a>";
}
// 获取数据,以二维数组格式返回结果
if( $amount ){
   $sql = "sel&#101;ct * from table o&#114;der by id desc limit ". ($page-1)*$page_size .", $page_size";
   $result = mysql_query($sql);
  
   while ( $row = mysql_fetch_row($result) ){
       $rowset[] = $row;
   }
}else{
   $rowset = array();
}
// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果
?>

4、OO风格代码
以下代码中的数据库连接是使用的pear db类进行处理

<?php
// FileName: Pager.class.php
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作
Class Pager
{
   var $PageSize;             //每页的数量
   var $CurrentPageID;        //当前的页数
   var $NextPageID;           //下一页
   var $PreviousPageID;       //上一页
   var $numPages;             //总页数
   var $numItems;             //总记录数
   var $isFirstPage;          //是否第一页
   var $isLastPage;           //是否最后一页
   var $sql;                  //sql查询语句
  
  function Pager($option)
   {
       global $db;
       $this->_setOptions($option);
       // 总条数
       if ( !isset($this->numItems) )
       {
           $res = $db->query($this->sql);
           $this->numItems = $res->numRows();
       }
       // 总页数
       if ( $this->numItems > 0 )
       {
           if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
           if ( $this->numItems % $this->PageSize )
           {
               $this->numPages= (int)($this->numItems / $this->PageSize) + 1;
           }
           else
           {
               $this->numPages = $this->numItems / $this->PageSize;
           }
       }
       else
       {
           $this->numPages = 0;
       }
      
       switch ( $this->CurrentPageID )
       {
           case $this->numPages == 1:
               $this->isFirstPage = true;
               $this->isLastPage = true;
               break;
           case 1:
               $this->isFirstPage = true;
               $this->isLastPage = false;
               break;
           case $this->numPages:
               $this->isFirstPage = false;
               $this->isLastPage = true;
               break;
           default:
               $this->isFirstPage = false;
               $this->isLastPage = false;
       }
      
       if ( $this->numPages > 1 )
       {
           if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
           if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
       }
      
       return true;
   }
  
   /***
    *
    * 返回结果集的数据库连接
    * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
    * 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
    * getPageData方法也是调用本方法来获取结果的
    *
    ***/
  
   function getDataLink()
   {
       if ( $this->numItems )
       {
           global $db;
          
           $PageID = $this->CurrentPageID;
          
           $from = ($PageID - 1)*$this->PageSize;
           $count = $this->PageSize;
           $link = $db->limitQuery($this->sql, $from, $count);   //使用Pear DB::limitQuery方法保证数据库兼容性
          
           return $link;
       }
       else
       {
           return false;
       }
   }
  
   /***
    *
    * 以二维数组的格式返回结果集
    *
    ***/
  
   function getPageData()
   {
       if ( $this->numItems )
       {
           if ( $res = $this->getDataLink() )
           {      
               if ( $res->numRows() )
               {
                   while ( $row = $res->fetchRow() )
                   {
                       $result[] = $row;
                   }
               }
               else
               {
                   $result = array();
               }
              
               return $result;
           }
           else
           {
               return false;
           }
       }
       else
       {
           return false;
       }
   }
  
   function _setOptions($option)
   {
       $allow_options = array(
                   "PageSize",
                   "CurrentPageID",
                   "sql",
                   "numItems"
       );
      
       foreach ( $option as $key => $value )
       {
           if ( in_array($key, $allow_options) &amp;&amp; ($value != null) )
           {
               $this->$key = $value;
           }
       }
      
       return true;
   }
}
?>
<?php
// FileName: test_pager.php
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require "Pager.class.php";
if ( isset($_GET["page"]) )
{
   $page = (int)$_GET["page"];
}
else
{
   $page = 1;
}
$sql = "sel&#101;ct * from table o&#114;der by id";
$pager_option = array(
       "sql" => $sql,
       "PageSize" => 10,
       "CurrentPageID" => $page
);
if ( isset($_GET["numItems"]) )
{
   $pager_option["numItems"] = (int)$_GET["numItems"];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
   $turnover = "首页|上一页|";
}
else
{
   $turnover = "<a href="?page=1&amp;numItems=".$pager->numItems."">首页</a>|<a href="?page=".$pager->PreviousPageID."&amp;numItems=".$pager->numItems."">上一页</a>|";
}
if ( $pager->isLastPage )
{
   $turnover .= "下一页|尾页";
}
else
{
   $turnover .= "<a href="?page=".$pager->NextPageID."&amp;numItems=".$pager->numItems."">下一页</a>|<a href="?page=".$pager->numPages."&amp;numItems=".$pager->numItems."">尾页</a>";
}
?>


需要说明的地方有两个:

这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:

<?php
Class MemberPager extends Pager
{
   function showMemberList()
   {
       global $db;
      
       $data = $this->getPageData();
// 显示结果的代码
       // ......
   }
}
/// 调用
if ( isset($_GET["page"]) )
{
   $page = (int)$_GET["page"];
}
else
{
   $page = 1;
}
$sql = "sel&#101;ct * from members o&#114;der by id";
$pager_option = array(
       "sql" => $sql,
       "PageSize" => 10,
       "CurrentPageID" => $page
);
if ( isset($_GET["numItems"]) )
{
   $pager_option["numItems"] = (int)$_GET["numItems"];
}
$pager = @new MemberPager($pager_option);
$pager->showMemberList();
?>


第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
mysql: sel&#101;ct * from table limit offset, rows
pgsql: sel&#101;ct * from table limit m offset n
......
所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。

ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

Tags: 分页

PHP4之COOKIE支持详解

        建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的信息,在PHP中提供了两种方便的手段:session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.

    一: 设置cookie
        使用cookie前必须设置cookie.
        函数原型:int setcookie(string name,string value,int expire,string path,string domain,int secure)
        其中,除name外,所有的参数都是可选的,可以用空的字符串表示未设置.
        属性value: 用来指定值.
        属性path:  用来指定cookie被发送到服务器的哪一个目录路径下.
        属性domain:能够在浏览器端对cookie的发送进行限定.  
        expire参数:用来指定cookie的有效时间,它是一个标准的Unix时间标记.
                   可以用time()或者mktime()函数取得,以秒为单位.
        secure参数:表示这个cookie是否通过加密的HTTPS协议在网络上传输.

    二: 设置cookie时的注意事项
        在同一个页面中设置cookie,实际上是按从后往前的顺序进行的.如果要先删除一个cookie,再写入一个cookie,则必须先写写入语句,再写删除语句.否则会出现错误.
  
    三: setcookie举例
        简单的: setcookie("mycookie","value_of_mycookie");
        带失效时间的: setcookie("withExpire","Expire_in_1_hour",time()+3600);
        什么都有的:setcookie("FullCookie","Full_cookie_value",time+3600,"/forum","www.123.com",1);

    四: cookie的一些特点
        cookie是面向路径的.缺省path属性时,WEB服务器页会自动传递当前路径给浏览器.指定路径会强制服务器使用设置的路径.
        在一个目录页面里设的cookie在另一个目录的页面里是看不到的.

    五: 接收和处理cookie
        PHP对cookie的处理是全自动的,和处理FORM变量的原则一样.当然也可以使用PHP全局变量,$HTTP_COOKIE_VARS数组.
        例:  echo $mycookie;
             echo $cookie Array[0];
             echo count($cookie Array);
             echo $HTTP_COOKIE_VARS["mycookie"];
    
    六: 删除cookie
        (1)调用只带有name参数的setcookie();
        (2)使失效时间为time()或time-1;  
    
    七: 使用cookie的限制
        (1) 必须在HTML文件的内容输出之前设置;
        (2)不同的浏览器对cookie的处理不一致,使用时一定要考虑;
        (3)客户端的限制,比如用户设置禁止cookie,则cookie不能建立;
    
    八: 一个具体的例子,希望大家对cookie有更加深刻的认识
        
代码:
<?
         //cookie.php
         if(!isset($flag))
           {
            setcookie("mycookie","this my cookie!");
            header("location:cookie.php?flag=1");
            exit;
            }
         ?>
         <html>
         <body>
         <?
            echo "cookie中有:".$mycookie;
         ?>
         </body>
         </html>
    
    怎么样,通过上面的介绍,你是不是对PHP中的COOKIE功能有了详细的了解.发挥你的聪明才智,让你的站点功能更强大吧.

Tags: cookie

用PHP实现验证码功能

??目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

??我们这里展示了如何编写PHP程序实现验证码功能:

??代码一:  

    <?php
   /*
    *   Filename:    authpage.php
    *   Author:   hutuworm
    */

    srand((double)microtime()*1000000);

   //验证用户输入是否和验证码一致
        if(isset($HTTP_POST_VARS["authinput"]))  
        {
                if(strcmp($HTTP_POST_VARS["authnum"],$HTTP_POST_VARS["authinput"])==0)
                        echo "验证成功!";
                else
                        echo "验证失败!";
        }
    
   //生成新的四位整数验证码
        while(($authnum=rand()%10000)<1000);  
    ?>
        <form action=authpage.php method=post>
        <table>
                请输入验证码:<input type=text name=authinput style="width: 80px"><br>
                <input type=submit name="验证" value="提交验证码">
                <input type=hidden name=authnum value=<? echo $authnum; ?>>
                <img src=authimg.php?authnum=<? echo $authnum; ?>>
        </table>
        </form>

??代码二:

<?php
   /*
    *   Filename:    authimg.php
    *   Author:   hutuworm
    */

   //生成验证码图片
        Header("Content-type: image/PNG");  
        srand((double)microtime()*1000000);
        $im = imagecr&#101;ate(58,28);
        $black = ImageColorAllocate($im, 0,0,0);
        $white = ImageColorAllocate($im, 255,255,255);
        $gray = ImageColorAllocate($im, 200,200,200);
        imagefill($im,68,30,$gray);

   //将四位整数验证码绘入图片
        imagestring($im, 5, 10, 8, $HTTP_GET_VARS["authnum"], $black);

        for($i=0;$i<50;$i++)   //加入干扰象素
        {
                imagesetpixel($im, rand()%70 , rand()%30 , $black);
        }

        ImagePNG($im);
        ImageDestroy($im);
???>



??本文程序在Apache 2.0.45 + PHP 4.3.1环境下运行通过。

上文只是对验证码功能的一个简单实现,并没有考虑商用安全性问题。如果要增强安全性,将此功能投入商业应用,则可以通过以下几个步骤实现:

1. 启用Session。
2. authnum在authimg.php中生成,并计算md5sum,存入session。
3. authpage.php将authinput计算md5sum后,与session中的authnum(md5sum)对比得出验证结果。


注:作者使用了简单的代码实现了很酷的功能。不过在添加干扰像素时的效果不是太好,偶把第二段代码稍改了一下,效果就理想一些了。

修改后的代码如下:

<?php
/*
*   Filename: authimg.php
*   Author:   hutuworm
*/
//生成验证码图片
Header("Content-type: image/PNG");  
srand((double)microtime()*1000000);
$im = imagecr&#101;ate(62,20);
$black = ImageColorAllocate($im, 0,0,0);
$white = ImageColorAllocate($im, 255,255,255);
$gray = ImageColorAllocate($im, 200,200,200);
imagefill($im,68,30,$gray);
while(($authnum=rand()%100000)<10000);
//将四位整数验证码绘入图片
imagestring($im, 5, 10, 3, $authnum, $black);
for($i=0;$i<200;$i++)   //加入干扰象素
{
    $randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
    imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);
}
ImagePNG($im);
ImageDestroy($im);
?>

Tags: 验证码

php分页显示类

代码:
<?php
/*
* 分页显示类
* PageItem.php v 1.0.2
* 说明:
* 1. 配合MYSQL数据库使用
* 2. 类没有提供连接数据库的功能,需在外部建立数据库连接。
* */
/*
* 使用方法:
* $sql = "sel&#101;ct * from news limit 0,10";
* $hdc = new PageItem($sql);
* echo $hdc->myPageItem();
* $arrRecords = $hdc->ReadList();
* */
if (!defined("_BB_PAGEITEM_")) {
    define("_BB_PAGEITEM_", 1);
}
else return;

class PageItem {
    var $iDefaultRecords = 10; // 默认每页显示记录数,如果没有设置,就使用默认值    
    var $iMaxRecord; //每页记录数
    var $iTotal; //记录总数
    var $sqlRecord; // 获取记录的SQL查询
    var $iPages; //总页数  
    var $CPages; //当前页数
    /*
     * 构造函数 -- 初始化变量
     * 参数:SQL查询语句,将忽略LIMIT语句
     * */

    function PageItem($sql = "")
    {
        // register_shutdown_function($this->_PageItem());
        if(!@mysql_ping())
        {
            echo "本类需要在类外建立MySQL数据库连接";
            exit;
        }        
        /*
          * 解析SQL语句
          * */
        if ($sql <> "") {
            list($sql,$limit) = spliti("LIMIT", $sql);
            // 分析LIMIT语句,如果设置了,则以limit后面的记录为分页的记录数
            list($cnt1,$cnt2) = explode(",",$limit);
            if(!empty($cnt2))    $this->SetMaxRecord($cnt2);
            elseif(!empty($cnt1)) $this->SetMaxRecord($cnt1);

            unset($cnt1);
            unset($cnt2);
            
            $this->sqlRecord = trim($sql);
            list(, $sql) = spliti("FROM", $sql);
            $sql = trim($sql);
            if(preg_match ("/\bGROUP\b \bBY\b/i", $sql))
            {
                if(preg_match ("/\bHAVING\b/i", $sql))    list(,$field) = spliti("HAVING",$sql);
                list($field) = spliti(" ",trim($field));
                $this->iTotal = $this->CountRecord("Sel&#101;ct $field,COUNT(DISTINCT $field) AS cnt FROM " . $sql,2);
            }
            else    $this->iTotal = $this->CountRecord("Sel&#101;ct COUNT(*) AS cnt FROM " . $sql,1);
        }
        if($this->iMaxRecord<=0) $this->SetMaxRecord($this->iDefaultRecords);
        $this->iPages = ceil($this->iTotal / $this->iMaxRecord);
        $this->CPages = $_REQUEST["page"];
        if ($this->CPages <= 0) $this->CPages = 1;
        if ($this->CPages > $this->iPages) $this->CPages = $this->iPages;
    }
    /*
        * 析构函数 -- 暂时不可用
        * */
    function _PageItem()
    {
        // $this->linkid = NULL;
    }

    function SetMaxRecord($cnt)
    {
        $this->iMaxRecord = $cnt;
    }

    /*
        * 统计匹配的记录总数
        * */
    function CountRecord($sql,$type)
    {
        if($type == 1)
        {
            if (($records = mysql_query($sql)) &amp;&amp; ($record = mysql_fetch_assoc($records))) {
                return $record["cnt"];
            } else return 0;
        }
        elseif($type == 2)
        {
            if($records = mysql_query($sql))
                return mysql_affected_rows();
        }
    }
    /*
     * 读取记录
     * */
    function GetRecord()
    {
        $ret = array();
        $this->sqlRecord.=" LIMIT ".($this->CPages-1)*$this->iMaxRecord.",".$this->iMaxRecord;
        $records = mysql_query($this->sqlRecord);
        if(!$records) return;
        while($record = mysql_fetch_array($records))
        {
            $ret[] = $record;
        }
        return $ret;
    }

    function LinktoPage($page, $msg)
    {
        $link = $this->PageUrl($page);
        return "<A href=\"$link\">$msg</A>\n";
    }
    function PageUrl($page)
    {
        // 有些服务器设置的ServerName跟常用的不同,需要更改这里
        $phpself = "http://" . $_SERVER["SERVER_NAME"] . $_SERVER["PHP_SELF"];
        
        $querystring = $_SERVER["QUERY_STRING"];
        $querystring = preg_replace("/page=[0-9]*&amp;?/i", "", $querystring);
        $link = $phpself . "?page=$page&amp;" . $querystring;
        return $link;
    }

    /*
     * 显示当前页及总页数  
     * */
    function PageNav()
    {
        echo "第" . $this->CPages . "页/共" . $this->iPages . "页";
    }

    /*
     * 显示翻页按钮,包括首页、下页、上页、未页
     * */

    function PageButton()
    {
        if ($this->CPages > 1) {
            echo $this->LinktoPage(1, "首页");
            echo " | ";
            echo $this->LinktoPage($this->CPages-1, "上一页");
        } else {
            echo "首页 | 上一页";
        }

        if ($this->CPages < $this->iPages) {
            echo " | ";
            echo $this->LinktoPage($this->CPages + 1, "下一页");
            echo " | ";
            echo $this->LinktoPage($this->iPages, "首页");
        } else {
            echo " | 下一页 | 尾页";
        }
    }
    /*
     * 显示跳转页选择框
     * */

    function Sel&#101;ctItem()
    {
        echo "&amp;nbsp;&amp;nbsp;跳到第<Sel&#101;ct name="topage" size="1" onchange="window.location=this.value">&amp;nbsp;&amp;nbsp;\n";
        for($i = 1;$i <= $this->iPages;$i++) {
            if ($this->CPages == $i)
                $extra = "sel&#101;cted";
            else
                $extra = "";
            echo "<OPTION VALUE="" . $this->PageUrl($i) . "" $extra>$i</OPTION>";
        }
        echo "</Sel&#101;ct>\n";
    }

    /*
        * 一次性显示所有按钮组件
        * */
    function myPageItem()
    {
        $this->PageButton();
        $this->Sel&#101;ctItem();
        $this->PageNav();
    }
} // 类结束

?>  


示例:
代码:

<?
// db debug
$time_start = getmicrotime();
@mysql_connect("localhost","root","");
//@mysql_sel&#101;ct_db("cms");
//@mysql("cr&#101;ate database testdb");
@mysql_sel&#101;ct_db("testdb");

/*
// 测试数据,请自行导入
Cr&#101;ate DATABASE testdb;

Cr&#101;ate TABLE `testtable` (
  `threadid` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(250) NOT NULL default "",
  `lastpost` int(10) unsigned NOT NULL default "0",
  PRIMARY KEY  (`threadid`)
) TYPE=MyISAM AUTO_INCREMENT=5142 ;

#
# 导出表中的数据 `testtable`
#

Ins&#101;rt INTO `testtable` VALUES (1, "用户手册", 1056675353);
Ins&#101;rt INTO `testtable` VALUES (2, "斑竹守则", 1056208568);
Ins&#101;rt INTO `testtable` VALUES (3, "Linux下构架邮件系统", 1056703118);
Ins&#101;rt INTO `testtable` VALUES (4, "世界七大奇迹选举", 1029819163);
Ins&#101;rt INTO `testtable` VALUES (5, "真的是寒冬耶~~~~", 1030512351);
Ins&#101;rt INTO `testtable` VALUES (7, "[文章] PHP本地调试环境简易安装配置", 1032175589);
Ins&#101;rt INTO `testtable` VALUES (8, "PHP还有希望么?", 1050675680);
Ins&#101;rt INTO `testtable` VALUES (10, "[问题] o&#114;acle导入数据的权限问题?", 1032772383);
Ins&#101;rt INTO `testtable` VALUES (17, "vBulletin 2.2.9版本发布了", 1040229341);
Ins&#101;rt INTO `testtable` VALUES (11, "[文章] Web服务器解决方案(一)", 1036405968);
Ins&#101;rt INTO `testtable` VALUES (12, "Tomcat启动不了?", 1036662305);
Ins&#101;rt INTO `testtable` VALUES (13, "程序员不得不看的好帖(转)", 1085021674);
Ins&#101;rt INTO `testtable` VALUES (14, "本站的FTP站点开通,欢迎大家使用!", 1084408733);
Ins&#101;rt INTO `testtable` VALUES (15, "现在如何登陆阿?", 1037956765);
Ins&#101;rt INTO `testtable` VALUES (16, "[分享] 可以和你做一个联接么", 1037785003);
Ins&#101;rt INTO `testtable` VALUES (18, "FTP目录在调整中...", 1037869139);
Ins&#101;rt INTO `testtable` VALUES (19, "能开放ftp吗?", 1039633468);
Ins&#101;rt INTO `testtable` VALUES (20, "FTP综合论坛的访问问题解决了", 1037949721);
Ins&#101;rt INTO `testtable` VALUES (21, "请问斑竹那个*.gho文件用什么程序打开? 谢谢!!!", 1082483109);
Ins&#101;rt INTO `testtable` VALUES (22, "有没有找不到的软件呢?", 1039633312);
Ins&#101;rt INTO `testtable` VALUES (23, "互联网论坛:中国互联网 盈利别得意", 1039633657);
Ins&#101;rt INTO `testtable` VALUES (24, "最厉害的图片!", 1039633215);
Ins&#101;rt INTO `testtable` VALUES (25, "论坛银行", 1060911818);
Ins&#101;rt INTO `testtable` VALUES (36, "人生到底为了什么呢?", 1039764753);
Ins&#101;rt INTO `testtable` VALUES (35, "关于五个创业者的五个细节", 1039748528);
Ins&#101;rt INTO `testtable` VALUES (28, "修改论坛显示发表信息的修改", 1039628337);
Ins&#101;rt INTO `testtable` VALUES (29, "Oracle与DB2比较", 1039633786);
Ins&#101;rt INTO `testtable` VALUES (31, "PHP 4.3.0最后一个预发行版本", 1040815970);
Ins&#101;rt INTO `testtable` VALUES (40, "FTP站点开通音乐频道", 1040399193);
Ins&#101;rt INTO `testtable` VALUES (37, "平均拥有21个密码 IT用户的密码泛滥成灾 [转贴]", 1039772963);
Ins&#101;rt INTO `testtable` VALUES (38, "我要软件啊", 1042300012);
Ins&#101;rt INTO `testtable` VALUES (39, "这里的速度相对别的FTP来说(对我而言)是最快的了", 1039947371);
Ins&#101;rt INTO `testtable` VALUES (41, "[文章] Web服务器解决方案(一)", 1040027122);
Ins&#101;rt INTO `testtable` VALUES (42, "那位大哥哥原帮忙?", 1040229203);
Ins&#101;rt INTO `testtable` VALUES (43, "老大请进 有问题求教", 1040399120);
Ins&#101;rt INTO `testtable` VALUES (44, "老大 怎么回事", 1040228529);
Ins&#101;rt INTO `testtable` VALUES (45, "Oracle中Del&#101;te时候提示出错:ORA-02292", 1040399794);
Ins&#101;rt INTO `testtable` VALUES (46, "如何连同email地址也复制过去?", 1040399557);
Ins&#101;rt INTO `testtable` VALUES (47, "星矢冥王篇和字幕", 1044628632);
Ins&#101;rt INTO `testtable` VALUES (48, "无间道主题曲和一经典", 1040724634);
Ins&#101;rt INTO `testtable` VALUES (49, "要霸王别姬吗", 1040526751);
Ins&#101;rt INTO `testtable` VALUES (50, "双城记", 1040646014);
Ins&#101;rt INTO `testtable` VALUES (51, "第四集有了 马上放上去", 1040566962);
Ins&#101;rt INTO `testtable` VALUES (52, "这个地方好象不合适偶来", 1046516491);
Ins&#101;rt INTO `testtable` VALUES (53, "PHP4中文教程", 1040568390);
Ins&#101;rt INTO `testtable` VALUES (54, "FTP有问题了吗", 1040724674);
Ins&#101;rt INTO `testtable` VALUES (55, "奇怪,怎么就两个人呢?", 1040996101);
Ins&#101;rt INTO `testtable` VALUES (56, "有没有PHP/GTK的详细教程啊??", 1040700746);
Ins&#101;rt INTO `testtable` VALUES (58, "论坛如何调整", 1042116789);
Ins&#101;rt INTO `testtable` VALUES (57, "哪儿有PHPCompiler下载啊?", 1040713790);
Ins&#101;rt INTO `testtable` VALUES (59, "MySQL错误(errno: 140)错误的解决", 1040983562);
Ins&#101;rt INTO `testtable` VALUES (60, "加油?灌水?", 1042198274);
Ins&#101;rt INTO `testtable` VALUES (61, "PHP 4.3.0 正式发行了", 1041107823);
Ins&#101;rt INTO `testtable` VALUES (62, "伯恩的身份 强烈推荐 下面这篇介绍是转载", 1042300019);
Ins&#101;rt INTO `testtable` VALUES (63, "老大 有红磨房", 1042944938);
Ins&#101;rt INTO `testtable` VALUES (64, "haha", 1042300076);
Ins&#101;rt INTO `testtable` VALUES (65, "老大 又在调整吗", 1041672910);
Ins&#101;rt INTO `testtable` VALUES (66, "学习PHP", 1042560221);
Ins&#101;rt INTO `testtable` VALUES (67, "php+oracle 中文显示不正常", 1052969974);
Ins&#101;rt INTO `testtable` VALUES (68, "老大 怎么了", 1042301133);
Ins&#101;rt INTO `testtable` VALUES (69, "倒 不知不觉变斑竹拉", 1042300340);
Ins&#101;rt INTO `testtable` VALUES (72, "PHP网站该往何处去?", 1045971230);
Ins&#101;rt INTO `testtable` VALUES (70, "伯恩的身份 老大删了吗", 1042301209);
Ins&#101;rt INTO `testtable` VALUES (71, "美国电影协会评选出的美国历史上的最伟大的100部电影(转)", 1043059704);
Ins&#101;rt INTO `testtable` VALUES (73, "THE TWO TOWERS", 1042715292);
Ins&#101;rt INTO `testtable` VALUES (75, "[重要] 目的是方便PHP爱好者", 1043287064);
Ins&#101;rt INTO `testtable` VALUES (76, "好文章 大家来看看 (转)", 1042649914);
Ins&#101;rt INTO `testtable` VALUES (77, "忠奸人", 1042945061);
Ins&#101;rt INTO `testtable` VALUES (78, "电影点播", 1079154880);
Ins&#101;rt INTO `testtable` VALUES (79, "2001-2002日本动漫排名", 1052491517);
Ins&#101;rt INTO `testtable` VALUES (80, "关于论坛改版得通知", 1048655501);
Ins&#101;rt INTO `testtable` VALUES (81, "[转贴] 我的购盘经验", 1043226808);
Ins&#101;rt INTO `testtable` VALUES (82, "&amp;lt;hero&amp;gt;已上传完毕", 1043246593);
Ins&#101;rt INTO `testtable` VALUES (83, "最新电影 BLOOD WORK", 1043246292);
Ins&#101;rt INTO `testtable` VALUES (84, "感谢djzhi", 1043923465);
Ins&#101;rt INTO `testtable` VALUES (85, "Blood Work 上传完", 1043582674);
Ins&#101;rt INTO `testtable` VALUES (86, "[求助]PHP安装", 1043685944);
Ins&#101;rt INTO `testtable` VALUES (87, "[转贴] 我的一个朋友与我谈到当前中国人的生活方式", 1043678405);
Ins&#101;rt INTO `testtable` VALUES (88, "现在服务器陷入非常缓慢的状态", 1043686177);
Ins&#101;rt INTO `testtable` VALUES (89, "提请新注册用户注意!", 1051885362);
Ins&#101;rt INTO `testtable` VALUES (91, "能上传了吗", 1044886700);
Ins&#101;rt INTO `testtable` VALUES (90, "请问:我用$_session[var]去获得session中的变量,有时可以有时不行?", 1078180091);
Ins&#101;rt INTO `testtable` VALUES (92, "[求助]", 1051454294);
Ins&#101;rt INTO `testtable` VALUES (93, "祝大家新春愉快", 1044707042);
Ins&#101;rt INTO `testtable` VALUES (94, "紧急求助", 1044271917);
Ins&#101;rt INTO `testtable` VALUES (95, "[转贴] 面试工作比找“女朋友”要烦啊!", 1043935699);
Ins&#101;rt INTO `testtable` VALUES (96, "再次求助", 1044334208);
Ins&#101;rt INTO `testtable` VALUES (97, "菜鸟紧急求助!", 1044283078);
Ins&#101;rt INTO `testtable` VALUES (98, "超级菜鸟求助!!!!!!!!!!!", 1044464729);
Ins&#101;rt INTO `testtable` VALUES (99, "进一步求助。", 1044462787);
Ins&#101;rt INTO `testtable` VALUES (100, "如何以模块化的方式在Apache下安装PHP", 1078811867);

*/


include("./PageItem.php");
$pi = new PageItem("sel&#101;ct * from testtable");

echo "<html><head>\n";
echo "<head><meta http-equiv="content-type" content="text/html;charset=gb2312">\n<title>类使用示例--Boban@21php.com</title></head>";
echo "<body>";
echo "<p align=center style="font-size:9pt">PHP服务器系统:".PHP_OS."<br>";
echo "<br<br>";
$records = $pi->getrecord();
if(is_array($records))
{
    while(list($key,$val)=each($records))
    {
        echo $val["threadid"].":".$val["title"]."(".date("Y-m-d",$val["lastpost"]).")<br>\n";;
    }
}
echo "<br<br>";
$pi->myPageItem();

//$charset = mysql_client_encoding($auth->bb_db_conn);
//printf ("current character set is %s\n", $charset);

?>

<?
echo "</body></html>";
$time_end = getmicrotime();
printf("<br>{程序执行时间: %0.3f 秒}</p>\n",$time_end - $time_start);
function getmicrotime()
{
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}
?>

Tags: 分页

php中rename()函数的妙用

大家都知道,rename()函数可以对文件或目录进行重命名的操作。其实它还可以做很多事情。

熟悉unix的朋友应该知道shell命令mv,它相当与win32的移动,而且移动的同时可进行重命名。我发现,php的rename()函数就相当于mv,它不仅仅只有简单的重命名的功能,同样可以改变文件甚至整个目录的路径。


例如:

$oldpath ----文件或目录原来路径

$newpath ----新定义路径

那么 rename($oldpath,$newpath)就可以完成文件/目录移动的操作

经过测试,win32和unix的php4版本都支持这个功能。

那么还可以巧用rename()函数来完成删除的操作(当然可以用unlink()函数),例如:

$path ---- 文件或目录路径

$tmp ---- tmp目录(/tmp)

用rename($path,$tmp) 将文件移动到tmp目录.

Tags: 函数

一个程序中login.php的代码

只是想让大家看看cookie和session在有会员的程序注册或登录的程序中如何使用

代码:

session_start();
if(isset($HTTP_COOKIE_VARS["PHPSESSID"])) //如果有cookie变量PHPSESSIN
{
    session_id($HTTP_COOKIE_VARS["PHPSESSID"]); //取出PHPSESSID(就是session id),和服务器上对应的session建立连接
    $PHPSESSID=$HTTP_COOKIE_VARS["PHPSESSID"];
}
else $PHPSESSID=session_id(); //如果没有就重新生产一个新的session id
setcookie("PHPSESSID",$PHPSESSID,time()+3600*2400,$cookie_path); //设cookie,保存session id

if($HTTP_GET_VARS["islogout"]!=1 &amp;&amp; isset($HTTP_POST_VARS["name"])) //如果用户没有注销,并且存在由表单提交过来的用户名
{
    $HTTP_SESSION_VARS["account"]="guest"; //先把session变量account,也就是当前已经登录的用户名冲掉(这点我现在觉得不好),变成guest
    $HTTP_SESSION_VARS["isadm"]=0; //也是清掉,isadm是我这个程序表示是否为管理员的变量
    $HTTP_SESSION_VARS["style"]=$HTTP_GET_VARS["style"]; //style是我的程序中表示当前用户的样式,也就是模板
    $query="sel&#101;ct * from ka_account wh&#101;re account="".$HTTP_POST_VARS["name"]."";";
    $result=mysql_query($query); //从数据库中取出该用户名的密码等信息
    if(mysql_num_rows($result)==1) //如果找到一个匹配的
    {
        $rec=mysql_fetch_object($result);
        if($rec->banned!=1){  //如果用户没有被禁止
        if(encrypt($HTTP_POST_VARS["passwd"])==$rec->passwd) //如果密码匹配,encrypt是我的加密函数,我使用了默认的md5
        {
            $HTTP_SESSION_VARS["account"]=$rec->account;  //设当session变量account为这个用户
            $HTTP_SESSION_VARS["isadm"]=$rec->isadm;  //类似上面
            $err="已登录";
        }
        else $err="密码错误";
        }
        else $err="账号被禁止";
    }
    else $err="账号不存在";
}
if($HTTP_GET_VARS["islogout"]==1) //如果用户在注销,就把所有的session变量设置成guest的
{
    $HTTP_SESSION_VARS["account"]="guest";
    $HTTP_SESSION_VARS["isadm"]=0;
    $HTTP_SESSION_VARS["style"]="default";
}

echo $err;  显示出错信息  


Tags: 登录

一个简单的分页类

一个简单的分页类,高手看到请指点!

代码:

<?php
/*-----------------------------分页操作类-------------------------------
  1.操作灵活,方便mvc模式开发者
  2.本代码只用于交流
  3.应用实例:
     $sqlStr="sel&#101;ct count(*) from news";
     $query=mysql_query($sqlStr,$conn);
     $data_sum=@mysql_result($query,0);
     $sqlStr="sel&#101;ct * from news o&#114;der by id";
     $page=new page($data_sum,5);
     $page->execute($sqlStr);
     echo $page->show_item("#FF0000",5)."<br>";
     $array=$page->show(true);
    
----------------------------------------------------------------------*/
  class page{
    var $page_size;                   //显示数据的行数(可提供,可设置)
    var $data_sum;                    //查询数据的总数(需提供)
    var $page_sum;                    //页面总数
    var $page=0;                      //当前页
    var $html_href_up;                //上一页的连接herf值
    var $html_href_next;              //下一页的连接herf值
    var $html_href_start;             //第一页的连接herf值
    var $html_href_end;               //尾页的连接herf值
    var $page_url_request="page";     //页面请求(url)的分页参数值,例如:http://localhost/index.php...
      
    function page($data_sum,$page_size=10){
      $this->data_sum=$data_sum;
      $this->page=($_REQUEST[$this->page_url_request]!="")? $_REQUEST[$this->page_url_request]: 1;
      $this->page_size=$page_size;
      $this->page_sum();
    }
    
/*------------------------------引用$sqlStr进行操作-----------------------------
    参数为SQL语句的引用
------------------------------------------------------------------------------*/
    function execute(&amp; $sqlStr){
      if($sqlStr=="") $this->halt("请先设置\$sqlStr的值!");
      $limit1=($this->page-1) * $this->page_size;
      $limit2=$limit1+$this->page_size;
      $limit_mod=" limit ".$limit1.",".$limit2." ";
      if(eregi("limit",$sqlStr)){
        $mod="/limit(\s)+[0-9]+(,(\s)*[0-9]*)?/i";
        $sqlStr=preg_replace($mod,$limit_mod,$sqlStr);
      }
      else $sqlStr .=$limit_mod;
    }
    
/*----------------------------页面计算--------------------------------------*/
    function page_sum(){
      $page_end=$this->data_sum%$this->page_size;
      $page_sum=(int) ($this->data_sum/$this->page_size);
      $this->page_sum=($page_end==0)?$page_sum:$page_sum+1;
    }

/*---------------------------跳转连接操作----------------------------------*/
    function href($page){
      if($page>$this->page_sum || $this->data_sum==0 || $this->page_sum<=1) return "#";
      else{
        $request_string=$_SERVER["QUERY_STRING"];
        if(eregi($this->page_url_request,$request_string)){
          $mod="/$this->page_url_request=[0-9]+/";
          eval("\$mod=\"$mod\";");
          $request_string=preg_replace($mod,$this->page_url_request."=".$page,$request_string);
        }
        else $request_string.="&amp;".$this->page_url_request."=".$page;
        return "http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$request_string;
      }
    }
    
/*---------------------------------返回跳转连接的herf------------------------------
可单个返回引用,或者返回索引数组;返回数组需提供一个任意值的
---------------------------------------------------------------------------------*/
    function show($return_type=false){
      $this->html_href_up=($this->page<=1)?"#":$this->href($this->page-1);
      $this->html_href_next=$this->href($this->page+1);
      $this->html_href_start=$this->href(1);
      $this->html_href_end=$this->href($this->page_sum);
      if($return_type!=false) return array("up"=>$this->html_href_up,"next"=>$this->html_href_next,"start"=>$this->html_href_start,"end"=>$this->html_href_end);
    }

/*-------------------------返回联系跳转的html----------------------------
可提供当前页的值的显示颜色
可设置显示大小
例如:1 2 3 4 5 6 7
------------------------------------------------------------------------*/
    function show_item($index_color="#FF0000",$item=9){
      $page=$this->page;
      $midd=(int) ($item/2);
      if($this->page_sum<=$item){   //如果总页数大于显示的页数时,
        $show_start=1;
        $show_end=$this->page_sum;
      }elseif($page-$midd <= 0){
        $show_start=1;
        $show_end=$item;
      }
      elseif($page+($item-$midd)>=$this->page_sum){
        $show_start=$this->page_sum-$item+1;
        $show_end=$this->page_sum;
      }
      else{
        $show_start=$page-$midd;
        $show_end=$page+($item-$midd)-1;
      }
      for($i=$show_start;$i<=$show_end;$i++){
        $item_son=($i==$this->page)?"<font color=".$index_color."><strong>".$i."</strong></font>":$i;
        $item_html.="<a href=".$this->href($i).">".$item_son."</a>&amp;nbsp;";
      }
      return "&amp;nbsp;".$item_html;
    }
    
  /* ------------------------------显示错误----------------------------*/
    function halt($errorStr){
      echo "<p><font color=\"#FF0000\"><strong>错误提示:</strong></font></p>";
      echo "<p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;".$errorStr."</p>";
      exit();
    }

  }
?>

Tags: 分页

Records:7712345678