etable手冊

  1. 概觀
  2. 與xoops之比較及結合
  3. main諸引數
  4. 通道諸變數
  5. 重要屬性
  6. 單獨使用時之常數
  7. 未來改良方向
  8. 目前使用及測試的case
  9. 程式說明
    1. etable.php
    2. 工作程式
    3. mkphp.php
附錄 使用手冊 dot.gif 程式撰寫提示

壹、etable 概觀

一、效用與開發目的:

  1. 專注於資料表的輸出,與筆的維護(基本的插、編、刪)。
  2. 讓許多介面使用相同物件,只要維護這個物件(做一次),不必再很多次。除錯是程式開發最耗時的部分,除一次,用很多次。
  3. 增進分工:
    • 高手:撰寫新方法
    • 中手:組合運用方法,熟悉運用html及php陣列
    • 低手:直接套用方法,熟悉MySQL的Select語法及php陣列。
    • 超低手:使用程式產生器。

二、功能:

  1. 支援多表。
  2. 支援數學公式。
  3. 支援ajax,佈景不重畫僅資料重畫,第一次載入時才load 諸css,諸js,其餘時機只引用就好。
  4. 可調整sql指令,使工作程式的能力和MySQL新版功能與時俱進。
  5. 支援自行定義的額外欄位,並可指定插入位置。
  6. 支援多種顯示格式:表格式、文章式、文句式、月曆式,將開發卡片式及日曆式。
  7. 畫面分解為head,form,body三部分,三部分可進行多種樣式組合。
  8. 支援sql演算式欄位。
  9. 可在xoops中使用,也可單獨使用。單獨使用可套佈景,有etable.css可參考。要載入常數檔constant.php。
    單獨使用時用到四個class:database,xoopsform,calendar,logger.php,均可從xoops拷出來。
  10. 單獨使用可使用帳號認證。
  11. 支援單筆插入及連續插入。
  12. 蒐尋功能
  13. 排序功能
  14. 繪圖功能
  15. 多國語言

三、基本規畫與工作流程:

  1. 考慮處理對象是「多人同時」使用的資料表,其他client可能正使用相同的工作程式(x.php),所以和資料表相關的畫面須即時重畫。
  2. 通道→x.php→→→→→→叫main函式(諸引數)
            ↑ 通道傳入:exec_type,   └→ 共同完成main()
            ↑          action ,perpage↗
    載入etable.php      rid[表],start
  3. 變數值彈性:物件屬性預設 < 函式預設 < x.php中寫死引數(每支php不同) < 通道傳入(每次不同)
  4. form中省略action會後送給自己,省略method會使用GET,所有submit無過濾一定後送,這有時會壓掉ajax的局部後送回應,要小心
  5. 而通道應只傳與單一client與其他client無關的變數。

四、程式檔案:

  1. x.php :實際運作的工作程式。
  2. constant.php:單獨使用時之常數定義。一constant.php支援多個工作程式。
  3. etable.php :類別定義。一個類別定義支援多個constant.php。
  4. etable.css :單獨使用時之布景範例。
  5. etloc_ct.php:正體中文語系檔。
  6. etloc_en.php:英文語系檔。
  7. edraw.php :繪圖類別定義。
  8. drawbar.php :長條圖。
  9. drawpoly.php:折線圖。
  10. drawpie.php :派圖。
  11. mimetex.cgi :數學公式繪圖二元執行檔。
  12. mimetex.php :數學公式過濾程式。將[tex]公式[/tex]換成圖檔。
  13. dot.gif :一圖素之白點,讓ajax可以透過onload來執行javascript。
  14. xoopsform目前只使用了formhidden.php,formlabel.php,formbutton.php,formtext.php,formselect.php,formradio.php,formradioyn.php,formcheckbox.php,formcheckbox.php等表單元素。修改:
    1. formelement.php和formtext.php原在標籤內有$_extra,以getExtra()實體化,丁丁增加$_extra2,在標籤外用getExtra('2')實體化,以支援小日曆。<img onload="Calendar.setup(物件實字)">
    2. 因為原來的xoopsform,靠臨時產生javascript函式作輸入驗證,但此法在改用ajax後便失效,所以進行以下修改:
      form.php和themeform.php原在lt;form>標籤內有$_extra,支援form屬性設定,丁丁增加$_extra2,在form中實體化時</form>前加getExtra('2')。以便日後利用setExtra('2'),透過<img onload="runJava()或其他函式或設定物件實字>,然後讓sendFormData()進行表單驗證。
      runJava遺址在et/jj_test內。
    3. formcheckbox-et.php在xoops2.2版時,抑制掉複選。但2.3版尚未抑制複選。
    4. formselect.php、formcheckbox.php、formtextarea.php在xoops2.3版時因多了「xoops_load('xoopsformelement');」只能為xoops版使用,無法為etable單獨版所使用,所以必須改用xxxx-et.php(抑制過xoops_load())。
  15. etable.html :基本說明文件

五、範例檔案:

  1. etdemo.php 是九參數的例子,額外欄button,隱藏欄
  2. etdemo2.php 測單獨使用
  3. etdemo3.php 測單一表格時
  4. article/sel.php 文章/一筆時無頭
  5. bt.php 文句/基測題目/簡易認證
  6. account.php 記帳/秀圖/條件/排序

貳、與xoops之比較及結合

一、大體比較:

功能類別 xoops 參考其他軟體 etable獨立使用
小、快、易設定,易與多種CMS結合。 自行優化
ajax 沒有 自行強化
PHP繪圖 沒有 自行強化(edraw)
資料表通用表達管理沒有 phpmyadmin 強化
google服務Data擷取沒有 自行強化
CSV編輯 沒有 自行強化
跨資料庫 沒有 自行強化
樣版列印 沒有 自行強化,支援ODF
簡報製作 沒有 自行強化(mkweb)
跨平台桌面AP 沒有 Abyss Web Server 整合
日期時間 jscalendar 沿用
資料庫物件 完整 沿用
通用表單 完整 沿用
使用者登入管理 連結LDAP
設定 完整 極簡化,在x.php中處理
模組 完整 極簡化,一x.php一功能
多國語言 完整 極簡化,在x.php中處理,etable.php中多國語言由constant.php處理
布景 完整 極簡化,用x.css處理
區塊 完整 不用
樣板引擎 完整 未定

二、項目比較:

xoops etable獨立使用
全域變數 $xoopsRequestUri /modules/kpfood/x.php $_SERVER['PHP_SELF']
$xoopsUserIsAdmin 1或0 不用
$xoopsConfig 整體性一般設定陣列 不用
$xoopsModuleConfig此模組偏好項目設定陣列 不用
$xoopsOption 頁面及佈景控制陣列 不用
$xoopsSecurity 未定
$xoopsErrorHandler編錯誤碼,設定各種顯示 仿做
$sess_handler 未定
$xoopsLogger 已用
$xoopsDB 資料庫連結 已用
$config_handler 設定控制 不用
$member_handler 使用者及其群組 不用
/$xoopsUser 使用者 將用
$module_handle 模組控制 不用
/$xoopsModule 現用模組 不用
$xTheme 佈景 不用
/$xoopsTpl 樣版引擎 未定
非全域物件 XoopsImage 圖片管理 仿做
XoopsLists 列表 已用
class.tar.php 處理TAR檔 未定
class.zipfile.php 處理zip檔 未定
XoopsDownloader 使網頁轉成其他MIME格式的header未定
block.php 區塊 不用
comment.php 評論 仿做
notification.php 通知 仿做
editor,xoopseditor編輯器 仿做
profile.php 使用者管理 將用
privmessage.php 私人訊息 將用
auth_ldap.php ldap登入 將用
通用物件 phpmailer 郵寄 將用
smarty 樣板引擎 未定
xml/css 將用
snoopy webclient:擷取某個網址的網頁資訊,直接傳送表單資訊餵(post)給某個網頁的
處理,利用這功能其實就很容易寫出自動登入、自動填表單、無限制新增表單!
將用

二、xoops之校調與修改:

  1. xoops用$_SESSION看是空值,但是用cookie看有PHPSESSID=唯一碼。
  2. common.php的198行是session_start,然後將$xoopsUser物件初始化。如session_start未執行,會導致$xoopsUser成為空字串,而非物件。
  3. 但執行198行又會出現header已送出的警告訊息,不可用headers_sent()判斷標頭是否送出然後決定要不要session_start,而要用@session_start,抑制警告訊息。
  4. 改form.php、formelement.php,在_extra屬性外再加_extra2,用於表單外、元素外額外字串。改其setExtra方法、getExtra方法。
  5. 改themeform.php,在其實體化方法render()中,在table和form結束前加入getExtra('2'),取得_extra2。
  6. 改formtext.php,在其實體化方法render()中, 在input結束後加入getExtra('2'),取得_extra2。

參、main諸引數

有屬性者,一物件僅能一值;非屬性者,一物件可以多值。
引數屬性名資料型態預設值MVC新增屬性
1查詢命令sql字串或陣列M
2顯示「插,編,刪」連結整數0Veditable
3每頁筆數perpage整數15C
4欄名代稱col_alias陣列空陣列M
5額外欄陣列空陣列V
6顯示型態字串disp_tableV
7可「插編刪」諸表editables陣列空陣列M
8表單中諸欄描述form_type陣列空陣列Mfield[$i][formType]
9是否翻譯tran布林0C
10輸入驗證formValidate布林0Cfield[$i][formValidate]

由於多表且各表可能有代稱,所以定義:
表代稱(as_name),例如select * from DVD as d,d即為表DVD之代稱。
長欄名(lc_name),只有一表時為「欄名」,多表時為「表代稱.欄名」。例如select Name from DVD as d,「d.Name」即為長欄名(lc_name)。

一、$sql:查詢命令,須為select,不可帶limit。

可為字串,亦可為陣列。

(一)字串:

  1. 諸欄可為欄名或演算式。
  2. 無預設值。
  3. 諸欄為欄名時,若在可編表中,會出現於表單並可編。依form_type及欄型決定表單元件。
  4. 諸欄可為演算式,不可編,若有欄名代稱則出現於表單中;無欄名代稱則不出現於表單中。
  5. 演算式傳回的name是演算式或as 欄名之欄名,len是計算後最大可能的長度(char在utf-8中要乘三倍,整數乘一倍),type 視演算式傳回值的種類,flags 預設為not_null及其他特性,table 為空字串(非null)。
  6. 演算式中若結合純字串與字串欄時,flag變成not_null,type為string。
  7. 演算式中若結合數值與字串,會使flag變成binary。而其type有時為string有時為blob規則不明。

(二)陣列:

  1. 其第0元素(註標索引)為sql命令,規則同上段。
  2. 'where'(字串索引)元素,元素值為額外過濾條件,會用and加進第0元素。
  3. 'order'(字串索引)元素,元素值為額外排序條件,會用「,」加進第0元素。
  4. '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軸每單位幾點

二、$editable:顯示「插,編,刪」連結。

  1. 用1+2+4:代表「插,編,刪」相關連結顯不顯示。1代表插入連結,2代表編連結,4代表刪連結。
  2. 預設值0,即只可顯示。
  3. 以($editable%2)>(2/2-1)、($editable%4)>(4/2-1)、($editable%8)>(8/2-1)檢查
  4. 與各表可「插,編,刪」無關。各表是否可「插,編,刪」由$editables陣列管制。

三、$perpage:每頁筆數。

  1. 預設值15。

四、$col_alias:欄名代稱。

  1. array(lc_name=>代稱,…)
  2. 預設值為空陣列。
  3. 用以顯示表首列之各欄欄名。沒設之欄,其欄名代稱即為其長欄名。

五、$more_col:額外欄。

  1. array($i=>array(插入序,欄名代稱,函式名),…)
  2. 預設值為空陣列。
  3. 「插入序」表示插在第幾欄之後,欄名代稱為各額外欄的欄名代稱。
  4. 函式名為產生欄值的函式。函式在載入etable.php的php(x.php)中定義:function 函式名($i,$j,$k){演算式…return 值;},
    其中$i為在本頁中第幾筆,$j為本次查詢中第幾筆,皆從1開始算。$k為本筆其他欄的欄值陣列。
    $k[0]~$k[n]代表各欄原欄值,$k['rid']代表各表之rid,由$k['rid']['as_name']取其值。
    所以額外欄之欄值可由$i,$j,$k此三者設定演算式算出後傳回。

六、$disp_type:顯示型態。

  1. list_body中各欄的相關位置。有disp_table、disp_text
  2. 預設值為'disp_table'。
  3. 目前支援以下型態:
    • no_thing:只完成物件,如何顯示在x.php中發揮。
    • disp_table:表格型態;
    • disp_text:文章型態;
    • disp_sentence:文句型態;
  4. 將再加入日曆型態、卡片型態

七、$editables:可插諸表,可編諸表,可刪諸表。

  1. 可插諸表:$editables['ins']=array(表代名,…);
  2. 可編諸表:$editables['edit']=array(表代名,…);
  3. 可刪諸表:$editables['erase']=array(表代名,…);
  4. 預設值為空陣列,代表全部資料表均可「插、編、刪」。

八、$form_type:指定欄位的表單元件型態。

  1. 預設值為空陣列。
  2. 有select(選單欄),radio(選鈕欄),radioyn(10選鈕欄),checkbox(核取方塊欄),unix_time(時間戳記),date(yyyy-mm-dd),hidden
  3. 陣列元素之索引為長欄名,值為陣列,其諸元素說明如下:
    1. $form_type[lc_name][0]欄的種類;
    2. $form_type[lc_name][1]欄值和提示
      • select,radio,radioyn,checkbox,date為陣列,元素索引是欄值,元素值是提示
      • hidden,unix_time是字串,hidden是算出欄值的函式、unix_time是格式。
      • auto是陣列
    3. $form_type[lc_name][2]後送條件
  4. 派值範例:
      $form_type=array('長欄名'=>array('select',array('值'=>'提示文字','值'=>'提示文字','值'=>'提示文字',…)),
                       '長欄名'=>array('radio' ,array('值'=>'提示文字','值'=>'提示文字','值'=>'提示文字',…)),
                       '長欄名'=>array('radioyn',array('0之提示','1之提示')),
                       '長欄名'=>array('checkbox',array('勾選後送值'=>'提示')),
                       '長欄名'=>array('date',array('ifFormat'=>'daFormat')),改畢,因欄值'%Y-%m-%d'是小日曆認得的格式,所以預選日期為欄值日期
                       '長欄名'=>array('auto',array('plain','html','wiki','tex')),改畢,$this->form_type中未定義,則$this->fields[$i]["formType"]會自動將該欄定為auto型,如欄型為TEXT則form出textarea,其他出文字欄。第二元素為語法組合陣列,預設為plain(純文本)。
                       '長欄名'=>array('hidden',函式,表單種類),
                       '長欄名'=>array('unix_time',"Y-m-d<bR>H:i:s",表單種類),待改,因欄值'%s'是小日曆不認得的格式,所以預選日期為跑到當天日期,要認得欄值格式須為「年-月-日 [10] 時:分」,用Calendar.setDateFormat('%s');無效。此事無解,參看http://192.168.3.175/et/class/calendar/jstest.htm,不是每一種格式jscalendar都可以認得出日期,如Date #0:的%s會解不出日期,Date #2:的…會解錯日期,Date #4:解不出日期。
    
                      );
  5. unix_time型:在body中強迫翻譯為日期時間樣式。其後的表單種類:
    • 'ins':在插入表單中以隱藏欄後傳mktime(),編輯表單則用小日曆。
    • 'ins_only':在插入表單中以隱藏欄後傳mktime(),編輯表單則不改其值。
    • 'edit':在編輯表單中以隱藏欄後傳mktime(),插入表單則用小日曆。
    • 'both':在插入表單及編輯表單中均以隱藏欄後傳mktime()。
    • 其他字串:在插入表單及編輯表單中均用小日曆。

    如果要在插入時自動插入時間戳記,而編輯時用小日曆,應選用'ins'表單種類。
    小日曆無法將input/text型改成input/hidden。
  6. hidden型:在body中不顯示。其後的表單種類:
    • 'ins':在插入表單中以函式值用隱藏欄位後傳,編輯表單則正常。
    • 'ins_only':在插入表單中以函式值用隱藏欄位後傳,編輯表單則不改其值。
    • 'edit':在編輯表單中以函式值用隱藏欄位後傳,插入表單則正常。
    • 'both':在插入表單及編輯表單中均以函式值用隱藏欄位後傳。
    • 其他字串:在插入表單及編輯表單中均正常。
型態 插表單中編表單中 body不翻譯時body翻譯時
select select諸option 提示文字
radio 諸radio 提示文字
radioyn 兩radio 提示文字
checkbox 一checkbox 提示文字
date yy-mm-dd及小日曆
unix_time 小日曆指定的date()樣式
隱藏欄後送mktime()
hidden 隱藏欄後送函式值不顯示

九、$tran:是否翻譯。

  1. 1代表body顯示時將欄值翻譯成對應之提示文字,提示文字在form_type中指定。
  2. 預設為0,除unix_time外,其餘均不翻譯。

十、$formValidation:輸入驗證陣列。

  1. array(lc_name=>array('合法輸入值的正規表示式','驗證不過之提示'),lc_name=>array(…),…),以各欄的lc_name為索引。
  2. 預設值為空陣列。
  3. xoops的javascript檢驗無法在ajax中作用,須重寫。但必填欄有*。

十一、$must:必填欄位陣列。

  1. array(lc_name,lc_name,…),以各必填欄位的lc_name為諸值。
  2. 預設值為空陣列。
  3. xoops的javascript檢驗無法在ajax中作用,須重寫。但必填欄有*。

肆、通道諸變數

  1. $exec_type:執行型態。0或無:重畫布景,1:不重畫布景但重畫head,form,body,2以上只執行相應的javascript。次次不同,不可由main引數設死。
  2. $perpage:每頁筆數。
  3. $start:開始筆。
  4. $rid:此次要編刪的筆索引,必須在各表中均唯一,$rid[表代名]值為「主鍵欄名=欄值」或諸「 and 欄名=欄值」。
  5. $action:資料表前置處理。
    • 'ins'要插一筆,出插入表單。
    • 'ins_ed'已插畢,update資料表。
    • 'inss'連續插入,是ins和ins_ed的綜合。
    • 'edit'要編某筆
    • 'edited'已編畢
    • 'erase'刪某筆

伍、重要屬性

  1. $rid :要找到某一筆資料,通道傳入,在main解析,在mk_tbl比對
  2. $sql :現用查詢,sql[0]是x.php中函式引數,sql['from']…為命令中的各段,sql['tmp']是未解析前帶as的諸表字串
  3. $colnum :查詢指令總欄數,ana_sql完得初值,不含索引欄、額外欄
  4. $rownum :查詢指令總筆數,ana_sql完得初值
  5. $tblnum :查詢指令資料表數,ana_table完得初值
  6. $table_list:諸資料表名串成字串,ana_table完得初值。
  7. $tables :諸資料表陣列,ana_table完得初值。由於from段中,諸表的as name不可重覆,且考慮了不同庫名同表名的問題所以tables可用as name索引,欄好依as_name找表。
    • tables['as_name']['t_name']
    • tables['as_name']['PRI'] 可能有可能沒有,有時用作$rid
    • tables['as_name']['sql_col']為陣列,元素為「欄名=>欄序」,表示sql中slect 諸欄中,屬於本表的有那幾欄
  8. $fields :查詢指令諸選用欄,ana_fields後得初值,含索引欄,不含額外欄。由於不同表可取相同欄名,所以要用註標索引,如用欄名索引,後欄壓前欄,同名欄會只出現一次。
    • fields[$i]['colname']欄名
    • fields[$i]['collen'] 欄長
    • fields[$i]['coltype']欄型
    • fields[$i]['colflag']欄旗
    • fields[$i]['as_name']所屬表名,代稱
    • fields[$i]['lc_name']長欄名,只有一表時為「欄名」,多表時為「表代稱.欄名」
    • fields[$i]['default']預設值
    • fields[$i]['colalias']欄代稱
    • fields[$i]['must']是否必填。1必填,0非必填。
  9. $tbl :查詢指令結果多維陣列,含索引欄,不含額外欄,含各筆之rid
  10. $defau_v :defau_v[表代名][欄名]為該欄預設值
  11. $form :表單物件
  12. $extra :額外傳遞項
  13. 屬性來源一覽表:
    $perpage 通道>main()>方法預設
    $start=0 通道>方法預設>類別預設
    $action 通道
    $rid 通道
    $sql main()參數
    $colnum 由sql決定
    $rownum 由sql決定
    $tblnum 由sql決定
    $tables 由sql決定
    $table_list由sql決定
    $editables main()參數
    $fields 由sql決定
    $col_alias main()參數
    $tbl 由sql+perpage+start決定
    $defau_v 由sql決定
    $form 由sql+col_alias+form_type決定
    $form_type main()參數
    $tran main()參數
    $extra main()參數中$sql陣列中的where,order元素
  14. $users :登錄驗證陣列
  15. $calendar_start:月曆中該月起始秒數

陸、單獨使用時之常數:

define("ALONE",1); 脫離xoops獨立執行。
define("CLASS_HTML_PATH",'路徑');      包含諸class之url路徑。以url之根節點為根目錄。
define("XOOPS_ROOT_PATH",'絕對路徑');┐伺服器中包含諸class之檔案路徑。
define("XOOPS_DB_TYPE",'mysql');     │
define("XOOPS_DB_PREFIX",'前置字串');│
define("XOOPS_DB_HOST",'可用HOST');  ├同mainfile.php
define("XOOPS_DB_USER",'可用帳號');  │
define("XOOPS_DB_PASS",'可用密碼');  │
define("XOOPS_DB_NAME",'資料庫名');  │
define("XOOPS_DB_PCONNECT",'1');     ┘
define("XOOPS_DB_PROXY", 1); 選用XoopsMySQLDatabaseProxy實體化資料庫物件,
     通常用於非post通道。未設則以XoopsMySQLDatabaseSafe實體化資料庫。
define("_REQUIRED",'必填欄位,務請填寫。');

柒、未來改良方向:

  1. 必填欄javascript檢查。
  2. 物件一覽表
  3. 屬性一覽表
  4. 方法一覽表
  5. 加強蒐尋
  6. 加強排序
  7. 跳頁選單上下都有
  8. 唯一插入(不重覆插入)
  9. 多筆插入
  10. 多筆編輯
  11. 日曆型
  12. 群組 LDAP
  13. 桌面端AP開發環境,配合Abyss Web Server(小,跨平台,多國語言,免費)
  14. 繪圖增加派圖及資產負債圖
  15. 跨資料庫
    CSV模式
  16. 拖曳
  17. 列印
  18. 簡報

捌、目前使用及測試的case:

  1. xoops 文章模組。
  2. 教育2.0網站網路連署。
  3. 教育2.0捐款。
  4. 教育2.0基測題目公布。
  5. 開平食材網站(不小)。
  6. 開平綜高課程→自製行事曆。
  7. 開平綜高課程→LDAP認證。
  8. 開平綜高課程→自製設施管理系統。
  9. 開平綜高課程→自製收支帳記帳軟體。
  10. 開平綜高課程→自製記帳過帳軟體→Open Source for NGO。
  11. 開平綜高課程→自製動態欄位管理工具。
  12. 開平綜高課程→自製階層樹解析軟體。
  13. TOP→ODF檔案格式解析及轉檔。

玖、程式解說:

一、三層程式

      2  帶時分秒日曆
      3  日曆
    exec_java2
    exec_java3

二、互動介面

附錄一、使用手冊

  1. 建資料表。字串欄、數值欄、日時欄都能和excel互通。日時欄datetime欄、timestamp格式完全一樣,只接受now()函式或字串輸入,差別在於前者的預設值只能固定如0000-00-00 00:00:00;後者的預設值可固定或CURRENT_TIMESTAMP插入當地時間(作用同now())。
  2. 執行mkphp.php,並指定sql。
  3. 指定參數,儲存參數。
  4. 如果以數值編碼,數值必須「定長」,以後才能支援複選欄位蒐尋。因為複選欄位的蒐尋只能用like而不能用=,而like '%1%'會把1和10都找出來,但是like '%01%'只會找到01不會找到10。
  5. 改sql需到後台資料表中修改,其和介面有相依關係。

附錄二、dot.gif

       byte值           bits
                   7 6 5 4 3 2 1 0
Byte序+-----------+---------------+
 0-5  |GIF87a     |               | GIF 識別
      +-----------+---------------+ ---------------------------------+
 6-7  |1,0        |    顯示框寬   | (最小值位元優先)                 |
      +-----------+---------------+                                  |
 8-9  |1,0        |    顯示框高   | (最小值位元優先)                 |
      +-----------+-+-----+-+-----+ M=1,隨後描述全體色彩映圖         |
 10   |128        |M|  cr |0| 像素| cr值+1=顏色的解析度由幾個bits代表+-- 顯示框描述
      +-----------+-+-----+-+-----+ 像素值+1=每像素由幾個bits代表    |
 11   |0          |   背景色色碼  | (依全體色彩映圖或預設映圖指定)   |
      +-----------+---------------+                                  |
 12   |0          |0 0 0 0 0 0 0 0|                                  |
      +-----------+---------------+ ---------------------------------+
 13-15|255,255,255|  紅,綠,藍強度 | 色碼0 --+  缺全體色彩映圖時      |
      +-----------+---------------+         +--IE預設為黑色          +-- 全體色彩映圖(2的n方個項目,n為每像素由幾bit代表)
 16-18|255,255,255|               | 色碼1 --+  Firefox預設為白色     |
      +-----------+---------------+ ---------------------------------+
 19   |,          | 圖形描述前導字|                                  |
      +-----------+---------------+                                  |
 20-21|0          |    左側起點   |                                  |
      +-----------+---------------+                                  |
 22-23|0          |    上側起點   |                                  |
      +-----------+---------------+                                  +-- 圖形描述 --+
 24-25|1          |      圖寬     | M=0 使用全體色彩映圖,忽略像素欄  |              |
      +-----------+---------------+ M=1 隨後有局部色彩映圖,使用像素欄|              |
 26-27|1          |      圖高     | I=0 圖形格式為連續式             |              |
      +-----------+---------------+ I=1 圖形格式為交錯式             |              |
 28   |0          |M|I|0|0|0|pixel| 像素值+1=每像素由幾個bits代表    |              |
      +-----------+---------------+ ---------------------------------+              +-- 重覆一到多次
      |           |               | 局部色彩映圖(本例無)             |              |
      +-----------+---------------+ ---------------------------------+              |
 29   |2          |   壓縮碼大小  | 通常為幾bit代表像素但不能為1     |              |
      +-----------+---------------+ ---------------+                 |              |
 30   |0          | 資料塊byte數目|                |                 |              |
      +-----------+---------------+                +--重覆一到多次   +-- 點陣資料 --+
      |           |   點陣資料塊  | LZW編碼(本例無)|                 |
      +-----------+---------------+ ---------------+                 |
 31   |0          |0 0 0 0 0 0 0 0| 結束本圖形                       |
      +-----------+---------------+ ---------------------------------+
 32   |;          |               | GIF 終止指示
      +-----------+---------------+
Firefox可接受有顯示框無圖形的gif圖,加上省略全體色彩映圖預設為白色,所以畫一白點最少14byte,IE一定要有圖形不能只有顯示框,圖的寬高不能為0,一定要有點陣資料區,但編碼的點陣資料塊大小可為0,所以畫一白點最少為33byte。

附錄三、程式撰寫提示

javascript部分

  1. index屬性只隸屬於select之下的option,指出該option是第幾個(從0算起)。不能用來查表單元素是該表單的第幾個。而selectedIndex則傳回被選的option是第幾個。
  2. 已知該元素是表單中的第幾個元素可以用elements[幾]來標示此元素;反之不然,無法查出此元素是第幾個元素。
  3. 不啟用javascript時也能使用,對連結有問題。ajax連結可以用post通道送參數,但如改用href就非走get通道不可。
  4. 抓出表單元素的諸方法:
    1. document.表單.elements[i]
    2. document.表單.元素名
    3. document.getElementsByName('元素名稱')[0]
    4. document.表單.elements['元素id']
    5. document.表單['元素id']
  5. 為了使表單後送資料結構良好,所以表單元素常會設定name=xxx[xxx],這種元素名稱含有[]的表單元素無法用「document.表單名.元素名」來找出該表單元素,但可以用上項的其他方法來找出該表單元素。
  6. 表單元素名稱也可以使用變數,利用上項方法再加上eval()指令,如eval("document.表單."+變數)。
  7. 如果同一表單中有多個 NAME 屬性相同的對象,將會自動創建一個該名稱的陣列。該陣列中的每一個元素描述一個單獨的對象。元素按照源文件的順序從 0 開始依次索引。例如,如果相同窗體中有 NAME 屬性同為「myField」的兩個 Text 元素和一個 Button 元素,將會自動創建元素為 myField[0]、myField[1] 和 myField[2] 的陣列。你需要在代碼中注意到這種情況,並且自行識別 myField 到底是對單個元素還是元素陣列的引用。

PHP部分

  1. 關於引號,儘量以'為最裡層,約為HTML階層(除javascript事件觸發後包裹多指令)或SQL階層或PHP中之短字串(無換行、變數);再向外為",約為PHP階層,用以包裹長字串,其中有"者表達為\",給工作程式及etable.php用;再向外為<<<,約為編譯程式階層,在mkphp.php中使用。

其他部分

  1. 有關POST、GET通道編碼後送之詳述,請參閱ajax.html之「貳/三、後送資料」。現摘要如下:由於通道資料送至伺服器必經解碼,先用「&」切成一組一組變數,再用「=」切成變數名和變數值,變數名中發現「+」或「空白」或「%20」代換成「_」,變數值中發現「+」代換成「空白」;此外,不論變數名或變數值,「%xx」一概轉換成相應的非英數符號。所以etable只用POST通道,以下通道資料編成%xx:
    1. 「&」在變數值組成時就換掉,不然會干擾變數組分段。
    2. 「+」換掉,不然會被解碼成空白。
    3. 「<」「>」換掉,不然在連結<a onclick="postData('檔名','通道資料','輸出div');…">中會破壞HTML標籤。
    4. 「"」「'」換掉,不然會破壞引號對稱性和階層關係。引號常用於SQL指令欄值包裹。
    5. 「%」換掉,不然會和其他%xx url編碼混淆。%常用於SQL指令Like之後。
  2. 所以PHP中有 encode() 函式,提供諸表rid值編碼;傳送命令where、order之值編碼。
  3. javascript中也有 encode() 函式,提供sendFormData中非按鈕、非核取方塊、非隱藏欄之表單元素值後送前編碼。但此編碼不用管<、>。
    由於對%編碼,所以同一段字串絕不能編碼兩次,否則會將第一次編碼結果%xx的%再編碼,就錯了。所以javascript的encode()不對隱藏欄編碼。這樣就不會對rid,extra等已經在PHP編過碼者再編一次碼。