博客來網路書店查詢

書名

博客來網路書店查詢

星期二, 11月 09, 2010

PHP&MySQL--9 2010年11月課程講義預覽

PHP&MySQL--9
一、 補充:資料表正規化
1. 第一正規化


1. 欄位內容必須是單一內容。
2. 同一欄位的內容必須是相同的類型。
3. 必須要有一個或一組主鍵可以辨識資料。
4. 不可用很多欄位來表達同一筆資料。




2. 第二正規化


1.無法單獨新增一筆學生資料。因為 Subject_id是主鍵之一,不能為空值。當學生尚未選修任何課程之前,將無法寫入資料表。  
2.無法單獨刪除一筆成績資料。如果打算刪除科目代表為P1234這個科目資訊,您會把這名學生資訊也刪除,學號99345這位同學資料就此消失。
3.需要同步異動的資料太多。假設學號為99312 這個學生搬家了,那麼我們得異動其中的 6 筆紀錄。



第一正規化之後資料表將產生以下的問題:

第二正規化將要求資料表裡所有的資料必需與該資料表的主鍵有相依關係,以避免資料重複與不一致性。若某欄位只和主鍵的一部份而非全部有關的話,請將這些欄位獨立成另外一個資料表。

3. 第三正規化


1.無法單獨新增一筆縣市資料。因為 Stu_no 是主鍵,不能是空值;因此,若無任何學生居住的某個縣市,其郵遞區號資料將無法被事先建立。  
2.無法單獨刪除一筆學生資料。如果我們打算刪除 99524 這筆資料的話,新北市郵遞區號資料也將一併消失。
3.更新郵遞區號困難。假設有兩位同學同住在台中市清水區,若郵遞區號變更,則要同時異動多筆紀錄。



第三正規化將要求資料表內刪除不依賴主鍵的欄位,也就是不應該存在遞移相依性欄位,將非主鍵決定的欄位獨立為新資料表。

二、 人數統計分頁分析【提供display1.php,並請修改網頁內容】


〈html〉〈head〉
〈meta http-equiv="Content-Type" content="text/html; charset=utf-8"〉
〈title〉人數統計分析〈/title〉〈/head〉
〈body〉〈?
include("server.php");
if( isset($_GET['page']) )
$page = intval( $_GET['page'] );
else{$page = 1;}
$page_size = 10;
$sql = "select count(*) as total from record";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$total = $row['total'];
if(isset($total))
{
if( $total 〈 $page_size )
$page_count = 1;
if( $total % $page_size )
$page_count = (int)($total / $page_size) + 1;
else
$page_count = $total / $page_size;
}
else
$page_count = 0;
$page_number = '';
if( $page == 1 )
$page_number .= '[第一頁][上一頁] ';
else {
$page_number.='[〈a href='.$_SERVER['PHP_SELF'].'?page=1〉第一頁〈/a〉]';
$page_number.='[〈a href='.$_SERVER['PHP_SELF'].'?page='.($page-1).'〉'."上一頁〈/a〉]";
}
if(($page == $page_count) || ($page_count == 0))
$page_number .= '[下一頁][尾頁]';
else {
$page_number.='[〈a href='.$_SERVER['PHP_SELF'].'?page='.($page+1).'〉'."下一頁〈/a〉]";
$page_number.='[〈a href='.$_SERVER['PHP_SELF'].'?page='.$page_count.'〉'."尾頁〈/a〉]";
}
if(isset($total)) {
$sql = "select * from record limit ". ($page-1)*$page_size .", $page_size";
$result = mysql_query($sql);
echo "〈table border=1〉";
echo "〈tr〉〈td〉時間〈/td〉〈td〉ip〈/td〉〈/tr〉";
while($list1=mysql_fetch_array($result))
{
echo "〈tr〉〈td〉".$list1['visitday']."〈/td〉";
echo "〈td〉".$list1['ip']."〈/td〉〈/tr〉"; }
echo "〈/table〉";
echo $page_number; }
?〉〈/body〉〈/html〉



三、 檔案上傳
1. 表單網頁【提供upload.htm】


〈html〉〈head〉〈meta http-equiv="Content-Type" content="text/html; charset=utf-8"〉〈title〉檔案上載〈/title〉〈/head〉〈body〉
〈form action="upload.php" method="post" enctype="multipart/form-data"〉
〈input type="hidden" name="MAX_FILE_SIZE" value="1000000"〉
Send this file: 〈input name="userfile" type="file"〉
〈input type="submit" value="Send File"〉
〈/form〉〈/body〉〈/html〉



2. 接收端網頁【提供upload.php,並請修改網頁內容】


〈html〉
〈head〉〈meta http-equiv="Content-Type" content="text/html; charset=utf-8"〉
〈title〉檔案上傳:接收端網頁〈/title〉〈/head〉〈body〉〈?
$uploaddir='./tmp/';
print "〈pre〉";
$file2=mb_convert_encoding($_FILES["userfile"]["name"],"big5","utf8");
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$file2))
{ echo "檔名:".$_FILES['userfile']['name']."〈br〉" ;
echo "大小:".$_FILES['userfile']['size']."〈br〉" ;
echo "型態:".$_FILES['userfile']['type']."〈br〉" ; }
else
{
print_r ($_FILES);
$a=$_FILES['userfile']['error'];
echo "a-〉".$a;
if ($a==1)
{ die("檔案大小超出 php.ini:upload_max_filesize 限制"); }
if($a==2)
{ die("檔案大小超出 MAX_FILE_SIZE 限制"); } }
echo $a;
?〉〈/body〉〈/html〉



四、 header( )進階使用
1. 開啟jpg圖檔【提供jpg1.php,並請修改網頁內容】


〈?
$im = imagecreatefromjpeg("test.jpg");
header('Content-type: image/jpg');
imagejpeg($im);
imagedestroy($im); ?〉



2. 與上例有關,增加ip限制【提供lockip.php,並請修改網頁內容】


〈?
function allow_ip($addr)
{
$first = substr($addr,0,(strrpos($addr,".")));
$second = substr($addr,(strrpos($addr,".")+1));
if(($first=="140.111.144") && ($second〉=1 && $second 〈=255))
{ return true; }
else
{ return false; }
}?〉



3. ip限制才能看圖【請自行撰寫】


〈?
require("lockip.php");
$addr_ip=$_SERVER['REMOTE_ADDR'];
$flag=allow_ip($addr_ip);
if(!$flag)
{die("不能看圖,IP位置不合法");}
include('./jpg1.php'); ?〉



4. 連結PHP檔案瀏覽圖片 【提供jpg3.php,並請修改網頁內容】

〈html〉〈head〉
〈meta http-equiv="Content-Type" content="text/html; charset=utf-8" /〉
〈title〉檢測縮圖並做連結〈/title〉〈/head〉〈body〉
按下連結可察看原圖〈br〉
〈a href="jpg2.php"〉
〈img src = "jpg1.php" alt="看不到" width="100" height="90" border="0"〉〈/a〉
〈/body〉〈/html〉




五、 開啟網頁前的認證【提供auth1.php,並請修改網頁內容】

〈? header("Content-type: text/html; charset=utf-8");
if (empty($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Please input"');
header('HTTP/1.0 401 Unauthorized');
echo '請輸入正確的帳號及密碼, 不可以取消!';
exit;
} else {
$correctName="pcschool";
$correctpwd="mysql" ;
if (($_SERVER['PHP_AUTH_USER'] != $correctName) or
($_SERVER['PHP_AUTH_PW'] !=$correctpwd)){
echo "登入失敗,請開啟新的瀏覽器重新登入"; }} ?〉




六、 下載的檔案與實際的檔案不同【請自行撰寫】


〈?php
include("auth1.php"); //可不加上此行
header("Content-type: text/html; charset=utf-8");
$file="./9707.zip"; // 實際檔案的路徑+檔名
$filename="0714.zip"; // 下載的檔名
header("Content-type: ".filetype("$file"));//指定類型
header("Content-Disposition: attachment; filename=".$filename."");
readfile($file); ?〉



七、 上傳多個檔案【提供表單網頁upload4.htm及接收資料網頁upload4.php,再請修改】


〈html〉〈head〉
〈meta http-equiv="Content-Type" content="text/html; charset=utf-8"〉
〈title〉處理上傳多個檔案〈/title〉〈/head〉 〈body〉〈?
$uploaddir='./upload/';
$i=count($_FILES["fileupload"]["name"]);
for ($j=0;$j〈$i;$j++){
$tmpfile=$_FILES["fileupload"]["tmp_name"][$j];
$file2=mb_convert_encoding($_FILES["fileupload"]["name"][$j],"big5","utf8");
if(move_uploaded_file($tmpfile,$uploaddir.$file2)){
echo "上傳成功〈br〉";
echo "檔案名稱:".$_FILES["fileupload"]["name"][$j]."〈br〉";
echo "檔案類型:".$_FILES["fileupload"]["type"][$j]."〈br〉";
echo "檔案大小:".$_FILES["fileupload"]["size"][$j]."〈br〉";
}else{
echo $_FILES["fileupload"]["tmp_name"][$j]."上傳失敗!〈br /〉";
switch ($_FILES["fileupload"]["error"][$j]){
case 1:
echo "失敗原因:大小超過php.ini內設定 upload_max_filesize"."〈br〉";
break;
case 2:
echo "失敗原因:大小超過表單設定 MAX_FILE_SIZE"."〈br〉";
break;
case 3:
echo "失敗原因:上傳不完整"."〈br〉";
break;
case 4:
echo "失敗原因:沒有檔案上傳"."〈br〉";
break;
case 6:
echo "失敗原因:暫存資料夾不存在"."〈br〉";
break;
case 7:
echo "失敗原因:上傳檔案無法寫入"."〈br〉";
break;
case 8:
echo "失敗原因:上傳停止"."〈br〉";
break;
} } } ?〉
〈/body〉〈/html〉




八、 繪製圖片—graph.php


〈? $height = 200;
$width = 200;
$im = ImageCreate($width, $height);
$white = ImageColorAllocate ($im, 255, 255, 255);
$black = ImageColorAllocate ($im, 0, 0, 0);
ImageFill($im, 0, 0, $black);
ImageLine($im, 0, 0, $width, $height, $white);
ImageString($im, 4, 50, 150, 'Sales', $white);
Header ('Content-type: image/png');
ImagePng ($im);
ImageDestroy($im);?〉



九、 如何呼叫已經產生圖片的網頁? (請自行設計)



〈img src="graph.php" height=200 width=200 alt="顯示php的內容"〉




十、 輸入資料檢驗驗證碼
1. 表單部分


〈html〉 〈head〉〈title〉〈/title〉
〈meta http-equiv="Content-Type" content="text/html; charset=UTF-8"〉
〈/head〉〈body〉〈form action="input.php" method="post"〉
〈input type="text" name="graph" maxlength="7" size="7"〉
〈input type="submit"〉〈/form〉
〈img src="graph.php" width="200" height="200" alt="show image"/〉
〈/body〉〈/html〉



2. 驗證碼部分(graph.php,請修改網頁)

〈? session_start( );
$_SESSION['test']=generatorPassword( );
$height = 200;
$width = 200;
$im = ImageCreate($width, $height);
$white = ImageColorAllocate ($im, 255, 255, 255);
$black = ImageColorAllocate ($im, 0, 0, 0);
ImageFill($im, 0, 0, $black);
ImageLine($im, 0, 0, $width, $height, $white);
ImageString($im, 4, 50, 150, $_SESSION['test'], $white);
Header ('Content-type: image/png');
ImagePng ($im);
ImageDestroy($im);
function generatorPassword( )
{ $password_len = 7;
$password = '';
$word = '0123456789';
$len = strlen($word);
for ($i = 0; $i 〈 $password_len; $i++) {
$password .= $word[rand( ) % $len]; }
return $password; } ?〉




3. 接收資料


〈?session_start( ); ?〉〈html〉〈head〉〈meta http-equiv="Content-Type" content="text/html; charset=utf-8"〉〈title〉驗證資料〈/title〉〈/head〉〈body〉
〈? if ($_POST['graph']==$_SESSION['test'])
{ ?〉
〈script language="JavaScript"〉
alert("〈? echo "輸入資料正確,轉往google"; ?〉");
location.href="http://www.google.com";
〈/script〉〈? }
else
{ ?〉
〈script language="JavaScript"〉
alert("輸入資料不正確,請重新輸入");
history.back( );
〈/script〉 〈?
} ?〉 〈/body〉〈/html〉




十一、 簡單資料操作
1. 新增

〈? ob_start(); ?〉〈html〉〈head〉
〈meta http-equiv="content-type" content="text/html; charset=utf-8"〉
〈title〉新增〈/title〉
〈/head〉〈body〉
〈?
include("config.php");
$account = $_POST['frm_account'];
$username = $_POST['frm_name'];
$sex = $_POST['frm_sex'];
$temp_date = date("Y-m-d H:m:s");

mysql_query("insert into student (account,username,sex,date1) values('$account','$username','$sex','$temp_date') ") or die("error");

header("location:index.php");
?〉〈/body〉〈/html〉




2. 列表


〈html〉〈head〉
〈meta http-equiv="content-type" content="text/html; charset=utf-8"〉
〈title〉表列資料〈/title〉
〈/head〉〈body〉
〈?
include("config.php");
$res =mysql_query("select * from student") or dir("sql error");
?〉〈a href="add.htm"〉新增〈/a〉〈br〉 〈?
while($row=mysql_fetch_array($res)){
echo "姓名:".$row["username"]."帳號:".$row["account"]."性別:";
if($row["sex"] == 1)
echo "男";
else
echo "女";
echo "日期:".$row["date1"];?〉
〈a href="edit.php?id= 〈? echo $row["id"]; ?〉"〉編輯〈/a〉
〈a href="del.php?id= 〈? echo $row["id"]; ?〉"〉刪除〈/a〉
〈br〉 〈?
}
?〉〈/body〉〈/html〉





3. 編輯


〈? ob_start(); ?〉〈html〉〈head〉
〈meta http-equiv="content-type" content="text/html; charset=utf-8"〉
〈title〉編輯〈/title〉〈/head〉〈body〉
〈?
include("config.php");
$id = $_GET['id'];
$res = mysql_query("select * from student where id ='$id'");
$row = mysql_fetch_array($res);
?〉
〈table width="75%" border="0" align="center"〉
〈tr〉
〈td〉〈form action="edit2.php" method="post" name="form1"〉
〈p〉姓名
〈input name="frm_name" type="text" value="〈? echo $row["username"]; ?〉"〉
〈/p〉〈p〉帳號
〈input name="frm_account" type="text" value="〈? echo $row["account"]; ?〉"〉
〈/p〉〈p〉性別
〈input type="radio" name="frm_sex" value="1" 〈? if($row["sex"] == 1) echo "checked"; ?〉〉男
〈input type="radio" name="frm_sex" value="0" 〈? if($row["sex"] == 0) echo "checked"; ?〉〉女
〈/p〉〈p〉
〈input type="submit" name="Submit" value="送出"〉
〈input name="id" type="hidden" value="〈? echo $row["id"]; ?〉"〉
〈/p〉〈/form〉〈/td〉〈/tr〉〈/table〉〈/body〉〈/html〉






〈? ob_start(); ?〉〈html〉〈head〉
〈meta http-equiv="content-type" content="text/html; charset=utf-8"〉
〈title〉編輯〈/title〉
〈/head〉〈body〉
〈?
include("config.php");
$id = $_POST['id'];
//echo $id."〈br〉";
$account = $_POST['frm_account'];
$username = $_POST['frm_name'];
$sex = $_POST['frm_sex'];
$temp_date = date("Y-m-d H:m:s");
$sql="update student set
account = '$account',
username = '$username',
sex = '$sex',
date1 = '$temp_date'
where id ='$id'";
//echo $sql."〈br〉";
//exit;
mysql_query("update student set
account = '$account',
username = '$username',
sex = '$sex',
date1 = '$temp_date'
where id ='$id'") or die("error");
header("location:index.php");
?〉〈/body〉〈/html〉




4. 刪除


〈? ob_start(); ?〉〈html〉〈head〉
〈meta http-equiv="content-type" content="text/html; charset=utf-8"〉
〈title〉刪除〈/title〉〈/head〉〈body〉
〈?
include("config.php");
$id = $_GET['id'];
mysql_query("delete from student where id ='$id'") or die("SQL Error");
header("location:index.php");
?〉
〈/body〉〈/html〉



十二、 其他

沒有留言: