PHP查詢到的數(shù)據(jù)存放到數(shù)組里面,一般使用$arr[]=$row的方式實現(xiàn),$row是mysql_fetch_array獲得的一行數(shù)據(jù),本身是一個數(shù)組,執(zhí)行上面的語句之后,這一行會添加存放在額為數(shù)組$arr的最后。
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有福海免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
典型的例子代碼是這樣的:
mysql_connect('127.0.0.1',?'root',?'123456');
$sql='select?*?from?test.tab';
if?($res=mysql_query($sql)){
while($row=mysql_fetch_array($res))?$result[]=$row;
mysql_free_resule($res);
}else?echo?"執(zhí)行SQL語句:$sqlbr\n錯誤:".mysql_error();
echo?'查詢結(jié)果在下面的額為數(shù)組里面:pre';
print_r($result);
echo?'/pre';
下面的代碼可以查詢單個數(shù)據(jù)庫的所有表的指定的字段內(nèi)容,如何才能實現(xiàn)多個數(shù)據(jù)庫一起查詢相同字段的內(nèi)容,每個數(shù)據(jù)庫字段都一樣,表都是100+個。并且下面的代碼雖然能查詢單個數(shù)據(jù)庫所有表的內(nèi)容,但是查詢一次耗費時間很長,該怎么樣優(yōu)化才能加快速度,不然假設(shè)多個數(shù)據(jù)庫一起查詢實現(xiàn)了,該會變得多卡。
$i=1; //初始一個變量iwhile($i=100) //當(dāng)變量i小于等于100時都執(zhí)行{ $query ="select * from 表".$i." where 字段1=". $textfield; $row =mssql_query($query); $i++; //變量i遞增運算//輸出查詢結(jié)果while($list=mssql_fetch_array($row)){ //print_r($list);echo '賬號:',$list['字段1'];echo '--〉昵稱:',$list['字段2'];echo '--〉密碼:',$list['字段3']; echo '/br';}} }
該方法是根據(jù)一個條件查詢一個集合
$admin=Admin::model()-findAll($condition,$params);
$admin=Admin::model()-findAll("username=:name",array(":name"=$username));
$admin=Admin::model()-findAll(“username=:name and age=:age” , array(“:name”=$name, “age”=$age));
$admin=Admin::model()-findAll(“username like :name and age=:age” , array(“:name”=$name, “age”=$age));
$infoArr= NewsList::model()-findAll("status = '1' ORDER BY id DESC limit 10 ");
PHP+Mysql多條件多值查詢示例代碼:
index.html代碼:
!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"
html
head
meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"
titleSQL多條件查詢示例/title
/head
body
form?method="post"?action="deal.php"
h1房屋出租/h1
房屋類型:select?name="type"
option?value="1"一居室/option
option?value="2"二居室/option
option?value="3"三居室/option
/selectbr/
面積:input?name="area"?type="text"/br/
地址:input?name="addr"?type="text"/br/
input?name="btn"?type="submit"?value="搜索"?/br/
/form
/body
/html
deal.php文件:
?php
//連接數(shù)據(jù)庫
$conn=mysql_connect("localhost","root","");
//選擇數(shù)據(jù)庫
$db=mysql_select_db("數(shù)據(jù)庫名");
//接收?參數(shù)
$type=$_POST['type'];
$area=$_POST['area'];
$addr=$_POST['addr'];
//SQL語句主題
$query="select?*?from?room??where?";?
//根據(jù)條件和傳的值拼接sql語句
//判斷面積不為空
if($type!=""){
//然后根據(jù)具體面積分情況拼接
switch($type){
case?1:
//一居室
$query.="?room_type=1";?
break;
case?2:
$query.="?room_type=2";
break;
case?3:
$query.="?room_type=3";
break;
}
}
//面積
if($area!=""){
$query.="?and?area?={$area}";
}
//地址
if($addr!=""){
$query.="?and?addr?like?'%{$addr}%'";?//地址
}
//執(zhí)行查詢
$result=mysql_query($query);
//遍歷結(jié)果
echo?"搜搜結(jié)果如下:";
while($row=mysql_fetch_array($result)){
echo?"地址:".$row['addr'];
echo?"br/";
echo?"面積:".$row['area'];
echo?"br/";
echo?"居室:".$row['type'];
echo?"br/";
echo?"價格:".$row['addr'];
echo?"br/";
//等等
}
?
根據(jù)你設(shè)定的條件, keyword參數(shù)必須是數(shù)字才會把它當(dāng)作username去查詢,而如果不是數(shù)字,則查詢?nèi)?。所以,第一步,你?yīng)該把紅色框里第二行的那個if語句整行刪掉,然后第三行要改為:
..... 'username="'.$_POST['keyword'].'"';
在PHP-FPM處理HTTP請求時,有時會遇到一個請求需要進行多次MySQL查詢(在報表類應(yīng)用中比較常見)。通常我們會以串行方式查詢:
$link?=?new?mysqli();
$rs1?=?$link-query('SELECT?*?FROM?table1');
while?($row?=?$rs1-fetch_row())?{?...?}
$rs2?=?$link-query('SELECT?*?FROM?table2');
while?($row?=?$rs2-fetch_row())?{?...?}
$rs3?=?$link-query('SELECT?*?FROM?table3');
while?($row?=?$rs3-fetch_row())?{?...?}
串行查詢方式有個缺點:在MySQL返回數(shù)據(jù)之前,PHP一直是處于空等的狀態(tài),不會繼續(xù)往后執(zhí)行。如果數(shù)據(jù)量大或者查詢復(fù)雜,MySQL響應(yīng)可能會比較慢,那么以串行方式查詢會有一些延遲。給用戶最直接的感受就是 Loading… 的圈圈一直打轉(zhuǎn)。
那么有什么辦法可以減少查詢MySQL的時間?用多進程并行查詢不行,因為PHP-FPM 中不允許用 pcntl_fork 一類的調(diào)用。
幸好還有 mysqlnd,mysqlnd提供了類似 stream_select 的機制(見 這篇文章) ,可以做到在單進程中對MySQL并行查詢。這主要運用了mysqli_poll 和 reap_async_query 兩個函數(shù)。
還是通過例子來介紹MySQL并行查詢的實施方法。假設(shè)要并行地向MySQL發(fā)出10個查詢,最基本的代碼應(yīng)該是這樣的:
1.??$links?=?[];
2.??for?($i?=?0;?$i?!==?10;?$i++)?{
3.??????$links[$i]?=?new?mysqli('127.0.0.1',?'user',?'password',?'db1');
4.??????$links[$i]-query('SELECT?SLEEP(1)',?MYSQLI_ASYNC);
5.??}
6.??$allResult?=?[];
7.??while?(!empty($links))?{
8.??????$reads?=?$links;
9.??????$errors?=?$reject?=?[];
10.?????if?(!mysqli_poll($reads,?$errors,?$reject,?null))?{
11.?????????continue;
12.?????}
13.?????foreach?($reads?as?$read)?{
14.?????????$idx?=?array_search($read,?$links,?true);
15.?????????$allResult[$idx]?=?[];
16.?????????$result?=?$read-reap_async_query();
17.?????????while?($row?=?$result-fetch_row())?{
18.?????????????$allResult[$idx][]?=?$row;
19.?????????}
20.?????????$read-close();
21.?????????unset($links[$idx]);
22.?????}
23.?}
解釋下這段代碼的含義:
2~5行,同時發(fā)起10個MySQL連接,并發(fā)出查詢
注意query() 的第二個參數(shù)帶上了 MYSQLI_ASYNC 表示非阻塞查詢
10行,使用mysqli_poll 輪詢10個連接的查詢有無返回
mysqli_poll 的第一個參數(shù)$reads是個數(shù)組,包含需要輪詢那些連接。mysqli_poll 執(zhí)行完后,會改寫$reads,改寫后$reads包含的是那些已經(jīng)有數(shù)據(jù)返回連接。
mysqli_poll的第四個參數(shù),控制的是輪詢的等待時間,單位是“秒”。如果像本例當(dāng)中設(shè)置為null,那么mysqli_poll輪詢是阻塞的:只有監(jiān)聽的連接中,任意一個連接有數(shù)據(jù)返回了,mysqli_poll才會返回。如果等待時間設(shè)置為0,那么每次執(zhí)行mysqli_poll會立即返回,外層的while會頻繁循環(huán)。
第11~19行,遍歷已經(jīng)有數(shù)據(jù)返回的連接
reap_async_query和普通query一樣,返回的是mysqli_result,可以一行行fetch數(shù)據(jù)
20~21行,對于已經(jīng)獲得了數(shù)據(jù)的連接,下次mysqli_poll就不需要再輪詢這個連接了,所以關(guān)閉連接,并從$links數(shù)組刪除這個連接
當(dāng)所有的連接都返回了數(shù)據(jù),$links數(shù)組空了,while循環(huán)也就終止了。
使用并行查詢的方式,可以大大縮短處理HTTP請求的時間,假設(shè)本例中的10個SQL查詢,每個需要執(zhí)行1秒。因為是并行,處理所有的查詢,也只需要1秒左右。