程式設計師找工作必備 PHP 基礎面試題 - 第十九天

viphper發表於2020-04-03

“PHP學習網” 公眾號會每天分享一些面試題,正在找工作的小夥伴們可以來看看哦。

一、需要設定一個有效期為31天,的memcache值,請補充下面的程式碼

<?php
$memcache_obj=new memcache
$memcache_obj->connect(‘memcache_host,11211);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>

答案:31243600

二、請對於據select * from tableExample where ((a and b) and c or (((a and b ) and (c and d)))優化的語句。

答案:select * from tableExample where (a and b and c) or  (a and b and c and d);

三、_____函式能返回指令碼里的任意行中呼叫的函式的名稱。該函式同時還經常被用在除錯中,用來判斷錯誤是如何發生的。

答案:debug_backtrace()

四、現在請你設計一個留言板系統,請簡要的寫出你設計的其中分頁演算法的思路.

答案:
1.可以通過count(*)來得到記錄總條數

2.將總條數除以每頁顯示條數取整得到分頁數

3.點選下一頁的連結進行傳值,將傳值拼裝成where條件

4.顯示相應資料

或者

一個簡單的資料庫的增刪改查的留言版,分頁的設計思路,即是每次進行查詢所傳送的引數不同,從資料庫中得到不同資料,在sql語句中用limit動態設定偏移量。偏移量可以通過判斷和疊加的方式而改變。而總頁數可以是,返回的總行數除以每頁顯示的條數之後取整。
如果是一個檔案寫入的留言版,則可以將取出的內容拆分成陣列,讓後設定偏移量取出不同的元素。

五、資料庫中的事務是什麼?

答:事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,
事務則提交,其修改將作用於所有其他資料庫程式。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。

六、優化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')";
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);
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";

選取最適用的欄位屬性 儘量減少欄位的長度 設定為not null

使用join代替子查詢

使用union代替手動建立臨時表

使用並優化事物處理

使用外來鍵

使用索引

優化查詢語句

最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題

本作品採用《CC 協議》,轉載必須註明作者和本文連結

和PHP學習網一起努力學習

相關文章