php面試題(二)附答案

1.單引號和雙引號的用法
雙引號串中的內容可以被解釋而且替換,而單引號串中的內容總被認爲是普通字符
2.web開發中的安全性問題
1. sql注入攻擊
2. 數據庫操作安全,UPDATE、 DELETE、INSERT的操作沒有限制用戶操作權限,這將是一件很危險的事情。
3. 沒有驗證用戶http請求的方式 POST 或者 GET,GET請求被合法通過
4. 沒有驗證表單來源的唯一性,不能識別是合法的表單提交還是黑客僞造的表單提交!
3.簡述GBK、GB2312、BIG5 、GB18030
GB2312支持的漢字較少
GBK是相比GB2312漢字更爲豐富
GB18030相比GBK增加了一些少數名族漢字漢字庫更爲多樣,但是常人很難用到,一般簡體中文使用GBK。
繁體中文使用BIG5.
4.如果某段與數據庫交互的程序運行較慢該如何處理
一是首先提高數據庫的查詢速度,比如增加索引,優化表的結構.
二是優化程序代碼,如果查詢比較多,可以儘量用條件查詢,減少查詢語句,比如能用一條查詢語句就不用兩條.
三就是提高服務器的速度,優化服務器,把不必要的進程關掉。
5.存儲過程的使用場景
sql難以實現的複雜邏輯或計算
高併發中避免使用存儲過程
6.get與post提交的區別
get是發送請求HTTP協議通過url參數傳遞進行接收,
post是實體數據,可以通過表單提交大量信息.
7.session與cookie的區別?
session:儲存用戶訪問的全局唯一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來說是存儲在用戶WIN的Temp目錄中的。
兩者都可通過時間來設置時間長短
8.優化MYSQL數據庫的方法
1、選取最適用的字段屬性,儘可能減少定義字段長度,儘量把字段設置NOT NULL,例如’省份,性別’,最好設置爲ENUM
2、使用連接(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用聯合(UNION)來代替手動創建的臨時表
a.創建臨時表:SELECT name FROM nametest UNION SELECT username FROM nametest2
4、事務處理:
a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query(“BEGIN”);
mysql_query(“INSERT INTO customerinfo (name) VALUES ('name1)";mysqlquery("SELECTFROMorderinfowherecustomerid=".name1')"; mysql_query("SELECT * FROM `orderinfo` where customerid=".id”);
mysql_query(“COMMIT”);
5、鎖定表,優化事務處理:
a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
mysql_query(“LOCK TABLE customerinfo READ, orderinfo WRITE”);
mysql_query(“SELECT customerid FROM customerinfo where id=”.id);mysqlquery("UPDATEorderinfoSETordertitle=id); mysql_query("UPDATE `orderinfo` SET ordertitle='title’ where customerid=".$id);
mysql_query(“UNLOCK TABLES”);
6、使用外鍵,優化鎖定表
a.把customerinfo裏的customerid映射到orderinfo裏的customerid,
任何一條沒有合法的customerid的記錄不會寫到orderinfo裏
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo
(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE
)TYPE = INNODB;
注意:‘ON DELETE CASCADE’,該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order
表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型爲INNODB;
7、建立索引:
a.格式:
(普通索引)->
創建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
創表指定索引:CREATE TABLE tablename([…],INDEX索引名)
(唯一索引)->
創建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
創表指定索引:CREATE TABLE tablename([…],UNIQUE索引名)
(主鍵)->
它是唯一索引,一般在創建表是建立,格式爲:
CREATA TABLE tablename ([…],PRIMARY KEY[索引字段])
8、優化查詢語句
a.最好在相同字段進行比較操作,在建立好的索引字段上儘量減少函數操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<“2008-01-01”;(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like “%good%”;
SELECT * FROM order WHERE title>=“good” and name<“good”;
9.對於大流量的網站,您採用什麼樣的方法來解決訪問量問題
確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表,
程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不同主機分流主要流量
10.用PHP寫出顯示客戶端IP與服務器IP的代碼
打印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服務器IP:echo gethostbyname(“www.baidu.com”)

如需轉載,請註明出處 https://mp.csdn.net/mdeditor/95535620#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章