檢視 網頁程式撰寫 的原始碼
←
網頁程式撰寫
跳至導覽
跳至搜尋
由於以下原因,您無權編輯此頁面:
您請求的操作只有這個群組的使用者能使用:
使用者
您可以檢視並複製此頁面的原始碼。
[[分類:選修與社團]] ==槪述== ===課程目標=== 結合網際網路前後端的技術,達成以下目的: #與使用者溝通; #管理資料、運用資料。 ===對學習者的叮嚀=== 學到掌握與運用能力,至少要一年。一定要用功,半途而廢,等於沒有學,不如一開始就不要來修課。作業要做,自己也要找書來看,做自己的筆記。 名詞、觀念、邏輯要徹底弄清楚,似懂非懂程式就會錯,只要錯一個標點,程式就不會按預期規畫動作,可能查三天三夜也查不出來。 ===牽涉的技術=== *前端(clint):HTML4 *#DOM *#CSS *#javascript *#*jQuery *#SVG *#HTML5 *後端(SERVER) *#PHP *#*物件使用 *#MySQL *溝通前後端 *#叫出新頁 *#ajax ===參考講義=== *HTML *#[http://jendo.org/files/doc/Demo 練習] *#[[分類:HTML 講義]] *[http://jendo.org/files/doc/http.html HTTP] *[http://jendo.org/files/doc/php.html PHP] *[http://jendo.org/files/doc/MySQL.html MySQL] *[http://jendo.org/files/doc/ajax.html AJAX] ==前端與後端溝通== *[[HTML/表單]] *[http://jendo.org/files/doc/php.html php講義] *伺服器端 *#form.html *#r.php *前端與後端溝通有兩個通道 *#GET:由網址列就可傳送變數到後端 *#POST:要從表單傳送變數 *#REQUEST:表單、網址列皆可傳送 *在表單加入屬性action *#<form action='檔案的位置'> *#在上面form.html的範例裡,action='r.php',r.php就是表單資料送出後會傳到的地方。這就是用php撰寫。 *PHP *#開頭結尾:<?php........?> *#echo回應出表單資料,分號;為執行。 *#echo '1:'.$_REQUEST['name1'].'<br/>'; 回應出前台表單name1的變數 *#echo '2:'.$_POST['name1'].'<br/>'; 由表單傳送變數(POST),回應出前台表單name1的變數 *#echo '3:'.$_GET['name1'].'<br/>'; 由網址列傳送變數(GET),回應出前台表單name1的變數 *PHP符號 *# + 值相加 *# - 值相減 *# * 值相乘 *# / 值相除 *# % 值相除後的餘數 *# . 兩串文字結合 *MySQL *#[http://jendo.org/files/doc/MySQL.html MySQL講義] *#MySQL是一個資料庫系統,裡面包含了數個資料表。 *#基本指令: *#* ; 意為執行 *#* ` 是重音符號,Grave accent。若是那個單字在MySQL辨識碼裡面有,就必須要用 ` 括起來以說明此字是我們編輯的內容。 *#*insert into 表格名 values ('值1','值2',…); 照著欄序加一筆資料 *#*insert into 表格名 values ('值1','值2',…),('值1','值2',…),('值1','值2',…)…; 照著欄序加很多筆的資料 *#*insert into 表格名 (欄名1,欄名2,…) values ('值1','值2',…); 只對指定的欄加一筆資料 *#*insert into 表格名 set 欄名1='值1',欄名2='值2',…; 只對指定的欄加一筆資料 *#*select 欄名1,欄名2,… from 表格名; 找出指定欄位的全部資料 *#*select * from 表格名; 找出此表格的全部欄位全部資料 *#*select * from 表格名 where 欄位名稱='欄位內容'; 找出某欄位,合條件的筆數。 *#*select * from 表格名 where 欄位名稱 like '09%'; 找出某欄位,內容有09的資料。''%''指09後面任何內容 *#*update 表格名 set 欄名=欄值,欄名=欄值… [where 條件][limit 範圍]; 合條件或合範圍的所有筆數,指定欄都換成指定欄值 *#*delete from 表格名 where 條件 limit 幾筆; 刪除合條件合範圍的資料 ==各次上課內容== ===2016.2.1=== *說明課程內容 *建立每位同學的修課資料夾: *#後台:個人資料夾/www/php,php資料夾的所有者必須是這位同學,php資料夾中的php程式所有者也必須是這位同學。否則會因缺乏權限而導致伺服器內部錯誤。 *#前台:jendo.org/~○○○/php *檢查瀏覽器 *檢查文字編輯器 *檢查上下傳工具 *檢查每個人的筆記頁 *建立應答程式對 *#form.php:負責以表單跟使用者互動;並設 action 為 r.php。 *#r.php:負責接收表單的資料,存入資料表。 ===2016.3.21=== *綜合演練 *#電腦教室四部電腦可用 *#去 192.168.3.3 *#adminer-4.2.2-mysql.php *#帳號密碼問老師 *#去同學們資料庫 *#建自己的資料表:英文姓名Name和英文姓名Mail,前者要有id欄、姓名欄,後者要有id欄、email欄 *#以 filezilla 登入 192.168.3.3 ,用自己的姓名和帳號 *#在自己的 www 之下建 php 資料夾 *#建立 form.php 輸入資料,要輸入至少三個人的資料 *#建立 nameList1.php 和 nameList2.php 將兩個資料表「關連起來」,前者用等連結,後者用左側連結 *#問老師回家之後要怎麼用 filezilla 連,無法再用 192.168.3.3 *準備考試: *#第二章 *#第四章 *#第五章 *#第七章 *#第十章 *#第十一章 *#第十二章 ===2016.4.18=== *在nameList.php 增加編連結 ===2016.4.25=== *增加「加一人」連結 *在每個 email 之前增加「+」用以對某個人再加一筆 email : *#在 nicetable() 函式增加「+」連結,type變數值設為 insMailForm ,並從 GET 通道再送回來。 *#造一個 insMailForm($wid) 的函式,負責傳回插入 mail 的表單 *#前置處理再增加一個 elseif ,處理當按「+」連結時,呼叫 insMailForm($wid) 函式,提供使用者插入 mail 之表單 *#前置處理再增加一個 elseif ,處理當按「加Mail」按鈕時,將表單後送資料插入 webMail 資料表 ===2016.9.2=== *[http://jendo.org/files/doc/ajax.html 以 PHP 為基礎說明 javascript 基本語法(壹)] *實作姓名驗證 *實作表單 Email 驗證 ===2016.9.9=== *解釋類別與物件 *實作表單生成類別 *整理程式 ===2016.9.23=== *解釋並實作 ajax 相關函式 ===2016.9.30=== *統一化 ajax 函式 *#[http://jendo.org/~丁志仁/php/table.txt 更改函式 nicetable ,並進行相應的調整] *#*前置處理增加「編 mail 表單」及編畢。 *#*增加函式 editMailForm *#*修改撈取資料表的欄位 *#[http://jendo.org/~丁志仁/php/js.txt 增加 javascript 中 ajax 的相關函式] *#*宣告變數 ahr (Asynchronous Http Request,非同步 HTTP 請求) *#*函式 createXMLHttpRequestObject 由類別產生新物件 *#*函式 postData 控制後送與回應流程 *#*函式 sendFormData 從指定表單擷取資料並後送,hidden型變數不編碼 *#*函式 encode 進行特字元的 URL 編碼,給 sendFormData 使用 *#[http://jendo.org/~丁志仁/php/showAndForm.txt 增加測試表單與測試div] *#[http://jendo.org/~丁志仁/php/response.txt 配合測試的伺服器回應程式原始碼] *再解釋 ajax 相關函式 *#[http://jendo.org/files/doc/ajax.html ajax的方法與屬性(貳)] *#詳細解說 postData 函式 <pre>function postData(dataSource,parm,divID){ // 對 dataSource 後送POST請求,帶 parm 參數,回應送divID 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.');} }</pre> ===2016.10.7=== *先把前置處理分成「有type的」「沒type的」兩大段。後者才載入 javascript 。 *去掉測試的 form。 *綜合 姓名,email 驗證為函式 chkFormList 程式碼如下: <pre>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);} }</pre> *刪掉原來 isEmail 以外的驗證程式。 *保留 javascrip 中的 ajax 段落。 *將撈資料表和定義欄位名稱($colName=…)兩行分開,欄位名稱定義放到前置處理之前。 *在「沒type的」前置處理中, javascript 段落之後接 show div ,div 中撈資料表並丟給 nicetable 生成表格。 *在「有type的」前置處理,最後也撈資料表並丟給 nicetable 生成表格,且輸出。 *所有表單中的 checkWhich 屬性都刪掉。 *修改 makeForm 類別: *#屬性 $checkWhich 預設為 chkFormList() *#改 form 標籤,增加 id='表單',刪掉 action 屬性和 method 屬性。 *#改 submit 為 button ,onClick 改到 \"chkFormList('表單','".$_SERVER['PHP_SELF']."','show')\" *editForm 中加「$xx->submitValue='確定';」 *新增 ajax 連結的產生器,程式碼為: <pre>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; }</pre> *改 nicetable ,所有的連結改成 ".ajaxLink(array('type'=>'相應的值'),'提示字')." *前置處理中 $_GET 和 $_REQUEST 都改成 $_POST *一些優化的處理: *#editForm 中撈資料改為「select 姓名,phone from web where wid=".$wid」,不需要管 webMail *#nicetable 中加「\n」讓原始碼整齊。 *#makeForm 中判斷遇到 hidden 輸入框不跳行。 ===2016.10.14=== '''[https://zh.wikipedia.org/wiki/MVC MVC]''' *Model–view–controller 三者分離 *基本觀念: *#一個伺服器上有多個網站(SITE),彼此共用基本「類別」 *#每個 SITE 有自己的外觀 Theme *#每個 Theme 簡化為 banner 、 導航列 、 ajax 內容顯示區 *實作WWEB: *#DB類別,無屬性諸方法 *#*connect($dsn):利用DSN連結資料庫 *#*queryF($sql,$perpage=0,$start=0):送出查詢,傳回結果 *#*numRows($result):傳回查詢結果的筆數 *#*getResultValue($result,$recordNo,$col):傳回查詢結果第幾列、第幾欄的值 *#siteConstant.php *#Theme 的模組化 *#style.css、menu.css *#navbar-bg的搭配與使用 *#banner圖照的去背與嵌入 *#畫字 *#工作程式 *#*Theme的前半 *#*Theme的後半 '''SESSION''' #@session_start(); #$_SESSION 儲值 #在另一個 php 中(翻頁後)檢查 $_SESSION 的值 #一次儲值多次檢查,直到瀏覽器關閉 ===2016.10.21=== 在 WWEB 中測試: #sessLogin1.php:認證登入介面 #sessLogin2.php:登入正確則啟動 session,並創建約定的 session 變數 #sessLogin3.php:其他頁正確登入、登出後,在本頁觀察 session #sessLogout1.php:秀登出按鈕 #sessLogout2.php:登出後銷毀約定的 session 變數 ===2016.10.28=== '''停用COOKIE的網站''' *建立 SID 觀察列 *刪除伺服器上所有 sess *打開瀏覽器的 COOKIE 設定 *#firefox 在「選項/個人隱私/瀏覽紀錄/使用自訂的設定/顯示 Cookie」 *#chrome 在「設定/顯示進階設定/隱私權/內容設定/Cookie/所有 Cookie 和網站資料」 *先全部移除之前的 Cookie ,再進入 jendo.org/~你自己/WWEB/sessLogin3.php *找到 COOKIE 中變數 PHPSESSID ,刪除它之後,sessionId會變、COOKIE中沒有、SID常數會放「PHPSESSID=新的sessionId xxxx」、SESSION 是會新生一個 sess_xxxx 的變數存放檔。 *注意:同一時間,不同的瀏覽器針對相同的網站,會使用不同的 sessionId 和 SESSION 變數存放檔,但相同的瀏覽器、針對相同網站上不同的 php 會使用相同的 sessionId 和 SESSION 變數存放檔。 ===2016.11.4=== *完成兩組 session 機制演示 *#有開 COOKIE *#沒開 COOKIE *架站測試 *#建立並修改 passtest.php *#轉移 nameList.php '''參考資料''' Mediawiki的session *COOKIE設變數 *#$wgDBname_wiki_session:放 session id *#$wgDBname_wiki_UserName:放登入帳號的 url 編碼 *#$wgDBname_wiki_UserID:放登入帳號的 user_id *#$wgDBname_wiki_Token:放登入帳號的 user_token *#$wgDBname_wiki_LoggedOut:放登出時時間戳記(秒數) 參考: #[https://www.mediawiki.org/wiki/API:Login/zh 登入] #[https://www.mediawiki.org/wiki/API:Tokens/zh 令牌] adminer的session *COOKIE設變數 *#adminer_permanent: *#adminer_version:放 0 *#adminer_sid:放 session id *#adminer_key:放長數字 可用客戶端資訊: #HTTP_HOST:當前請求頭中 Host: 項的內容,如「jendo.org」 #HTTP_COOKIE:此 host 上所有有效的COOKIE變數之變數名與變數值,兩組變數間以「;」間開。 #HTTP_USER_AGENT:瀏覽器相關資訊,也可用 get_browser() 來取得 #REMOTE_ADDR:客戶端的ip #REMOTE_PORT:客戶端的port,會跳來跳去不固定 #QUERY_STRING:「?」之後的變數串 #REQUEST_URI:請求要訪問的網址,URL編碼,含QUERY_STRING #SCRIPT_NAME:當前腳本檔的網址,URL解碼,不含QUERY_STRING。通常就是REQUEST_URI所指的網址,只是URL解碼。 #PHP_SELF:當前腳本的檔名,從文件根目錄算起,通常就是同上的 SCRIPT_NAME 。例如,在網址為 http://example.com/test.php/foo.bar 的腳本中使用 $_SERVER['PHP_SELF'] 將得到 /test.php/foo.bar。<br/>__FILE__ 常數包含當前腳本檔的完整路徑和檔名。<br/>從 PHP 4.3.0 版本開始,如果 PHP 以命令行模式運行,這個變數將包含腳本檔名。之前的版本該變數不可用。 #SCRIPT_FILENAME:當前執行腳本檔在伺服器檔案系統絕對路徑中的位置、名稱。<br/>如果在命令行界面(Command Line Interface, CLI)使用相對路徑執行腳本,例如 file.php 或 ../file.php,那麼 $_SERVER['SCRIPT_FILENAME'] 將包含用戶指定的相對路徑。 #REQUEST_TIME:請求開始時的時間戳記(秒數) #REQUEST_TIME_FLOAT:請求開始時的時間戳記(秒數,含小數以下4位,到萬分之一秒) 次要資訊: #REQUEST_METHOD:客戶端對伺服器端請求方法;例如,「GET」、「HEAD」、「POST」、「PUT」,請求方法為 HEAD,PHP 腳本將在發送 Header 頭信息之後終止(這意味著在產生任何輸出後,不再有輸出緩衝)。 #HTTP_REFERER:該值並不可信。此為引導客戶端到當前頁的前一頁的地址(如果存在),如 http://jendo.org/~%E4%B8%81%E5%BF%97%E4%BB%81/WWEB/sessLogin1.php?xx=yy 。 ===2016.11.11=== *www之下增「sessPath」路徑 *調 serverConstant.php <pre> <?php ini_set('session.save_path','/volume1/homes/○○○/www/sessPath'); if(!isset($noSession) || !$noSession){@session_start();} define('CMS','alone'); define("CLASS_HTML_PATH",'/et/class'); define('CLASS_FILE_PATH','/volume1/web/et/class'); define('DSN',"mysql://assistant:aide@localhost/助理們"); include_once CLASS_FILE_PATH."/wiki/wiki.php"; if(!function_exists('webContent')){include_once $_SERVER['DOCUMENT_ROOT']."/GfWebContent.php";} ?></pre> *調 index.php <pre> <?php include_once '../serverConstant.php'; include_once "theme.php"; include_once CLASS_FILE_PATH."/database/DB.php"; DB::connect(DSN); if(!isset($_REQUEST['ajax'])){echo $html1;} echo webContent(urldecode($_SERVER['REQUEST_URI'])); if(!isset($_REQUEST['ajax'])){echo $html2;} ?></pre> *調 theme.php ,$html1 加 if(isset($moreJavascript) && $moreJavascript){$html1.=$moreJavascript;} *nameList.php 更名並下載新的 *改 passtest.php 中類別的路徑 *加「秦始皇」 *調 style.css 加圖照靠右 ===2016.11.18=== *[http://jendo.org/files/doc/etable.htm etable基本說明] *練習: *#建 account_xxx資料表 *#建 std.php 加基本五行。 *#加 css、editable、perpage、colAlias 諸屬性 *#加 formType 屬性 *#嵌入 WWEB 中。 *#加入密碼驗證。 ===2016.11.25=== *建立 DVD.php *#加 colAlias、formType 屬性 *#加 formType/oneWaySwitch 到 inHome 欄 *#加 concat(Name,'-',number) 演算式欄位,並了解演算式欄位無法編輯 *#加 演算式欄位的代名 *#加 moreCol(額外欄) 屬性,並解釋自訂函式 f1,f2 *#加 formValidate 驗證屬性,並解釋正規表示式 *回到 std.php *#加 驗證屬性 到 summary、money 兩欄 *#同學取回連動兩陣列 *#加 formType/select2,select22 到 subaccount,subaccountItem 兩欄 ===2016.12.2=== 架構改動: #將 sessPath 移到更深的地方:不在 www 之下而與 www 平行,網際網路無法讀得到 #serverConstant.php 的首行改為 「ini_set('session.save_path','/volume1/homes/○○○/sessPath');」 '''etable 應介紹內容列表''' *基本入門應用 *#載入常數檔,載入 etable.php 類別定義,new 出新物件,設物件的 sql[0] 屬物,執行物件的 main() 方法。 *#加 css、editable、perpage、colAlias 諸屬性 *#嵌入 WWEB 中:載入 theme.php ,在未傳入 exec_type 時秀出 $html1 和 $html2 *formType *#(v)select *#(v)select2 *#(v)select22 *#searchSelect *#(v)radio *#radioyn *#(v)checkbox *#(v)date *#auto *#hidden *#password *#unix_time *#(v)oneWaySwitch *#wrap *(v)演算式欄與額外欄 *(v)輸入驗證屬性 formValidate 與正規表示式 *(∆)蒐尋與排序 *#search:蒐尋 *#searchId:蒐尋表單中傳入值必須以「=」蒐索的諸欄 *#order:排序 *(∆)繪圖 *(∆)批次處理 *顯示型態與頭部控制 *控制多表的可「插編刪」屬性 *檔案上傳與管理 *是否翻譯 *用編碼函式輸入欄值:參考 jj/testBatch.php *一工作程式多物件協作 *多國語言 學員操作 #在 std.php 、 DVD.php 中加入 search 屬性、 searchId 屬性,如: #*$ET->search=array('Name','En');(在DVD.php中) #*$ET->search=array('summary','subaccount');(在std.php中) #*$ET->search=array('money');$ET->searchId=array('money');(在std.php中) #在 std.php 、 DVD.php 中加入 order 屬性 #到 共用 的 www/示範程式 中下載 etable繪圖.txt ,嵌入 std.php 並抑制原來的 sql[0]。 #練習 std.php 介面中「畫圖」與「關圖」兩按鈕。 #理解$sql陣列中,'stats'(字串索引)元素,為陣列,代表各統計圖形。其各元素含意如下: #*$sql['stats'][0]['sql'] ,選取兩欄第一欄為值,第二欄為值之註解 #*$sql['stats'][0]['file'] ,drawbar.php畫長條圖,drawpoly.php畫折線圖 #*$sql['stats'][0]['x_word'] ,x軸說明 #*$sql['stats'][0]['y_word'] ,y軸說明 #*$sql['stats'][0]['vu'] ,值之倍率 #*$sql['stats'][0]['x_angle'],值之註解旋轉角度 #*$sql['stats'][0]['xu'] ,x軸每單位幾點 #*$sql['stats'][0]['yu'] ,y軸每單位幾點 #自己設計一個統計圖表 #到 共用 的 www/示範程式 中下載 editCol3.php ,放入自己的 WWEB 中。 #練習兩介面切換。 #了解用POST通道中的 type 變數控制兩介面切換。 #設法將 editCol3.php 嵌入 WWEB 的布景中,想不出來就等老師下週公布答案。
返回到「
網頁程式撰寫
」。
切換側邊欄
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊
六年制學程
導覽選單
個人工具
登入
命名空間
頁面
討論
變體
視圖
閱讀
檢視原始碼
檢視歷史
更多
搜尋