我設計的公司通信錄是先人工輸入到後臺,而後前臺進行綁定、查詢、更新等操做,今天先講後臺錄入這塊,主要包括部門設置和員工管理兩個頁面,全部的開發都在sae的代碼管理中進行,因此請進入SAE的應用裏的代碼管理。php
在開發前咱們先要上傳一個文件「base-class.php」,這個文件主要是用來作傳遞參數的過濾以及格式驗證,好比是否郵箱、手機等是否正確輸入,文件請回復「微信代碼」下載!html
第一個要開發的模塊是部門設置,通常的公司架構都是多層級的,好比總經理-》部門-》小組,所以咱們的部門設置裏也要具有多層級的功能。mysql
首先第一個頁面部門錄入頁面,咱們新建一個文件,命名爲class_add.php,主要實現功能爲添加和修改部門名稱及上下級分類。代碼以下:
sql
後臺頁面是須要在瀏覽器裏打開操做的,所以須要有HTML代碼部分,通常正規開發都會將數據操做、邏輯操做、網頁模板分離,我這裏圖方便就混排了。數據庫
這個頁面實現的是兩個功能:一是新增部門,二是修改部門,兩個是放在同一個頁面裏的,那麼如何判斷是新增操做仍是修改操做呢?根據url裏是否有傳遞過來部門的序號即ID號,若是有就是修改,沒有就是新增,具體後面會有解釋。segmentfault
碼解釋以下:數組
第1-6行代碼是html語言,頭部格式都是固定的,其中第4行是告訴瀏覽器這個網頁是utf-8編碼的,第5行是網頁的名字,會顯示在瀏覽器頂部,固然通常還有兩個重要參數,一個是Keyword,就是關鍵字,還有一個是Description,是網頁說明,這兩個都是作SEO時用的,這裏不須要就沒寫了。
- PS:HTML 語言一般被稱爲 HTML 標籤 (HTML tag),HTML 標籤是由尖括號包圍的關鍵詞,好比 <html>,一般是成對出現的,好比 和 ,標籤對中的第一個標籤是開始標籤,第二個標籤是結束標籤。瀏覽器
第7行是html頁面的主體的開始標籤<body>,瀏覽器會將<body>與</body>之間的內容顯示在瀏覽器頁面。安全
第9行是開始是php的程序處理。微信
第10行是加載前面讓你們上傳的base-class.php,後面會調用裏面的函數。
第13行是新建一個數據庫操做類,因爲是在sae環境下開發,因此我直接用了sae提供的mysql類,這樣就免去數據庫連接什麼亂七八糟的了。固然原始提供的函數並不豐富,也不適合代碼遷移,通常是須要去封裝一層的,我這裏先偷個懶吧,同時也方便你們學習。
第16行是獲取經過URL傳遞的參數class_id,即部門的序號。這裏有個intval函數是將變量轉化成整數,若是class_id值爲空則intval(class_id)=0;若是class_id值爲1則intval(class_id)=1;若是若是class_id值爲abc12則intval(class_id)=0,這裏的做用是將轉換數據格式同時防止注入。
PS:程序中數據傳遞主要經過兩種方式獲取GET和POST,前者是獲取URL的參數值,後者是獲取表單傳遞的數據,前者安全性低效率高適合傳輸一些小數據,後者安全性高效率低適合傳輸一些大數據。
第19行是獲取表單提交的參數action的值,用來判斷是否提交了表單。
第20、21行是用來過濾操做變量action的值,因爲action是字符串,因此得用字符串過濾規則,其中un_script_code是去除js代碼,un_html是去除html代碼。
第24行判斷class_id是否有值,若是有值即非0則表示修改序號爲class_id的部門信息;
第26行根據class_id從數據庫中提取詳細數據,提取單條記錄咱們使用sae的mysql類下的getLine函數,咱們前面已經新建了一個mysql類命名爲$mysql,因此這裏就是$mysql->getLine,後面括號裏就是一句sql查詢語句,意思是
select(選擇) *(全部字段) from(從) class(名字爲class的表裏) where(符合條件爲) class_id=$class_id(class_id字段的值等於$class_id的數據),獲取到的數據是一個數組,賦值給$class_value。
第27行爲判斷是否獲取到class_id=$class_id的記錄,!$class_value表示該值爲空沒有獲取到,那麼就執行一個警告。
第29行輸出一個JS語句,這個語句裏<script>是js的標籤,alert是警告函數,用法是alert("提示的文字內容"),history.back();是返回上一頁 ,整句話就是警告沒有該條記錄,點擊肯定後返回到上一頁,中斷程序執行。
第35行是判斷$action是否等於update,便是否提交了表單。
第38行到第44行是獲取從表單提交過來的數據,並進行格式化,其中$old_class_id的值來源是在修改條件下,url傳遞過來的class_id值會在存放在一個隱藏的input元素中,而後表單提交時又將該值傳遞回來,也就是$old_class_id實際上是url傳遞過來那個class_id的值。
第46行是獲取當前時間,time()以前有講過是獲取時間戳,是一個10位的整數,而後用date函數格式化成年月日時分秒格式,後面要寫到數據庫裏。
第48行是判斷$old_class_id是否爲空,即修改模式仍是新增模式,若是有值則爲修改模式。
第51,52行,更新數據的sql語言,
update 修改 class 名字是class的數據表 set 設置 class_name='$class_name', 部門名修改 class_fid='$class_fid',上級部門修改 edittime='$nowtime' 修改時間 where class_id=$old_class_id (符合條件class_id字段的值等於$class_id的數據)
你們能夠看到這裏修改的其實就是部門名字、上級部門,同時記錄下修改的時間,因爲sql語句自己就是一個字符串,因此當賦值的變量爲字符串須要用單引號包括起來,不然執行會出錯。
第53行是執行上面的sql語句,只運行語句不返回結果,函數爲runSql。
第5八、59行,新增數據的sql語句, insert into 插入數據到 class 名字是class的數據表 (class_name,class_fid,addtime,edittime,status)字段名 values 賦值爲 ('$class_name', '$class_fid','$nowtime','$nowtime',1)對應的值
這裏能夠注意到字段名和數據是一一對應的,分別是部門名、上級部門序號、添加時間、修改時間和記錄狀態(新增的設爲1表示正常)。
第63行,runSql函數雖然不返回數據結果可是會返回一個執行信息,$mysql->errno() 若是是0則表示成功,不然不成功。
第65行執行不成功,輸出警告信息。
第70行執行成功,輸出成功提示,而後頁面刷新,「location=」是JS函數,用來改變當前url並載入,連接地址爲「class_add.php」,我在後面又加了class_id=$old_class_id,效果會變爲若是是修改模式則從新加載一次修改後的部門信息,若是是新增模式則清空表單能夠繼續新增。
第76行提取全部有效的部門信息,主要是用來作上級部門選擇用的,提取多條記錄使用的函數是
getData,sql語句的意思是: select 選擇 class_name,class_id 部門名和部門ID from 從 class 名字是class的數據表 where 符合 status=1 狀態爲正常的數據 order by class_fid asc 按照上級部門ID的升序排序,order by 表示排序,排序的字段是class_fid,asc是升序即從小到大。
第80行開始是HTML代碼,H3是標題標籤,這裏寫了這頁面的標題是「部門添加/修改」,後面跟的一個連接地址用來返回到部門列表頁面,a標籤是連接標籤,href後面跟的是連接地址,a開閉標籤之間是頁面顯示文字。
第82行表單標籤開始,介紹下參數action是指當提交表單時,向何處發送表單數據,這裏是填寫URL,我這裏寫了?號,指向當前頁發送表單,method是以何種方式發送表單,有post和get兩種,通常選post,若是是get則表單會以url參數方式發送,name是指表單名字,id指該表單的惟一標示,enctype是指表單上傳前如何對錶單數據進行編碼,multipart/form-data是指不對字符編碼主要是在表單裏有文件上傳控件時使用。
第83行p標籤是段落標籤,即分段;
第84行部門名稱的文本輸入框,輸入控件的標籤是input;
type是控件屬性,不一樣屬性有不一樣的功能:text是文本框能夠輸入文字、file是文件上傳控件、button是按鈕、submit是提交表單按鈕、hide是隱藏控件;
name是該控件的名稱,提交表單時程序獲取數據時就是用這個名稱,能夠看下第38行到44行,命名規則建議使用和數據表字段同樣的名字,方便辨識;
value是該控件的值,傳遞到程序裏的就是這個值,我這裏寫了一段代碼是用來在修改模式下輸出部門名稱的,在新增模式下該值爲空。
第87到98行是一個選擇控件,用來選擇部門的上級部門,標籤名爲select,name爲該控件名稱;每一個option都是一個選擇項,value是該選項的數值,option開閉標籤之間是選項描述,最後傳遞的是value。
option還有一個屬性是selected,看名字就知道是選中,若是沒有一個選項指定了這個值,則默認第一個爲選中狀態。所以代碼裏第一個選項是「無上級部門」,value爲0。
在第76行咱們將全部的部門數據拉取出來賦值給$class_list,就在這裏用了,這個$class_list是用數組存放數據的,因此這裏用foreach將記錄一條條的讀取出來。
第94行是在修改模式條件下,咱們但願被修改的記錄上級部門名稱是選中狀態的,所以在循環輸出全部部門時,若是上級部門ID和列表部門ID相同時則加上selected,不然爲空,賦值給$class_select。而後在輸出
這裏我用了個判斷式 (條件)?成立:不成立;等於if(條件){成立}else{不成立}
第102,103行是兩個隱藏的輸入標籤,分別是放置action的值和class_id的值,這能夠看到class_id的value是經過前面獲取的url參數賦予的。
第105行就是提交按鈕。
該頁面訪問是在瀏覽器裏直接運行,輸入你的應用地址加上/class_add.php,執行效果以下:
新增了數據我們要看看效果唄,就要寫個部門列表管理的代碼,咱們命名爲class_manager.php,代碼以下:
有部分代碼是差很少的,主要解釋幾個地方吧,
第16行,是獲取當前頁碼參數。
第25行到34行是判斷是否要進行刪除操做,若是是刪除則獲取須要刪除的部門ID號,刪除操做咱們不是真正的進行操做,只是將將記錄狀態由正常變爲刪除,即1變爲0,因此這裏執行的實際上是更新操做,將status設置成0。
第35行到55行是一個分頁的加獲取符合條件記錄列表的模塊。
第38行,要分頁確定先要知道有一共有多少條數據,因此這裏是一個計算記錄總數的代碼,mysql操做函數getVar是返回結果集第一條記錄的第一個字段值,sql語句的意思是
select 選擇 COUNT(*) 總共多少條記錄 from 從 class 名字是class的數據表 where status=1 符合條件爲正常的數據
這裏的count(*)返回全部記錄總數,若是指定某個字段名,則是返回該字段不爲空的記錄總數。
第40行,計算記錄總數除了分頁之外還有一個好處就是能夠知道到底有沒有記錄,這裏就是判斷是否有記錄。
第43行,每頁顯示的條數,由於我這裏數據就加了三條,因此設了個2,通常建議10到20。
第45行,若是獲取的當前頁碼是0則表示第一頁。
第47行,每一頁開始的指針都是不一樣的,好比每頁顯示10條的話,第一頁是0-9(數據表裏記錄第一條實際上是第0條),第二頁是10-19,經過這個代碼來肯定起始的指針,注意這個指針指記錄在數據庫裏的實際位置,而不是ID號。
第49行,獲取記錄列表,這裏我用了sql左鏈接查詢兩張表,主要是爲了把記錄裏的class_fid變成對應的部門名稱(class_fid是數字的),其實不推薦使用這種,由於效率很低,不過我們不用考慮這個。解釋下SQL語句,看不懂也不要緊照抄吧。
select 選擇 A.class_id,A.class_name,表A的序號和部門名 B.class_name as fclass_name 表B的部門名,變量重命名爲fclass_name from 從 class A left join class B 名稱爲class的表命名爲A左鏈接名稱爲class的表命名爲B on A.class_fid=B.class_id 兩錶鏈接的條件是表A的class_fid等於表B的class_id where A.status=1 符合條件爲A表的狀態爲正常的數據 order by A.class_id desc 排序按照A表的序號降序排列 limit $from_record,$page_num 從第$from_record獲取$page_num條。
第54行,分頁函數multi,這個是本身的函數,函數代碼在base-class.php裏,參數分別是記錄總數、每頁顯示條數、當前頁碼,還有一個就是列表頁的url。
第61行,表格標籤,border=1是爲了有框框,哈哈。
第62行到64行,表格頭,是行標籤,是列標籤,就跟xls表格是同樣的概念。
第66行,判斷是否有數據列表。
第68行到80行,循環數組$class_list輸出列表,能夠看到裏面的字段就是前面sql查詢結果的字段,最後到操做是兩個連接標籤,一個是刪除,一個是修改,都是經過URL+參數實現的。
第90行,輸出頁碼。
最後的執行的效果以下圖:
今天的代碼也放到網上了,請輸入「微信代碼」下載。
最簡單的方式將三個文件上傳到本身的SAE裏,若是數據表名字和結構都是如出一轍的話,應該是能夠直接執行的,執行地址爲你SAE的應用地址+斜槓+文件名。
有問題請留言……