+===================================================================+ + 專題 + +===================================================================+ 台北市立師範學院 指導老師: 賴阿福 老師 學生:周凡淇 班級:數三 A 學號:863007 E-mail: nora@math.tmtc.edu.tw ms863007@mail2.tmtc.edu.tw 一、前言 【 本網頁建構於 FreeBSD 3.4 + Apache 1.3.11 + mysql-3.22.27 】 1. 本系的首頁最下方寫著這幾個不起眼的字。 先從FreeBSD說起,簡單的說,FreeBSD就是一個作業系統,正如其名 "Free",它是不用錢的,but...,它好像和我們的日常生活沒有關係 。其實很多時候大家都用過它,我們的市師 BBS 官方站 "松梅戀曲 就建構於 FreeBSD 上,還有學校的 Name Server ( DNS )當然,數 理系的網站、資料庫、 BBS(阿基米德)都建構在 FreeBSD 上。 為什麼要建構於 FreeBSD 而不選擇強大的 Windows 2000 Server版 ? 在數理系簡單的配備( 感謝立德的主機版、硬碟還有長峻的 cpu)下 FreeBSD 能比 Windows 2000 發揮出強很多的效能,除此之外還有授 權費,十人版(最多十人同時上線)的 Windows 2000 Server好像要 十多萬元,與其拿十多萬去買授權不如用這些錢來增加硬體。 結論:一個強大的 OS 。 2. Apache,中文翻作阿帕契,小學六年級時波灣戰爭時常聽到的直昇機名字。 就是拿來建置WWW網站的一個軟體啦~,跟 FreeBSD 一樣,是不用錢的 ,哪裡有裝呢?學校的 mail2 就有啦~~,在自己的目錄下建一個 pub_html ,把網頁放進去,在 IE 或 NS 上打 http://mail2.tmtc.edu.tw/~msxxxxxx 就可看到自己做的網頁, 這就是 Apache 的功用。 目前世界上的占有率大概是 60%,世界第一。 3. mysql--->唸作 my ess q l ,這是極正確的唸法,但是我認識的人中 只有我會這樣子唸,其它人都是唸 my si qual,無妨。 Mysql,一個資料庫的名稱,如同微軟的 Access 一樣,是一個資料庫。 只要不是在商業用途上都不需付費,它是所有資料庫中最陽春的一種資料 庫,也很容易學,要做出如數理系那樣子的學生搜尋引擎用的函數大概是 五個左右,再用程式去美化一下,要做出如接近奇摩站那般的搜尋引擎是 不難的。 4. PHP是一種伺服端(server-side),跨平台(cross-platform),簡單易學的 HTML嵌入式非編譯性語言(HTML embedded scripting language)。它通過 模組(module)的形式和Apache伺服器結合,提供多種連結資料庫的介面, 如MySQL,mSQL,PostgreSQL,Sybase ,Informix,InterBase等。 以四行上摘自 http://mark.ee.nctu.edu.tw:8888/php3/doc/ 伺服端:也就是說它會在 Server 端執行完畢再把結果送給 client 端 無疑的,這會加重 Server 的負載 (loading),以前的電腦網 路課應該有學過,把一些不必要的計算送給 client 端去計算 可以避免 Server 端過重的負載,進而加快速度。 跨平台:就是說在很多種 OS 上都可以用, Win 98 也可以,只是我沒 試過。 模組:這個……,不太清楚,在我的概念裡就像是一個模子,有需要用到 的時候就灌一個出來用…??在 FreeBSD 下的說法:模組,要用的 時候再掛上去~~??例如我現在要聽音樂,那麼我就把模組掛上, 這樣子才能聽,不用的時候就拿掉,才不會佔系統的資源,我不知 道有沒有一樣~~,一個頭兩個大。 二、安裝:假設你已經灌完 FreeBSD 1. 先找到套件,數理系 FTP 上有 位址: ftp://163.21.240.83/sourcecode/ 裡面有 apache_1.3.12.tar.gz mysql-3.22.32.tar.gz php-3.0.15.tar.gz 以 root 的權限來做。 先把以上套件抓到 /tmp 下面。 然後解壓縮 tar zxvf apache_1.3.12.tar.gz------------>解壓縮 tar zxvf mysql-3.22.32.tar.gz------------>解壓縮 tar zxvf php-3.0.15.tar.gz--------------->解壓縮 以上解壓縮完之後應該會出現三個目錄 apache_1.3.12 mysql-3.22.32 php-3.0.15 2. 先裝 mysql cd mysql-3.22.32,到 mysql 的目錄下 執行 ./configure --help ,會有簡單的英文解說,把你要用到的記錄下來。 執行 ./configure --prefix=/usr/local --localstatedir=/usr/local/var --with-named-thread-libs=-lc_r --with-charset=big5 以上兩行在輸入時請打成一行(就是不要管,一直打下去,直到打完) 執行完畢後 鍵入 make -------->編譯。 執行完畢後 鍵入 make install -------->把檔案裝到該裝的目錄,如我們用 --prefix=/usr/local 來指定安裝的目錄 make install 就會把檔案裝到這裡。 然後,在原始碼的目錄下 cd scripts 執行 mysql_install_db OK 3. 再來安裝 apache + php3 到 apache_1.3.12 的目錄下。 執行 ./configure --prefix=/home/apache 指定安裝的目錄。 cd .. 到上一層 cd php-3.0.15--------->到php3 的原始碼目錄下 ./configure --with-mysql=/usr/local --with-apache=../apache_1.3.12 然後鍵入 make 再鍵入 make install cd .. 到上一層 cd apache_1.3.12 到apache 的目錄下 ./configure --prefix=/home/apache --activate-module=src/modules/php3 /libphp3.a 執行 make 執行 make install 然後修改 Apache 的設定檔在 /home/apache/conf 裡面的 httpd.conf 找到 DirectoryIndex index.html ,在後面加上 index.php3 再找到 AddType application/x-httpd-php3 .php3 改完儲存。 然後到你解開 php3 原始碼的目錄下 執行 cp php3.ini-dist /usr/local/lib/php3.ini 這樣子就行 由於我們只做資料庫和 php 的結和,如果要做到和數理系一樣的 WebMail 那就不只是這麼簡單,有一大段路要走~~,那真的是非常非常的麻煩! 所以,略過不說。 三、Mysql 照之前安裝的步驟,mysql 在 /usr/local/share/mysql 的地方。 mysql 的指令就不要說太多,說幾個就好,剩下的我們就自己寫一個 php3 的程式來幫我們做,不然的話,以數理系的學生名單存入為例,每加入一個 學生我們都要打一次: INSERT INTO studentDB (id, name, no) VALUES ('', '周凡淇', '863007') 這樣子啟不是會昏倒,當初我打了一百八十份的資料,雖然說複製貼上很方便 ,但是,如果照這樣子去做真的會死掉。而且這個只有三個欄位 id name no, 等會再說如何用 php3 來自己寫一個方便的小程式來存入資料。 1、開始執行 mysql 到 /usr/loca/share/mysql 中 執行 chmod +x mysql.server 把 mysql.server 加入可執行的屬性 然後執行 ./mysql.server start 這樣子就可以開始使用了。 要進入資料庫的話就執行 mysql 就會進入 mysql> 這樣子就可以開始用啦! 要離開的話就按 exit 再按 Enter 即可。 註: chmod +x 是用來加入"可執行"的屬性。 2、設定密碼 SET PASSWORD FOR root=PASSWD('密碼'); 要記得設定密碼,不然任何人都可以透過 php3 存取你的資料庫 ; --->用來結束命令用的,在 mysql> 裡面 Enter 只是用來斷行 讓你容易看而已,並不是用來執行命令,一定要在最後加上一個分號 再按 Enter 才會去執行。 註: PASSWD('密碼'),是一個函數,用來加密的。 3、開一個資料庫 mysql>CREATE DATABASE 資料庫名稱 ; 如 mysql>create database Students; 除了資料庫名稱外,其它大小寫沒差。 4、在資料庫中開一個資料表。 mysql> use 資料庫名稱; mysql> CREATE TABLE 資料表名稱(欄位的定義) 欄位的定義很多,以數理學生資料庫為例,只用到了三種。 mysql>CREATE TABLE studentsDB (id INT (6) not null AUTO_INCREMENT, name VARCHAR (20) not null, no INT (7) not null , PRIMARY KEY (id) ) ; 這一行所代表的意思是說,開了一個叫做 studentsDB 的 table ,而裡面 有 id, name , no 等三個欄位, 而欄位名稱後面的是代表欄位的屬性。 如下: a.id INT (6) not null AUTO_INCREMENT就是說,它被定義為 int 即整 數,佔了 6 個位元組, not null 就是不允許資料為空資料,也就是 說,插入資料時一定要有數據。 b.name VARCHAR (20) not null varchar (20),每個欄位所佔的位元組是 20 ,但是如果長度不滿 20 設其長度為 n ,則實際佔的空間是 n+1 ,最後一個位元組用來 記錄其長度。 c.id:設為 PRIMARY KEY即主鍵,具有唯一性,可用來做為連外鍵。 它是設計用來減少資料的重覆性的,即可以做為連外鍵。 我再印我的筆出來給你們看好了,用打的實在說的不清楚。 四、 資料庫的結構 +-----+----------+--------+ | id | name | no | +-----+----------+--------+ | 1 | 許\\育瑋 | 883001 | | 2 | 郭士豪 | 883002 | | 3 | 柯政宏 | 883003 | | 4 | 陳皇印 | 883004 | | 5 | 許\振一 | 883005 | +-----+----------+--------+ 這樣子就是一個小小的資料庫中的資料表。 這是放在 Students 的 資料庫(Database) 中的一個 資料表(table)。 最頂端的 id name no 就是代表三個名為 id , name,no 的欄位。 Students____________studentDB |_______86studentDB |_______87studentDB Students 就是一個資料庫,裡面包含了 studentDB 、 86studentDB、87studentDB 等資料表。 介紹一下選取資料的語法。 選取資料的語法相當的英文。真的很英文,就連我這個英文比彥宏爛的人都 看得懂。 以上面的資料庫為例,我想要找出學號為 883003 的姓名只要下 mysql> use students; ------>先用 Students 這個資料庫 mysql> select name from studentDB where no='883003'; ----->再從 studentDB 來找 no 為 883003 的 name。 這樣子就會得到下面的結果 +--------+ | name | +--------+ | 柯政宏 | +--------+ 1 row in set (0.01 sec) 想要找出學號為883004這個人的 id 、 name 還有 no 只要下 mysql> select id,name,no from studentDB where no='883004'; 就會得到下面的結果 +----+--------+--------+ | id | name | no | +----+--------+--------+ | 4 | 陳皇印 | 883004 | +----+--------+--------+ 1 row in set (0.00 sec) 夠英文吧! 要找出所有名字裡面有"陳"這個字的呢? 就下 mysql> select id,name,no from studentDB where name like "%陳%"; % 為"任何"長度的萬用字元。 得到的結果如下 +-----+--------+--------+ | id | name | no | +-----+--------+--------+ | 4 | 陳皇印 | 883004 | | 7 | 陳正一 | 883009 | | 37 | 陳慶峰 | 883044 | | 56 | 陳永祥 | 883061 | | 57 | 陳信文 | 883062 | | 67 | 陳崇文 | 883073 | | 76 | 陳彥竹 | 883082 | | 80 | 陳建良 | 883086 | | 99 | 陳智凱 | 883108 | | 114 | 陳科良 | 873004 | | 121 | 陳盈帆 | 873011 | | 125 | 陳邵瑜 | 873016 | | 137 | 陳文迪 | 873029 | | 147 | 陳雪玉 | 873083 | | 154 | 陳建良 | 873047 | | 156 | 陳佳興 | 873049 | | 171 | 陳威駿 | 873064 | | 187 | 陳怡文 | 873082 | +-----+--------+--------+ 18 rows in set (0.00 sec) 如何?夠英文吧~~。(好冷……) 後記: 只可惜我的筆記實在是太難看了,除了我之外,這個世界上大概很難找到 第二個看得懂的,不然我就直接把筆記印出來,可以說資料庫的精華都在 裡面了(我還沒有看完,不過快了,只是春假央圖沒開,不然我這個春假就 可以結束了)。 資料庫的重要關念就是【存入資料】和【讀出資料】,存入資料有許多要 考慮的地方,考慮資料的重覆性,重覆性太高就用關聯性資料庫,但是使 用關聯性資料庫又會在速度上打折扣 (其實不用考慮這麼多,這些是在資 料量非常龐大的時候才需要用到,如企業用途……) 五、實做 #############################資料庫匯入############################# 以下是數理系的資料庫存入的程式~~ 我寫的~~嘿嘿,不過寫的很爛~,當初 VB 沒學好~~。 數理系學生資料庫匯入

 

 

姓名:

學號:
這裡只說一個東西,那就是
姓名:

學號: 這樣子的程式會送出一個叫做 $username 和 $no 的變數,送到 input.php3 $username 的值就是你在網頁上填入的東西 $no 也是 註: $ 加上英文 就是代表變數的意思,但是不會很嚴格 你指定 $no=5656 ,那麼 $no 就是一個 integer 的變數 不用像我們以前寫 VB 的時候要指定變數的型態。 剩下的 html 碼,請自己看。 php 起啟的地方 $absname=addslashes($username); $link=mysql_connect("localhost","root","密碼"); mysql_select_db("Students",$link); $str = "insert into studentDB (name,no) values ('$absname','$no')"; mysql_query($str,$link); ?> ------------> php 結束的地方 再來說說 php 的函數 addslashes($username) 這個 addslahes 是用來處理特殊字元的。 因為中文是由兩個字元組合而成,而有些字的字元裡帶有 \ 而 \ 在 php3 中是有特殊意義,所以用這個函數把所有帶有 \ 這個字元的字 在最後面加上一個 \ ,這就是為什麼剛剛說的範例中許的後面有 \ 。 $link=mysql_connect("localhost","root","密碼"); mysql_connect : 用 root 這個身份,密碼是 "密碼" ,連到 localhost 的 資料庫裡。 $str = "insert into studentDB (name,no) values ('$absname','$no')"; 這只是字串。 把 '$absname' 和 '$no' 存到 studentDB 這個資料表的 name 和 no 這兩個 欄位。 最後用 mysql_query($str,$link) 把上面那兩行給合起來。 這樣子就是一個簡單的資料匯入程式。 ##################################################################################### 以下是搜尋的程式碼。
輸入任何關鍵字:
到這裡為止,和上一個資料庫的匯入相同。 php 的起始地方。 $absname=addslashes($username); -----------------------> 每個要執行的地方都要有分號。 addslashes 這個 function 和之前說的一樣。 $link=mysql_pconnect("localhost","root","密碼"); mysql_select_db("Students",$link); 這邊也是之前說過的。 $namestr="select name from studentDB where name like'%$absname%' or no like '%$absname%'"; $nostr="select no from studentDB where name like '%$absname%' or no like '%$absname%'"; 這兩個是用來搜尋字串的 mysql 語法。 "select name from studentDB where name like'%$absname%' or no like '%$absname%'"; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "select no from studentDB where name like '%$absname%' or no like '%$absname%'"; %$absname% ----->任何和輸入的關鍵字相似(like)的字串 $rname=mysql_query($namestr,$link); $rno=mysql_query($nostr,$link); mysql_query ---->傳回一個整數 這兩個也和之前說過的一樣 $i=mysql_num_rows($rno); mysql_num_rows ----->算出 $rno 所得到的資料表共有幾列。 讓使用者知道有多少個搜尋結果。 echo ""; -----------> echo 印出 echo "您所搜尋的結果有"; echo $i; echo "個"; echo "
"; echo "
"; $j=1; while($j<=$i) { --------->迴圈,和vb一樣,只是寫法不同。 $color=array('#CCCCFF','#FFCCFF','#FFFFCC','#CCFFFF','#CCFFCC','#ffffff','#cccccc'); 這是一個陣列,加上下面那一行可以造出用亂數來表示顏色。 $c=mt_rand(0,6); list($sname)=mysql_fetch_row($rname); list($sno)=mysql_fetch_row($rno); mysql_fetch_row (int result);---->從 mysql_query 傳回的整數來抓取一行,傳回值是陣列。 list 不是一個函數,是一個 php3 的語法(使用手冊寫的) 也是一個陣列。 $cbsname=StripSlashes($sname); StripSlashes ------------->記得之前把特殊字元的後面加上一個 / 嗎? 這個函數就是用來把 \ 這個字元砍掉的,這樣子出來的 果會比較好看。 echo "
";echo $sno;echo " ";echo $cbsname;echo " ";echo $sex[$s];echo "
"; $j=$j+1; } ?> 大致上就是這個樣子,如果是留言板的話,就按照這個模式把欄位擴充,例如姓名啦~~,學號啦 職業啦~~,等等等,就是這樣子,有些東西只要在程式碼中多加一點,資料庫的空間就不會佔那 麼大,查詢速度也會快一點。例如老師的資料庫查詢,姓別就用0和1來代表就好,只要加個小程 式 if ($sex="0") { echo "公的"; } else { echo "母的"; } 就這樣子~~,留言板的理念也是如此,留言板嘛,就是讓人留下言,要看的人就再把別人留的言 給叫出來,just 這樣子,不過這只是小地方的用處啦,真的要在企業上用就沒有那麼簡單,要 考慮的東西不少,包括擴充性啦~~,等等等。 我們再來看一個計數器的例子~。 理念也是一樣,先在一個資料庫中開一個資料表,在裡面放入一個值。 在網頁中加入這一段,每進去一次就在那個資料表中加一。 就這樣,沒了。簡單吧~。 因為 vb 沒學好,嘿嘿嘿~~~ 以致於浪費了很多函數沒有用~~ 看了這篇一定會想說,嘿,原來要做出一個屬於自己的小奇摩只要用到這些函數~~。 大家一起努力吧。