1. 學習php感覺遇到瓶頸了,
原來我也是有這種感覺,其實你需要提升的地方還有很多.當前你的狀態還是停留於"碼工",其實我也是.
框架開發仍停留於開發模式,雖然框架開發局限了你的思維,但你仍需要了解一下.以應對快速開發所需.國內優秀的框架是thinkphp和speedphp,國外是zendFramework,YII,CI等,如果需要框架開發了,你需要進行有選擇的開發.
另外,和前台交互地方需要加強,比如flash交互和ajax交互.
最主要的是,你要了解php項目的多種設計模式.有思想的項目,再小也是精美的.
你還需要了解php相關SOAP協議,比如webservice,以應對多環境語言間進行邏輯引用.
另外一個是如果你有興趣,可以了解下用c寫php擴展,不過正常情況下用處不多.
新版php有很多新特性,注意多應用一下.
2. PHP8新特性示例
命名參數 :就是具名參數,在調用函數的時候,可以指定參數名稱,指定參數名稱後,參數順序可以不安裝原函數參數順序傳
示例:
註解 :註解可以將類定義成一個一個低耦合,高內聚的元數據類。在使用的時候通過註解靈活引入,反射註解類實例的時候達到調用的目的。註解類只有在被實例化的時候才會調用
示例
示例:
解釋 :在不確定參數類型的場景下,可以使用.
示例:
解釋:和 switch case 差不多,但是嚴格要求 === 匹配
示例:
解釋:簡化了 is_null 判斷
示例:
考慮到 PHP 動態語言類型的特性,現在很多情況下,聯合類型都是很有用的。聯合類型是兩個或者多個類型的集合,表示可以使用其中任何一個類型。
請注意,聯合類型中不包含 void ,因為 void 表示的含義是 「根本沒有返回值」。 另外,可以使用 |null 或者現有的 ? 表示法來表示包含 nullable 的聯合體 :
JIT — just in time — 編譯器雖然不總是在 Web 請求的上下文中,但是有望顯著地提高性能。目前還沒有完成任何准確的基準測試,但是肯定會到來。
屬性在其他語言中通常被稱為 註解 ,提供一種在無需解析文檔塊的情況下將元數據添加到類中的方法。
盡管已經可以返回 self,但是 static 直到 PHP 8 才是有效地返回類型 。考慮到 PHP 具有動態類型的性質,此功能對於許多開發人員將非常有用。
有人可能將其稱為必要的邪惡: mixed 類型讓許多人感覺十分混亂。然而,有一個很好的論據支持去實現它:缺少類型在 PHP 中會導致很多情況:
因為上述原因,添加 mixed 類型是一件很棒的事兒。 mixed 本身代表下列類型中的任一類型:
請注意,mixed 不僅僅可以用來作為返回類型,還可以用作參數和屬性類型。因為 mixed 類型已經包括了 null,因此 mixed 類型不可為空。下面的代碼會觸發致命錯誤:
已上是整理出來的新特性的變化,後續會繼續整理,PHP8的發布會讓PHP更上一層樓,相信PHP是世界上最好的語言!
3. PHP到底有多糟糕
php是web開發第一語言,這已經是坐穩了的事實,因為使用簡單,工具完善,開發效率高等優點為它積聚了大量的粉絲,號稱世界上最好的語言。 然而,就算是世界上最好的語言也有缺陷,下面我挑幾個php語法層面不那麼好用的特性吐槽下。
變數面前的美元($)符號
我想不明白當初php語言的設計師是怎麼想的,為什麼非要在變數名面前加上這個美元符號?每次我書寫變數時必須要按一下shift +4鍵,用其它語言可以很流暢的寫代碼,在php中卻老是被按這個shift打斷整個過程,這除了能給程序員帶來麻煩,我實在看不到有其它一丁點的好處。網上流傳著的說法好像是因為帶美元符號代碼解析起來更容易, 性能更好。但是解釋類型的語言又不只有php ,為什麼其它語言就不用讓程序員打這個討厭的美元符號。每天看著滿屏的美元符號,我口袋裡的錢也沒見多一分呀。
訪問對象成員要使用箭頭符號
明明按一下點號(.)就可以方便快捷的搞定的問題,卻非要使用簡單符號(->)來代替,真的是借我一百個腦袋也想不明白php設計者在設計這個特性是什麼邏輯。難不成是因為php解釋器最終會把php的代碼轉換成c代碼執行,而c中訪問指針的成員就是使用箭頭符號的。如果是這樣那顯然是php的設計者們偷懶了,難到不能在轉換成c執行的過程中多一步將點號轉換為箭頭符號的過程嗎?不要告訴我又是因為性能問題而辦不到,他們就不能為程序員想想?
數組即能當列表也能當字典
寫一個函數,返回一個數組類型,但是在函數的外面,鬼知道這個數組是一個list還是一個map?寫php代碼不知道被這個特性坑過多少回,如果是別人寫的函數, 又沒有注釋,那非得跑進函數里看個明白才知道應該這么樣使用這個函數才是安全的。難到就不能把array拆成兩個獨立的類型分別代表list(列表)和map(字典)嗎?這能為程序提供很大的便利,寫的代碼也更加不會出錯。
匿名函數使用外部變數必須使用use關鍵字導入
這個特性不能說完全沒有優點,對於代碼的可維護性還是能起到正面的作用的,因為這么做能讓我知道我在匿名函數體裡面對於外部會有哪些依賴,讓代碼更可控。然而,這種寫法真的是非常的不方便,每次寫lambda時,要用到外部的變數時,都要使用use導入,把代碼搞的看起來很臃腫,而且,因為其它語言沒這個限制,習慣已經養成,所以每次都會忘記使用use導入,導致代碼出錯,增加排查問題的時間,這真的不是什麼好玩的事。
用include導入文件
當把代碼模塊化時,然後在其它文件中使用,每次都需要使用這個include把文件導入進來,而且還要考慮路徑的問題,在結構復雜的項目中,非常讓人蛋疼。而像java和Python之類的語言中,代碼管理機制設計的非常好,想用什麼import進來就可以了,根本不用考慮路徑啊,文件名大小寫啊之類的問題,能大大的提升開發效率。雖然,有框架可以解決這類問題,但畢竟是外部實現,使用起來總歸不是那麼順暢。這也算是php一個比較大的毛病了。
總結的這五點算是php中存在問題的典範了,希望php團隊能加把勁,把這些問題在未來的版本中優化掉,讓開發者寫代碼時有更好的體驗,更高的效率,讓世界上最好的語言名副其實
4. 學習php可以做什麼發展方向有哪些
PHP能做什麼
PHP 能做任何事,PHP 腳本主要用於以下三個領域:
1、服務端腳本。
這是 PHP 最傳統,也是最主要的目標領域。開展這項工作需要具備以下三點:
A、PHP 解析器(CGI 或者伺服器模塊)、
B、web 伺服器、
C、web 瀏覽器。
需要在運行web伺服器時,安裝並配置PHP,然後,可以用web瀏覽器來訪問PHP程序的輸出,即瀏覽服務端的PHP頁面。
如果只是實驗 PHP 編程,所有的這些都可以運行在自己家裡的電腦中。
2、命令行腳本。
可以編寫一段 PHP 腳本,並且不需要任何伺服器或者瀏覽器來運行它。
通過這種方式,僅僅只需要 PHP 解析器來執行。
這種用法對於依賴cron(Unix或者linux環境)或者Task Scheler(Windows環境)的日常運行的腳本來說是理想的選擇。
這些腳本也可以用來處理簡單的文本。
3、編寫桌面應用程序。
對於有著圖形界面的桌面應用程序來說,PHP 或許不是一種最好的語言,
但是如果用戶非常精通 PHP,並且希望在客戶端應用程序中使用 PHP 的一些高級特性,
可以利用 PHP-GTK 來編寫這些程序。用這種方法,還可以編寫跨平台的應用程序。
PHP-GTK 是 PHP 的一個擴展,在通常發布的 PHP 包中並不包含它。
如果對 PHP-GTK 感興趣,請訪問其網站以獲取更多信息。
PHP還可用於其他更廣泛的領域:
PHP 還支持利用諸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows環境)等不計其數的協議的服務。
還可以開放原始網路埠,使得任何其它的協議能夠協同工作。
PHP 支持和所有 web 開發語言之間的 WDDX 復雜數據交換。
關於相互連接,PHP 已經支持了對 Java 對象的即時連接,並且可以將他們自由的用作 PHP 對象。
甚至可以用我們的 CORBA 擴展庫來訪問遠程對象。
PHP 具有極其有效的文本處理特性,支持從 POSIX 擴展或者 Perl 正則表達式到 XML 文檔解析。
為了解析和訪問 XML 文檔,PHP 4 支持 SAX 和 DOM 標准,也可以使用 XSLT 擴展庫來轉換 XML 文檔。
PHP5基於強健的libxm2標准化了所有的XML擴展,並添加了SimpleXML和XMLReader支持,擴展了其在XML方面的功能。
如果將PHP用於電子商務領域,
會發現其Cybercash支付、CyberMUT、VeriSign Payflow Pro以及MCVE函數對於在線交易程序來說是非常有用的。
另外,還有很多其它有趣的擴展庫。
例如 mnoGoSearch 搜索引擎函數、IRC 網關函數、多種壓縮工具(gzip、bz2)、日歷轉換、翻譯……
php+mysql相結合,可以開發大中型網站,網店等軟體,flex+php+mysql相結合可以開發像開心網這樣的游戲,還有phpgane(游戲),隨著php版本的不斷提高,php涉及領域網站,網游和管理,銷售軟體等開發觸!
5. 小伺服器選 ThinkPHP幾好
小伺服器選ThinkPHP5好
因為ThinkPHP5比之前的版本好用了很多,增加了很多的一些特性,它採用全新的架構思想,引入了更多的PHP新特性,優化了核心,減少了依賴,實現了真正的惰性載入,支持一些小伺服器使用,並針對API開發做了很多優化。所以小伺服器選ThinkPHP5好。
6. 什麼是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
7. php是什麼什麼作用
PHP(HypertextPreprocessor)是一種通用開源腳本語言。PHP語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
1.PHP獨特的語法混合了C、Java、Perl以及PHP自創新的語法。
2.PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,
PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現。
3.PHP支持幾乎所有流行的資料庫以及操作系統。
4.最重要的是PHP可以用C、C++進行程序的擴展!
PHP腳本主要用於以下三個領域:
(1)服務端腳本。這是PHP最傳統,也是最主要的目標領域。開展這項工作需要具備以下三點:PHP解析器(CGI或者伺服器模塊)、web伺服器和web瀏覽器。需要在運行web伺服器時,安裝並配置PHP,然後,可以用web瀏覽器來訪問PHP程序的輸出,即瀏覽服務端的PHP頁面。如果只是實驗PHP編程,所有的這些都可以運行在自己家裡的電腦中。請查閱安裝一章以獲取更多信息。
(2)命令行腳本。可以編寫一段PHP腳本,並且不需要任何伺服器或者瀏覽器來運行它。通過這種方式,僅僅只需要PHP解析器來執行。這種用法對於依賴cron(Unix或者Linux環境)或者TaskScheler(Windows環境)的日常運行的腳本來說是理想的選擇。這些腳本也可以用來處理簡單的文本。請參閱PHP的命令行模式以獲取更多信息。
編寫桌面應用程序。對於有著圖形界面的桌面應用程序來說,PHP或許不是一種最好的語言,但是如果用戶非常精通PHP,並且希望在客戶端應用程序中使用PHP的一些高級特性,可以利用PHP-GTK來編寫這些程序。用這種方法,還可以編寫跨平台的應用程序。PHP-GTK是PHP的一個擴展,在通常發布的PHP包中並不包含它。
(3)PHP能夠用在所有的主流操作系統上,包括Linux、Unix的各種變種(包括HP-UX、Solaris和OpenBSD)、microsoftWindows、MacOSX、RISCOS等。今天,PHP已經支持了大多數的web伺服器,包括Apache、(IIS)、PersonalwebServer(PWS)、Netscape以及iPlantserver、OreillyWebsiteProServer、Caudium、Xitami、OmniHTTPd等。對於大多數的伺服器,PHP提供了一個模塊;還有一些PHP支持CGI標准,使得PHP能夠作為CGI處理器來工作。
插件豐富,網上的解決方案有很多,而且還有龐大的開源社區可以提供幫助。
跨平台性強效率高圖像處理
面向對象
[在php4,php5中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程序。]
PHP性能很強.配合簡單、穩定、容易部署,總的來說php能幫你低成本完成事情
1)函數命名不規范駝峰法和下滑線,傳參位置不一你知道的
2)單線程;PHP本身,一直以來php就是個單進程的程序;雖然php的pthreads擴展早就有了。但是它不夠穩定,運行運行著就會莫名其妙的自己掛掉;php的擴展都是C寫的,這也就意味著任何一個擴展出現線程競爭資源控制問題都能讓整個掛掉
3)核心非同步網路不支持(當然在linux只有同步非阻塞網路模型)。卻少了這個使得很難開發一個能夠承受大並發的網路應用。傳統的網路模型和io都阻塞的。這樣基本的編程的做法就是一個進程(或者線程)響應一個用戶鏈接請求。因此無法完成像實時網游那樣需要成千上萬網路連接的任務。盡管php也有Libevent、eio擴展對此算是某種程度上面的彌補,但是感覺都不是那麼完善
4)只支持web開發,不方便做.exe文件,不方便做桌面應用程序.不方便做手機程序.
5)不適合做爬蟲、自動運行腳本.科學運算項目,這語言基本構架就不適合,雖然有很多方法實現。
6)後期維護困難。後期提速空間局限性較大。
今朝全球5000萬互聯網網站中,有60%以上使用著PHP手藝;
PHP也當選是全球五大最受接待的編程說話,而且是唯一當選的劇本說話;
國際80%以上的靜態網站都在使用PHP開拓,網路、網易、新浪、搜狐、阿里巴巴、騰訊、金山等,都有PHP的影子;
AlexaTOP500中國網站排名,有394家使用了PHP手藝,比例為78.8%。(火爆不?)
以下是某支流搜索引擎在某時辰收錄各WEB說話頁面個數的斗勁:
Php:2,150,000,000
ASPX:1,370,000,000
Java:6,710,000,00
Asp:1,140,000,000
各類類型在搜索引擎的收錄景象證實:可以或許開拓網站的說話良多,能做到精曉的只需一種;在Web手藝方面,PhP利用更遍及。
2015年6月份PHP新浪科技等諸多大媒體都在轉載了「互聯網十大搶手人材」,PHP排名後端說話第一位。據統計,PHP人材供求比抵達1:10,php高端人材特別稀缺。
PHP、C++、java這三種說話都是相當優良的劇本說話,為什麼PHP能大行其道,位居榜首呢?
從概略下去看,這是就業景象使然。越來越多的新公司或新項目使用PHP,這使得PHP相關社區越來越活躍,而這又反過來影響到良多項目或公司的挑選,構成一個良性的輪回。就我們今朝體味到的景象,PHP是國際大部門web項手段首選,而且有良多公司從其它說話(如ASP,JAVA)轉到了PHP。適合的就是最好的,PHP的快速,開拓成本低,周期短,前期保護費用低,開源產物豐盛,這些都是另外兩種說話沒法對照的。
以上各種消息都在給我們傳送一種旌旗燈號:PHP手藝今朝很給力。
薪資也是反映PHP手藝是不是給力的一個很首要的身分,PHP是不是很有前景,看中立網站職友集顯現的薪資即可!
總之,在全球前一百萬的網站中,大約有70%的站點使用PHP開拓,PHP的用武之地不只僅只是在網站開拓,在游戲開拓、廣告系統開拓、API介面開拓、移動端後台開拓,內部OA系統開拓上都能使用PHP。所以不管是斟酌開拓周期,仍是合計開拓成本,PHP都是值得優先斟酌的。不管另外說話若何興衰,但企業會一向需求PHP。
8. php5.6升級到php7,對應用有什麼影響
這個最好是看手冊,英文版的 網頁是可以自動翻譯的http://php.net/manual/zh/migration70.php,當然商業項目中不建議使用php7,要優先使用5.6版本,因為5.6相對7來說更穩定,等7應用較多的時候,你再使用不遲,不然容易出現兼容性等問題
9. thinkphp 3.2.3在3.2.2基礎上有哪些新特性
3.2.3 主要更新
資料庫驅動完全用PDO重寫;
支持通用insertAll方法;
改進參數綁定機制;
主從分布式資料庫連接改進;
對Mongo的支持更加完善;
模型類的諸多增強和改進;
增加聚合模型擴展;
支持復合主鍵;
多表操作的支持完善;
模型的CURD操作支持僅獲取SQL語句而不執行;
增加using/index/fetchSql/strict/token連貫操作方法;
模型類的setInc和setDec方法支持延遲寫入;
I函數增加變數修飾符和正則檢測支持;
支持全局變數過濾和Action參數綁定的變數過濾;
修正可能的SQL注入漏洞;
支持全局路由定義;
增加插件控制器支持;
增加對全局和模塊的模板路徑的靈活設置;
日誌目錄分模塊存放;
增加memcache Session驅動;
改進session函數的數組操作;