493333王中王开奖结果-王中王开奖一马中特

493333王中王开奖结果让不同类型的网络可以可靠地互相联接,王中王开奖一马中特拥有规模庞大的原创游戏,在这里您将享受的不一样快乐。

网络频道

当前位置:493333王中王开奖结果 > 网络频道 > PHP实现产品列表分类筛选与排序的项目实例

PHP实现产品列表分类筛选与排序的项目实例

来源:http://www.soniaLorenzana.com 作者:493333王中王开奖结果 时间:2019-09-30 17:05

一、简单的单条件查询

一、基础知识(mysql语句)

工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页。下面这个是产品控制器 ProductController 中的一个函数,用于简单的查询,比如199元专区就可以使用 getTypeSimPro('price=199');

1、增加,插入

插入数据关键字是INSERT    INTO 表名(字段一,字段二,字段三) VALUES(值一,值二,值三);(字段是不需要加引号的,值如果是字符串需要加引号,关键字可以小写,但一般不用);

INSERT  INTO  product  (name,price,type)  VALUES  ("樱",88,"fruit") ;

/**简单的筛选条件分类产品,单表查询
 * @param string $sql 单表查询的SQL
 * @param int $countPerPage=16 每页商品数
 * @param string $orderBy='salseF DESC' 排序 默认销量阈值
 * @return array $res 产品二维数组
 */
function getTypeSimPro($sql, $countPerPage = 16, $orderBy='salesF DESC'){
    //$sql = "SELECT ProductId,name,mainPic,priceN,priceVIP,isNew,isHot,sales FROM product WHERE ".$sql;
    $productM = M('product');    // 实例化Data数据对象       
    $where = $sql ? 'onSale=1 AND '.$sql : 'onSale=1';

2、删除

DELETE  FROM   表名   WHERE   条件语句;

    $tempSQL = $productM->field('ProductId,name,mainPic,priceN,priceVIP,isNew,isHot,sales,salesF')
                         ->where( $where )                        
                        ->order( $orderBy );
                        
//    $res = $this->executeTempSQL($tempSQL, $countPerPage);
    $res = $tempSQL->select();    //演示不使用分页,直接返回结果集
    return $res;
}

3、修改(更新)

UPDATE   表名    SET   字段=“值”   WHERE    条件语句

二、使用分页

4、查询

SELECT   *    FROM   表名   WHERE    条件语句

* 代表所有字段;不给*可以指定字段,直接给字段名称,多个字段用逗号隔开;

如果要统计查询出来的数据数量就用COUNT关键字来统计 COUNT(*)    COUNT(name)

SELECT   *   FROM   `phone`    WHERE    price >= 3000

由于Thinkphp的自带Page分页类有些不太好用,所以我进行了一点小改造,可以进行传递配置参数修改页码显示的方式。这里的主要实现逻辑是:

5、条件语句

条件语句:比较运算符或者是IN()关键字(某个字段在指定的值里面),NOT IN (某个字段不在指定的值里面)

BETWEEN 值1 AND 值2 , 条件语句在值1和值2之间

SELECT   *   FROM    `phone`    WHERE    id     IN (1,8,9);

1、利用同一个临时数据库对象 $tempSQL ,使计数和查询结果的条件保持一致,注意这里使用了对象克隆,因为TP中,一个Model执行完操作后会被初始化成原始的Model对象,参见 TP手册连贯操作说明>> 。

6、排序

根据条件进行排序:ORDER   BY   字段   顺序(正序(ASC)和倒序(DESC)),不需要加WHERE

SELECT   *   FROM   `phone`   ORDER   BY   price   DESC

SELECT   *    FROM   `phone`    WHERE    price >= 3000   ORDER     BY    price   DESC

2、$_GET['p']是Page类默认的辨别当前页码的参数。Page类尤其里面的 show() 函数是经过我改造的,可以传递定制化页码导航栏参数。不定制也可以,就是页码导航有点太长。

7、限制语句

限制语句:LIMIT 值1,值2;(值不能用括号括起来)(值1:从值1开始查询,不包含值1,值2是查询的个数)

限制语句要放在最后

SELECT   *   FROM   `phone`   LIMIT   3,3

SELECT   *   FROM   `phone`    ORDER   BY   price   DESC   LIMIT   3,2

检索前5个记录行

SELECT   *   FROM   phone    LIMIT   5;

限制语句主要用来做分页:已知:1.每一页显示的条数 (例子:条数2)2.当前页数(例子:当前页3);

数据=LIMIT (当前页-1)*条数,条数

3、这里的 count() 在后面多表查询的时候是有BUG的,后面再说。

8、模糊查询

模糊查询  LIKE   前面和后面要加%

SELECT   *   FROM   `phone`    WHERE    name    LIKE     "o%" ;

SELECT   name,price    FROM    `phone`    WHERE    name   LIKE    "%e%"   ORDER   BY   price   DESC ;

SELECT   name,price    FROM    `phone`    WHERE    name    LIKE    "%e%"    AND   id>3   ORDER    BY    price    DESC ;

SELECT   *    FROM    product    WHERE    price >= 5    AND    name    LIKE    "%a%" ;

/**
 * 执行分类和搜索中的SQL对象
 * @param TP.Model $tempSQL Thinkphp的Model对象
 * @param int $countPerPage=16 每页的产品数
 * @return array $res['nowP']当前页数  $res['totalP']总产品数  $res['links']分页栏HTML     $res['productList']产品二维数组
 * */
protected function executeTempSQL( $tempSQL, $countPerPage=16 ){
    $tempSQL2 = clone $tempSQL;        //对象复制,否则调用一次后第二次会被初始化成原始的M对象
//    print_r($tempSQL);
    $count = $tempSQL->count(); // 查询满足要求的总记录数,这里在多表查询时一定要以产品编号为限制条件
//  var_dump($count);
//    var_dump($tempSQL);

9、关联查询,联表查询

关键字 JOIN ON,这种是内联,跟INNER JOIN ON是一样的

SELECT * FROM phone JOIN product ON phone.id=product.id

左关联:LEFT JOIN ON,以左边的表为主表

SELECT * FROM phone LEFT JOIN product ON phone.id=product.id

右关联:RIGHT JOIN ON,以右边的表为主表

SELECT * FROM phone RIGHT JOIN product ON phone.id=product.id

关键字:AS

SELECT * FROM phone AS ph RIGHT JOIN product AS pr ON ph.id=pr.id;


    $nowPage = isset($_GET['p'])?$_GET['p']:1;  //当前页        
    import('ORG.Util.Page');// 导入分页类
    $Page = new ThinkPage($count,$countPerPage);        // 实例化分页类 传入总记录数,每页数
    $list = $tempSQL2->page($nowPage.','.$Page->listRows)->select();        //查询结果集        
//    var_dump($list);
        
    //分页导航的定制
    $showConfig = array(
        'first'  => '首页',
        'prev'   => '上一页',
        'next'   => '下一页',    
//        'last'   => '尾页',    //这个不行
        'rollPage' => 5,        //最多显示5页导航
    );
    $links = $Page->show( $showConfig );            //分页显示输出
    //var_dump($links);
    //var_dump($list);
    $res['nowP'] = $nowPage;
    $res['totalP'] = $count;
    $res['links'] = $links;            //分页输出
    $res['productList'] = $list;    //数据集
    return $res;
}

二、连接数据库

连接数据库语法上:php版本如果是5.5以上的,我们用mysqli来连接数据库,5.5或5.5以下的用mysql来连接数据库

输出php的版本:echo   phpinfo();     //PHP Version 5.6.14

三、多表查询功能概览

给数据库增加数据:

第一步链接数据库

php版本如果是5.5以上的:支持面向对象的写法

$link=mysqli_connect("localhost","root"," ","users");

mysqli_errno():判断链接数据库是否有错误

if(mysqli_errno($link)){

//抛出错误

print_r(mysqli_error($link));

}else{

echo"连接数据库成功";

}

第二步写添加sql语句:

$sql="INSERT   INTO   phone   (name,price,type)    VALUES    ('魅族',3500,'64G')";

设置编码格式:

设置编码格式方式一:

mysqli_query($link,"set names utf8");

//设置编码格式方式二:

// mysqli_set_charset($link, "utf8");

第三步执行sql语句,添加数据到数据库:

$res=mysqli_query($link, $sql);

if($res){

echo"添加成功";

}else{

echo"添加失败";

}

关闭数据库

mysqli_close($link);

//5.5或5.5以下的用mysql:面向过程写法,不支持面向对象

//mysql_connect("localhost", "root", "");

//mysql_select_db("users");


先来一张截图,要达到的筛选功能大概是这个样子的。

三、数据库的增、删、改、查的函数

图片 1

增加、添加

function    add($sql,$database){

//连接数据库

$link=mysqli_connect("localhost","root","", $database);

//设置编码格式

mysqli_query($link,"set names utf8");

//执行sql语句

$res=mysqli_query($link, $sql);

//获取到添加数据的id

//echo mysqli_insert_id($link);

//获取前一次 MySQL 操作所影响的记录数

//echo mysqli_affected_rows($link);

return    $res;

}

//调用函数

//$sql="INSERT INTO phone (name,price,type) VALUES ('华为',2569,'p9')";

//$res=add($sql,"users");

//if($res){

//echo "添加成功";

//}else{

//echo "添加失败";

//}

其中的数据库设计为:

删除

function   delete($sql,$database){

//连接数据库

$link=mysqli_connect("localhost","root","", $database);

//执行sql语句

$res=mysqli_query($link, $sql);

return    $res;

}

//调用删除

//$sql="DELETE FROM phone WHERE type='64G'";

//$res=delete($sql, "users");

//if($res){

//echo "删除成功";

//}else{

//echo "删除失败";

//}

product表:ProductId-产品ID、name-产品名、sort1-一级分类、sort2-品牌分类、price-价格、onSale-上下架……等等
reserve表:ProductId-产品ID、color-颜色、size-尺码、reserve-库存
tagpro表:Id-自增没实际用途、tagId-标签ID、ProductId-产品ID
tag表:Id-标签ID、tag_name-标签名

更新

function   update($sql,$database){

//连接数据库

$link=mysqli_connect("localhost","root","", $database);

//设置编码格式

mysqli_query($link,"set names utf8");

//执行sql语句

$res=mysqli_query($link, $sql);

return     $res;

}

//调用更新

//$sql="UPDATE phone SET name='金米' WHERE id=8";

//$res=update($sql,"users");

//if($res){

//echo "更新成功";

//}else{

//echo "更新失败";

//}

标签与产品是多对多的关系。在上面展示的分类和搜索中,黑色导航栏、性别以及以后可能扩展的筛选项为标签联表查询,尺码为库存表联表查询。

查询

四、SearchController控制器

只能获取一条数据的函数:

function   getOne($sql,$database){

//连接数据库

$link=mysqli_connect("localhost","root","", $database);

//设置编码格式

mysqli_query($link,"set names utf8");

//执行sql语句,获取结果集

$result=mysqli_query($link, $sql);

//通过结果集拿到结果方式一:

$list=mysqli_fetch_assoc($result);//常用,关联数组的形式

//通过结果集拿到结果方式二:

//$list=mysqli_fetch_row($result);//索引数组的形式

//通过结果集拿到结果方式三:

//$list=mysqli_fetch_array($result);//索引数组和关联数组的形式结合

//通过结果集拿到结果方式四:

//$list=mysqli_fetch_object($result);//对象的格式

//获取查询返回的记录数;

$num=mysqli_num_rows($result);

var_dump($num);

//释放结果集

//mysqli_free_result($result);

if($list){

return    $list;

}else{

return    false;

}

}

//调用查询

//$sql="SELECT * FROM phone WHERE id=14";

//$list=getOne($sql, "users");

//print_r($list);

定义了一个Search控制器,里面有下面几个方法:

获取多条数据

function     getList($sql,$database){

//连接数据库

$link=mysqli_connect("localhost","root","", $database);

//设置编码格式

mysqli_query($link,"set names utf8");

//执行sql语句,获取结果集

$result=mysqli_query($link, $sql);

//通过结果集拿到结果:

while($list=mysqli_fetch_assoc($result)) {

$arr[]=$list;

}

if(!empty($arr)){

return    $arr;

}else{

return    false;

}

}

//调用查询

//$sql="SELECT * FROM phone WHERE name='华为'";

//$list=getList($sql, "users");

//echo    "<pre>";

//print_r($list);

//echo    "</pre>";

function index() 方法是根据上面页面中的筛选选项拼装相应的SQL语句的,提交到ProductController去筛选出相关的产品;

function getCutURL($getKey, $CtrlName=CONTROLLER_NAME) 是为了给页面生成一系列切除了指定get值的URL地址的;

function pageCheck() 如果改变了筛选条件,则去除页码参数,回到从第一页开始;

在我的项目规划中IndexController负责页面的显示,所以IndexController中的 search() 方法则负责搜索页面的展示,代码如下

本文由493333王中王开奖结果发布于网络频道,转载请注明出处:PHP实现产品列表分类筛选与排序的项目实例

关键词: