網頁程式撰寫2017

壹、概述

一、課程目標

培養會使用網頁與伺服器做事的人,即結合網際網路前後端的技術,達成以下目的:

  1. 與使用者溝通;
  2. 管理資料、運用資料。

二、選修說明

三、課程內容組成

(一)牽涉的技術

(二)使用的課本

使用《PHP,MySQL,AJAX,網頁設計範例教本》為參考書,旗標出版,學員請自備,向圖書館借用也行。

(三)參考講義

貳、各次上課內容

2017.9.7

<meta http-equiv='content-type' content='text/html;charset=UTF-8' />
<form action='r.php'>
姓名:<input type='text' name='姓名' value='丁志仁' /><br/>
email:<input type='text' name='email' value='alledu2@gmail.com' /><br/>
電話:<input type='text' name='phone' value='0987466665' /><br/>
<input type='submit' value='送出' />
</form>
<?php
 $connect=mysql_connect('localhost','assistant','××××××××');
 mysql_select_db('助理們');
 mysql_query("insert into web set 姓名='".$_REQUEST['姓名']."',phone='".$_REQUEST['phone']."'");
 mysql_close($connect);
?>

2017.9.14

2017.9.21

2017.9.28

2017.10.5

2017.10.12

2017.10.19

2017.10.26

<?php
$connect=mysql_connect('localhost','assistant','××××××××');
mysql_select_db('助理們');
// 前置處理
if($_POST['type']=='確定'){
	mysql_query("update web a,webMail b set a.姓名='".$_POST['姓名']."',a.phone='".$_POST['phone']."',b.email='".$_POST['email']."' where a.wid=".$_POST['wid']." && b.eid=".$_POST['eid']);
}
elseif($_GET['type']=='editForm'){
	echo editForm($_GET['wid'],$_GET['eid']);
}
else{
	#
}

$result=mysql_query("select * from web");	// 取資料
$colName=array('序','','wid','姓名','電話');// 設表格首列名稱
$id='wid';									// 配置識別欄欄名
// 輸入驗證程式
$str="<script language='javascript'>
function chkForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function chkNameForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
}
function chkMailForm(){
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function isEmail(theStr){
	var atindex=theStr.indexOf('@');
	var dotindex=theStr.indexOf('.',atindex);
	var flag=true;
	thesub=theStr.substring(0,dotindex+1);
	if((atindex<1)||(atindex!=theStr.lastIndexOf('@'))||(dotindex<atindex+2)||(theStr.length<=thesub.length)){flag=false;}
	else{flag=true;}
	return(flag);
}
</script>\n";
echo $str.nicetable($result,$colName,$id);
mysql_close($connect);

function editForm($wid){
	$result=mysql_query("select a.姓名,a.phone,b.email,b.eid from web a,webMail b where a.wid=b.wid && a.wid=".$wid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);	// 只取第一筆
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名',$row['姓名']);
	$xx->elements[]=array('email:','text','email',$row['email']);	// 第一筆 email
	$xx->elements[]=array('電話:','text','phone',$row['phone']);
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->elements[]=array('','hidden','eid',$row['eid']);
	return $xx->makeFormStr();
}
function nicetable($result,$colName,$id){
	$i=1;	// 筆計數器
	$str="<table style='border:1px solid black;border-collapse:collapse;border-top:none;border-left:none;border-right:none;'>";
	$str.="<tr>";
	foreach($colName as $colValue){
		 $str.="<th style='border:1px solid black;border-collapse:collapse'>".$colValue."</th>";
	}
	$str.="</tr>";
	$temp=array();
	while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
		$temp[$row[$id]]['姓名']=$row['姓名'];
		$temp[$row[$id]]['phone']=$row['phone'];
	}
	foreach($temp as $k=>$v){
		$str.="<tr>";
		$str.="<td style='border:1px solid black;border-collapse:collapse'>".$i."</td>";
		$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'><a href=".$_SERVER['PHP_SELF']."?type=editForm&wid=".$k.">編</a></th>";
		$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$k."</th>";
		$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['姓名']."</th>";
		$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['phone']."</th>";
		$str.="</tr>";
		$i++;
	}
	$str.="</table>";
	return $str;
}
class makeForm{
	var $elements=array();	// 表單內容初值為空陣列
	var $submitValue='確定';
	var $checkWhich='chkForm()';
	function makeFormStr(){
		$str="\n<form action='".$_SERVER['PHP_SELF']."' method='post' name='表單'>\n";	//	表單字串
		// 加入諸元素
		foreach($this->elements as $輸入框){
			$str.=$輸入框[0]."<input type='".$輸入框[1]."' name='".$輸入框[2]."' value='".$輸入框[3]."' />";
			if($輸入框[1]!='hidden'){$str.="<br/>";}
			$str.="\n";
		}
		$str.="<input type='submit' name='type' value='".$this->submitValue."' onClick=\"return ".$this->checkWhich.";\" />\n";
		$str.="</form>\n";
		return $str;
	}
}
?>

2017.11.2

2017.11.9

<?php
$connect=mysql_connect('localhost','assistant','××××××××');
mysql_select_db('助理們');
// 前置處理
if($_POST['type']=='編畢'){
	mysql_query("update webMail set email='".$_POST['email']."' where eid=".$_POST['eid']);
}
elseif($_POST['type']=='確定'){
	mysql_query("update web a,webMail b set a.姓名='".$_POST['姓名']."',a.phone='".$_POST['phone']."',b.email='".$_POST['email']."' where a.wid=".$_POST['wid']." && b.eid=".$_POST['eid']);
}
elseif($_POST['type']=='增一人'){
	mysql_query("insert into web set 姓名='".$_POST['姓名']."',phone='".$_POST['phone']."'");
}
elseif($_POST['type']=='加Mail'){
	mysql_query("insert into webMail set email='".$_POST['email']."',wid='".$_POST['wid']."'");
}
elseif($_GET['type']=='delMail'){
	mysql_query("delete from webMail where eid='".$_GET['eid']."'");
}
elseif($_GET['type']=='delPerson'){
	mysql_query("delete from webMail where wid='".$_GET['wid']."'");
	mysql_query("delete from web where wid='".$_GET['wid']."'");
}
elseif($_GET['type']=='editMailForm'){
	echo editMailForm($_GET['eid']);
}
elseif($_GET['type']=='editForm'){
	echo editForm($_GET['wid'],$_GET['eid']);
}
elseif($_GET['type']=='insPersonForm'){
	echo insPersonForm();
}
elseif($_GET['type']=='insMailForm'){
	echo insMailForm($_GET['wid']);
}
else{
	#
}

$result=mysql_query("select a.wid,b.eid,a.姓名,a.phone,b.email from web a left join webMail b on a.wid=b.wid where a.姓名!=''");//百分比代表萬用字元,只要裡面包含@都可以,left join是左側連結,where a.某欄=b.某欄
$colName=array('序','','wid','姓名','手機','±M','eid','Email');
$str="<script language='javascript'>
function chkForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function chkNameForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
}
function chkMailForm(){
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function isEmail(theStr){
	var atindex=theStr.indexOf('@');
	var dotindex=theStr.indexOf('.',atindex);
	var flag=true;
	thesub=theStr.substring(0,dotindex+1);
	if((atindex<1)||(atindex!=theStr.lastIndexOf('@'))||(dotindex<atindex+2)||(theStr.length<=thesub.length)){flag=false;}
	else{flag=true;}
	return(flag);
}
</script>\n";
echo $str.nicetable($result,$colName);
mysql_close($connect);

function insMailForm($wid){
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email','');
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='加Mail';
	$xx->checkWhich='chkMailForm()';
	return $xx->makeFormStr();
}
function editMailForm($eid){
	$result=mysql_query("select email from webMail where eid=".$eid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email',$row['email']);
	$xx->elements[]=array('','hidden','eid',$eid);
	$xx->submitValue='編畢';
	$xx->checkWhich='chkMailForm()';
	return $xx->makeFormStr();
}
function insPersonForm(){
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名','');
	$xx->elements[]=array('電話:','text','phone','');
	$xx->submitValue='增一人';
	$xx->checkWhich='chkNameForm()';
	return $xx->makeFormStr();
}
function editForm($wid){
	$result=mysql_query("select 姓名,phone from web where wid=".$wid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名',$row['姓名']);
	$xx->elements[]=array('電話:','text','phone',$row['phone']);
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='確定';
	return $xx->makeFormStr();
}
function nicetable($result,$colName){
	$i=1;
	$str="\n<table style='border:1px solid black;border-collapse:collapse;border-top:none;border-left:none;border-right:none;'>\n";
	$str.="<tr><td colspan=8 style='border-top:none;border-left:none;border-right:none;'><p style='text-align:right'>《<a href='".$_SERVER['PHP_SELF']."?type=insPersonForm'>增一人</a>》</p></td></tr>\n";
	$str.="<tr>";
	foreach($colName as $colValue){
		 $str.="<th style='border:1px solid black;border-collapse:collapse'>".$colValue."</th>";
	}
	$str.="</tr>\n";
	$temp=array();
	while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
		$temp[$row['wid']]['姓名']=$row['姓名'];
		$temp[$row['wid']]['phone']=$row['phone'];
		$temp[$row['wid']]['mail'][$row['eid']]=$row['email'];
	}
	foreach($temp as $k=>$v){
		$rs=count($v['mail']);$j=0;
		foreach($v['mail'] as $kk=>$vv){
			$str.="<tr>";
			$str.="<td style='border:1px solid black;border-collapse:collapse'>".$i."</td>";
			if($j==0){
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'><a href=".$_SERVER['PHP_SELF']."?type=editForm&wid=".$k."&eid=".$kk.">編</a> <a href=".$_SERVER['PHP_SELF']."?type=delPerson&wid=".$k.">刪</a></th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$k."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['姓名']."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['phone']."</th>";
			}
			
			$str.="<th style='border:1px solid black;border-collapse:collapse'><a href='".$_SERVER['PHP_SELF']."?type=insMailForm&wid=".$k."'>+</a>";
			if($kk){$str.=" <a href='".$_SERVER['PHP_SELF']."?type=editMailForm&eid=".$kk."'>編</a> <a href='".$_SERVER['PHP_SELF']."?type=delMail&eid=".$kk."'>—</a>";}
			$str.="</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$kk."</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$vv."</th>";
			$j++;
			if($j==$rs){$j=0;}
			$str.="</tr>\n";
			$i++;
		}
	}
	$str.="</table>\n";
	return $str;
}
class makeForm{
	var $elements=array();	// 表單內容初值為空陣列
	var $submitValue='確定';
	var $checkWhich='chkForm()';
	function makeFormStr(){
		$str="\n<form action='".$_SERVER['PHP_SELF']."' method='post' name='表單'>\n";	//	表單字串
		// 加入諸元素
		foreach($this->elements as $輸入框){
			$str.=$輸入框[0]."<input type='".$輸入框[1]."' name='".$輸入框[2]."' value='".$輸入框[3]."' />";
			if($輸入框[1]!='hidden'){$str.="<br/>";}
			$str.="\n";
		}
		$str.="<input type='submit' name='type' value='".$this->submitValue."' onClick=\"return ".$this->checkWhich.";\" />\n";
		$str.="</form>\n";
		return $str;
	}
}
?>

2017.11.16

AJAX 即“Asynchronous JavaScript and XML”(非同步的JavaScript與XML技術),是網頁程式技術發展的理程碑之一

  1. 以 JavaScript 驅動的瀏覽器端網頁開發技術。
  2. 不需要換頁,即可與伺服端互動,至於和客戶端互動的伺服端語言是什麼,AJAX 網頁不在乎,可以是 PHP 、可以是 JSP 、可以是 ASP ,甚至可以是 note.js 。
  3. 後來演變出 note.js 等技術,伺服端語言也使用 JavaScript 語法。
<?php
echo "catch:e0=".$_POST['e0'];	
?>
<?php
$connect=mysql_connect('localhost','assistant','××××××××');
mysql_select_db('助理們');
// 前置處理
if($_POST['type']=='編畢'){
	mysql_query("update webMail set email='".$_POST['email']."' where eid=".$_POST['eid']);
}
elseif($_POST['type']=='確定'){
	mysql_query("update web a,webMail b set a.姓名='".$_POST['姓名']."',a.phone='".$_POST['phone']."',b.email='".$_POST['email']."' where a.wid=".$_POST['wid']." && b.eid=".$_POST['eid']);
}
elseif($_POST['type']=='增一人'){
	mysql_query("insert into web set 姓名='".$_POST['姓名']."',phone='".$_POST['phone']."'");
}
elseif($_POST['type']=='加Mail'){
	mysql_query("insert into webMail set email='".$_POST['email']."',wid='".$_POST['wid']."'");
}
elseif($_GET['type']=='delMail'){
	mysql_query("delete from webMail where eid='".$_GET['eid']."'");
}
elseif($_GET['type']=='delPerson'){
	mysql_query("delete from webMail where wid='".$_GET['wid']."'");
	mysql_query("delete from web where wid='".$_GET['wid']."'");
}
elseif($_GET['type']=='editMailForm'){
	echo editMailForm($_GET['eid']);
}
elseif($_GET['type']=='editForm'){
	echo editForm($_GET['wid'],$_GET['eid']);
}
elseif($_GET['type']=='insPersonForm'){
	echo insPersonForm();
}
elseif($_GET['type']=='insMailForm'){
	echo insMailForm($_GET['wid']);
}
else{
	#
}

$result=mysql_query("select a.wid,b.eid,a.姓名,a.phone,b.email from web a left join webMail b on a.wid=b.wid where a.姓名!=''");//百分比代表萬用字元,只要裡面包含@都可以,left join是左側連結,where a.某欄=b.某欄
$colName=array('序','','wid','姓名','手機','±M','eid','Email');
$str="
<div id='show' style='border:red 2px solid;width:500px;'>
123456
</div>
<br/>
<form id='ajaxTest'>
<input type='text' name='e0' value=''>	
<input type='button' name='button' value='後送' onclick=\"sendFormData('ajaxTest','/~丁志仁/php/response.php','show');\" >
</form>
<script language='javascript'>
function chkForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function chkNameForm(){
	if(document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();return false;}
}
function chkMailForm(){
	if(document.表單.email.value != ''){if(!isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();return false;}}
	else{alert('請填寫Email!');document.表單.email.focus();return false;}
}
function isEmail(theStr){
	var atindex=theStr.indexOf('@');
	var dotindex=theStr.indexOf('.',atindex);
	var flag=true;
	thesub=theStr.substring(0,dotindex+1);
	if((atindex<1)||(atindex!=theStr.lastIndexOf('@'))||(dotindex<atindex+2)||(theStr.length<=thesub.length)){flag=false;}
	else{flag=true;}
	return(flag);
}
var ahr=createXMLHttpRequestObject();					// 先建立物件以俾重覆使用
function createXMLHttpRequestObject(){
	var ahr=false;										// 物件初值設為不存在
	if(window.XMLHttpRequest){ahr=new XMLHttpRequest();}// 產生非同步請求物件,本行給Firefox,下行給IE5,6
	else if(window.ActiveXObject){ahr=new ActiveXObject('Microsoft.XMLHTTP');}
	if(!ahr){alert('Error: failed to create the XMLHttpRequest object.');}
	else{return ahr;}
}
function postData(dataSource,parm,divID){			// 對 dataSource 後送POST請求,帶 parm 參數,回應送divID,回應後執行 onAjax(a)
	if(ahr){
		ahr.open('POST',dataSource);				// 初始化請求
		ahr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	// 通知伺服器後送資料是url編碼
		ahr.onreadystatechange=function(){if(ahr.readyState==4 && ahr.status==200){document.getElementById(divID).innerHTML=ahr.responseText;}};
		parm+='&nowtime='+new Date().getTime();		// 使後送資料不同
		ahr.send(parm);								// 執行請求並後送資料
	}
	else{alert('Error: XMLHttpRequest object do not exist.');}
}
function sendFormData(idForm,dataSource,divID){			// 從指定表單擷取資料並後送
	if(ahr){
		var sendData='';
		for(var i=0;i<document.getElementById(idForm).elements.length;i++){
			if(document.getElementById(idForm).elements[i].type=='checkbox' || document.getElementById(idForm).elements[i].type=='radio'){
				if(document.getElementById(idForm).elements[i].type=='checkbox'){	// 處理核取方塊,checked回傳值,沒checked回傳空無一物
					if(document.getElementById(idForm).elements[i].checked==true){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
					else{sendData += '&'+document.getElementById(idForm).elements[i].name+'=';}
				}else{																// 處理按鈕,checked回傳值,否則跳過
					if(document.getElementById(idForm).elements[i].checked==true){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
				}
			}																		// 非核取方塊非按鈕,如為隱藏欄不編碼傳回值,不是隱藏欄則編碼傳回值
			else if(document.getElementById(idForm).elements[i].type=='hidden'){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+document.getElementById(idForm).elements[i].value;}
			else{sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
		}
	}
	postData(dataSource,sendData,divID);
}
function encode(x){
	return x.replace(/%/g,'%25').replace(/&/g,'%26').replace(/\+/g,'%2B').replace(/\"/g,'%22').replace(/\'/g,'%27');
}
</script>\n";
echo $str.nicetable($result,$colName);
mysql_close($connect);

function insMailForm($wid){
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email','');
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='加Mail';
	$xx->checkWhich='chkMailForm()';
	return $xx->makeFormStr();
}
function editMailForm($eid){
	$result=mysql_query("select email from webMail where eid=".$eid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email',$row['email']);
	$xx->elements[]=array('','hidden','eid',$eid);
	$xx->submitValue='編畢';
	$xx->checkWhich='chkMailForm()';
	return $xx->makeFormStr();
}
function insPersonForm(){
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名','');
	$xx->elements[]=array('電話:','text','phone','');
	$xx->submitValue='增一人';
	$xx->checkWhich='chkNameForm()';
	return $xx->makeFormStr();
}
function editForm($wid){
	$result=mysql_query("select 姓名,phone from web where wid=".$wid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名',$row['姓名']);
	$xx->elements[]=array('電話:','text','phone',$row['phone']);
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='確定';
	return $xx->makeFormStr();
}
function nicetable($result,$colName){
	$i=1;
	$str="\n<table style='border:1px solid black;border-collapse:collapse;border-top:none;border-left:none;border-right:none;'>\n";
	$str.="<tr><td colspan=8 style='border-top:none;border-left:none;border-right:none;'><p style='text-align:right'>《<a href='".$_SERVER['PHP_SELF']."?type=insPersonForm'>增一人</a>》</p></td></tr>\n";
	$str.="<tr>";
	foreach($colName as $colValue){
		 $str.="<th style='border:1px solid black;border-collapse:collapse'>".$colValue."</th>";
	}
	$str.="</tr>\n";
	$temp=array();
	while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
		$temp[$row['wid']]['姓名']=$row['姓名'];
		$temp[$row['wid']]['phone']=$row['phone'];
		$temp[$row['wid']]['mail'][$row['eid']]=$row['email'];
	}
	foreach($temp as $k=>$v){
		$rs=count($v['mail']);$j=0;
		foreach($v['mail'] as $kk=>$vv){
			$str.="<tr>";
			$str.="<td style='border:1px solid black;border-collapse:collapse'>".$i."</td>";
			if($j==0){
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'><a href=".$_SERVER['PHP_SELF']."?type=editForm&wid=".$k."&eid=".$kk.">編</a> <a href=".$_SERVER['PHP_SELF']."?type=delPerson&wid=".$k.">刪</a></th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$k."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['姓名']."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['phone']."</th>";
			}
			
			$str.="<th style='border:1px solid black;border-collapse:collapse'><a href='".$_SERVER['PHP_SELF']."?type=insMailForm&wid=".$k."'>+</a>";
			if($kk){$str.=" <a href='".$_SERVER['PHP_SELF']."?type=editMailForm&eid=".$kk."'>編</a> <a href='".$_SERVER['PHP_SELF']."?type=delMail&eid=".$kk."'>—</a>";}
			$str.="</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$kk."</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$vv."</th>";
			$j++;
			if($j==$rs){$j=0;}
			$str.="</tr>\n";
			$i++;
		}
	}
	$str.="</table>\n";
	return $str;
}
class makeForm{
	var $elements=array();	// 表單內容初值為空陣列
	var $submitValue='確定';
	var $checkWhich='chkForm()';
	function makeFormStr(){
		$str="\n<form action='".$_SERVER['PHP_SELF']."' method='post' name='表單'>\n";	//	表單字串
		// 加入諸元素
		foreach($this->elements as $輸入框){
			$str.=$輸入框[0]."<input type='".$輸入框[1]."' name='".$輸入框[2]."' value='".$輸入框[3]."' />";
			if($輸入框[1]!='hidden'){$str.="<br/>";}
			$str.="\n";
		}
		$str.="<input type='submit' name='type' value='".$this->submitValue."' onClick=\"return ".$this->checkWhich.";\" />\n";
		$str.="</form>\n";
		return $str;
	}
}
?>

會議資料處理的資料結構示例

2017.11.23

<?php
$connect=mysql_connect('localhost','assistant','××××××××');
mysql_select_db('助理們');
$colName=array('序','','wid','姓名','手機','±M','eid','Email');
if(isset($_REQUEST['type'])){	// 前置處理
	if($_POST['type']=='編畢'){
		mysql_query("update webMail set email='".$_POST['email']."' where eid=".$_POST['eid']);
	}
	if($_POST['type']=='確定'){
		mysql_query("update web set 姓名='".$_POST['姓名']."',phone='".$_POST['phone']."' where wid=".$_POST['wid']);
	}
	elseif($_POST['type']=='增一人'){
		mysql_query("insert into web set 姓名='".$_POST['姓名']."',phone='".$_POST['phone']."'");
	}
	elseif($_POST['type']=='加Mail'){
		mysql_query("insert into webMail set email='".$_POST['email']."',wid='".$_POST['wid']."'");
	}
	elseif($_POST['type']=='delMail'){
		mysql_query("delete from webMail where eid='".$_POST['eid']."'");
	}
	elseif($_POST['type']=='delPerson'){
		mysql_query("delete from webMail where wid='".$_POST['wid']."'");
		mysql_query("delete from web where wid='".$_POST['wid']."'");
	}
	elseif($_POST['type']=='editMailForm'){
		echo editMailForm($_POST['eid']);
	}
	elseif($_POST['type']=='editForm'){
		echo editForm($_POST['wid'],$_POST['eid']);
	}
	elseif($_POST['type']=='insPersonForm'){
		echo insPersonForm();
	}
	elseif($_POST['type']=='insMailForm'){
		echo insMailForm($_POST['wid']);
	}
	$result=mysql_query("select a.wid,b.eid,a.姓名,a.phone,b.email from web a left join webMail b on a.wid=b.wid where a.姓名!=''");//百分比代表萬用字元,只要裡面包含@都可以,left join是左側連結,where a.某欄=b.某欄
	echo nicetable($result,$colName);
}
else{	// 第一次載入
	$str="<script language='javascript'>
function chkFormList(idForm,dataSource,divID){
	if(('姓名' in document.表單) && document.表單.姓名.value==''){alert('請填寫姓名!');document.表單.姓名.focus();}
	else if(('email' in document.表單) && document.表單.email.value == ''){alert('請填寫Email!');document.表單.email.focus();}
	else if(('email' in document.表單) && document.表單.email.value != '' && !isEmail(document.表單.email.value)){alert('請輸入正確的Email格式!');document.表單.email.focus();}
	else{sendFormData(idForm,dataSource,divID);}
}
function isEmail(theStr){
	var atindex=theStr.indexOf('@');
	var dotindex=theStr.indexOf('.',atindex);
	var flag=true;
	thesub=theStr.substring(0,dotindex+1);
	if((atindex<1)||(atindex!=theStr.lastIndexOf('@'))||(dotindex<atindex+2)||(theStr.length<=thesub.length)){flag=false;}
	else{flag=true;}
	return(flag);
}
var ahr=createXMLHttpRequestObject();					// 先建立物件以俾重覆使用
function createXMLHttpRequestObject(){
	var ahr=false;										// 物件初值設為不存在
	if(window.XMLHttpRequest){ahr=new XMLHttpRequest();}// 產生非同步請求物件,本行給Firefox,下行給IE5,6
	else if(window.ActiveXObject){ahr=new ActiveXObject('Microsoft.XMLHTTP');}
	if(!ahr){alert('Error: failed to create the XMLHttpRequest object.');}
	else{return ahr;}
}
function postData(dataSource,parm,divID){			// 對 dataSource 後送POST請求,帶 parm 參數,回應送divID,回應後執行 onAjax(a)
	if(ahr){
		ahr.open('POST',dataSource);				// 初始化請求
		ahr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');	// 通知伺服器後送資料是url編碼
		ahr.onreadystatechange=function(){if(ahr.readyState==4 && ahr.status==200){document.getElementById(divID).innerHTML=ahr.responseText;}};
		parm+='&nowtime='+new Date().getTime();		// 使後送資料不同
		ahr.send(parm);								// 執行請求並後送資料
	}
	else{alert('Error: XMLHttpRequest object do not exist.');}
}
function sendFormData(idForm,dataSource,divID){			// 從指定表單擷取資料並後送
	if(ahr){
		var sendData='';
		for(var i=0;i<document.getElementById(idForm).elements.length;i++){
			if(document.getElementById(idForm).elements[i].type=='checkbox' || document.getElementById(idForm).elements[i].type=='radio'){
				if(document.getElementById(idForm).elements[i].type=='checkbox'){	// 處理核取方塊,checked回傳值,沒checked回傳空無一物
					if(document.getElementById(idForm).elements[i].checked==true){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
					else{sendData += '&'+document.getElementById(idForm).elements[i].name+'=';}
				}else{																// 處理按鈕,checked回傳值,否則跳過
					if(document.getElementById(idForm).elements[i].checked==true){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
				}
			}																		// 非核取方塊非按鈕,如為隱藏欄不編碼傳回值,不是隱藏欄則編碼傳回值
			else if(document.getElementById(idForm).elements[i].type=='hidden'){sendData += '&'+document.getElementById(idForm).elements[i].name+'='+document.getElementById(idForm).elements[i].value;}
			else{sendData += '&'+document.getElementById(idForm).elements[i].name+'='+encode(document.getElementById(idForm).elements[i].value);}
		}
	}
	postData(dataSource,sendData,divID);
}
function encode(x){
	return x.replace(/%/g,'%25').replace(/&/g,'%26').replace(/\+/g,'%2B').replace(/\"/g,'%22').replace(/\'/g,'%27');
}
</script>
<div id='show'>\n";
	$result=mysql_query("select a.wid,b.eid,a.姓名,a.phone,b.email from web a left join webMail b on a.wid=b.wid where a.姓名!=''");//百分比代表萬用字元,只要裡面包含@都可以,left join是左側連結,where a.某欄=b.某欄
	$str.=nicetable($result,$colName);
	$str.="</div>\n";
	echo $str;
}
mysql_close($connect);

function insMailForm($wid){
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email','');
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='加Mail';
	return $xx->makeFormStr();
}
function editMailForm($eid){
	$result=mysql_query("select email from webMail where eid=".$eid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('email:','text','email',$row['email']);
	$xx->elements[]=array('','hidden','eid',$eid);
	$xx->submitValue='編畢';
	return $xx->makeFormStr();
}
function insPersonForm(){
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名','');
	$xx->elements[]=array('電話:','text','phone','');
	$xx->submitValue='增一人';
	return $xx->makeFormStr();
}
function editForm($wid){
	$result=mysql_query("select 姓名,phone from web where wid=".$wid);
	$row=mysql_fetch_array($result,MYSQL_ASSOC);
	$xx=new makeForm;
	$xx->elements[]=array('姓名:','text','姓名',$row['姓名']);
	$xx->elements[]=array('電話:','text','phone',$row['phone']);
	$xx->elements[]=array('','hidden','wid',$wid);
	$xx->submitValue='確定';
	return $xx->makeFormStr();
}
function nicetable($result,$colName){
	$i=1;
	$str="\n<table style='border:1px solid black;border-collapse:collapse;border-top:none;border-left:none;border-right:none;'>\n";
	$str.="<tr><td colspan=8 style='border-top:none;border-left:none;border-right:none;'><p style='text-align:right'>《".ajaxLink(array('type'=>'insPersonForm'),'增一人')."》</p></td></tr>\n";
	$str.="<tr>";
	foreach($colName as $colValue){
		 $str.="<th style='border:1px solid black;border-collapse:collapse'>".$colValue."</th>";
	}
	$str.="</tr>\n";
	$temp=array();
	while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
		$temp[$row['wid']]['姓名']=$row['姓名'];
		$temp[$row['wid']]['phone']=$row['phone'];
		$temp[$row['wid']]['mail'][$row['eid']]=$row['email'];
	}
	foreach($temp as $k=>$v){
		$rs=count($v['mail']);$j=0;
		foreach($v['mail'] as $kk=>$vv){
			$str.="<tr>";
			$str.="<td style='border:1px solid black;border-collapse:collapse'>".$i."</td>";
			if($j==0){
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".ajaxLink(array('type'=>'editForm','wid'=>$k),'編')." ".ajaxLink(array('type'=>'delPerson','wid'=>$k),'刪')."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$k."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['姓名']."</th>";
				$str.="<th rowspan='".$rs."' style='border:1px solid black;border-collapse:collapse'>".$temp[$k]['phone']."</th>";
			}
			
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".ajaxLink(array('type'=>'insMailForm','wid'=>$k),'+');
			if($kk){$str.=" ".ajaxLink(array('type'=>'editMailForm','eid'=>$kk),'編')." ".ajaxLink(array('type'=>'delMail','eid'=>$kk),'—');}
			$str.="</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$kk."</th>";
			$str.="<th style='border:1px solid black;border-collapse:collapse'>".$vv."</th>";
			$j++;
			if($j==$rs){$j=0;}
			$str.="</tr>\n";
			$i++;
		}
	}
	$str.="</table>\n";
	return $str;
}
function ajaxLink($paras,$prompt){
	$str="<a href='' onclick=\"postData('".$_SERVER['PHP_SELF']."','";
	foreach($paras as $k=>$v){$str.="&".$k."=".$v;}
	$str.="','show');return false;\">".$prompt."</a>";
	return $str;
}
class makeForm{
	var $elements=array();	// 表單內容初值為空陣列
	var $submitValue='確定';
	var $checkWhich='chkFormList()';
	function makeFormStr(){
		$str="\n<form name='表單' id='表單'>\n";	//	表單字串
		// 加入諸元素
		foreach($this->elements as $輸入框){
			$str.=$輸入框[0]."<input type='".$輸入框[1]."' name='".$輸入框[2]."' value='".$輸入框[3]."' />";
			if($輸入框[1]!='hidden'){$str.="<br/>";}
			$str.="\n";
		}
		$str.="<input type='button' name='type' value='".$this->submitValue."' onclick=\"chkFormList('表單','".$_SERVER['PHP_SELF']."','show')\">\n";
		$str.="</form>\n";
		return $str;
	}
}
?>

2017.11.30

MVC

SESSION

  1. @session_start();
  2. $_SESSION 儲值
  3. 在另一個 php 中(翻頁後)檢查 $_SESSION 的值
  4. 一次儲值多次檢查,直到瀏覽器關閉

2017.12.7

CSS基本說明

串接樣式表(Cascading Style Sheets),用來控制網頁外觀表現。

虛擬類別選擇器指的是為不同的狀態、性質的元素。
屬性 狀態
:link 超連接未被訪問
:visited 超連接被訪問過
:hover 滑鼠(鼠標)在元素上面
:active 滑鼠(鼠標)在元素上按著
:focus 焦點在元素上
:target 元素被URL標記(CSS 3新增的類別)
:lang 向帶有指定lang屬性的元素添加樣式。

方盒子模型(Box Model)

七大類物件搭配的CSS

CSS和SVG對照

CSSSVG
borderstroke
backgroundfill
字體中英文英文

自修與進階

2017.12.14

內容映射

前置工作

<?php
ini_set('session.save_path','/volume1/homes/○○○/sessPath'); 
include_once '/volume1/web/constant.php';
?>

四種內容映射的方法

  1. 取用 WebContent 資料表:
    • URL:伺服器ip/~○○○/siteName/index.php/頁名
    • path:/~○○○/siteName/index.php/頁名
    • 在 siteConstant.php 中用常數 SITE 來代替「~○○○/siteName」
  2. 取用預設 wiki 站台的頁:
    • URL:伺服器ip/~○○○/siteName/index.php/wiki站路徑/index.php/頁名?參數串
      或 伺服器ip/~○○○/siteName/index.php/wiki站路徑/index.php?title=頁名&參數串
    • 參數串:
      1. notitle=1,去標題(頁名),否則會自動以「頁名去斜線」為調中標題,並以 h1 大小顯示。
      2. cutTag=1,去掉各段的 id 。
      3. gotop=0,去掉 gotop 圖示。
      4. p=類別名,將<p>調整為指定的類別。
  3. 跨 site 引用
  4. php

2017.12.21

  1. 程式整理
    • 外觀相關程式整理
    • 基本功能相關程式整理
    • 類別定義相關程式整理
    • 擴充功能(日後解說)
  2. https wiki 映射與 http wiki 映射
  3. 上傳程式配置
  4. 類別定義說明

2017.12.28

include_once CLASS_FILE_PATH.'/database/DB.php';
DB::connect(DSN);
$result=DB::queryF("select 諸欄 from 某表");
echo DB::numRows($result)."<br/>\n";
echo DB::getResultValue($result,某筆,'欄名');
include_once CLASS_FILE_PATH."/database/login.php";
$物件=new login;
$物件->users=array(
	'丁志仁'=>array('psd'=>'xxxxxxxxx','editable'=>7,'grp'=>array('4')),
	'柯智懷'=>array('psd'=>'xxxxxxxxx','editable'=>7,'grp'=>array('4')),
);
$物件->logon();
if(isset($物件->checkin) && $物件->checkin==1){
…
}else{…}
$物件->loginTable=array('tableName'=>'認證資料表','psd'=>'密碼欄','name'=>'帳號欄','grp'=>'群組欄','canWorkGrp'=>'諸群組');
/* 諸群組以「;」相間 */

2018.1.4

<?php
include_once '../userConstant.php';
include_once CLASS_FILE_PATH."/database/etable.php";
$ET=new etable;
$ET->sql[0]="select * from account_xxx";
$ET->main();
?>
if(!isset($_REQUEST['exec_type'])){echo "<link rel='stylesheet' type='text/css' media='all' href='".CLASS_HTML_PATH."/database/etable.css' />\n";}
$ET->colAlias=array('money'=>'支出','date'=>'日期','summary'=>'摘要','name'=>'支付者');
$ET->formType=array('date'=>array('date'),
					'account_e'=>array('checkbox',array('費用'=>'費用')),
					'account_a'=>array('radio',array('現金'=>'現金','存款'=>'存款')),
					'subaccount'=>array('radio',array('食'=>'食','衣'=>'衣','住'=>'住','行'=>'行','育'=>'育','樂'=>'樂','健'=>'健')),
					'name'=>array('radio',array('丁志仁'=>'丁志仁','李森茂'=>'李森茂'))
);
$ET->formType=array(
					'EN'=>array('radio',array('中'=>'中文','英'=>'英文','中英'=>'中英','中日'=>'中日')),
					'buyDate'=>array('date'),
					'inHome'=>array('oneWaySwitch',array(0=>'待還',1=>'已還'))
);

2018.1.11

<?php
include_once '../userConstant.php';
include_once "theme.php";
if(!isset($_REQUEST['exec_type'])){echo $html1;}
include_once CLASS_FILE_PATH."/database/etable.php";
$ET = new etable;
$ET->sql[0]="select concat(Name,'-',number) 片名數量,album,EN,buyDate,inHome from DVD";
$ET->editable=7;
$ET->formType=array(
					'EN'=>array('radio',array('中'=>'中文','英'=>'英文','中英'=>'中英','中日'=>'中日')),
					'buyDate'=>array('date'),
					'inHome'=>array('oneWaySwitch',array(0=>'待還',1=>'已還'))
);
$ET->formValidate=array('Name'=>array('.+','請填片名!'));
$ET->perpage=12;
$ET->colAlias=array('uid'=>'擁有者','Name'=>'片名','album'=>'套片','number'=>'數量','EN'=>'字幕','buyDate'=>'購買日期','inHome'=>'是否在家');
$ET->editables=array('ins'=>array('DVD'),'edit'=>array('DVD'),'erase'=>array('DVD'));
$ET->tran=1;
$ET->moreCol=array(array(0,'本頁','f1'),array(1,'序','f2'));
$ET->dispType='disp_table';
$ET->search=array('Name','EN');
$ET->main();
if(!isset($_REQUEST['exec_type'])){echo $html2;}
function f1($i,$j,$k){return $i;}
function f2($i,$j,$k){return $j;}
?>

2018.1.18

響應式網頁設計(Responsive Web Design)簡稱RWD

<!DOCTYPE html>
<html>
<head>
	<link rel='stylesheet' type='text/css' media='all' href='screen.css' />
</head>
<body>
<a href='#' class='CardLink CardLink_H'>Heart</a>
<a href='#' class='CardLink CardLink_C'>Club</a>
<a href='#' class='CardLink CardLink_S'>Shahe</a>
<a href='#' class='CardLink CardLink_D'>Diamon</a>
</body>
</html>
.CardLink {
	display:block;
	color:#666;
	text-shadow:0 2px #efefef;
	text-decoration:none;
	height:2.75 rem;
	line-height:2.75 rem;
	border-bottom:1px solid #bbb;
	position:relative;
}
@media (orientation:portrait) {
	.CardLink {
		padding-left:1.8 rem;
		font-size:1.6 rem;
		color:green;
	}
}
.CardLink:before {
	display:none;
	position:absolute;
	top:50%;
	transform:translateY(-50%);
	left:0;
}