技術(shù)背景:無php基礎(chǔ),有sql基礎(chǔ)。
動機(jī)1:對數(shù)據(jù)接口的管理是電子文檔的管理方式,效率奇低,市面上現(xiàn)有的軟件工具感覺都不趁手
動機(jī)2:一顆做全棧的心,打通了網(wǎng)站,可以自己想做啥就做啥
前期準(zhǔn)備
web+sql環(huán)境搭建:見XAMPP環(huán)境搭建與配置
開發(fā)工具:PhpStorm,去官網(wǎng)下載(然后自己找個(gè)license server激活),選擇原因是用慣了JetBrains出品
PHP基礎(chǔ):W3School的php部分簡單讀了一遍
參考項(xiàng)目:一個(gè)涵蓋基本CRUD功能的小項(xiàng)目,我找的是SFON
開發(fā)過程
1.概念與分工
我們會用到這么幾個(gè)東西:php,html,js(javascript),css,他們是這樣合作的

我們知道,網(wǎng)站其實(shí)就是向?yàn)g覽器丟出一堆頁面數(shù)據(jù),瀏覽器自己解析這些數(shù)據(jù),顯示成我們看到的樣子。
在瀏覽器那里,HTML就像是房屋結(jié)構(gòu),決定頁面有哪些內(nèi)容;CSS就像是裝修的壁紙和油漆,決定這些內(nèi)容看起來是什么樣子;JavaScript就像是一個(gè)建筑+裝修工人,可以把房子拆建/擴(kuò)建/刷漆/移墻/換門窗什么的...。
上述三個(gè)語言都是在瀏覽器上工作的,房子都拆了,后臺服務(wù)器一點(diǎn)兒也不知道,所以有人能從后臺處理數(shù)據(jù),PHP就是在后臺工作的,它的工作分兩部分:
一個(gè)是從服務(wù)器上組合頁面數(shù)據(jù),服務(wù)器網(wǎng)站向?yàn)g覽器丟出頁面數(shù)據(jù)前,php可以先運(yùn)轉(zhuǎn)一下,決定把哪些頁面數(shù)據(jù)丟給瀏覽器,這個(gè)過程大概可以這樣理解

另一個(gè)是從瀏覽器向服務(wù)器提交數(shù)據(jù),因?yàn)榉?wù)器不會去問瀏覽器上發(fā)生了什么,需要瀏覽器主動向服務(wù)器提交。這個(gè)提交過程就復(fù)雜很多了,它涉及如何從瀏覽器向后臺傳數(shù)據(jù)的問題,基本過程是這樣的

首先,把數(shù)據(jù)從瀏覽器提交到服務(wù),在提交時(shí),瀏覽器先把數(shù)據(jù)從特定的表單里拿出來,提交給服務(wù)器,并要求服務(wù)器在指定的另一個(gè)php頁面里取出這些數(shù)據(jù)
然后,瀏覽器會去打開這個(gè)特定php頁面,此時(shí),服務(wù)器會根據(jù)要求取出瀏覽器提交的數(shù)據(jù),然后再執(zhí)行我們寫的php代碼,去修改數(shù)據(jù)庫什么的。
2.頁面的結(jié)構(gòu)
PHP只負(fù)責(zé)組裝頁面數(shù)據(jù),等數(shù)據(jù)發(fā)到瀏覽器時(shí),已經(jīng)看不到PHP代碼了(php只運(yùn)行在后臺服務(wù)器上),瀏覽器上能到的就是HTML+JS+CSS,他們是這樣分工的

3.頁面的引用和跳轉(zhuǎn)
web頁面里有很多引用,我們知道軟件開發(fā)都會盡力做到可復(fù)用,在Java里是import引用其他類,在web里就是include引用文件了,js、css、php文件都可以這樣引用,如果是本地文件,可以直接指向?qū)?yīng)的文件夾;如果是在線文件,可以直接指向?qū)?yīng)的網(wǎng)絡(luò)地址。
web頁面可以互相跳轉(zhuǎn),一般來說web應(yīng)用都需要在幾個(gè)頁面間來回跳轉(zhuǎn)(也有些單頁面web應(yīng)用),超鏈接、php函數(shù)、js函數(shù)都可以實(shí)現(xiàn)跳轉(zhuǎn)或回退功能,但更重要的是數(shù)據(jù)的傳遞,要傳遞參數(shù),可以通過url傳遞,或者可以通過瀏覽器的cookie來傳遞,或者可以通過服務(wù)器的session來傳遞,具體使用哪種方式看自己的需求了。
4.數(shù)據(jù)庫連接與處理
這里連接的是mysql數(shù)據(jù)庫,php連接mysql數(shù)據(jù)庫有三種方式,php-mysql,php-mysqli和pdo。
第一種php-mysql已經(jīng)廢棄,能用,但不推薦,因?yàn)樘惻f了,容易被sql注入攻擊,不能在一次連接中執(zhí)行多條SQL語句(建立和釋放數(shù)據(jù)庫連接時(shí),消耗的資源可能超過執(zhí)行SQL)等等。
第二種php-mysqli其實(shí)就是php-mysql improvement,增強(qiáng)版,主要解決了舊版php-mysql的問題,并增強(qiáng)了很多功能,例如支持事務(wù)等,不過本質(zhì)上還是拼sql語句,數(shù)據(jù)層和業(yè)務(wù)層還是混雜在一起的。
第三種pdo看名字就知道,終于把數(shù)據(jù)層抽象出來了,業(yè)務(wù)層使用pdo數(shù)據(jù)對象,pdo再去跟數(shù)據(jù)庫對接,解耦合的結(jié)果是,你可以自由地更換數(shù)據(jù)庫了,除非是一錘子買賣完全不考慮擴(kuò)展維護(hù),否則還是使用pdo為妙。
5.漢字亂碼與utf8字符集
記得Jeff大神曾經(jīng)在一篇文章里提到,很多英文網(wǎng)站都沒有設(shè)定字符集,導(dǎo)致在非英語國家各種亂碼...
我們中國這種情況好一些,因?yàn)椴辉O(shè)字符集,網(wǎng)站里的漢字就先亂碼給你看。
設(shè)定uft8字符集可以解決這個(gè)問題,但要設(shè)置三處
一要為php里的html頁面設(shè)置字符集,在head里添加meta數(shù)據(jù),告訴瀏覽器,使用utf8解析這頁html的數(shù)據(jù)

還要為mysql設(shè)定字符集,數(shù)據(jù)庫要設(shè)定utf8字符集,這樣才能保存漢字;

最后,web頁面里連接數(shù)據(jù)庫時(shí)也要設(shè)定字符集,這樣才能正常處理查詢結(jié)果中的漢字,例如用php-mysqli查詢數(shù)據(jù)庫時(shí),就要先為數(shù)據(jù)庫連接設(shè)定為utf8,然后再執(zhí)行sql

6.操作頁面元素
web頁面現(xiàn)在已經(jīng)進(jìn)化為可以互動了,就是說用戶可以在瀏覽器端修改html頁面的內(nèi)容,這主要是通過Javascript實(shí)現(xiàn),Ajax/jQuery等實(shí)質(zhì)都是javascript的擴(kuò)展。
javascript只能在瀏覽器端操作,要和后臺服務(wù)器通信的話,還是要用php,不過php可以調(diào)用js,但是js調(diào)不了php,因?yàn)閜hp只能在服務(wù)器運(yùn)行,瀏覽器上根本看不到php的代碼,無從調(diào)用。
7.其他
一般來說,網(wǎng)站的默認(rèn)頁面會指向根目錄下的index.php,如果要頻繁修改首頁的話就很麻煩,我們可以通過設(shè)置Header實(shí)現(xiàn)自動跳轉(zhuǎn)

另外,phpstorm里可以直接用瀏覽器打開正在編輯的頁面,但是接口會用phpstorm的63342端口,這個(gè)端口一般不是apache等web容器的端口,缺少web容器的支持,會導(dǎo)致post提交失敗,打開phpstorm的setting,配置一下該項(xiàng)目的端口和地址即可

如果項(xiàng)目比較多,可以取消勾選“Visible only for this project”,共用這個(gè)apache服務(wù)器.
注意,這里配置的web地址,需要是已經(jīng)在xampp中定義過的虛擬目錄,具體在httpd-xampp.conf中配置
如果不想一個(gè)個(gè)改虛擬目錄,還可以修改xampp中apache的根目錄為phpstorm工作目錄,例如,打開xampp的apache/conf/httpd.config,把document root從 D:/xampp/htdocs改為D:/php。
部署應(yīng)用
硬件與系統(tǒng):有一臺裝了CentOS的服務(wù)器可以用
網(wǎng)絡(luò):內(nèi)部使用,直接搭在公司內(nèi)網(wǎng)
軟件:服務(wù)器裝Apache+Mysql,個(gè)人PC裝xshell、xftp、mysql workbench
遇到的問題主要有兩個(gè):
1.數(shù)據(jù)庫賬戶的問題
安全起見,網(wǎng)站使用的數(shù)據(jù)庫賬戶不能是root賬戶,要新建一個(gè)滿足網(wǎng)站的最小權(quán)限的賬戶,但是無論是SQL語句創(chuàng)建還是通過workbench界面創(chuàng)建,都可能會遇到新用戶無法登錄/修改的問題,各種access deny,解決方案有點(diǎn)兒意想不到,需要檢查數(shù)據(jù)庫是否有匿名賬戶,如果有,刪除之,問題解決。
2.apache不能連mysql的問題
開發(fā)環(huán)境用xampp承包了,沒遇到過這個(gè)問題,但是在CenOS上是獨(dú)立安裝的mysql和apache,就遇到了問題,凡涉及到連接數(shù)據(jù)庫,都失敗了
php頁面可以顯示的,在php頁面里用eche phpinfo();來展示一下環(huán)境,會得到一個(gè)這樣的頁面:

這個(gè)炒雞冗長的頁面里會向你提供php所在web容器的一切信息,如果能正常連接數(shù)據(jù)庫,其中應(yīng)該有這么一段:

如果找不到這部分,說明缺少庫文件支持,把缺失文件補(bǔ)齊即可。
另外,網(wǎng)站必然有需要更新維護(hù),CentOS的命令行界面又不友好(對我來說),所以xftp去更新上面的文件,步驟如下:
1.用xshell登錄服務(wù)器
2.打開xftp
3.左邊是本地文件夾,右邊是服務(wù)器文件夾,直接拖拽文件夾,實(shí)現(xiàn)更加(好方便)
