av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql入門系列:運(yùn)行PHP

瀏覽:19日期:2024-07-07 14:13:58
;;;;在本章的剩余部分中,將解決我們在第1章中為自己定下的目標(biāo):對于學(xué)分保存方案,需要編寫一個允許我們輸入、編輯測試和測驗(yàn)分?jǐn)?shù)的腳本。對于歷史同盟,需要開發(fā)一個有關(guān)美國總統(tǒng)的聯(lián)機(jī)測驗(yàn),使之成為交互式的,以便不做任何事情就可以為這個Web 站點(diǎn)的訪問者產(chǎn)生試題。我們也想允許歷史同盟成員聯(lián)機(jī)編輯它們的目錄項,使信息維持最新并減少我們自己編輯項的數(shù)量。每個腳本都產(chǎn)生多個Web 頁面,并依靠在創(chuàng)建頁面中嵌入的信息來在腳本的調(diào)用之間進(jìn)行通信。輸入學(xué)生分?jǐn)?shù)在本節(jié)中,我們將把注意力轉(zhuǎn)向?qū)W分保存方案。我們Web 站點(diǎn)上的這個區(qū)域的URL 是http://pit-viper.snake.net/gp/,應(yīng)該為它編寫一個簡短的主頁i n d e x . p h p,下面的頁面就正在做這件事。它包括了與第7 章編寫的score_browser 腳本的連接,因?yàn)檫@個腳本適合于學(xué)分保存方案。Mysql入門系列:運(yùn)行PHP現(xiàn)在讓我們考慮如何設(shè)計和實(shí)現(xiàn)腳本score _ e n t r y. p h p,它將讓我們輸入一組新的測試或測驗(yàn)分?jǐn)?shù),或者修改一組已經(jīng)存在的分?jǐn)?shù)。后者的性能對于處理由于生病或者其他原因缺席(或者,放棄這個想法以免輸入分?jǐn)?shù)失敗)造成考試或測驗(yàn)比其他學(xué)生晚的學(xué)生的分?jǐn)?shù)是必要的。分?jǐn)?shù)項腳本的概要是這樣的:1) 最初的頁面代表一系列已知的登記事件,并允許選擇一個事件或者指定應(yīng)該創(chuàng)建的新事件。2) 如果選擇創(chuàng)建一個新事件,腳本就給出允許指定日期和事件類型的頁面。創(chuàng)建這個事件記錄之后,腳本重新顯示事件列表頁面來顯示這個新事件。3) 當(dāng)選擇了事件后,腳本給出在頂部(事件ID、日期、類型)顯示事件信息的分?jǐn)?shù)項頁面,后接每個學(xué)生一項的列表。對于新事件,項將是空白的。對于已存在的事件,項將顯示每個學(xué)生已存在的分?jǐn)?shù)。選擇提交按鈕時,分?jǐn)?shù)輸入到score 表中。腳本需要執(zhí)行幾個不同的操作,這意味著我們需要從一個頁面到另一個頁面周而復(fù)始地傳遞狀態(tài)變量,以便腳本在每次調(diào)用時能夠知道假設(shè)要做什么。在PHP 中很容易做到這一點(diǎn),因?yàn)镻HP 處理作為URL 參數(shù)傳遞的變量,并把它們轉(zhuǎn)換為與參數(shù)具有相同名稱的變量。例如,可以在腳本URL 的末尾對參數(shù)action 進(jìn)行如下編碼:http://pit-viper.snake.net/gp/score_entry.php?action=value當(dāng)調(diào)用score _ e n t r y.php 時,參數(shù)action 作為變量$action 來編碼,這樣就可以直接訪問它了。這也適用于格式中的域。設(shè)想一個包括域name 和address 的表格,當(dāng)客戶機(jī)傳遞表格時,Web 服務(wù)器就調(diào)用腳本訪問表格的內(nèi)容。腳本能夠找出通過檢查變量$name 和$address 的值而輸入到表格中的值。對于包括許多域的表格,全部給出唯一的命名是有困難的。PHP 很容易地把數(shù)組在表格中傳入和傳出。如果使用了如x [ 0 ]、x[1] 等等的域名,則PHP 把它們作為$x 數(shù)組的元素進(jìn)行編碼。可以將這些元素作為$ x [ 0 ]、$x[1] 等等來訪問。我們通過使用頁面中的action 參數(shù),可以將信息從score _ e n t r y.php 腳本的一個調(diào)用傳送到另一個調(diào)用,并在腳本中用變量$action 檢查它的值。腳本的框架是這樣的:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP變量$action 可以取若干值,我們已在switch() 語句中測試過了(為避免在腳本中使用文字的數(shù)字,可以用PHP 的define() 構(gòu)造來定義常量)。PHP switch() 語句與它在C 中相應(yīng)的部分相類似。在score _ e n t r y.php 中,它用來確定采用什么操作,并且調(diào)用實(shí)現(xiàn)這個操作的函數(shù)。檢查一下每次處理一個操作的函數(shù)。第一個函數(shù)d i s p l a y _ e v e n t s ( ),檢索來自MySQL的event 表的行并加以顯示。表的每一行都列出了事件ID、日期和時間類型(測試或測驗(yàn)),還有編寫事件ID作為可以選擇用來修改事件分?jǐn)?shù)的連接:Mysql入門系列:運(yùn)行PHP表中的連接用$PHP_SELF 來構(gòu)造。這個變量包括了腳本自己的U R L,它為腳本再次調(diào)用自己提供了一個方便的方法。然而,請注意函數(shù)開始處的global 行:global $PHP_SELF;在PHP 函數(shù)中,全局變量是不可訪問的,除非顯式地聲明要使用它們。沒有g(shù)lobal 行,$PHP_SELF 將被看成局部變量(因?yàn)槲覀儧]有將值賦給它,因此是空的)。在函數(shù)內(nèi)部,使用global 來訪問依靠URL 參數(shù)或者作為表格域傳遞到腳本中的參數(shù)也是必需的。用來生成表的函數(shù)display_cell() 與第7 章編寫的同名DBI 函數(shù)相類似。PHP 版本如下:Mysql入門系列:運(yùn)行PHP如果在display_events() 給出的表中選擇了“ New Event ”連接,則腳本通過操作SOLICIT_ EVENT進(jìn)行再次調(diào)用。它引發(fā)了對solicit_event_info() 的調(diào)用,這個函數(shù)顯示了允許輸入新事件信息的表格:Mysql入門系列:運(yùn)行PHP由solocit_event_info() 生成的表格包括輸入數(shù)據(jù)的編輯域、指定新事件是測試還是測驗(yàn)的兩個單選按鈕、Submit 按鈕。當(dāng)遞交表格時, ADD_EVENT 操作將調(diào)用score _ e n t r y. p h p。調(diào)用add_new_event() 函數(shù)在event 表中輸入一個新的行:Mysql入門系列:運(yùn)行PHP在add_new_event() 中,我們使用global 訪問在新事件項表格中使用的域值( date 和type,用變量$date 和$type 訪問)。做出最低限度的安全檢查,確定數(shù)據(jù)為非空白之后,在event 表中輸入一個新記錄。輸入這個事件記錄之后,主程序?qū)⒃俅物@示事件列表,這樣就可以選擇新事件并開始輸入分?jǐn)?shù)了。函數(shù)display_scores() 為給定的事件查找已存在的分?jǐn)?shù),并列出顯示他們的表格,包括學(xué)生姓名:Mysql入門系列:運(yùn)行PHPdisplay_scores() 用于檢索所選事件的分?jǐn)?shù)信息的查詢并不是表之間的簡單連接,因?yàn)樗粫槭录袥]有分?jǐn)?shù)的學(xué)生選擇行。特別是,對于新的事件,連接會選擇無記錄,這就有了一個空項表格!我們使用LEFT JOIN 強(qiáng)迫為每個學(xué)生檢索行,無論學(xué)生是否在score表中已經(jīng)有了分?jǐn)?shù)。與display_scores() 用來檢索來自于MySQL的分?jǐn)?shù)記錄相類似的查詢背景,已在3 . 8 . 2節(jié)“檢查表中未給出的值”中給出了介紹。那里的查詢只選擇缺失分?jǐn)?shù),這里的查詢只選擇特殊事件的分?jǐn)?shù)。分?jǐn)?shù)在表格中使用了有名稱的域進(jìn)行編碼,如score [n],這里的n是student_id 的值。當(dāng)表格送回Web 服務(wù)器時,PHP 將這些域轉(zhuǎn)換為$score 數(shù)組的元素,我們可以訪問數(shù)組元素以恢復(fù)表格的內(nèi)容。當(dāng)完成輸入或者編輯分?jǐn)?shù),并提交給表格后,ENTER_SCORES 操作調(diào)用score _ e n t r y. p h p,并且調(diào)用函數(shù)enter_scores() 處理表格信息:Mysql入門系列:運(yùn)行PHP學(xué)生ID 的值和相關(guān)的分?jǐn)?shù)通過迭代PHP 的each 函數(shù)的$score 數(shù)組來獲得。每個分?jǐn)?shù)處理如下:如果分?jǐn)?shù)是空白的,則表明什么也沒有輸入,但是我們還要試圖刪除這個分?jǐn)?shù),以免它以前曾經(jīng)存在(也許以前我們?yōu)槿毕膶W(xué)生錯誤地輸入了分?jǐn)?shù))如果分?jǐn)?shù)不是空白的,就對值進(jìn)行一些根本的確認(rèn)。用函數(shù)trim() 去掉前后的空格之后,如果剩余部分是空白或者整數(shù),就接受這個結(jié)果。然而,表格值通常作為字符串來編碼,因此不能用is_long() 或者is_int() 檢查值是否為整數(shù)。即使值只包括數(shù)字,這些函數(shù)也會返回FA L S E。既然這樣,最好用模型匹配操作。如果字符串從開始到結(jié)束每個字符都是數(shù)字,則下面的測試為T R U E:ereg('^[0-9]+$',$str)如果分?jǐn)?shù)檢查完畢,我們就將它加到score 表中。查詢使用REPLACE 而不用INSERT,因?yàn)槲覀兛赡芴鎿Q了已存在的分?jǐn)?shù)而不是輸入一個新的分?jǐn)?shù)( REPLACE 在兩種情況下都適用)。注意score _ e n t r y.php 腳本。現(xiàn)在所有的分?jǐn)?shù)項和編輯項都能從Web 瀏覽器執(zhí)行。一個明顯的缺點(diǎn)是:腳本沒有提供安全措施,連接到Web 服務(wù)器的任何人都可以對分?jǐn)?shù)進(jìn)行編輯。以后,我們用編輯歷史同盟成員項編寫的腳本來說明這個腳本所采取的簡單確認(rèn)方案。也可以使用PHPLIB 程序包來提供更完善的確認(rèn)。美國總統(tǒng)測驗(yàn)歷史同盟Web 站點(diǎn)的目標(biāo)之一就是用它給出測驗(yàn)的在線版本,這類似于同盟在時事通信“美國編年史”的兒童部分發(fā)表的一些測驗(yàn)。實(shí)際上我們創(chuàng)建了president 表,因此對基于歷史的測驗(yàn)可以用它作為問題的來源。為了給出這個測驗(yàn),我們將編寫稱為pres_quiz.php 的腳本。基本的想法是隨機(jī)挑選一個總統(tǒng),問一個關(guān)于他的問題,然后請求用戶回答并且察看答案是否正確。為了簡單一點(diǎn),可以把主題限制為詢問總統(tǒng)出生在哪里。另外一種簡單的衡量就是以多個選擇的格式給出這個問題。這對用戶來講很容易,他只需從一組選擇中挑選一個,而不用將之鍵入等待回應(yīng)。這對我們來講也是容易的,因?yàn)槲覀儾恍枳鋈魏渭值钠ヅ渥址畞頇z查用戶可能鍵入的內(nèi)容,而只需對用戶的選擇和我們尋找的值做一個簡單的比較。顯示這個測驗(yàn)的腳本必須執(zhí)行兩個函數(shù)。第一個,對于它最初的調(diào)用,將從p r e s i d e n t表中查閱信息來生成并顯示一個新的問題。第二個,如果腳本已經(jīng)被調(diào)用是因?yàn)橛脩粽峤灰粋€回答,那么就需要檢查這些答案并給出一些反饋信息來指出它是否正確。如果正確,腳本會生成并顯示一個新的問題。如果回答不正確,將再次顯示同一問題。為了生成這些問題,我們將使用MySQL3.23 中出現(xiàn)的一個ORDER BY RAND()特性。使用這個函數(shù)就能從p r e s i d e n t表中隨機(jī)地進(jìn)行行選擇。例如,為了隨機(jī)地挑選總統(tǒng)的姓名和出生地,查詢將執(zhí)行這樣的操作:Mysql入門系列:運(yùn)行PHPname是選擇的總統(tǒng)的名字,出生地是問題“總統(tǒng)出生在哪里?”的正確答案,我們還需要給出一些錯誤的選擇,可用類似的查詢:Mysql入門系列:運(yùn)行PHP從這個查詢的結(jié)果中,我們選擇了與正確答案不同的最前面的四個值。發(fā)布這個查詢并檢索結(jié)果的函數(shù)如下:Mysql入門系列:運(yùn)行PHP為了給出測驗(yàn)問題的信息,我們使用了顯示總統(tǒng)姓名、一組列出可能選擇的單選按鈕和一個S ub m i t按鈕的表格。這個表格需要做兩件事情:必須對客戶機(jī)給出測驗(yàn)信息;當(dāng)用戶提交回答時必須將信息傳送回Web 服務(wù)器,以便檢查回答是否正確。為了安排表格執(zhí)行這些操作,我們使用了隱藏域把測驗(yàn)信息包括在表格中。把域稱為name、place 和c h o i c e,它們代表總統(tǒng)的姓名、出生地和一組可能的選擇。使用implode() 連接值和特殊字符,這樣,這些選擇可以很容易地作為單個字符串來編碼(我們需要特殊字符,以便如果需要重新顯示問題時可以用explode() 分離字符串)。顯示表格的函數(shù)如下:Mysql入門系列:運(yùn)行PHP函數(shù)hidden_field( )為表格中的隱藏域編寫了H T M T :Mysql入門系列:運(yùn)行PHP當(dāng)用戶做出選擇并提交表格時,答案作為response 域值在發(fā)送回Web 服務(wù)器的表格內(nèi)容中編碼。我們可以通過檢查變量$ name、$place 和$choice 發(fā)現(xiàn)name、place 和choice 域的值。這也給了我們一個方法,指出是否是第一次調(diào)用腳本,或者用戶是否給以前顯示過的表格提交了回答,如果是第一次調(diào)用則不會設(shè)置那些變量。這樣,通過檢查其中一個變量,腳本的主體就決定了應(yīng)該做的事情:Mysql入門系列:運(yùn)行PHP我們?nèi)匀恍枰帉慶heck_response() 函數(shù)來將用戶的回答與正確答案做比較。我們將正確答案在表格的place 域進(jìn)行編碼,用戶的回答則在表格的response 域進(jìn)行編碼,因此我們所要做的就是比較$place 和$ r e s p o n s e。在比較結(jié)果的基礎(chǔ)上,我們提供了一些反饋信息,之后每次都生成顯示一個新的問題,或者再次顯示相同的問題:Mysql入門系列:運(yùn)行PHP這樣,我們就做完了。將pres_quiz.php 的鏈接加到歷史同盟主頁上,參觀者可以做一下這個測驗(yàn)來測試他們的知識。歷史同盟聯(lián)機(jī)成員項的編輯最終的腳本e d i t _ member.php 允許歷史同盟成員編輯他們自己的聯(lián)機(jī)項。無論何時,成員都可以校正或者更新他們的成員信息,而不必向同盟部提交這些更改。這個性能使成員目錄總是保持最新的,而且減少了秘書的工作量。我們需要采取的一個防范措施就是:除了該項目的成員之外,防止任何其他人修改項目。這意味著我們需要一些安全性的表單。作為一個簡單的身份確認(rèn)表單的示范,我們將使用MySQL存放每個成員的口令,并要求成員提供正確的口令以訪問腳本給出的編輯表單。該腳本操作如下:當(dāng)初次調(diào)用時,edit_script.php 給出包括成員ID 和口令域的表單。當(dāng)提交初始表單時,腳本用成員ID 作為關(guān)鍵字尋找相關(guān)的口令來搜索口令表。如果口令相符,腳本將從member 表中查找成員項,并顯示要編輯的內(nèi)容。當(dāng)提交編輯過的表單后,我們就用表單的內(nèi)容更新項。e d i t _ member.php 的框架如下所示:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP當(dāng)然,我們還需要一些口令,一個簡單的方法就是隨機(jī)地生成它們。下面的語句建立member _ pass表,然后,通過從隨機(jī)數(shù)中生成MD5 校驗(yàn)來為每個成員創(chuàng)建口令。您可以讓成員們來選擇他們自己的口令,也可以調(diào)用mysql并發(fā)布這些語句作為一種既快速又容易的方法:Mysql入門系列:運(yùn)行PHP我們將一個特殊項加到這個表中作為編號0,它有一個用于管理的(超級用戶)口令。可以使用這個口令訪問所有想要訪問的項:INSERT INTO member_pass (member_id,password) VALUES (0,'secret');在創(chuàng)建口令表之后,您可以停止使用第7章中編寫的samp_browse 腳本,該腳本允許任何人在samp_db 數(shù)據(jù)庫中瀏覽任何表的內(nèi)容,其中包括member_pass 表。當(dāng)成員輸入ID 和口令并提交該表單時, e d i t _ member.php 顯示該編輯的項:Mysql入門系列:運(yùn)行PHP Mysql入門系列:運(yùn)行PHPdisplay_entry() 需要做的第一件事就是校驗(yàn)口令。對于給定的成員ID,如果表單中輸入的口令與member_pass 表中存放的口令相符,或者如果它與管理口令相符(即成員0 的口令),e d i t _ member.php 就顯示編輯的項。口令檢查函數(shù)check_pass() 將執(zhí)行一個簡單的查詢從member_pass 表中移出一條記錄:Mysql入門系列:運(yùn)行PHP因?yàn)椴荒苄薷乃跃庉嫳韱巫鳛橹蛔x文本顯示成員ID 的值。對于正常的成員,截止日期也作為只讀文本顯示,因?yàn)椴荒茏尦蓡T改動它。然而,如果給出管理口令,則截止日期就成為可編輯的,允許同盟秘書為成員更新日期來重新更新他們的會員資格。member 表項的列由display_column() 函數(shù)顯示。它按照第三個參數(shù)值把列作為可編輯的文本或作為只讀文本加到編輯表單中:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHPdisplay_entry() 函數(shù)在格式中作為隱藏字段嵌入了member_id 和pass w o r d,因此當(dāng)成員提交編輯的項時將繼續(xù)edit_script.php 的下一個調(diào)用。這允許自動校驗(yàn)ID 的口令,而不用請求成員再次輸入(請注意,我們的簡單的確認(rèn)身份的方法是以文本形式來回傳遞口令。通常這不是個好主意,但是歷史同盟不是對安全性要求很高的運(yùn)作機(jī)構(gòu),因此這種方法足夠滿足要求。如果在運(yùn)行金融業(yè)務(wù),可能需要更強(qiáng)的安全性操作)。更新項的函數(shù)如下:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP首先,重新校驗(yàn)口令,確定沒人發(fā)送假表單來愚弄我們,然后更新項。更新時需要注意,因?yàn)槿绻韱沃械淖侄问强瞻椎模瑒t可能需要作為NULL 而不是作為空字符串輸入。expiration 列就是這樣的例子。NULL的成員截止日期具有特殊的含義,即“終生會員”。如果將一個空字符串插入到此列中,值轉(zhuǎn)換成“ 0 0 0 0 - 0 0 - 0 0”,則成員不再具有終生會員資格。為了處理這個問題,我們查找該列的元數(shù)據(jù)并檢查它是作為NULL 還是作為NOT NULL進(jìn)行聲明的。該信息由函數(shù)mysql_fetch_field() 返回。不幸地是,此函數(shù)通過數(shù)值的索引查找列。在member 表中按名稱訪問列會更方便,因此我們編寫一個小函n ul l a b l e ( ),它獲取一個列名并查找相應(yīng)的元數(shù)據(jù)對象:Mysql入門系列:運(yùn)行PHPmysql_fetch_field() 函數(shù)需要包含檢查列所在表的結(jié)果集標(biāo)識符。這可通過執(zhí)行簡單的不返回行的SELECT 查詢來獲得。雖然該查詢返回一個空結(jié)果集,但是,對于檢索要評估m(xù)ember 表中列的空性能(n ul l a b i l i t y)的元數(shù)據(jù)來說,這種方法足夠了:SELECT * FROM member WHERE 1=0安裝腳本,讓成員們知道他們的口令,這樣他們就能更新自己的成員信息了。
標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 国产精品久久久久久吹潮 | 成人欧美一区二区三区视频xxx | 天天爱天天操 | 久久久久一区二区三区 | 亚洲精品一区av在线播放 | 国产一区二区 | 亚洲一区二区免费看 | 午夜寂寞福利视频 | 69av在线视频 | 国产精品国产成人国产三级 | 免费一区二区三区 | 福利精品 | 欧美一二精品 | 日韩精品一区中文字幕 | 免费av手机在线观看 | 久草精品视频 | 中文字幕一区二区三区精彩视频 | 99久久夜色精品国产亚洲96 | 国产日屁 | 成年人免费网站 | 亚洲国产一区二区三区四区 | 成人在线免费观看 | 久久久精品天堂 | 国产精品污www一区二区三区 | 伦理午夜电影免费观看 | 日本在线一区二区三区 | 国产高清在线精品一区二区三区 | 日本久久久久久 | 国产精品久久久久久久久久久久 | 中文精品视频 | 在线中文字幕第一页 | 免费黄色录像视频 | 在线欧美一区二区 | 91精品国产99 | 奇米四色影视 | 最新日韩av | 亚洲品质自拍视频网站 | 男人天堂色 | 国产精品久久二区 | 日韩欧美国产一区二区三区 | jizz在线看片 |