摘要: 模糊查詢技術、分頁技術、App介面
1、分頁問題
關鍵技術點:php執行sql語句。示例:“SELECT * FROM hotel WHERE subject=`10` and address like `%杭州%` LIMIT 0,4”。注意:LIMIT後需要跟2個數字,1個是起始位置,2是結束位置。
複製程式碼
可以對limit函式進行封裝:select *from user limit (page-1)size,pagesize;
單例模式編寫App介面的注意點:
(1)、php後臺獲取引數,之後根據引數轉換成SQL語句;
(2)、php執行SQL語句,將結果轉換成JSON,返回給客戶端
複製程式碼
2、模糊搜尋
SQL匹配模式(開發中應用最多的一種):
複製程式碼
(1)、使用SQL匹配模式,不能使用操作符 = 或 != ,而是使用操作符LIKE或者NOT LIKE
(2)、使用SQL匹配模式,MySQL提供了2種萬用字元。
%:表示任意數量的任意字元(包括0個)
_:表示任意的單個字元
例子:u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”。如果要找回包含“三”和“貓”的紀錄
“select *from user where u_name LIKE `%三%` and u_name LIKE `%貓%`;
若使用“select *from user where u_name LIKE `%三%貓%`;”只能找出:三腳貓
複製程式碼
(3)、使用SQL匹配模式,如果匹配格式當中不包含以上2種萬用字元中的任意1個,其查詢效果等同於= 或 !=
(4)、使用SQL匹配模式,預設情況下是不區分大小寫的
正規表示式匹配模式(不推薦):
(1)、 []:表示括號內所列字元中的一個:指定一個字元、字串或範圍,要求所匹配物件為它們中的任意一個
比如 SELECT * FROM [user] WHERE u_name LIKE `[張李王]三`。將找出“張三”、“李三”、“王三”(而不是“張李王三”);
比如[ ] 內有一系列字元(01234、abcde之類的)則可略寫為“0-4”、“a-e”。SELECT * FROM [user] WHERE u_name LIKE `老[1-9]`-> 將找出“老1”、“老2”、……、“老9”;
(2)、[^]:表示不在括號所列之內的單個字元。其取值和[]相同,要求匹配物件為指定字元以外的任意一個字元
比如 SELECT * FROM [user] WHERE u_name LIKE `[^張李王]三`。將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等
複製程式碼
(3)、.:匹配任意的單個字元
(4)、^:表示以某個字元或字串開頭。^a:以a開頭
(5)、$:表示以某個字元或字串結尾。s$:以s結尾
(6)、*:匹配0個或多個在它前面的字元
使用正規表示式匹配的操作符是:REGEXP和NOT REGEXP(RLIKE或NOT RLIKE)
注意啊:正規表示式和SQl匹配模式工作原理不一樣:正則只要匹配出符合條件就馬上算成功;而SQl需要嚴格匹配。比如同樣需要寫從酒店表中拿出地址中包含“杭州”的酒店
SQL:SELECT *FROM hotel WHERE address LIKE `%杭州%`;
正則:SELECT FROM hotel WHERE address REGEXP `^[杭][州]’;
需要特別注意的是:如果所查詢的內容包含萬用字元時,導致我們查詢”%”,”_”,”[“的語句無法正常實現。因此我們需要特殊處理。
需要特別注意的是:如果所查詢的內容包含萬用字元時,導致我們查詢”%”,”_”,”[“的語句無法正常實現。因此我們需要特殊處理。
function sql_encode($sql){
$sql = replace($sql,"[","[[]");
$sql = replace($sql,"%","[%]");
$sql = replace($sql,"_","[_]");
return $sql;
}
複製程式碼
最後貼一個利用模糊查詢實現分頁查詢的介面。
<?php
/**
* Created by PhpStorm.
* User: geek
* Date: 2017/2/20
* Time: 上午9:15
*/
header(`content-type:text.html;charset=utf-8`);
error_reporting(0);
require_once `../../model/PdoMySQL.class.php`;
require_once `../../model/config.php`;
require_once `Response.php`;
class HotelList
{
private $tableName = "hotel";
private $telephone = "";
private $cityName= "";
private $subjectId = "";
private $page = 0;
private $size = 0;
protected static $_instance = null;
protected function __construct()
{
}
protected function __clone()
{
// TODO: Implement __clone() method.
}
public function getInstance()
{
if (self::$_instance === null) {
self::$_instance = new self();
}
return self::$_instance;
}
function getHotels()
{
self.$this->telephone = $_REQUEST["telephone"];
self.$this->subjectId = $_REQUEST["subjectId"];
self.$this->cityName = $_REQUEST["cityName"];
self.$this->page = $_REQUEST["page"];
self.$this->size = $_REQUEST["size"];
$mysqlPdo = new PdoMySQL();
if($this->telephone == ""){
Response::show(201,"fail","非安全的資料請求","json");
}
$userRows = $mysqlPdo->find("user","telephone=`$this- >telephone`");
if($userRows[0]["telephone"] != $this->telephone){
Response::show(201,"fail","非安全的資料請求","json");
}
$city = str_replace("市","",$this->cityName);
$allrows = $mysqlPdo->find($this->tableName,"subject=`$this->subjectId` and address like `%$city%`","","","","",[(intval($this->page)-1)*intval($this->size),intval($this->page)*intval($this->size)]);
Response::show(200,`酒店列表獲取成功`,$allrows,`json`);
}
}
$lister = HotelList::getInstance();
$lister->getHotels();
複製程式碼
其中:Respone和PdoMySQL的2個類分別是介面資料展示的類和PDO操作的一個封裝。
如果有需要請留下郵箱。