導航:首頁 > 編程語言 > phpsam

phpsam

發布時間:2023-05-02 12:50:29

『壹』 php如何用header設置文件下載頭!感謝~

$filename = '文件路徑';
//文件的類型
header('Content-type: application/pdf');
//下載顯示的名字
header('Content-Disposition: attachment; filename="保存時的文件名.pdf"');
readfile("$filename");
exit;

附伺服器響應HTTP的類型ContentType大全:
".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
".class"="java/*"
".cml"="text/xml"
".cmp"="application/x-cmp"
".cmx"="application/x-cmx"
".cot"="application/x-cot"
".crl"="application/pkix-crl"
".crt"="application/x-x509-ca-cert"
".csi"="application/x-csi"
".css"="text/css"
".cut"="application/x-cut"
".dbf"="application/x-dbf"
".dbm"="application/x-dbm"
".dbx"="application/x-dbx"
".dcd"="text/xml"
".dcx"="application/x-dcx"
".der"="application/x-x509-ca-cert"
".dgn"="application/x-dgn"
".dib"="application/x-dib"
".dll"="application/x-msdownload"
".doc"="application/msword"
".dot"="application/msword"
".drw"="application/x-drw"
".dtd"="text/xml"
".dwf"="Model/vnd.dwf"
".dwf"="application/x-dwf"
".dwg"="application/x-dwg"
".dxb"="application/x-dxb"
".dxf"="application/x-dxf"
".edn"="application/vnd.adobe.edn"
".emf"="application/x-emf"
".eml"="message/rfc822"
".ent"="text/xml"
".epi"="application/x-epi"
".eps"="application/x-ps"
".eps"="application/postscript"
".etd"="application/x-ebx"
".exe"="application/x-msdownload"
".fax"="image/fax"
".fdf"="application/vnd.fdf"
".fif"="application/fractals"
".fo"="text/xml"
".frm"="application/x-frm"
".g4"="application/x-g4"
".gbr"="application/x-gbr"
".gcd"="application/x-gcd"
".gif"="image/gif"
".gl2"="application/x-gl2"
".gp4"="application/x-gp4"
".hgl"="application/x-hgl"
".hmr"="application/x-hmr"
".hpg"="application/x-hpgl"
".hpl"="application/x-hpl"
".hqx"="application/mac-binhex40"
".hrf"="application/x-hrf"
".hta"="application/hta"
".htc"="text/x-component"
".htm"="text/html"
".html"="text/html"
".htt"="text/webviewhtml"
".htx"="text/html"
".icb"="application/x-icb"
".ico"="image/x-icon"
".ico"="application/x-ico"
".iff"="application/x-iff"
".ig4"="application/x-g4"
".igs"="application/x-igs"
".iii"="application/x-iphone"
".img"="application/x-img"
".ins"="application/x-internet-signup"
".isp"="application/x-internet-signup"
".IVF"="video/x-ivf"
".java"="java/*"
".jfif"="image/jpeg"
".jpe"="image/jpeg"
".jpe"="application/x-jpe"
".jpeg"="image/jpeg"
".jpg"="image/jpeg"
".jpg"="application/x-jpg"
".js"="application/x-javascript"
".jsp"="text/html"
".la1"="audio/x-liquid-file"
".lar"="application/x-laplayer-reg"
".latex"="application/x-latex"
".lavs"="audio/x-liquid-secure"
".lbm"="application/x-lbm"
".lmsff"="audio/x-la-lms"
".ls"="application/x-javascript"
".ltr"="application/x-ltr"
".m1v"="video/x-mpeg"
".m2v"="video/x-mpeg"
".m3u"="audio/mpegurl"
".m4e"="video/mpeg4"
".mac"="application/x-mac"
".man"="application/x-troff-man"
".math"="text/xml"
".mdb"="application/msaccess"
".mdb"="application/x-mdb"
".mfp"="application/x-shockwave-flash"
".mht"="message/rfc822"
".mhtml"="message/rfc822"
".mi"="application/x-mi"
".mid"="audio/mid"
".midi"="audio/mid"
".mil"="application/x-mil"
".mml"="text/xml"
".mnd"="audio/x-musicnet-download"
".mns"="audio/x-musicnet-stream"
".mocha"="application/x-javascript"
".movie"="video/x-sgi-movie"
".mp1"="audio/mp1"
".mp2"="audio/mp2"
".mp2v"="video/mpeg"
".mp3"="audio/mp3"
".mp4"="video/mpeg4"
".mpa"="video/x-mpg"
".mpd"="application/vnd.ms-project"
".mpe"="video/x-mpeg"
".mpeg"="video/mpg"
".mpg"="video/mpg"
".mpga"="audio/rn-mpeg"
".mpp"="application/vnd.ms-project"
".mps"="video/x-mpeg"
".mpt"="application/vnd.ms-project"
".mpv"="video/mpg"
".mpv2"="video/mpeg"
".mpw"="application/vnd.ms-project"
".mpx"="application/vnd.ms-project"
".mtx"="text/xml"
".mxp"="application/x-mmxp"
".net"="image/pnetvue"
".nrf"="application/x-nrf"
".nws"="message/rfc822"
".odc"="text/x-ms-odc"
".out"="application/x-out"
".p10"="application/pkcs10"
".p12"="application/x-pkcs12"
".p7b"="application/x-pkcs7-certificates"
".p7c"="application/pkcs7-mime"
".p7m"="application/pkcs7-mime"
".p7r"="application/x-pkcs7-certreqresp"
".p7s"="application/pkcs7-signature"
".pc5"="application/x-pc5"
".pci"="application/x-pci"
".pcl"="application/x-pcl"
".pcx"="application/x-pcx"
".pdf"="application/pdf"
".pdf"="application/pdf"
".pdx"="application/vnd.adobe.pdx"
".pfx"="application/x-pkcs12"
".pgl"="application/x-pgl"
".pic"="application/x-pic"
".pko"="application/vnd.ms-pki.pko"
".pl"="application/x-perl"
".plg"="text/html"
".pls"="audio/scpls"
".plt"="application/x-plt"
".png"="image/png"
".png"="application/x-png"
".pot"="application/vnd.ms-powerpoint"
".ppa"="application/vnd.ms-powerpoint"
".ppm"="application/x-ppm"
".pps"="application/vnd.ms-powerpoint"
".ppt"="application/vnd.ms-powerpoint"
".ppt"="application/x-ppt"
".pr"="application/x-pr"
".prf"="application/pics-rules"
".prn"="application/x-prn"
".prt"="application/x-prt"
".ps"="application/x-ps"
".ps"="application/postscript"
".ptn"="application/x-ptn"
".pwz"="application/vnd.ms-powerpoint"
".r3t"="text/vnd.rn-realtext3d"
".ra"="audio/vnd.rn-realaudio"
".ram"="audio/x-pn-realaudio"
".ras"="application/x-ras"
".rat"="application/rat-file"
".rdf"="text/xml"
".rec"="application/vnd.rn-recording"
".red"="application/x-red"
".rgb"="application/x-rgb"
".rjs"="application/vnd.rn-realsystem-rjs"
".rjt"="application/vnd.rn-realsystem-rjt"
".rlc"="application/x-rlc"
".rle"="application/x-rle"
".rm"="application/vnd.rn-realmedia"
".rmf"="application/vnd.adobe.rmf"
".rmi"="audio/mid"
".rmj"="application/vnd.rn-realsystem-rmj"
".rmm"="audio/x-pn-realaudio"
".rmp"="application/vnd.rn-rn_music_package"
".rms"="application/vnd.rn-realmedia-secure"
".rmvb"="application/vnd.rn-realmedia-vbr"
".rmx"="application/vnd.rn-realsystem-rmx"
".rnx"="application/vnd.rn-realplayer"
".rp"="image/vnd.rn-realpix"
".rpm"="audio/x-pn-realaudio-plugin"
".rsml"="application/vnd.rn-rsml"
".rt"="text/vnd.rn-realtext"
".rtf"="application/msword"
".rtf"="application/x-rtf"
".rv"="video/vnd.rn-realvideo"
".sam"="application/x-sam"
".sat"="application/x-sat"
".sdp"="application/sdp"
".sdw"="application/x-sdw"
".sit"="application/x-stuffit"
".slb"="application/x-slb"
".sld"="application/x-sld"
".slk"="drawing/x-slk"
".smi"="application/smil"
".smil"="application/smil"
".smk"="application/x-smk"
".snd"="audio/basic"
".sol"="text/plain"
".sor"="text/plain"
".spc"="application/x-pkcs7-certificates"
".spl"="application/futuresplash"
".spp"="text/xml"
".ssm"="application/streamingmedia"
".sst"="application/vnd.ms-pki.certstore"
".stl"="application/vnd.ms-pki.stl"
".stm"="text/html"
".sty"="application/x-sty"
".svg"="text/xml"
".swf"="application/x-shockwave-flash"
".tdf"="application/x-tdf"
".tg4"="application/x-tg4"
".tga"="application/x-tga"
".tif"="image/tiff"
".tif"="application/x-tif"
".tiff"="image/tiff"
".tld"="text/xml"
".top"="drawing/x-top"
".torrent"="application/x-bittorrent"
".tsd"="text/xml"
".txt"="text/plain"
".uin"="application/x-icq"
".uls"="text/iuls"
".vcf"="text/x-vcard"
".vda"="application/x-vda"
".vdx"="application/vnd.visio"
".vml"="text/xml"
".vpg"="application/x-vpeg005"
".vsd"="application/vnd.visio"
".vsd"="application/x-vsd"
".vss"="application/vnd.visio"
".vst"="application/vnd.visio"
".vst"="application/x-vst"
".vsw"="application/vnd.visio"
".vsx"="application/vnd.visio"
".vtx"="application/vnd.visio"
".vxml"="text/xml"
".wav"="audio/wav"
".wax"="audio/x-ms-wax"
".wb1"="application/x-wb1"
".wb2"="application/x-wb2"
".wb3"="application/x-wb3"
".wbmp"="image/vnd.wap.wbmp"
".wiz"="application/msword"
".wk3"="application/x-wk3"
".wk4"="application/x-wk4"
".wkq"="application/x-wkq"
".wks"="application/x-wks"
".wm"="video/x-ms-wm"
".wma"="audio/x-ms-wma"
".wmd"="application/x-ms-wmd"
".wmf"="application/x-wmf"
".wml"="text/vnd.wap.wml"
".wmv"="video/x-ms-wmv"
".wmx"="video/x-ms-wmx"
".wmz"="application/x-ms-wmz"
".wp6"="application/x-wp6"
".wpd"="application/x-wpd"
".wpg"="application/x-wpg"
".wpl"="application/vnd.ms-wpl"
".wq1"="application/x-wq1"
".wr1"="application/x-wr1"
".wri"="application/x-wri"
".wrk"="application/x-wrk"
".ws"="application/x-ws"
".ws2"="application/x-ws"
".wsc"="text/scriptlet"
".wsdl"="text/xml"
".wvx"="video/x-ms-wvx"
".xdp"="application/vnd.adobe.xdp"
".xdr"="text/xml"
".xfd"="application/vnd.adobe.xfd"
".xfdf"="application/vnd.adobe.xfdf"
".xhtml"="text/html"
".xls"="application/vnd.ms-excel"
".xls"="application/x-xls"
".xlw"="application/x-xlw"
".xml"="text/xml"
".xpl"="audio/scpls"
".xq"="text/xml"
".xql"="text/xml"
".xquery"="text/xml"
".xsd"="text/xml"
".xsl"="text/xml"
".xslt"="text/xml"
".xwd"="application/x-xwd"
".x_b"="application/x-x_b"
".x_t"="application/x-x_t"

『貳』 php實現cookie控制每個用戶一天只能評論一次

Cookies現在經常被大家提到,那麼到底什麼是Cookies,它有什麼作用呢?Cookies是一種能夠讓網站伺服器把少量數據儲存到客戶端的硬碟或內存,或是從客戶端的硬碟讀取數據的一種技術。Cookies是當你瀏覽某網站時,由Web伺服器置於你硬碟上的一個非常小的文本文件,它可以記錄你的用戶ID、密碼、瀏覽過的網頁、停留的時間等信息。

當你再次來到該網站時,網站通過讀取Cookies,得知你的相關信息,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登錄等等。從本質上講,它可以看作是你的身份證。但Cookies不能作為代碼執行,也不會傳送病毒,且為你所專有,並只能由提供它的伺服器來讀取。保存的信息片斷以"名/值"對(name-value pairs)的形式儲存,一個"名/值"對僅僅是一條命名的數據。一個網站只能取得它放在你的電腦中的信息,它無法從其它的Cookies文件中取得信息,也無法得到你的電腦上的其它任何東西。 Cookies中的內容大多數經過了加密處理,因此一般用戶看來只是一些毫無意義的字母慎卜李數字組合,只有伺服器的CGI處理程序才知道它們真正的含義。

由於Cookies是我寬遲們瀏覽的網站傳輸到用戶計算機硬碟中的文本文件或內存中的數據,因此它在硬碟中存放的位置與使用的操作系統和瀏覽器密切相關。在Windows 9X系統計算機中,Cookies文件的存放位置為C:/Windows/Cookies,在Windows NT/2000/XP的計算機中,Cookies文件的存放位置為C:/Documents and Settings/用戶名/Cookies。

硬碟中的Cookies文件可以被Web瀏覽器讀取,它的命令格式為:用戶名@網站地址[數字].txt。如筆者計算機中的一個Cookies文件名為:ch@163[1].txt。要注意的是:硬碟中的Cookies屬於文本文件,不是程序。

Cookies的設置

你可以在IE的"工具/Internet選項"的"常規"選項卡中,選擇"設置/查看文件",查看所有保存到你電腦里的Cookies。這些文件通常是以user@domain格式命名的,user是你的本地用戶名,domain是所訪問的網站的域名。如果你使用NetsCape瀏覽器,則存放在"C:/PROGRAMFILES/NETS- CAPE/USERS/"裡面,與IE不同的是,NETSCAPE是使用一個Cookie文件記錄所有網站的Cookies。

我們可對Cookie進行適當設置:打開"工具/Internet選項"中的"隱私"選項卡(注意該設置只在IE6.0中存在,其他版本IE可以單擊"工具/Internet選項" "安全"標簽中的"自定義級別"按鈕,進行簡單調整),調整Cookie的安全級別。通常情況,可以調整到"中高"或者"高"的位置。多數的論壇站點需要使用Cookie信息,如果你從來不去這些地方,可以將安全級調到"阻止所有Cookies";如果只是為了禁止個別網站的Cookie,可以單擊"編輯"按鈕,將要屏蔽的網站添加到列表中。在"高級"按鈕選項中,你可以對第一方Cookie和第三方的Cookie進行設置,第一方Cookie是你正在瀏覽的網站的Cookie,第三方Cookie是非正在瀏覽的網站發給你的Cookie,通常要對第三方Cookie選擇"拒絕"。你如果需要保存Cookie,可以使用IE的"導入導出"功能,打開"文件/導入導出",按提示操作即可。

Cookies的寫入與讀取

Cookies集合是附屬於Response對象及Request對象的數據集合,使用時需要在前面加上Response或Request。

用於給客戶機發送Cookies的語法通常為:

當給不存在的Cookies集合設置時,就會在客戶機創建,如果該Cookies己存在,則會被代替。由於Cookies是作為HTTP傳輸的頭信息的一部分發給客戶機的,所以向客戶機發送Cookies的代碼一般放在發送給瀏覽器的HTML文件的標記之前。

如果用戶要讀取Cookies,則必須使用Request對象的Cookies集合,其使用方法是: 需要注意的是,只有在伺服器未被下載任何數據給瀏覽器前,瀏覽器才能與弊輪Server進行Cookies集合的數據交換,一旦瀏覽器開始接收Server所下載的數據,Cookies的數據交換則停止,為了避免錯誤,要在程序和前面加上response.Buffer=True。
Cookies的應用

幾乎所有的網站設計者在進行網站設計時都使用了Cookie,因為他們都想給瀏覽網站的用戶提供一個更友好的、人文化的瀏覽環境,同時也能更加准確地收集訪問者的信息。

網站瀏覽人數管理

由於代理伺服器、緩存等的使用,唯一能幫助網站精確統計來訪人數的方法就是為每個訪問者建立一個唯一的ID。使用Cookie,網站可以完成以下工作:測定多少人訪問過;測定訪問者中有多少是新用戶(即第一次來訪),多少是老用戶;測定一個用戶多久訪問一次網站。

通常情況下,網站設計者是藉助後台資料庫來實現以上目的的。當用戶第一次訪問該網站時,網站在資料庫中建立一個新的ID,並把ID通過Cookie傳送給用戶。用戶再次來訪時,網站把該用戶ID對應的計數器加1,得到用戶的來訪次數或判斷用戶是新用戶還是老用戶。

按照用戶的喜好定製網頁外觀

有的網站設計者,為用戶提供了改變網頁內容、布局和顏色的權力,允許用戶輸入自己的信息,然後通過這些信息對網站的一些參數進行修改,以定製網頁的外觀。

在電子商務站點中實現諸如"購物籃"等功能

可以使用Cookie記錄用戶的ID,這樣當你往"購物籃"中放了新東西時,網站就能記錄下來,並在網站的資料庫里對應著你的ID記錄當你"買單"時,網站通過ID檢索資料庫中你的所有選擇就能知道你的"購物籃"里有些什麼。

在一般的事例中,網站的資料庫能夠保存的有你所選擇的內容、你瀏覽過的網頁、你在表單里填寫的信息等;而包含有你的唯一ID的Cookie則保存在你的電腦里。

Cookies的缺陷

Cookie雖然被廣泛的應用,並能做到一些使用其它技術不可能實現的功能。但也存在一些不夠完美的方面,給應用帶來不便。

多人共用一台電腦的問題

任何公共場合的電腦或者許多在辦公室或家裡使用的電腦,都會同時被兩個以上的人使用。這樣,當你用它在網上超市購物時,網上超市或網站會在這台機器上留下一個Cookie,將來也許就會有某個人試圖使用你的賬戶購物,帶來了不安全的可能。當然,在一些使用多用戶操作系統如Windows NT或UNIX的電腦上,這並不會成為一個問題。因為在多用戶操作系統下不同的賬戶的Cookie分別放在不同的地方。
Cookies被刪除時

假如你的瀏覽器不能正常工作,你可能會刪除電腦上所有的臨時Internet文件。然而,一旦這樣操作以後,你就會丟掉所有的Cookies文件。當你再次訪問一個網站時,網站會認為你是一位新用戶並分配給你一個新的用戶ID以及一個新的Cookie。結果將會造成網站統計的新老用戶比發生偏差,而你也難以恢復過去保存的參數選擇。

一人使用多台電腦時

有的人一天之中經常使用一台以上的電腦。例如在辦公室里有一台電腦、家裡有一台、還有移動辦公用的筆記本電腦。除非網站使用了特別的技術來解決這一問題,否則,你將會有三個不同的Cookies文件在這三台機器上,而在三台機器上訪問過的任何網站都將會把你看成三個不同的用戶。

防範Cookies泄密

想知道你訪問的網站是否在你的硬碟或內存中寫入了Cookies信息嗎?只需執行下面的操作步驟,就可以了解和控制你正在訪問的網站的Cookies信息。

步驟一點擊IE窗口中的"工具" "In-ernet選項",打開"Internet選項"設置窗口;

步驟二點擊"Internet選項"設置窗口中的"安全"標簽,然後再點擊"自定義級別"按鈕,進入"安全設置"窗口;

步驟三 找到"安全設置"窗口中的"Cookies"設置項。"Cookies"設置項下有兩個分選項,其中"允許使用存儲在您計算機上的ookies"是針對存儲在用戶計算機硬碟中的Cookies文件;"允許使用每個對話Cookies(未存儲)"是針對存儲在用戶計算機內存中的Cookies信息。存儲在硬碟中的Cookies文件是永久存在的,而存儲在內存中的Cookies信息是臨時的。要想IE在即將接收來自Web站點的所有Cookies時進行提示,可分別選擇上面兩個分選項中的"提示"項。當然,你也可以選擇"啟用",允許IE接受所有的Cookies信息(這也是IE的默認選項);選擇"禁止",則是不允許Web站點將Cookies存儲到您的計算機上,而且Web站點也不能讀取你計算機中已有的Cookies。

IE6.0提供了更為可靠的個人隱私及安全保護措施,可以讓用戶來控制瀏覽器向外發送信息的多少。在"Internet 選項"窗口中新增了"隱私"選項卡(圖1),用戶可以在其中直接設置瀏覽時的隱私級別,按需要控制其他站點對自己電腦所使用的Cookies。

如果我們正在瀏覽的站點使用了Cookie,那麼在瀏覽器狀態欄中會有一個黃色驚嘆號的標記,雙擊後可打開"隱私報告"對話框,用戶可以在其中查看具體的隱私策略,還可直接點擊"設置"按鈕後在上述"隱私"選項卡中調節安全隱私級別。

在"常規"選項卡中還增加了"刪除Cookies"按鈕(圖2),方便用戶直接清除本機上的Cookies。另外,在"工具" "選項" "高級"選項卡中也增加了一些進一步提高安全性的選項(如關閉瀏覽器時清空Internet臨時文件)。其實,如何更好地保護個人隱私和安全是微軟下一代".NET"戰略軟體中的關鍵技術,現在IE6.0已經嘗試著邁出了第一步。

另外,由於Cookies的信息並不都是以文件形式存放在計算機里,還有部分信息保存在內存里。比如你在瀏覽網站的時候,Web伺服器會自動在內存中生成Cookie,當你關閉IE瀏覽器的時候又自動把Cookie刪除,那樣上面介紹的兩種方法就起不了作用,我們需要藉助注冊表編輯器來修改系統設置。要注意的是,修改注冊表前請作備份,以便出現問題後能順利恢復。

運行Regedit,找到如下鍵值:HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Internet Settings/Cache/Special Paths/Cookies,這是Cookies在內存中的鍵值,把這個鍵值刪除。至此Cookies無論以什麼形式存在,我們都不用再害怕了。

最後有必要說明的一點是:杜絕Cookies雖然可以增強你電腦的信息安全程度,但這樣做同樣會有一些弊端。比如在一些需要Cookies支持的網頁上,會發生一些莫名其妙的錯誤,典型的例子就是你以後不能使用某些網站的免費信箱了。
Cookies欺騙

通過分析Cookie的格式,我們知道,最後兩項中分別是它的URL路徑和域名,伺服器對Cookie的識別靠的就是這兩個參數。正常情況下,我們要瀏覽一個網站時輸入的URL便是它的域名,需要經過域名管理系統DNS將其轉化為IP地址後進行連接。若能在DNS上進行一些設置,把目標域名的IP地址對應到其它站點上,我們便可以非法訪問目標站點的Cookie了。

要進行Cookies欺騙,其實很簡單。比如在Win9X下的安裝目錄下,有一名為hosts.sam的文件,以文本方式打開後會看到這樣的格式:

127.0.0.1 localhost

經過設置,便可以實現域名解析的本地化,只需將IP和域名依上面的格式添加到文件中並另存為hosts即可。hosts文件實際上可以看成一個本機的DNS系統,它可以負責把域名解釋成IP地址,它的優先權比DNS伺服器要高,它的具體實現是TCP/IP協議中的一部分。

比如我們要讀取的目標站點 所生成的Cookies信息,可以藉助(自己的站點)。 存放用來進行欺騙所需的文件,通過它讀取和修改對方的Cookie。

步驟一 ping 的IP地址:

ping

Reply from 192.168.0.1: bytes=32 time=20ms TTL=244

然後修改hosts.sam文件如下:

192.168.0.1

並保存為hosts文件。

步驟二 讀取Cookies信息:

將用來讀取Cookie的頁面傳 ,此時連,由於我們進行本機DNS域名解析的修改,這時網路連接的並不,而 。

這設在本地的Cookie便可被讀出。

步驟三 同樣道理,你可對讀出的數據進行修改,並可將修改後的信息寫入Cookie中。修改完畢後,刪掉hosts文件,再重新進,此時所使用的Cookies數據就是你制定的數據。

總之,在某種程度上雖然可以實現Cookies的欺騙,給網路應用帶來不安全的因素,但Cookies文件本身並不會造成用戶隱私的泄露,也不會給黑客提供木馬程序的載體,只要合理使用,它們會給網站管理員進行網站的維護和管理以及廣大用戶的使用都帶來便利。
Cookies集合具有以下幾種屬性:

1.Expires屬性:此屬性用來給Cookies設置一個期限,在期限內只要打開網頁就可以調用被保存的Cookies,如果過了此期限Cookies就自動被刪除。如:

設定Cookies的有效期到2004年4月1日,到時將自動刪除。如果一個Cookies沒有設定有效期,則其生命周期從打開瀏覽器開始,到關閉瀏覽器結束,每次運行後生命周期將結束,下次運行將重新開始。

2.Domain屬性:這個屬性定義了Cookies傳送數據的唯一性。若只將某Cookies傳送給_blank">搜狐主頁時,則可使用如下代碼:

3.Path屬性:定義了Cookies只發給指定的路徑請求,如果Path屬性沒有被設置,則使用應用軟體的預設路徑。

4.Srcure屬性:指定Cookies能否被用戶讀取。

5.Haskeys屬性:如果所請求的Cookies是一個具有多個鍵值的Cookies字典,則返回True,它是一個只讀屬性
轉自

『叄』 java伺服器推送消息給android

幾種常見的解決方案實現原理
1)輪詢(Pull)方式:客戶端定時向伺服器發送詢問消息,一旦伺服器有變化則立即同步消息。

2)SMS(Push)方式:通過攔截SMS消息並且解析消息內容來了解伺服器的命令,但這種方式一般用戶在經濟上很難承受。

3)持久連接(Push)方式:客戶端和伺服器之間建立長久連接,這樣就可以實現消息的及時行和實時性。

3、消息推送解決方案概述

A、C2DM雲端推送方案

在Android手機平台上,Google提供了C2DM(Cloudto Device Messaging)服務。Android
Cloud to Device Messaging (C2DM)是一個用來幫助開發者從伺服器向Android應用程序發送數據的服務。該服務提供了一個簡單的、輕量級的機制,允許伺服器可以通知移動應用程序直接與伺服器進行通信,以便於從伺服器獲取應用程序更新和用戶數據。

該方案存在的主要問題是C2DM需要依賴於Google官方提供的C2DM伺服器,由於國內的網路環境,這個服務經常不可用。

B、MQTT協議實現Android推送

採用MQTT協議實現Android推送功能也是一種解決方案。MQTT是一個輕量級的消息發布/訂閱協議,它是實現基於手機客戶端的消息推送伺服器的理想解決方案。

wmqtt.jar
是IBM提供的MQTT協議的實現。我們可以從這里(https://github.com/toku/AndroidPushNotificationsDemo)下載該項目的實例代碼,並且可以找到一個採用PHP書寫的伺服器端實現(https://github.com/toku/PhpMQTTClient)。

C、RSMB實現推送功能

Really Small Message Broker (RSMB)
,是一個簡單的MQTT代理,同樣由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。預設打開1883埠,應用程序當中,它負責接收來自伺服器的消息並將其轉發給指定的移動設備。SAM是一個針對MQTT寫的PHP庫。我們可以從這個http://pecl.php.net/package/sam/download/0.2.0地址下載它.

D、XMPP協議實現Android推送

Google官方的C2DM伺服器底層也是採用XMPP協議進行的封裝。XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許網際網路用戶向網際網路上的其他任何人發送即時消息。

androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和伺服器端。但也存在一些不足之處:

1)
比如時間過長時,就再也收不到推送的信息了。

2)性能上也不夠穩定。

3)如果將消息從伺服器上推送出去,就不再管理了,不管消息是否成功到達客戶端手機上。

如果我們要使用androidpn,則還需要做大量的工作,需要理解XMPP協議、理解Androidpn的實現機制,需要調試內部存在的BUG。

『肆』 什麼是PHP 什麼是SQL

PHP 是一種伺服器端的,嵌入HTML的腳本語言。PHP區別其他像客戶端Javascript的地方是它的代碼在伺服器端執行.PHP能做什麼?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格數據,生成動態頁面內容,或者收發cookies.可能最強大,最有意義的特性是PHP支持大范圍的資料庫.書寫一個支持資料庫的Web 頁面是難以置信的簡單.
下面是當前支持的資料庫:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL
PHP通過協議也支持與其他服務的"交談",像IMAP, SNMP, NNTP, POP3, 甚至是 HTTP. 你也可以打開晦澀的 網路介面和其他協議交互.
PHP的簡要歷史
1994年秋季, Rasmus Lerdorf 開始構思 PHP. 早期的非發行版本被用在他的主頁上,以追蹤誰在看他的在線簡歷. 1995年年初第一版本出台,當時PHP只被認為是個人主頁開發工具.它由一個非常單純的只能理解很少數特殊宏的分析引擎和 一些用在主頁後端通用的工具組成.如留言簿,計數器和其他一些東西.這個分析器在1995年年中被重寫並被命名為 PHP/FI 第二版. FI來自 Rasmus 寫的另外一個包, 用於解釋 html 形式的數據.他結合了個人主頁工具腳本和形式解析器,並加 上mSQL支持.這樣就產生 PHP/FI 了. PHP/FI以令人驚奇的步調成長,人們開始把自己的代碼貢獻給它.
很難給出它的硬統計表,但可以估計在1996年末,整個世界至少有15,000個網站在用PHP/FI.到1997年年中,這個 數字已經超過50,000了. 而在此時PHP的發展也發生了變化.由Rasmus自己偏愛的和幾個人開發的項目變成一個更有組織的團 體成就.Zeev Suraski和Andi Gutmans重寫了解析器.這個新的解析器成為PHP版本3的基礎.許多有用的代碼從PHP/FI 繼承到PHP3,並且很多是完全重寫的.
今天(1999年年中)不管是PHP/FI或PHP3與很多商業產品捆綁在一塊,例如C2級強度的Web伺服器和紅帽子Linux. 根據NetCraft提供的數據推斷,保守估計全世界應用PHP的網站已超過150,000個.由此看來,它比在網際網路上運行Netscape 的旗艦企業伺服器的站點還多.

PHP 是一種用來製作動態網頁的伺服器端腳本語言。你通過PHP和HTML創建頁面。當訪問者打開網頁時,伺服器端便會處理 PHP 指令,然後把其處理結果送到訪問者的瀏覽器上面,就好像 ASP 或者是 ColdFusion 一樣。然而,PHP 跟 ASP 或 ColdFusion 不一樣的地方在於,它是跨平台的開放源代碼。PHP 可以在 Windows NT 以及很多不同的 Unix 版本中執行,它也可以被編譯為一個 Apache 模塊,或者是一個CGI二進制文件。當被編譯為 Apache 模快時,PHP 尤其輕巧方便。它沒有任何繁瑣程序所產生的負擔,因此可以很快的返回結果,同時也不需為了保持較小的伺服器內存映象,而去調整mod_perl。

1. 引言

SQL是什麼?
* SQL (Structured Query Language)代表結構化查詢語言。
* 當用戶發出一項查詢,便可從資料庫檔內獲得若干資料。這項查詢是根據用戶所提供的條件 (condition) 所作出的一項檢索。而 SQL則是一個可讓用戶把條件列明的查詢語言。這樣,用戶只須列明查詢的條件,而不須要實際知道有關的檢索方法。
* 一般的資料庫管理軟體系統 (DBMS) 都包含 SQL 功能。

SQL的概念
* 通過 SQL 指令,用戶先列出資料庫檔及查詢的條件, SQL 程序便會在這資料庫檔內檢查每筆記錄是否符合這項條件,並把有關的資料顯示出來。這個過程稱為檢索。 (見例 2)
* 用戶除了直接查問各筆記錄的資料外,也可查問統計數項,例如最大值、最小值、總和及平均值。
* 查詢所得的結果會以表格的形式顯示,用戶亦可指示 SQL 程序把結果貯存成為資料庫檔。

在 FoxPro 如何使用 SQL
* 使用 SQL,必須先把有關資料庫檔開啟。
* 用戶可使用指令視窗 (Command Window) 直接把指令輸入,亦可使用對話方塊把指令輸入。
* 若用戶選用字元串的完全配對時,便須輸入 SET ANSI ON。

2. SQL檢索指令的基本結構

一般語法 SELECT, ALL / DISTINCT, *,
AS, FROM, WHERE
比較 IN, BETWEEN, LIKE "% _"
群組 GROUP BY, HAVING,
COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
顯示次序 ORDER BY, ASC / DESC
邏輯運算符 AND, OR, NOT
輸出 INTO TABLE / CURSOR
TO FILE [ADDITIVE], TO PRINTER, TO SCREEN
聯合 UNION

簡稱:
expr = 表達式 expression, groupexpr = 群組表達式 group expression
col = 欄 column, comcol = 共同欄 common column
colname = 欄名 column name
nullval = 空值 null value

實例:學生個人資料

例子: 考慮以下貯存學生數據的資料庫檔 STUDENT. DBF:

(i) hcode 表示學生的社名(即紅黃藍綠四社)。
R = Red, Y = Yellow, B = Blue, G = Green
(ii) dcode 表示學生的居住地區碼。
eg. TST = 尖沙咀(Tsim Sha Tsui), MKK = 旺角(Mong Kok)
(iii) remission 表示學生是否享有學費減免:
.T. =享有學費減免, .F. = 沒有學費減免
(iv) mtest 貯存學生數學測驗的分數,滿分為100。

欄名 類型 欄寬 內容
id 數字 4 學生編號
name 字元 10 學生名字
dob 日期 8 出生日期
sex 字元 1 性別: M / F
class 字元 2 班別
hcode 字元 1 社名: R, Y, B, G
dcode 字元 3 地區碼
remission 邏輯 1 學費減免
mtest 數字 2 數學測驗分數

I 一般語法

SELECT ...... FROM ...... WHERE ......

SELECT [ALL / DISTINCT] expr1 [AS col1], expr2 [AS col2] ;
FROM tablename WHERE condition

– SQL 程序會從資料庫檔 tablename 選取符合條件的橫列 (row) 並以表格的格式顯示。
– 表達式 expr1, expr2 可以是 (1) 欄位,或 (2) 以函數和欄位組成的表達式。
– 而 col1, col2 是表達式 expr1, expr2 在輸出結果的表格內的欄名。
– 選項 DISTINCT 會把重覆出現的橫列刪去(即只顯示一次),而選項 ALL 則會把所有重覆的保留。
– 條件 condition 可以是 (1) 等式或不等式,或 (2) 字元串的比較,並使用邏輯運算符 AND, OR, NOT。

在使用SQL之前,開啟資料庫檔:
USE student

例 1 求出所有學生的資料。
SELECT * FROM student

注意: 1) 這個指令並不提出任何條件,所以把 WHERE 部分省去。
2) 在 SELECT 部分中使用 * 來表示揀選來源表格的所有欄。
3) 查詢所得的結果將貯存於一個暫時的表格內。

id
name dob sex class mtest hcode dcode remission
9801 Peter 06/04/86 M 1A 70 R SSP .F.
9802 Mary 01/10/86 F 1A 92 Y HHM .F.
9803 Johnny 03/16/86 M 1A 91 G SSP .T.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
: : : : : : : : :

例 2 求出 1A 班學生的名字和社名。

SELECT name, hcode, class FROM student ;
WHERE class="1A"

注意: 這例使用條件 class="1A" 揀選 1A 班學生:SQL 程序會從來源表格中的每一橫列逐一地檢查是否符合這條件。然後 SQL 程序會根據 SELECT 的選項而保留這些橫列內的三欄,即 name, hcode 及 class。最後程序會把所得的結果貯存於一個暫時的表格內。

name
hcode class
Peter R 1A
Mary Y 1A
Johnny G 1A
Luke G 1A
Bobby B 1A
Aaron R 1A
: : :

例 3 求出紅社社員的居住地區。(hcode="R")

SELECT DISTINCT dcode FROM student ;
WHERE hcode="R"

注意: 若兩個或以上的學生居住於同一地區,使用選項 DISTINCT 便可把重覆的結果省去。

dcode

HHM
KWC
MKK
SSP
TST
YMT

例 4 求出 1B 班女生的名字和年齡。(准至一位小數)

SELECT name, ROUND((DATE( )-dob)/365,1) AS age FROM student ;
WHERE class="1B" AND sex="F"

注意: 1) 「1B 班女生」的條件包括兩部分:class="1B" 和 sex="F"。而這項條件必須同時符合,所以要使用邏輯運算符 AND。
2) 在這資料庫檔裏並沒有一欄直接貯存年齡,所以我們須要使用學生的出生日期 dob 來計算。首先,DATE( )-dob 表示該生的"日歲",再除 365 就變成"年歲"。再用選項 AS age 去說明該欄的名稱。

name
age
Wendy 12.1
Kitty 11.5
Janet 12.4
Sandy 12.3
Mimi 12.2

例 5 求出 1A 班沒有學費減免的學生的名字和編號。

SELECT name, id, class FROM student ;
WHERE class="1A" AND NOT remission

注意: 1) 這裏包括兩項條件:學生必須是 1A 班,而且沒有享有學費減免。 所以在 WHERE 部分中加上運算符 AND。
2) 因 remission 是一個邏輯欄位,所以可直接在邏輯表達式中使用 。在 remission 之前加上 NOT 便把意思相反。

name
id class
Peter 9801 1A
Mary 9802 1A
Luke 9810 1A
Bobby 9811 1A
Aaron 9812 1A
Ron 9813 1A
Gigi 9824 1A
: : :

II 比較

expr IN ( value1, value2, value3)
expr BETWEEN value1 AND value2
expr LIKE "%_"

– 在 WHERE 部分中,可使用以上的比較條款:
1) 若 expr 的值是相等於 value1, value2, value3 其中的一個時,條款 expr IN ( value1, value2, value3) 便會送回邏輯值 .T.。而 expr 可以是數值或字元串。
2) 若expr 是界乎於 value1 和 value2 之間,條款
expr BETWEEN value1 AND value2 便會送回邏輯值 .T.。
3) 若字元串 expr 符合 "%_" 的樣式,條款 expr LIKE "%_" 便會送回邏輯值 .T.。在樣式中, "%" 代表任何長度的字元串,而 "_" 則代表任何的單一字元。

例 6 求出所有出生於星期三或星期六的學生。

SELECT name, class, CDOW(dob) AS bdate FROM student ;
WHERE DOW(dob) IN (4,7)

注意: 學生若在星期三星期六齣生, DOW(dob) 使會送回 數值 4 或 7,所以用 IN (4,7) 來檢查。

name
class bdate
Peter 1A Wednesday
Wendy 1B Wednesday
Kevin 1C Saturday
Luke 1A Wednesday
Aaron 1A Saturday
: : :

例 7 求出所有不是在一月、三月、六月或九月出生的學生。

SELECT name, class, dob FROM student ;
WHERE MONTH(dob) NOT IN (1,3,6,9)

注意: 我們不想 MONTH(dob) = 1, 3, 6 或 9, 所以使用 NOT IN (1,3,6,9) 來檢查。

name
class dob
Wendy 1B 07/09/86
Tobe 1B 10/17/86
Eric 1C 05/05/87
Patty 1C 08/13/87
Kevin 1C 11/21/87
Bobby 1A 02/16/86
Aaron 1A 08/02/86
: : :

例 8 求出1A 班的學生名字,其數學測驗分數界乎於 80 至 90 分之間。

SELECT name, mtest FROM student ;
WHERE class="1A" AND mtest BETWEEN 80 AND 90

注意: 1) 這裏用了兩個條件:第一個是 class="1A",第二個是測驗分數界乎於 80 至 90 分之間。這兩個條件必須同時成立,所以須用 AND。
2) 測驗分數界乎於 80 至 90 分之間可用 mtest BETWEEN 80 AND 90 來表示。

name
mtest
Luke 86
Aaron 83
Gigi 84

例 9 求出所有學生其名字是以 "T" 為起首。

SELECT name, class FROM student ;
WHERE name LIKE "T%"

注意: 這裏所用的樣式是 "T%" ,這表示第一個字元必須是 "T" 而其後可以是任何的字元串。

name
class
Tobe 1B
Teddy 1B
Tim 2A

例10 求出所有紅社社員其名字的第二個字母是"a"。

SELECT name, class, hcode FROM student ;
WHERE name LIKE "_a%" AND hcode="R"

注意: 這裏所用的樣式是 "_a%" ,而其中的 "_" 符號代表任何單一字元,亦即第一個字元是任意的。第二個字元則必須是 "a",而其後的 "%" 代表任何的字元串。

name
class hcode
Aaron 1A R
Janet 1B R
Paula 2A R

III 群組

SELECT ...... FROM ...... WHERE condition ;
GROUP BY groupexpr [HAVING requirement]

群組函數: COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )

–GROUP BY groupexpr 列出群組組成所依照的表達式。一般都是資料庫檔的一欄。
– WHERE condition 列出個別橫列所須符合的條件,而 HAVING requirement 則列出個別群組須符合的條件。
– 可使用以群組函數來計算統計數項:
COUNT( ): 記錄出現的目數
SUM( ): 總和
AVG( ): 平均值
MAX( ): 最大值
MIN( ): 最小值

例11 求出每一班的人數。

SELECT class, COUNT(*) FROM student
GROUP BY class

注意: 1) 使用 GROUP BY class, SQL 程序便會先把表格裏的橫列按照 class 排列起來。
2) 然後 SQL 程序會把相連的橫列依照 class 來群組。
3) 最後使用群組函數 COUNT(*) 去算數每組的數目。

class
cnt
1A 10
1B 9
1C 9
2A 8
2B 8
2C 6

例12 求出每一班的數學測驗平均分。

SELECT class, AVG(mtest) FROM student GROUP BY class

注意: SQL 程序會先依照 class 來群組,然後在每一組中計算該組的 mtest 平均值。

class
avg_mtest
1A 85.90
1B 70.33
1C 37.89
2A 89.38
2B 53.13
2C 32.67

例13 求出每一居住地區的女生數目。

SELECT dcode, COUNT(*) FROM student ;
WHERE sex="F" GROUP BY dcode

注意: 查詢的條件為 sex="F"。而 SQL 程序會先把符合這條件的橫列選出,然後把這些橫列依照 dcode 為群組。

dcode
cnt
HHM 6
KWC 1
MKK 1
SSP 5
TST 4
YMT 8

例14 求出每一區中一學生數學測驗的最高分及最低分。

SELECT MAX(mtest), MIN(mtest), dcode FROM student ;
WHERE class LIKE "1_" GROUP BY dcode

max_mtest
min_mtest dcode
92 36 HHM
91 19 MKK
91 31 SSP
92 36 TST
75 75 TSW
88 38 YMT

注意: 這例使用條件 class LIKE "1_" 來揀選每區的中一學生。

例15 列出每一班男生數學測驗的平均分,但男生人數不及三人的班則不計算在內。

SELECT AVG(mtest), class FROM student ;
WHERE sex="M" GROUP BY class HAVING COUNT(*) >= 3

注意: SQL 程序會先把符合個別條件 sex="M" 的橫列揀選出來,然後依照 class 來群組並計算每組的 mtest 平均值。最後 SQL 程序會檢查群組條件 COUNT(*) >= 3。(這例中 2C 班男生人數不及三人,所以並沒有在結果裏顯示出來。)

avg_mtest
class
86.00 1A
77.75 1B
35.60 1C
86.50 2A
56.50 2B

IV 顯示次序

SELECT ...... FROM ...... WHERE ...... GROUP BY ..... ;
ORDER BY colname ASC / DESC

– ORDER BY colname 控制結果的顯示序。而 colname 代表結果表格的一欄。而ASC = 升冪, DESC = 降冪。

例16 列出 1A 班男生的名字,並按名字序顯示。

SELECT name, id FROM student ;
WHERE sex="M" AND class="1A" ORDER BY name

name id name id
Peter
9801 Aaron 9812
Johnny 9803 Bobby 9811
Luke 9810 Johnny 9803
Bobby 9811 Luke 9810
Aaron 9812 Peter 9801
Ron 9813 Ron 9813

例17 列出 2A 班的學生資料,並按居住地區序顯示。

SELECT name, id, class, dcode FROM student ;
WHERE class="2A" ORDER BY dcode

name id class dcode
Jimmy 9712 2A HHM
Tim 9713 2A HHM
Samual 9714 2A SHT
Rosa 9703 2A SSP
Helen 9702 2A TST
Joseph 9715 2A TSW
Paula 9701 2A YMT
Susan 9704 2A YMT

例18 求出每區居住學生的人數,並按降冪顯示。

SELECT COUNT(*) AS cnt, dcode FROM student ;
GROUP BY dcode ORDER BY cnt DESC

cnt
docode
11 YMT
10 HHM
10 SSP
9 MKK
5 TST
2 TSW
1 KWC
1 MMK
1 SHT

例19 列出每社的男社員名字並按班別序顯示。(即社和班的兩層次序)

SELECT name, hcode, class FROM student ;
WHERE sex="M" ORDER BY hcode, class

注意: 這些橫列先按 hcode 排列(即第一層排列);而相同的 hcode,再按 class 次序顯示。

name hcode class
Bobby
B 1A
Teddy B 1B
Joseph B 2A
Zion B 2B
Leslie B 2C
Johnny G 1A
Luke G 1A
Kevin G 1C
George G 1C
: : :
: : :

V 輸出

INTO TABLE tablename
把查詢所得的結果貯存成資料庫檔。
INTO CURSOR temp
把查詢所得的結果暫時貯存於電腦的工作記憶裏。
TO FILE filename [ADDITIVE]
把查詢所得的結果貯存成文字檔。(additive = 附加)
TO PRINTER 輸出到列印機。
TO SCREEN 輸出到螢幕。

例20 按學生名字的降冪,列出學生的所有資料,並把結果貯存成資料庫檔NAME.DBF。

SELECT * FROM student ;
ORDER BY name DESC INTO TABLE name.dbf

注意: 1) INTO TABLE name.dbf 要求 SQL 程序把結果貯存成檔案。
2) 這指令相等於資料庫指令 SORT。
3) SQL 程序會把結果貯存成一個新的資料庫檔 name.dbf。

id
name dob sex class mtest hcode dcode remission
9707 Zion 07/29/85 M 2B 51 B MKK .F.
9709 Yvonne 08/24/85 F 2C 10 R TST .F.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9819 Vincent 03/15/85 M 1C 29 Y MKK .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
9713 Tim 06/19/85 M 2A 91 R HHM .T.
9816 Teddy 01/30/86 M 1B 64 B SSP .F.
:
: : : : : : : :

例21 按社員的班別、性別及名字的次序,把紅社社員的資料列印出來。

SELECT class, name, sex FROM student ;
WHERE hcode="R" ;
ORDER BY class, sex DESC, name TO PRINTER

注意: 1) 這指令要求程序先找出綠社社員,然後把這些橫列以 class, sex 和 name 的次序排列。
2) SQL 程序先把查詢的結果暫時貯存於工作記憶裏,然後把這結果輸出到列印機。

class
name sex
1A
Aaron M
1A
Peter M
1A Ron M
1B Tobe M
1B Janet F
1B Kitty F
1B
Mimi F
: : :

3. 資料庫聯合、相交及差分
考慮兩個結構相同的資料庫檔 A 和 B。

A 和 B 的聯合
(A B) union
檢取屬於 A 或 B 的所有橫列。
A 和 B 的相交
(A B) intersection
檢取 A 和 B 所共有的橫列。
A 和 B 的差分
(A–B) difference 檢取只屬於 A 而不屬於 B 的橫列。(即從 A 把 B 的部分排出)

SELECT ...... FROM ...... WHERE ...... ;
UNION ;
SELECT ...... FROM ...... WHERE ......

SELECT ...... FROM table1 ;
WHERE col IN ( SELECT col FROM table2 )

SELECT ...... FROM table1 ;
WHERE col NOT IN ( SELECT col FROM table2 )

實例:橋牌會和棋藝會

考慮學校橋牌會和棋藝會的會員,他們的資料分別貯存於同一結構的資料庫檔 BRIDGE.DBF 和 CHESS.DBF 內:

欄名 類型 欄寬 內容
id 數字 4 學生編號
name 字元 10 學生名字
sex 字元 1 性別: M / F
class 字元 2 班別

Bridge [A] Chess [B]
id name sex class id name sex class
1 9812 Aaron M 1A 1 9802 Mary F 1A
2 9801 Peter M 1A 2 9801 Peter M 1A
3 9814 Kenny M 1B 3 9815 Eddy M 1B
4 9806 Kitty F 1B 4 9814 Kenny M 1B
5 9818 Edmond M 1C 5 9817 George M 1C
: : : : : : : :

在使用SQL之前,開啟這兩個資料庫檔:
SELECT A
USE bridge
SELECT B
USE chess

例22 本校計劃舉行一次 "棋橋活動",所有棋藝會和橋牌會的會員必須出席。試以班別和名字的次序,列出兩會會員的名單。(即兩會的聯合)

SELECT * FROM bridge ;
UNION ;
SELECT * FROM chess ;
ORDER BY class, name INTO TABLE party

注意: 所要求的是兩會的所有會員,這便是兩會的聯合。

Party

id name sex class
1 9812 Aaron M 1A
2 9802 Mary F 1A
3 9801 Peter M 1A
4 9815 Eddy M 1B
5 9814 Kenny M 1B
6 9806 Kitty F 1B
7 9818 Edmond M 1C
8 9817 George M 1C
: : : :

例23 列印兩會的共同會員。(即兩會的相交)

SELECT * FROM bridge ;
WHERE id IN ( SELECT id FROM chess ) ;
TO PRINTER

注意: 這例須找出兩會所共通的會員。SQL 程序須檢查橋牌會的每一個會員是否也屬於棋藝會。若是屬於的話,這人便符合這個要求了。

Common

id name sex class
1 9801 Peter M 1A
2 9814 Kenny M 1B
: : : :

例24 求出只參加了橋牌會的會員名單。(即兩會之差分)

SELECT * FROM bridge ;
WHERE id NOT IN ( SELECT id FROM chess ) ;
INTO TABLE diff

注意: 1) 這例須從橋牌會中揀選那些並不屬於棋藝會的人。所以 SQL 程序須使用 FROM bridge,即從逐一檢查橋牌會的會員是否屬於棋藝會,若不屬於的話,這人便符合這個要求了。
2) "差分"不是對稱的:若想找出"只參加了棋藝會的會員名單",其結果則會完全不同。

Diff

Id name sex class
1 9812 Aaron M 1A
2 9806 Kitty F 1B
3 9818 Edmond M 1C
: : : :

4. 多個資料庫

當所查詢的資料貯放於兩個資料庫檔時,就須使用接合 (join)。 接合的作用是把一個資料庫檔內的一個橫列與另一個資料庫檔內的橫列連合起來,從而把所有不同的組合列出來。 (數學: Cartesian Proct)

自然接合

* 在接合中加上一項接合條件,要求兩檔的共通欄(common column)的值是相同,這稱為自然接合。這目的是要把這兩檔的相關資料連合起來,變成一個合一的大表格,再從這表格中執行查詢工作。

考慮以下兩個資料庫檔 T1 和 T2:

SELECT a.comcol, a.col1, b.col2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol

– 在自然接合中,這兩個資料庫檔須要有一個欄是相同的,這一欄稱為共通欄 。SQL 程序會先把這兩檔的所有組合列出,然後從中揀選共通欄的值是相同的橫列。
– a 和 b 分別是 table1 和 table2的代號,用以指明各欄所屬的檔。
– 表達式 expr1, expr2 可以使用 table1 和 table2內的各欄。

實例:樂器班

學校規定每個學生都須要學習一件樂器。現在使用資料庫檔 MUSIC.DBF 貯存學生所學的樂器名稱 (而學生的其他資料則貯存於 STUDENT.DBF 內)

欄名 類型 欄寬 內容
id 數字 4 學生編號
type 字元 10 樂器名稱

例25 列出所有學生的名字及所學習的樂器名稱。

SELECT s.class, s.name, s.id, m.type FROM student s, music m ;
WHERE s.id=m.id ORDER BY class, name

注意: 1) 這裏用了s 代表 student.dbf 而 m 代表 music.dbf。
2) 接合條件是 s.id=m.id,表示兩檔的橫列須要依照 id 而接合。

class
name id type
1A Aaron 9812 Piano
1A Bobby 9811 Flute
1A Gigi 9824 Recorder
1A Jill 9820 Piano
1A Johnny 9803 Violin
1A Luke 9810 Piano
1A Mary 9802 Flute
: : : :

例26 求出每班學習鋼琴的學生數目。

SELECT s.class, COUNT(*) FROM student s, music m ;
WHERE s.id=m.id AND m.type="Piano" ;
GROUP BY class ORDER BY class

注意: 1) 裏先首先用了接合條件 s.id=m.id 把兩檔自然接合起來。
2) SQL 程序然後從接合的結果(表格形式)中再揀選去符合條件 m.type="Piano" 的橫列。
3) 最後 SQL 程序會依照 class 而群組,並數算每班的數目。

class cnt
1A 4
1B 2
1C 1
外接合

* 外接合是自然接合再加上沒有配合的部分。

SELECT a.common, a.column1, b.column2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol ;
UNION ;
SELECT comcol, col1, nullval, nullval, nullval ;
FROM table1 ;
WHERE a.comcol NOT IN ( SELECT comcol FROM table2 )

– 外接合的指令包括兩個 SELECT 部分,再以 UNION 聯會起來。
– 第一部分是自然接合(即成功接合),第二部分則是沒有配合(即是在第一部分不能自然接合的橫列)。
– 為了使第二部分與第一部分的結構一樣,第二部分中沒有數值的位置須填上空值 (null value),即空字元串""、數值零、 邏輯值 .F. 或空日期 { / / } 。

例27 列出尚未選擇樂器的學生名字。(即沒有相配)

SELECT class, name, id FROM student ;
WHERE id NOT IN ( SELECT id FROM music ) ;
ORDER BY class, name

注意: 1) 這指令會從 student.dbf 中選出那些在另一檔 music.dbf 沒有配合的橫列。
2) ( SELECT id FROM music) 選出那些在資料庫檔 music.dbf 出現的 id,所以條件 id NOT IN (...) 能檢索出沒有配對的橫列。

class
name id
1A Mandy 9821
1B Kenny 9814
1B Tobe 9805
1C Edmond 9818
1C George 9817
: : :

例28 列出一份名單,去查核所有學生學習的樂器。名單須包括尚未參加樂器班的學生名字。(即外接合)

SELECT s.class, s.name, s.id, m.type ;
FROM stu

『伍』 如何通過php實現mqtt協議

MQTT是一個輕量級的消息發布/訂閱協議,它是實現基於手機客戶端的消息推送伺服器的理想解決方案。

我們可以從這里下載該項目的實例代碼,並且可以找到一個採用PHP書寫的伺服器端實現。

架構如下所示:


『陸』 高中生零基礎學PHP好學嗎

php好不好學?零基礎學php能不能學會?這是一些打算學習php的同學最想知道的問題,下面就這問題呢給大家做一下詳細的分析,計算機零基礎到底可不可以學習php呢?

想要知道php好不好學,就一定要知道php是什麼。那麼什麼是php呢?php的優勢是什麼呢?
首先來說一下什麼是php:php(外文名:php:
Hypertext
Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。
php的優勢:
php獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
開放源代碼
所有的PHP源代碼事實上都可以得到。
免費性
和其它技術相比,PHP本身免費且是開源代碼。
快捷性
程序開發快,運行快,技術本身學習快。嵌入於HTML:因為PHP可以被嵌入於HTML語言,它相對於其他語言。編輯簡單,實用性強,更適合初學者。
跨平台性強
由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS、Mac OS、Android等平台
效率高
PHP消耗相當少的系統資源。
圖像處理
用PHP動態創建圖像,PHP圖像處理默認使用GD2。且也可以配置為使用image magick進行圖像處理。
面向對象
在php4,php5 中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程序。
專業專注
PHP支持腳本語言為主,同為類C語言。
關於零基礎學php這個問題,我相信很多同學也是看到目前php程序員招聘崗位多,而且薪水待遇也不錯,最重要的一個php編程語言與其他編程語言相比,php更加容易學習,所以,這也是很多同學選擇學習php課程的原因。
計算機0基礎學php是否好學呢?如果你真的打算學習php,將來從事php相關工作,你完全不用擔心自己有無基礎的問題,關鍵在於你的興趣愛好,退一步說,你實在找不到學習方法的話,你還可以參加一些專業的php培訓機構學習,參加培訓班學習的優勢學習時間短,少走彎路,知識更加系統化等。當然了,你想自學也可以,但是你會走一些彎路,或者是遇到問題堅持不下去有可能會中途放棄,因此,在學校的過程中一定要堅持,任何編程語言的學習過程都是充滿著艱辛,想要做到精通也不是一朝一夕就能達到的。只有堅持不斷的學習,才能夠達到目標。

閱讀全文

與phpsam相關的資料

熱點內容
微信聊天界面源碼 瀏覽:24
seo競價推廣點擊價格演算法公式 瀏覽:319
框架結構可以加密嗎 瀏覽:218
python編譯器怎麼清除 瀏覽:73
linux全局socks代理 瀏覽:611
php微信抽獎 瀏覽:771
壓縮演算法嵌入式移植 瀏覽:531
php新手小例子 瀏覽:233
按照醫生的演算法一周是幾天 瀏覽:805
三次b樣條曲線演算法 瀏覽:924
java7特性 瀏覽:555
愛山東app小學報名怎麼知道報沒報上 瀏覽:458
android獲取wifi信號 瀏覽:133
娜拉美妝app怎麼使用 瀏覽:760
有了源碼要買伺服器嗎 瀏覽:365
app怎麼查看自己的存款利息 瀏覽:515
碧藍安卓與b站有什麼區別 瀏覽:342
php靜態塊 瀏覽:719
ftpmget命令 瀏覽:475
源碼時代怎樣 瀏覽:415