php中CURL实现模拟登录并采集数据

 更新时间:2016年11月25日 16:22  点击:1389
在php中采集我们用的是简单的采集方式(例如file_get_contents)就无法做到了,但是如果想模拟登录用户并采集利用它就没办法了,我们可利用CURL函数来实现模拟登录并采集数据

这里要说一些,默认情况下,PHP的CURL功能是没有开启的,所以你要自己去开启这个功能,需要在php.ini中把  ;extension= php_curl.dll 前面的  " ; " 号去掉!!!
  好,我讲讲昨天晚上的程序吧,虽然最后没有成功,但是还是学习到一些东西的。
 

 代码如下 复制代码

$login="http://www.phpyu.com/index.php?action=login";
$post_file="user=××&pw=××";
$cookie_file    =    tempnam('./temp','cookie'); 

/////创建一个具有唯一文件名的临时文件。 若成功,则该函数返回新的临时文件名。若失败,则返回 false。

 代码如下 复制代码

$ch=curl_init($login_url); /////初始化一个CURL对象
curl_setopt($ch,CURLOPT_HEADER,0);

  //如果你想把一个头包含在输出中,设置这个选项为一个非零值。

 代码如下 复制代码

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); ///设置不输出在浏览器上
curl_setopt($ch,CURLOPT_POST,1);

 /////如果你想PHP去做一个正规的HTTP POST,设置这个选  项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。

 代码如下 复制代码

curl_setopt($ch,CURLOPT_POSTFIELDS,$post_file);  ////传递一个作为HTTP "POST"操作的所有数据的字符串。
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);  /////把返回来的cookie信息保存在$cookie_jar文件中
curl_exec($ch);///执行
curl_close($ch);////关闭


上面已经完成了模拟登录的过程
 

下面要做的就是进入具有权限的页面了,要记得你现在已经登录了,你应该把登录的凭证cookie保存了起来。

 代码如下 复制代码

$url="http://www.phpyu.com/admin/××";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

////把这个页面显示在浏览器上,这里要特别注意!!就是如果把它显示在浏览器上的时候 下面的$contents 就会变成 一个布尔类型 true

 代码如下 复制代码

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);

例2

 代码如下 复制代码

<?php
        $cookie_path = './'; //设置cookie保存路径


        //-----登录要提交的表单数据---------------
        $vars['username'] = '张三';
         $vars['pwd'] = '123';
         //-------------------------------------
        $method_post = true;
        //登录提交的url地址(表单中的action的绝对地址)
         $url = 'http://****.com/login';
        //----------------------------


         $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //请求url地址
        $params[CURLOPT_HEADER] = true; //是否返回响应头信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
   
        $postfields = '';
        foreach ($vars as $key => $value){
            $postfields .= urlencode($key) . '=' . urlencode($value) . '&'; 
        }
       
        $params[CURLOPT_POST] = true;
        $params[CURLOPT_POSTFIELDS] = $postfields;
       
        //判断是否有cookie,有的话直接使用
        if (isset($_COOKIE['cookie_jar']) && ($_COOKIE['cookie_jar'] || is_file($_COOKIE['cookie_jar'])))
        {
            $params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //这里判断cookie
        }
        else
        {
            $cookie_jar = tempnam($cookie_path, 'cookie'); //产生一个cookie文件
            $params[CURLOPT_COOKIEJAR] = $cookie_jar; //写入cookie信息
            setcookie('cookie_jar', $cookie_jar); //保存cookie路径
        }
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行


        echo '
';        echo $content; //输出登录结果
        /*
        //---------登录成功后再次请求其他地址,如果有多个可以循环执行---------
        echo '
--------------------------------------------------------------------------------
 ';
        $nexturl = 'http://****.com/test';
        $params[CURLOPT_URL] = $nexturl;
        $params[CURLOPT_POSTFIELDS] = '';
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行
        echo $content; //输出请求结果
        //-------------------------------------------------
        */
        curl_close($ch); //关闭连接
       
?>

注:如果遇到无法请求https站点的情况,可能是因为无法验证证书或者域名,只要在curl_setopt_array前增加以下两项就可以了:

 代码如下 复制代码

$params[CURLOPT_SSL_VERIFYPEER] = false;

$params[CURLOPT_SSL_VERIFYHOST] = false;

给图片加水印是php程序中一个常用的并且很实用的功能,下面我来给大家详细介绍php中png透明背景水印程序代码吧 。
 代码如下 复制代码

//原始图像

$dst = "/upload/20120914/20120914040740-0.jpg"; //注意图片路径要正确

//得到原始图片信息

$dst_info = getimagesize($dst); 

switch ($dst_info[2])

{

case 1:

$dst_im =imagecreatefromgif($dst);break;

case 2:

$dst_im =imagecreatefromjpeg($dst);break;

case 3:

$dst_im =imagecreatefrompng($dst);break;

case 6:

$dst_im =imagecreatefromwbmp($dst);break;

default:

die("不支持的文件类型1");exit;

}

//水印图像

$src = "/images/shuiyin.png"; //注意路径要写对

$src_info = getimagesize($src);

switch ($src_info[2])

{

case 1:

$src_im =imagecreatefromgif($src);break;

case 2:

$src_im =imagecreatefromjpeg($src);break;

case 3:

$src_im =imagecreatefrompng($src);break;

case 6:

$src_im =imagecreatefromwbmp($src);break;

default:

die("不支持的文件类型1");exit;

}

 

//半透明格式水印

//$alpha = 50;//水印透明度

//imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0]-10,$dst_info[1]-$src_info[1]-

10,0,0,$src_info[0],$src_info[1],$alpha);

 

//支持png本身透明度的方式

imagecopy($dst_im,$src_im,$dst_info[0]-$src_info[0]-10,$dst_info[1]-$src_info[1]-10,0,0,$src_info

[0],$src_info[1]);

 

//保存图片

switch ($dst_info[2]){

case 1:

imagegif($dst_im,$dst);break;

case 2:

imagejpeg($dst_im,$dst);break;

case 3:

imagepng($dst_im,$dst);break;

case 6:

imagewbmp($dst_im,$dst);break;

default:

die("不支持的文件类型2");exit;

}

imagedestroy($dst_im);

imagedestroy($src_im); 


给一个标准的图片水印类

 代码如下 复制代码

在网上找的水印代码:
/*
* 功能:PHP图片水印 (水印支持图片或文字)
* 参数:
*      $product_img    背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
*      $waterPos        水印位置,有10种状态,0为随机位置;
*                        1为顶端居左,2为顶端居中,3为顶端居右;
*                        4为中部居左,5为中部居中,6为中部居右;
*                        7为底端居左,8为底端居中,9为底端居右;
*      $waterImage        图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
*      $waterText        文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
*      $textFont        文字大小,值为1、2、3、4或5,默认为5;
*      $textColor        文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
*
* 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
*      $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
*      当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
*      加水印后的图片的文件名和 $product_img 一样。
* 作者:longware @ 2004-11-3 14:15:13
*/
function imageWaterMark

($product_img,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000")
{
    $isWaterImage = FALSE;
    $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
    //读取水印文件
    if(!empty($waterImage) && file_exists($waterImage))
    {
        $isWaterImage = TRUE;
        $water_info = getimagesize($waterImage);
        $water_w    = $water_info[0];//取得水印图片的宽
        $water_h    = $water_info[1];//取得水印图片的高
        switch($water_info[2])//取得水印图片的格式
        {
            case 1water_im = imagecreatefromgif($waterImage);break;
            case 2water_im = imagecreatefromjpeg($waterImage);break;
            case 3water_im = imagecreatefrompng($waterImage);break;
            default:die($formatMsg);
        }
    }
    //读取背景图片
    if(!empty($product_img) && file_exists($product_img))
    {
        $ground_info = getimagesize($product_img);
        $ground_w    = $ground_info[0];//取得背景图片的宽
        $ground_h    = $ground_info[1];//取得背景图片的高
        switch($ground_info[2])//取得背景图片的格式
        {
            case 1:$ground_im = imagecreatefromgif($product_img);break;
            case 2:$ground_im = imagecreatefromjpeg($product_img);break;
            case 3:$ground_im = imagecreatefrompng($product_img);break;
            default:die($formatMsg);
        }
    }
    else
    {
        die("需要加水印的图片不存在!");
    }
    //水印位置
    if($isWaterImage)//图片水印
    {
        $w = $water_w;
        $h = $water_h;
        $label = "图片的";
    }
    else//文字水印
    {
        $temp = imagettfbbox(ceil($textFont*2.5),0,"arial.ttf",$waterText);//取得使用 TrueType 字体的文

本的范围
        $w = $temp[2] - $temp[6];
        $h = $temp[3] - $temp[7];
        unset($temp);
        $label = "文字区域";
    }
    if( ($ground_w<$w) || ($ground_h<$h) )
    {
        echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!";
        return;
    }
    switch($waterPos)
    {
        case 0://随机
            $posX = rand(0,($ground_w - $w));
            $posY = rand(0,($ground_h - $h));
            break;
        case 1://1为顶端居左
            $posX = 0;
            $posY = 0;
            break;
        case 2://2为顶端居中
            $posX = ($ground_w - $w) / 2;
            $posY = 0;
            break;
        case 3://3为顶端居右
            $posX = $ground_w - $w;
            $posY = 0;
            break;
        case 4://4为中部居左
            $posX = 0;
            $posY = ($ground_h - $h) / 2;
            break;
        case 5://5为中部居中
            $posX = ($ground_w - $w) / 2;
            $posY = ($ground_h - $h) / 2;
            break;
        case 6://6为中部居右
            $posX = $ground_w - $w;
            $posY = ($ground_h - $h) / 2;
            break;
        case 7://7为底端居左
            $posX = 0;
            $posY = $ground_h - $h;
            break;
        case 8://8为底端居中
            $posX = ($ground_w - $w) / 2;
            $posY = $ground_h - $h;
            break;
        case 9://9为底端居右
            $posX = $ground_w - $w;
            $posY = $ground_h - $h;
            break;
        default://随机
            $posX = rand(0,($ground_w - $w));
            $posY = rand(0,($ground_h - $h));
            break;    
    }
    //设定图像的混色模式
    imagealphablending($ground_im, true);
    if($isWaterImage)//图片水印
    {
        imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件   

    
    }
    else//文字水印
    {
        if( !empty($textColor) && (strlen($textColor)==7) )
        {
            $R = hexdec(substr($textColor,1,2));
            $G = hexdec(substr($textColor,3,2));
            $B = hexdec(substr($textColor,5));
        }
        else
        {
            die("水印文字颜色格式不正确!");
        }
        imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im,

$R, $G, $B));        
    }
    //生成水印后的图片
    @unlink($product_img);
    switch($ground_info[2])//取得背景图片的格式
    {
        case 1:imagegif($ground_im,$product_img);break;
        case 2:imagejpeg($ground_im,$product_img);break;
        case 3:imagepng($ground_im,$product_img);break;
        default:die($errorMsg);
    }
    //释放内存
    if(isset($water_info)) unset($water_info);
    if(isset($water_im)) imagedestroy($water_im);
    unset($ground_info);
    imagedestroy($ground_im);
}

//---------------------------------------------------------------------------------------
if(isset($_FILES) && !empty($_FILES['userfile']) && $_FILES['userfile']['size']>0)
{
    $uploadfile = "./".time()."_".$_FILES['userfile']['name'];
    if (copy($_FILES['userfile']['tmp_name'], $uploadfile))
    {
        echo "OK<br>";
        //文字水印
        imageWaterMark($uploadfile,0,"",http://www.111cn.net,5,"#FF0000");
        //图片水印
        //$waterImage="images/bz.gif";//水印图片路径
        //imageWaterMark($uploadfile,0,$waterImage);
        echo "<img src="".$uploadfile."" border="0">";
    }
    else
    {
        echo "Fail<br>";
    }
}

 代码如下 复制代码

 

/*
  * 使用POI读取EXCEL文件
  */
 import java.io.File;
 import java.io.FileInputStream;
 import java.util.ArrayList;
 
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  *
  * @author Hanbin
  */
 public class ReadExcel {
 
     /**
      * @param args the command line arguments
      */
     public static void main(String[] args)throws Exception {
         read("d:\demo.xls");
     }
    
     public static ArrayList read(String fileName){
         ArrayList list = new ArrayList();
         String sql = "";
         try{
             File f = new File(fileName);
             FileInputStream fis = new FileInputStream(f);
             HSSFWorkbook wbs = new HSSFWorkbook(fis);
             HSSFSheet childSheet = wbs.getSheetAt(0);
             System.out.println("行数:" + childSheet.getLastRowNum());
             for(int i = 4;i<childSheet.getLastRowNum();i++){
                 HSSFRow row = childSheet.getRow(i);
                 System.out.println("列数:" + row.getPhysicalNumberOfCells());
                 if(null != row){
                     for(int k=1;k<row.getPhysicalNumberOfCells();k++){
                         HSSFCell cell;
                         cell = row.getCell((short)k);
                        // System.out.print(getStringCellValue(cell) + "t");
                         list.add(getStringCellValue(cell) + "t");
                     }
                 }
             }
         }catch(Exception e){
             e.printStackTrace();
         }
         return list;
     }
     /**
      * 获取单元格数据内容为字符串类型的数据
      *
      * @param cell Excel单元格
      * @return String 单元格数据内容
      */
     private static String getStringCellValue(HSSFCell cell) {
         String strCell = "";
         switch (cell.getCellType()) {
         case HSSFCell.CELL_TYPE_STRING:
             strCell = cell.getStringCellValue();
             break;
         case HSSFCell.CELL_TYPE_NUMERIC:
             strCell = String.valueOf(cell.getNumericCellValue());
             break;
         case HSSFCell.CELL_TYPE_BOOLEAN:
             strCell = String.valueOf(cell.getBooleanCellValue());
             break;
         case HSSFCell.CELL_TYPE_BLANK:
             strCell = "";
             break;
         default:
             strCell = "";
             break;
         }
         if (strCell.equals("") || strCell == null) {
             return "";
         }
         if (cell == null) {
             return "";
         }
         return strCell;
     }
 }

php上传Excel文件时如何判断文件中有图片 有需要的朋友可参考参考。
 代码如下 复制代码
$excelPath = 'Test.xls';
 
 $objReader = PHPExcel_IOFactory::createReader('Excel5');
 $objReader->setReadDataOnly(true);
 
 $objPHPExcel = $objReader->load($excelPath);
 $currentSheet = $objPHPExcel->getActiveSheet();
 $AllImages= $currentSheet->getDrawingCollection();
 
 if(count($AllImages) > 0) {
    //处理
 }
分页是目前在显示大量结果时所采用的最好的方式。有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据。在互联网上,分​页是一般用于搜索结果或是浏览全部信息

php基本分页

 代码如下 复制代码

<?php
// database connection info
$conn = mysql_connect('localhost','dbusername','dbpass') or trigger_error("SQL", E_USER_ERROR);
$db = mysql_select_db('dbname',$conn) or trigger_error("SQL", E_USER_ERROR);

// find out how many rows are in the table
$sql = "SELECT COUNT(*) FROM numbers";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);
$r = mysql_fetch_row($result);
$numrows = $r[0];

// number of rows to show per page
$rowsperpage = 10;
// find out total pages
$totalpages = ceil($numrows / $rowsperpage);

// get the current page or set a default
if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) {
// cast var as int
$currentpage = (int) $_GET['currentpage'];
} else {
// default page num
$currentpage = 1;
} // end if

// if current page is greater than total pages...
if ($currentpage > $totalpages) {
// set current page to last page
$currentpage = $totalpages;
} // end if
// if current page is less than first page...
if ($currentpage < 1) {
// set current page to first page
$currentpage = 1;
} // end if

// the offset of the list, based on current page
$offset = ($currentpage - 1) * $rowsperpage;

// get the info from the db
$sql = "SELECT id, number FROM numbers LIMIT $offset, $rowsperpage";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);

// while there are rows to be fetched...
while ($list = mysql_fetch_assoc($result)) {
// echo data
echo $list['id'] . " : " . $list['number'] . "<br />";
} // end while

/****** build the pagination links ******/
// range of num links to show
$range = 3;

// if not on page 1, don't show back links
if ($currentpage > 1) {
// show << link to go back to page 1
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1'><<</a> ";
// get previous page num
$prevpage = $currentpage - 1;
// show < link to go back to 1 page
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$prevpage'><</a> ";
} // end if

// loop to show links to range of pages around current page
for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) {
// if it's a valid page number...
if (($x > 0) && ($x <= $totalpages)) {
// if we're on current page...
if ($x == $currentpage) {
// 'highlight' it but don't make a link
echo " [<b>$x</b>] ";
// if not current page...
} else {
// make it a link
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a> ";
} // end else
} // end if
} // end for

// if not on last page, show forward and last page links
if ($currentpage != $totalpages) {
// get next page
$nextpage = $currentpage + 1;
// echo forward link for next page
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$nextpage'>></a> ";
// echo forward link for lastpage
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$totalpages'>>></a> ";
} // end if
/****** end build pagination links ******/
?>

先看一个常用的php分页类

 代码如下 复制代码

<?php
 /*
  Place code to connect to your DB here.
 */
 include('config.php'); // include your code to connect to DB.

 $tbl_name="";  //your table name
 // How many adjacent pages should be shown on each side?
 $adjacents = 3;
 
 /*
    First get total number of rows in data table.
    If you have a WHERE clause in your query, make sure you mirror it here.
 */
 $query = "SELECT COUNT(*) as num FROM $tbl_name";
 $total_pages = mysql_fetch_array(mysql_query($query));
 $total_pages = $total_pages[num];
 
 /* Setup vars for query. */
 $targetpage = "filename.php";  //your file name  (the name of this file)
 $limit = 2;         //how many items to show per page
 $page = $_GET['page'];
 if($page)
  $start = ($page - 1) * $limit;    //first item to display on this page
 else
  $start = 0;        //if no page var is given, set start to 0
 
 /* Get data. */
 $sql = "SELECT column_name FROM $tbl_name LIMIT $start, $limit";
 $result = mysql_query($sql);
 
 /* Setup page vars for display. */
 if ($page == 0) $page = 1;     //if no page var is given, default to 1.
 $prev = $page - 1;       //previous page is page - 1
 $next = $page + 1;       //next page is page + 1
 $lastpage = ceil($total_pages/$limit);  //lastpage is = total pages / items per page, rounded up.
 $lpm1 = $lastpage - 1;      //last page minus 1
 
 /*
  Now we apply our rules and draw the pagination object.
  We're actually saving the code to a variable in case we want to draw it more than once.
 */
 $pagination = "";
 if($lastpage > 1)
 { 
  $pagination .= "<div class="pagination">";
  //previous button
  if ($page > 1)
   $pagination.= "<a href="$targetpage?page=$prev">� previous</a>";
  else
   $pagination.= "<span class="disabled">� previous</span>"; 
  
  //pages 
  if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
  { 
   for ($counter = 1; $counter <= $lastpage; $counter++)
   {
    if ($counter == $page)
     $pagination.= "<span class="current">$counter</span>";
    else
     $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";     
   }
  }
  elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some
  {
   //close to beginning; only hide later pages
   if($page < 1 + ($adjacents * 2))  
   {
    for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
    {
     if ($counter == $page)
      $pagination.= "<span class="current">$counter</span>";
     else
      $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";     
    }
    $pagination.= "...";
    $pagination.= "<a href="$targetpage?page=$lpm1">$lpm1</a>";
    $pagination.= "<a href="$targetpage?page=$lastpage">$lastpage</a>";  
   }
   //in middle; hide some front and some back
   elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
   {
    $pagination.= "<a href="$targetpage?page=1">1</a>";
    $pagination.= "<a href="$targetpage?page=2">2</a>";
    $pagination.= "...";
    for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
    {
     if ($counter == $page)
      $pagination.= "<span class="current">$counter</span>";
     else
      $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";     
    }
    $pagination.= "...";
    $pagination.= "<a href="$targetpage?page=$lpm1">$lpm1</a>";
    $pagination.= "<a href="$targetpage?page=$lastpage">$lastpage</a>";  
   }
   //close to end; only hide early pages
   else
   {
    $pagination.= "<a href="$targetpage?page=1">1</a>";
    $pagination.= "<a href="$targetpage?page=2">2</a>";
    $pagination.= "...";
    for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
    {
     if ($counter == $page)
      $pagination.= "<span class="current">$counter</span>";
     else
      $pagination.= "<a href="$targetpage?page=$counter">$counter</a>";     
    }
   }
  }
  
  //next button
  if ($page < $counter - 1)
   $pagination.= "<a href="$targetpage?page=$next">next �</a>";
  else
   $pagination.= "<span class="disabled">next �</span>";
  $pagination.= "</div>n";  
 }
?>

 <?php
  while($row = mysql_fetch_array($result))
  {
 
  // Your while loop here
 
  }
 ?>

<?=$pagination?>
 


实例

 代码如下 复制代码

<?php
class PageView{
    /**页码**/
    public $pageNo = 1;
    /**页大小**/
    public $pageSize = 20;
    /**共多少页**/
    public $pageCount = 0;
    /**总记录数**/
    public $totalNum = 0;
    /**偏移量,当前页起始行**/
    public $offSet = 0;
    /**每页数据**/
    public $pageData = array();
   
    /**是否有上一页**/
    public $hasPrePage = true;
    /**是否有下一页**/
    public $hasNextPage = true;
   
    public $pageNoList = array();
   
    public $jsFunction ='jsFunction';
    /**
     *
     * @param unknown_type $count 总行数
     * @param unknown_type $size 分页大小
     * @param unknown_type $string
     */
    public function __construct($count=0, $size=20,$pageNo=1,$pageData =array(),$jsFunction='jsFunction'){

        $this->totalNum = $count;//总记录数
        $this->pageSize = $size;//每页大小
        $this->pageNo = $pageNo;
        //计算总页数
        $this->pageCount = ceil($this->totalNum/$this->pageSize);
        $this->pageCount = ($this->pageCount<=0)?1:$this->pageCount;
        //检查pageNo
        $this->pageNo = $this->pageNo == 0 ? 1 : $this->pageNo;
        $this->pageNo = $this->pageNo > $this->pageCount? $this->pageCount : $this->pageNo;
       
        //计算偏移
        $this->offset = ( $this->pageNo - 1 ) * $this->pageSize;
        //计算是否有上一页下一页
        $this->hasPrePage = $this->pageNo == 1 ?false:true;

        $this->hasNextPage = $this->pageNo >= $this->pageCount ?false:true;
       
        $this->pageData = $pageData;
        $this->jsFunction = $jsFunction;
       
    }
    /**
     * 分页算法
     * @return
     */
    private function generatePageList(){
        $pageList = array();
        if($this->pageCount <= 9){
            for($i=0;$i<$this->pageCount;$i++){
                array_push($pageList,$i+1);
            }
        }else{
            if($this->pageNo <= 4){
                for($i=0;$i<5;$i++){
                    array_push($pageList,$i+1);
                }
                array_push($pageList,-1);
                array_push($pageList,$this->pageCount);

            }else if($this->pageNo > $this->pageCount - 4){
                array_push($pageList,1);
               
                array_push($pageList,-1);
                for($i=5;$i>0;$i--){
                    array_push($pageList,$this->pageCount - $i+1);
                }
            }else if($this->pageNo > 4 && $this->pageNo <= $this->pageCount - 4){
                array_push($pageList,1);
                array_push($pageList,-1);
               
                array_push($pageList,$this->pageNo -2);
                array_push($pageList,$this->pageNo -1);
                array_push($pageList,$this->pageNo);
                array_push($pageList,$this->pageNo + 1);
                array_push($pageList,$this->pageNo + 2);
               
                array_push($pageList,-1);
                array_push($pageList,$this->pageCount);
               
            }
        }
        return $pageList;
    }

    /***
     * 创建分页控件
    * @param
    * @return String
    */
    public function echoPageAsDiv(){
        $pageList = $this->generatePageList();
       
        $pageString ="<div class='pagination'><div class='page-bottom'>";
   
        if(!empty($pageList)){
            if($this->pageCount >1){
                if($this->hasPrePage){
                    $pageString = $pageString ."<a class='page-next' href="javascript:" .$this->jsFunction . "(" . ($this->pageNo-1) . ")">上一页</a>";
                }
                foreach ($pageList as $k=>$p){
                    if($this->pageNo == $p){
                        $pageString = $pageString ."<span class='page-cur'>" . $this->pageNo . "</span>";
                        continue;
                    }
                    if($p == -1){
                        $pageString = $pageString ."<span class='page-break'>...</span>";
                        continue;
                    }
                    $pageString = $pageString ."<a href="javascript:" .$this->jsFunction . "(" . $p . ")">" . $p . "</a>";
                }
               
                if($this->hasNextPage){
                    $pageString = $pageString ."<a class='page-next' href="javascript:" .$this->jsFunction . "(" . ($this->pageNo+1) . ")">下一页</a>";
                }
               
            }
        }
        $pageString = $pageString .("</div></div>");
        return $pageString;
    }
}

?>

css代码

 代码如下 复制代码

<style type="text/css">
<!--
.pagination {font-family: Tahoma;overflow: hidden; padding-top: 12px; text-align: center;}
.pagination-tab { margin-bottom: 20px;}
.pagination a, .pagination .page-cur, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-break, .pagination .page-skip {
    display: inline-block;font-family: Tahoma,SimSun,Arial; height: 22px;line-height:22px; margin: 0; min-width: 16px;padding: 0 5px; text-align: center; vertical-align: top; white-space: nowrap;}
.pagination a, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-cur, .pagination .page-break {
    border: 1px solid #ed3d83; color:#e9357d; font-weight:bold;}
.pagination a:hover { border: 1px solid #ed3d83;text-decoration: none; background-color:#f95f9d; color:#fff;}
.pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g { width: 36px; background-image: url(../static/img/page.gif);}
.pagination .page-prev { background-position: -0px -38px; padding-left: 16px;}
.pagination .page-prev_g { background-position:0px -59px; padding-left: 16px; color:#cbcbcb; font-weight:normal;}
.pagination .page-next { background-position: 0px 0px; padding-right: 16px; font-weight:normal;}
.pagination .page-next_g { background-position: -0px -19px; padding-right: 16px; color:#cbcbcb;}
.pagination .page-cur {background-color: #f95f9d; border: 1px solid #ed3d83;color: #fff;font-weight: bold;}
.pagination .page-break {border: medium none; background:none transparent; color:#333;}

-->
</style>

在php页面中的调用方法

 代码如下 复制代码

    $pageNo = $_GET['pageNo'];
        if(empty($pageNo)){
            $pageNo = 1;
        }
        //分页数据
        $pageData = News::getNewsPage($pageNo,$pageSize);
       //取得总行数
        $count = News::getNewsCount();
        //创建分页器
        $p = new PageView($count['0']['TOTAL'],$pageSize,$pageNo,$pageData);
     //生成页码
        $pageViewString = $p->echoPageAsDiv();

[!--infotagslink--]

相关文章

  • php中登录后跳转回原来要访问的页面实例

    在很多网站用户先访问一个要登录的页面,但当时没有登录后来登录了,等待用户登录成功之后肯定希望返回到上次访问的页面,下面我就来给大家介绍登录后跳转回原来要访问的页...2016-11-25
  • php中用curl模拟登录discuz以及模拟发帖

    本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。 代码如下 复制代码 <?php $discuz_url = &lsquo;ht...2016-11-25
  • Ruby on Rails实现最基本的用户注册和登录功能的教程

    这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下...2020-06-30
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • php有效防止同一用户多次登录

    【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
  • vue实现用户登录切换

    这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-22
  • 修改mysql密码phpmyadmin不能登录

    出现phpmyadmin不能登录是我在修改我mysql服务器密码之后导致的,后来百度了相关的原因,原来是修改了mysql密码之后我们还需要在phpmyadmin目录中去修改config.inc.php中...2016-11-25
  • 浅谈js二维码扫码登录是什么原理

    这篇文章主要介绍了浅谈js二维码扫码登录是什么原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • Vue-Element-Admin集成自己的接口实现登录跳转

    关于这个Vue-element-admin中的流程可能对于新的同学不是很友好,所以本文将结合实例代码,介绍Vue-Element-Admin集成自己的接口实现登录跳转,感兴趣的小伙伴们可以参考一下...2021-06-23
  • phpmyadmin不能登录,无任何提示的问题解决

    昨天有一朋友说自己的phpmyadmin不能登录并且无任何提示了,问我怎么解决,下面我来分享一下关于phpmyadmin不能登录问题总结. phpmyadmin不能登录没有提示 解决方法:...2016-11-25
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • 简单php cookie用户登录实例

    cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25
  • SpringBoot登录拦截配置详解(实测可用)

    这篇文章主要介绍了SpringBoot登录拦截配置详解(实测可用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
  • Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法

    这篇文章主要介绍了Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法,需要的朋友可以参考下...2016-11-01
  • 微信小程序授权登录的优雅处理方式

    这篇文章主要给大家介绍了关于微信小程序授权登录的优雅处理方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • vue实现登录验证码

    这篇文章主要为大家详细介绍了vue实现登录验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-13
  • 关于JSP用户登录连接数据库详情

    这篇文章主要介绍了关于JSP用户登录连接数据库的相关资料,需要的朋友可以参考下面文章内容...2021-09-07
  • Python中tkinter的用户登录管理的实现

    这篇文章主要介绍了Python中tkinter的用户登录管理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-22
  • phpmyadmin无法登录提示please check errors given in your PHP

    下面来给各位同学介绍关于phpmyadmin无法登录提示please check errors given in your PHP and/or webserver,希望例子对各位有帮助。 今天帮别人弄网站的时候要...2016-11-25