2015年3月31日

[教學] PHP & MySQL 學習筆記 第九堂(資料庫建置:搜尋並篩選資料庫的資料後呈現於網頁)

非常抱歉,關於部落格內 PHP 的部分目前已經停止維護,因本人已經很久沒有寫 PHP ,且文章中所使用的 PHP 版本偏舊,希望有心學習 PHP 的朋友們,可以參考 Codecademy 的課程,或近一步嘗試 Laravel 這個 PHP 框架(可透過 laracasts 學習),若有找不到錯的學習資源也歡迎在留言串分享,方便有需要的人能夠有更多學習的管道!
在這一堂課我們會沿用上堂課所使用的資料庫,透過語法來練習怎麼樣篩選資料,並把篩選後資料呈現於網頁上。

結果可以看這裡

本次會學習到的函數共包含:

mysql_query("select * from 資料表名稱 where 欄位名稱=' 篩選條件'"):篩選出等同於「篩選條件」的資料
mysql_query("select * from 資料表名稱 where 欄位名稱 like % '篩選條件'%"):篩選具有「篩選條件」的資料

我們使用上一堂課所建立的資料庫繼續練習。

資料篩選

精確搜尋

篩選資料時,我們同樣會用到mysql_query的語法,這個語法的意思就類似「我告訴你」,然後後在輸入要告訴它的內容,這裡我希望它幫我篩選只呈現女生的資料,我們就可以用這樣的語法:mysql_query("select * from 資料表名稱 where 欄位名稱=' 篩選條件'"),套到我們的資料庫就是,mysql_query("select * from member where memSex='女' "),這樣的作法,其時做的是「精確搜尋」。


這樣在echo的時候,就只會呈現出性別為女的資料。


模糊搜尋

如果我是要在地址中篩選有「南」的資料,則可以輸入:
$data=mysql_query("select * from member where memCity like '%%'")

使用like和%就可以做模糊搜尋,只要城市裡面有南,不管這個是在第一個字,第二個,還是第三個,資料都會呈現:


透過類似的方法,如果我們輸入的是("select * from member where memCity like '%南'"),則會篩選出前面可以隨便,但最後一個字一定要是南。

如果是輸入("select * from member where memCity like '南%'"),則會篩選出後面可以隨便,但第一個字一定要是南的資料。
讓網友自訂篩選條件

既然我們知道篩選的語法了,那我們就要設計一個介面,讓網友可以自行篩選他想要的資料才對,該怎麼做呢?

一樣要先建立一個表單。


目標空白,就是傳送給自己的意思


這裡表單中所輸入的資料,我把它稱做city


透過if指令,即可達成根據網友輸入的資料加以進行模糊搜尋(若要進行精確搜尋,則不要加上%),這段語法的意思是,如果網友有輸入資料($_POST['city'] != ' ')則將城市根據網友所輸入的值進行模糊篩選,否則呈現所有的資料。


這時候,透過預覽,網頁就已經會根據你所輸入的資料加以搜尋了。

這裡還有一個很特別的地方,是文字框的預設值,在剛剛的預覽中,你會發現,當你點完搜尋後,搜尋框的內容就消失了,這點其實蠻不符合直覺的,為了修正這一點,我們可以去修改文字框內的預設值。

這裡先隨便打個abc,讓我們知道預設值的語法在程式碼的哪裡


預設值是value,我們把value裡的東西改成$city,因為在前面的php語法中,我們已經定義$city = $_POST['city'],也就是文字框內輸入的資料,所以當預設值等同於city時,搜尋框內預設值,就會變成是我們剛剛搜尋的內容。



我們也可以讓網友根據性別加以篩選

一樣先建立表單
 讓不拘變成預設核取的狀態


接著,我把按鈕名稱,取做sex,並且修改各自的value


最後在最上面的地方修改程式碼,把它改成
if($_POST['city'] != '' or $_POST['sex']!= ' '),意思是只要city的文字框或sex的核取按鈕有被選取的話(不是空白),則執行下面的語法,而下面的語法新增一行and memSex = '$sex',這樣就可以了。


按下搜尋時,網頁就會根據搜尋的指令加以搜尋了。

這堂課完整的語法如下

<?php
mysql_connect("localhost","root","12345678");//連結伺服器
mysql_select_db("contact");//選擇資料庫
mysql_query("set names utf8");//以utf8讀取資料,讓資料可以讀取中文
if($_POST['city']!='' or $_POST['sex']!=''){
 $city=$_POST['city'];
 $sex=$_POST['sex'];
 $data=mysql_query("select * from member where memCity like '%$city%' and memSex like '$sex'"); 
}else{
 $data=mysql_query("select * from member");
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>資料篩選</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="">
  <p>城市:
    <input name="city" type="text" id="city" value="<?php echo $city?>" />
  </p>
  <p>
    <input name="sex" type="radio" id="radio" value="%" checked="checked" />
  不拘
  <input type="radio" name="sex" id="radio2" value="男" />
  男
  <input type="radio" name="sex" id="radio3" value="女" />
  女</p>
  <p>
    <input type="submit" name="button" id="button" value="搜尋" />
  </p>
</form>
<p></p>
<table width="700" border="1">
   <tr>
    <td >編號</td>
    <td >姓名</td>
    <td >性別</td>
    <td >生日</td>
    <td >地址</td>
    <td >城市</td>
    <td >國籍</td>
    <td>郵遞區號</td>
    <td >電話</td>
    <td>備註</td>
  </tr>
  <?php
  for($i=1;$i<=mysql_num_rows($data);$i++){
$rs=mysql_fetch_row($data);
?>
  <tr>
    <td><?php echo $rs[0]?></td>
    <td><?php echo $rs[1]?></td>
    <td><?php echo $rs[2]?></td>
    <td><?php echo $rs[3]?></td>
    <td><?php echo $rs[4]?></td>
    <td><?php echo $rs[5]?></td>
    <td><?php echo $rs[6]?></td>
    <td><?php echo $rs[7]?></td>
    <td><?php echo $rs[8]?></td>
    <td><?php echo $rs[9]?></td>
  </tr>
  
  <?php
}
?>
</table>
<p>&nbsp;</p>
</body>
</html>

結果
結果可以看這裡


以上內容均為本人在馬老師雲端研究室學習所整理之筆記

3 則留言:

  1. 您好! 請問若想尋找台北+台中的人要怎麼寫呢?

    回覆刪除
    回覆
    1. Hi,你指的是臺北或台中人嗎?
      select * from member where memCity ='台北' or memCity ='台中'

      刪除
  2. 您好,感謝您的分享,受益無窮阿!
    但是想請問您要怎麼把寫好的成果放到網路上供別人使用呢?
    像您文末結果中的「這裡」一樣能夠有個連結
    摸索了一天還是不知道該怎麼用> <

    回覆刪除