共计 8002 个字符,预计需要花费 21 分钟才能阅读完成。
index.php 代码
<body>
<?php
require_once "./DBDA.class.php";
require_once "page.class.php";
$db = new DBDA();
$name = $_GET["name"];
$tel = $_GET["tel"];
$condition_str="";
if($name!="")
$condition_str.="and name like'%".$name."%'";
if($tel!="")
$condition_str.="and tel like'%".$tel."%'";
?>
<table width="80%" border=1>
<form action=""method="get">
<input type="text" name="name" placeholder="请输入用户名" value="<?php echo $name ?>" style="max-width:200px; float:left">
<input type="text" name="tel" placeholder="请输入电话号码" value="<?php echo $tel ?>" style="max-width:200px; float:left">
<button type="submit" style="float:left; margin-left:10px"> 查询 </button>
</form>
<br> <br>
<thead>
<tr>
<th width="20%"> 编号 </th>
<th width="20%"> 姓名 </th>
<th width="20%"> 电话 </th>
<th width="20%"> 分组 </th>
</tr>
</thead>
<tbody>
<?php
$zts = "select count(*) from contacts where 1=1". $condition_str;
$ats = $db->query($zts);
$page = new Page($ats[0][0],50);
$sql = "select * from contacts where 1=1". $condition_str . $page->limit;
$arr = $db->query($sql);
foreach($arr as $v){
// 给查询的关键字加字体颜色
$n = str_replace($name,"<span style='color:red'>{$name}</span>",$v[1]);
echo "<tr>
<td nowrap align=\"center\">{$v[0]}</td>
<td nowrap align=\"center\">{$n}</td>
<td nowrap align=\"center\">{$v[2]}</td>
<td nowrap align=\"center\">{$v[3]}</td>
</tr>";
}
?>
</tbody>
</table>
<p>
<?php
echo $page->fpage();
?>
</p>
</body>
DBDA.class.php 代码
<?php
// 个人总结
/*reslut 意思:结果
字符长度关键字 strlen
截取字符串关键字 substr */
class DBDA //PHP 链接 MySQL 先定义一个类
{
// 分装下面这四个类名字可以随便取
public $host="localhost"; //pudlic 公众的,给 IP 地址一个接受的名 $host
public $uid="root"; //mysql 软件名,给软件名一个接受的名 $uid
public $pwd="scit028@com"; //mysql 软件密码,给密码一个接受的名 $pwd
public $dbname="scit028"; // 要连的数据库名
/**
* 给一个 sql 语句,返回执行的结果
*@param string $sql 用户指定的 sql 语句
*@param int $type 用户给的语句类型,0 代表增删改,1 代表查询
*@return 返回查询的结果,如果是查询返回二维数组, 如果是增删改返回 true 或 false
*/
//$type 代表是给的 SQL 语句是什么类型的数据
// 一般网站上查询用的比较多,就给 $type 一个默认值 1
function Query($sql,$type=1) // 上面有注释详解 要养成这个习惯“写注释”{
// 造连接对象
$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
// 执行 sql 语句
$reslut = $db->query($sql);
// 从结果集对象里面取数据
if($type==1)
{return $reslut->fetch_all(); //reslut 调用 fetch_all 直接返回数组
}
else // 如果
{return $reslut; // 上面有注释}
}
/**
* 给一个 sql 语句,返回关联的二维数组
*@param string $sql 用户指定的 sql 语句
*@param int $type 用户给的语句类型,0 代表增删改,1 代表查询
*@return 返回查询的结果,如果是查询返回二维数组, 如果是增删改返回 true 或 false
*/
function GuanQuery($sql,$type=1)
{
// 造连接对象
$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
// 执行 sql 语句
$reslut = $db->query($sql);
// 取数据
if($type==1) // 先判断 type 是不是等于一
{$attr = array(); // 给一个空的数组
while($a = $reslut->fetch_assoc()) // 用 while 循环把所有的数据都取一遍。$reslut->fetch_assoc() 这句是取当前的数组,给 a 来接收一下
{$attr[] = $a; // 给把 $a 接收的值交个 $attr[] 它就存了一个关联数组了}
return $attr; // 把 attr 输出,就返回了一个关联数组
}
else
{return $reslut; // 如果其他数据就输出 取当前的数组}
}
/**
* 给一个 sql 语句,返回字符串
*@param string $sql 用户指定的 sql 语句
*@param int $type 用户给的语句类型,0 代表增删改,1 代表查询
*@return 返回查询的结果,如果是查询返回字符串, 如果是增删改返回 true 或 false
*/
function StrQuery($sql,$type=1)
{
// 造连接对象
$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
// 执行 sql 语句
$reslut = $db->query($sql);
// 取数据
if($type==1) // 先判断 type 是不是等于一
{$attr = $reslut->fetch_all(); // 取到所有数据,取到的是二维数组,需转换成字符串
$str=""; // 让 str 默认为空 循环里面的 $str. 让它加一 php 里面的加法用 . 来代表
foreach($attr as $v) // 先取出一维数组
{$str .= implode("^",$v); // 用 implode 关键字将 $v 取出的一维数组和 "^" 特殊符号拼接起来。因为 "^" 符号在 php 里基本用不上,所以用它。$str .=" | "; // 每一次循环结束之前加上一个分隔符
}
return substr($str,0,strlen($str)-1); // 截取字符串关键字 substr $ste 收到的值从零开始,字符长度关键字 strlen 讲 $st 取到的值再最后减一,最后那个多出来的分割符就去掉了!!}
else
{return $reslut;}
}
}
page.class.php 代码
<?php
/**
file: page.class.php
完美分页类 Page
*/
class Page {
private $total; // 数据表中总记录数
private $listRows; // 每页显示行数
private $limit; //SQL 语句使用 limit 从句, 限制获取记录个数
private $uri; // 自动获取 url 的请求地址
private $pageNum; // 总页数
private $page; // 当前页
private $config = array(
'head' => "条记录",
'prev' => "上一页",
'next' => "下一页",
'first'=> "首页",
'last' => "末页"
);
// 在分页信息中显示内容,可以自己通过 set() 方法设置
private $listNum = 10; // 默认分页列表显示的个数
/**
构造方法,可以设置分页类的属性
@param int $total 计算分页的总记录数
@param int $listRows 可选的,设置每页需要显示的记录数,默认为 25 条
@param mixed $query 可选的,为向目标页面传递参数, 可以是数组,也可以是查询字符串格式
@param bool $ord 可选的,默认值为 true, 页面从第一页开始显示,false 则为最后一页
*/
public function __construct($total, $listRows=25, $query="", $ord=true){
$this->total = $total;
$this->listRows = $listRows;
$this->uri = $this->getUri($query);
$this->pageNum = ceil($this->total / $this->listRows);
/* 以下判断用来设置当前面 */
if(!empty($_GET["page"])) {$page = $_GET["page"];
}else{if($ord)
$page = 1;
else
$page = $this->pageNum;
}
if($total > 0) {if(preg_match('/\D/', $page) ){$this->page = 1;}else{$this->page = $page;}
}else{$this->page = 0;}
$this->limit = "LIMIT".$this->setLimit();}
/**
用于设置显示分页的信息,可以进行连贯操作
@param string $param 是成员属性数组 config 的下标
@param string $value 用于设置 config 下标对应的元素值
@return object 返回本对象自己 $this,用于连惯操作
*/
function set($param, $value){if(array_key_exists($param, $this->config)){$this->config[$param] = $value;
}
return $this;
}
/* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性 limit 和 page 的值 */
function __get($args){if($args == "limit" || $args == "page")
return $this->$args;
else
return null;
}
/**
按指定的格式输出分页
@param int 0- 7 的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构
@return string 分页信息内容
*/
function fpage(){$arr = func_get_args();
$html[0] = "<span class='p1'> 共 <b> {$this->total} </b>{$this->config["head"]} </span>";
$html[1] = " 本页 <b>".$this->disnum()."</b> 条 ";
$html[2] = " 本页从 <b>{$this->start()}-{$this->end()}</b> 条 ";
$html[3] = " <b>{$this->page}/{$this->pageNum}</b> 页 ";
$html[4] = $this->firstprev();
$html[5] = $this->pageList();
$html[6] = $this->nextlast();
$html[7] = $this->goPage();
$fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">';
if(count($arr) < 1)
$arr = array(0, 1,2,3,4,5,6,7);
for($i = 0; $i < count($arr); $i++)
$fpage .= $html[$arr[$i]];
$fpage .= '</div>';
return $fpage;
}
/* 在对象内部使用的私有方法,*/
private function setLimit(){if($this->page > 0)
return ($this->page-1)*$this->listRows.", {$this->listRows}";
else
return 0;
}
/* 在对象内部使用的私有方法,用于自动获取访问的当前 URL */
private function getUri($query){$request_uri = $_SERVER["REQUEST_URI"];
$url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?';
if(is_array($query))
$url .= http_build_query($query);
else if($query != "")
$url .= "&".trim($query, "?&");
$arr = parse_url($url);
if(isset($arr["query"])){parse_str($arr["query"], $arrs);
unset($arrs["page"]);
$url = $arr["path"].'?'.http_build_query($arrs);
}
if(strstr($url, '?')) {if(substr($url, -1)!='?')
$url = $url.'&';
}else{$url = $url.'?';}
return $url;
}
/* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */
private function start(){if($this->total == 0)
return 0;
else
return ($this->page-1) * $this->listRows+1;
}
/* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */
private function end(){return min($this->page * $this->listRows, $this->total);
}
/* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */
private function firstprev(){if($this->page > 1) {$str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> ";
$str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> ";
return $str;
}
}
/* 在对象内部使用的私有方法,用于获取页数列表信息 */
private function pageList(){
$linkPage = " <b>";
$inum = floor($this->listNum/2);
/* 当前页前面的列表 */
for($i = $inum; $i >= 1; $i--){
$page = $this->page-$i;
if($page >= 1)
$linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
}
/* 当前页的信息 */
if($this->pageNum > 1)
$linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> ";
/* 当前页后面的列表 */
for($i=1; $i <= $inum; $i++){
$page = $this->page+$i;
if($page <= $this->pageNum)
$linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> ";
else
break;
}
$linkPage .= '</b>';
return $linkPage;
}
/* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */
private function nextlast(){if($this->page != $this->pageNum) {$str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> ";
$str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> ";
return $str;
}
}
/* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */
private function goPage(){if($this->pageNum > 1) {return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;"type="text"onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> ';
}
}
/* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */
private function disnum(){if($this->total > 0){return $this->end()-$this->start()+1;}else{return 0;}
}
}
输出效果如下,有兴趣的朋友可以折腾下:
打赏小哥
微信打赏
支付宝打赏
正文完