mysql面试100题及答案_PHP面试100题汇总
PHP面試100題匯總
1,Http 和Https的區別
第一:http是超文本傳輸協議,信息是明文傳輸,https是具有安全性的ssl加密傳輸協議
第二:http和https使用的是完全不同的連接方式,端口也不一樣,前者80 或者443
第三:http連接很簡單,是無狀態的。https協議是由ssl+http協議構建的可進行加密傳輸,身份認證的網絡協議。
2.什么方法來加快頁面的加載速度
1,用到服務器資源時在打開,不用時,立即關閉服務器資源。
2,數據庫添加索引
3,頁面可生成靜態
4,圖片等大文件單獨放在一個服務器
5,能不查詢數據庫的盡量不去數據取數據,可以放在緩存中。
3.表單中 get與post提交方法的區別?
答:get是發送請求HTTP協議通過url參數傳遞進行接收,而post是實體數據,可以通過表單提交大量信息.
4.echo ,print,print_r?的區別:
echo?是php語句,無返回值。
print,print_r是函數,有返回值。
print()??? 只能打印出簡單類型變量的值(如int,string)
print_r() 可以打印出復雜類型變量的值(如數組,對象)
echo???? 輸出一個或者多個字符串
5.session與cookie區別
session與cookie相同:跨頁面、不跨用戶
session與cookie不相同:
1、session可以存儲任意類型的數據,但cookie只能存儲字符串
2、cookie產生在服務器端、存儲在客戶端
session產生在服務器端、存儲在服務器端
6.魔術常量
答案:
__LINE__文件中的當前行號。
__FILE__文件的完整路徑和文件名。
__FUNCTION__函數名稱
__CLASS__類的名稱
__METHOD__類的方法名
7.數據庫中的事務是什么?
答:事務(transaction)是作為一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,事務則提交,其修改將作用于所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
8.1優化MYSQL數據庫的方法。
1、選擇合適的字段的數據類型
1)能用數字不用字符串
2)char、varchar、text? 能用varchar不用char
3)給字段加not null 避免在表中出現NULL關鍵字(default 值)
2、選擇合適的字段充當主鍵
1)建議每張表必須有主鍵
2)用數字類型的字段充當主鍵
拆分表
拆分字段,將文章的標題與內容分開
2)拆分記錄,將今年的記錄與往年的記錄分開
給字段合理添加索引
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[索引字段])
5、事務處理:
a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
6、鎖定表,優化事務處理:
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");
7、使用外鍵,優化鎖定表
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;
8、優化查詢語句
a用內連接代替子查詢代替子查詢,用sphinx代替like模糊查詢
b最好在相同字段進行比較操作,在建立好的索引字段上盡量減少函數操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate
例子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
緩存,靜態化
選擇合適存儲引擎用Innodb增刪改,用myisam查詢
主從數據庫
負載均衡
最好拿數字類型的字段充當where條件
最好拿相同類型的字段進行比對(避免發生數據類型的轉換)
不要在具有索引的字段上添加數據庫函數(索引失效)
8.2請簡述項目中優化sql語句執行效率的方法,從哪些方面,sql語句性能如何分析?
答:(1)選擇最有效率的表名順序
(2)WHERE子句中的連接順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函數提高SQL效率
(6)避免在索引列上使用計算。
(7)提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。
9.對于大流量網站,采用什么方法解決訪問量問題?
1,確認服務器的硬件是否足夠支持當前的流量
2,優化數據庫的訪問
3,禁止外部的盜鏈
4,控制大文件的下載
5,使用不同主機分流主要流量
6,使用流量分析統計軟件
10.一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾(20分)
function dir_recurse($dir) {
$i = 1;
if($handle = opendir($dir)) {
while(false !== ($file = readdir($handle))) {
if($file != "."&& $file != ".." ) {
if(is_dir($dir."/".$file) == true) {
$fullpath = $dir."/".$file;
dir_recurse($fullpath);
echo "$fullpath\n";
$i++;
}else {
$fullpath = $dir."/".$file;
echo "$fullpath\n";
$i++;
}
}
}
closedir($handle);
}
}
10.2寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ) {
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".."&& $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
11、能夠使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
12、使用哪些工具進行版本控制?(1分)
答:cvs,svn,vss;
13、如何實現字符串翻轉?(3分)
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 代碼是使用GB2312編碼
function reverse($str)
{
$ret = "";
len=mb s trwidth( len=mbstrwidth(len = mb_strwidth(str,"GB2312");
for(i=0; i=0;i=0; i< len; len;len; i++)
{
arr[]=mb s ubstr( arr[]=mbsubstr(arr[] = mb_substr(str, $i, 1, "GB2312");
}
return implode("", array_reverse($arr));
}
print_r(reverse("你好"));
14.PHP的意思(送1分)
PHP是一個基于服務端來創建動態網站的腳本語言,您可以用PHP和HTML生成網站主頁
15.MYSQL取得當前時間的函數是?,格式化日期的函數是(2分)
答:now(),date()
16.用PHP寫出顯示客戶端IP與服務器IP的代碼1分)
答:打印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');
打印服務器IP:echo gethostbyname("www.bolaiwu.com")
17、語句include和require的區別是什么?為避免多次包含同一文件,可用(?)語句代替它們?
答:require->require是無條件包含也就是如果一個流程里加入require,無論條件成立與否???????? 都會先執行require
include->include有返回值,而require沒有(可能因為如此require的速度比include快)
注意:包含文件不存在或者語法錯誤的時候require是致命的,include不是
18.http請求返回狀態碼
400 請求無效
401 未授權
403 請求被禁止
404 請求資源不存在
405 請求資源被禁止
406 無法接受
407 要求代理身份驗證
500 Internal Server Error 服務端源代碼錯誤
600 源站沒有返回響應頭部,只返回實現內容
19,linux授權碼:
600 屬主有讀寫權限
644 屬主有讀寫權限,屬性組有讀權限
700 屬主有讀寫執行權限
755 屬主有讀寫執行權限,屬性組有讀,執行權限
711 屬主有讀寫執行權限,屬性組有執行權限
666 所有用戶都有文件的讀寫權限
777 所有用戶都有文件的讀寫執行權限
20.有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?($1分)
答:方法1(對于PHP5及更高版本):
$readcontents = fopen("http://www.phpres.com/index.html", "rb");
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");
21.在PHP中error_reporting這個函數有什么作用? (1分)
答:設置錯誤級別與錯誤信息回報
22.JS表單彈出對話框函數是?獲得輸入焦點函數是? (2分)
答:彈出對話框: alert(),prompt(),confirm()
獲得輸入焦點 focus()
23.foo()和@foo()之間有什么區別?(1分)
答:@foo()控制錯誤輸出
24、mysql_fetch_row() 和mysql_fetch_array之間有什么區別? (1分)
答:mysql_fetch_row是從結果集取出1行數組,作為枚舉
mysql_fetch_array是從結果集取出一行數組作為關聯數組,或數字數組,兩者兼得
25、GD庫是做什么用的? (1分)
答:gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。
在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。
26.面向對象編程
有兩個重要的概念:類和對象
類是具備某項功能的抽象模型,實際應用中,還需要對類進行實例化后使用。這樣就引入了對象的概念。
對象是類進行實例化后的一個產物,是一個實體。
封裝 :把客觀的事物封裝成一個抽象的類。
繼承:子類繼承父類,可以使用父類的屬性和方法。可以實現接口,同時實現接口中的所有方法
多態:覆蓋和重載 子類可以覆蓋父類中的方法;一個類中可以同時擁有同一個函數名的方法,但是方法的參數不同,實現的結果也不同。
27.php框架
熟悉YII ,Thinkphp還有laravel ,symfony2,cakephp
28.mysql存儲引擎
ISAM:? 查詢速度快、增刪改慢,支持全文索引、不支持外鍵、不支持事務
MyISAM:??? ISAM升級版
Memory:??? 數據駐留在內存、速度快、數據管理不穩定、斷電后數據全部丟失
InnoDB:??? 速度較慢、支持外鍵、支持事務、不支持全文索引
使用的存儲引擎
MyISAM:內容管理系統(新聞、官網、電商、軟件下載、房屋、招聘...)? 可讀不可改? 大部分是瀏覽信息
InnoDB:技術型網站(bbs、blog、webo、oa...)
29.數據庫操作流程
$link = mysql_connect("localhost","root","root");
mysql_select_db("test",$link);
$sql ="select * from table";
$result = mysql_query($sql);
while($row =mysql_fetch_****($result) ){
$arr[]=$row;
}
$row = mysql_fetch_array($result)? 意思:$row['name'] 和$row[1] 都可以取到值
$row = mysql_fetch_row($result)) 意思:$row[1] 只有用索引取值,偏移量從0開始。
$row = mysql_fetch_assoc($result)) 意思: $row['name'] 字段名作為索引取值 抽取一條記錄轉為 關聯數組,失敗返回false
30.php 加密函數
crypt($str[,$slat]) 可以完成單向加密功能
md5()
sha1() 返回一個40位的十六進制數,
加密擴展庫
Mcrypt() 和Mash
31、字符串“to upper case” 分別用php,shell ,js實現將字符串中的字符全部轉換成大寫并輸出。(5分)
Php實現: echo strtoupper(‘to upper case’)
Shell實現:echo "to upper case" | tr 'a-z' 'A-Z'
Js實現:
var stmp1 = " to upper case ";
alert(stmp1.toLocaleUpperCase());//轉換成大寫
alert(stmp1.toUpperCase())//轉換成大寫
32.防止SQL注入
1)一般使用 addslashes 函數
addslashes 函數在制定的預定義字符前添加反斜杠
對字段和密碼MD5加密處理
預處理過濾處理
33、用PHP打印出前一天的時間,格式是2006-5-10 22:21:21
//echo date('Y-m-d H:i:s',time()-60*60*24
echo date("Y:m:d H:i:s",strtotime("-1 day"));
?>
34.如何實現字符串翻轉?
其實PHP本身就有字符串翻轉的函數:strrev(),不妨試試echo strrev($str);不過
所有的這三種方法都不能解決中文字符串翻轉的問題,會出錯的。
代碼
function reverse($var)
{
$res="";
for($i=0,$j=strlen($var);$i
{
$res=$var[$i].$res;
}
return $res;
}
$tmpvar="wofang";
$res=reverse($tmpvar);
echo $res;
?>
35.實現中文字串截取無亂碼的方法。
mb_substr()
36.以下哪一句不會把 John 新增到 users 陣列?
$users[] = 'john';
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= 'john';
語法錯誤。
37.sort()、assort()、和 ksort() 有什么分別?它們分別在什么情況下使用?
sort()
根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主
要是當陣列索引鍵的值無關疼癢時用來把? 陣列排序。
assort()
PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。
asort()
與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。
ksort()
根據陣列中索引鍵的值,以英文字母順序排序,特別適合用于希望把索引鍵排序的聯想陣列。
38.以下的代碼會產生什么?為什么?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由于函式 multiply() 沒有指定 $num 為全域變量(例如 global $num 或者
$_GLOBALS['num']),所以 $num 的值是 10。
39.些函式可以用來在現正執行的腳本中插入函式庫?
對這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎
include()、include_once()、require? ()、require_once(),但細心再想,“函式庫”也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括
com_load 和 dotnet_load,下次有人提起“函式庫”的時候,別忘記這兩個函式。
40.foo()與 @foo() 有什么分別?
foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
@foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
很多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤? 不該被隱藏,你必須妥善處理它們,可能的話解決它們。
“===”是什么?試舉一個“==”是真但“===”是假的例子。
“===”是給既可以送回布爾值“假”,也可以送回一個不是布爾值但卻可以賦與“假”值的函式,strpos() 和 strrpos()?? 便是其中兩個例子。
問題的第二部份有點困難,想一個“==”是假,但是“===”是真的例子卻很容易,
相反的例子卻很少。但我終于找到以下的? 例子:
if (strpos("abc", "a") == true){??? // 這部分永不會被執行,因為 "a" 的位
置是 0,換算成布爾值“假”}if?? (strpos("abc", "a") === true){??? // 這部份
會被執行,因為“===”保證函式 strpos() 的送回值不會換算成布爾值.}
42、如何修改SESSION的生存時間(1分).
答:方法1:將php.ini中的session.gc_maxlifetime設置為9999重啟apache
方法2:$savePath = "./session_save_dir/";
$lifeTime = 小時 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法3:setcookie() and session_set_cookie_params($lifeTime);
43、在PHP中,heredoc是一種特殊的字符串,它的結束標志必須?(1分)
答:heredoc的語法是用"<<
個字符串
例子:
$str = <<
my name is Jiang Qihui!
SHOW;
在PHP中error_reporting這個函數有什么作用? (1分)
答:設置錯誤級別與錯誤信息回報
請寫一個函數驗證電子郵件的格式是否正確 (2分)
答:function checkEmail($email)
{
$pregEmail = "/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-
9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";
return preg_match($pregEmail,$email);
}
46、請寫出數據類型(int char varchar datetime text)的意思; 請問varchar和char
有什么區別(2分)
答:int是數字類型,char固定長度字符串,varchar實際長度字符串,datetime日期時
間型,text文本字符串
char的場地固定為創建表設置的長度,varchar為可變長度的字符
47、檢測一個變量是否有設置的函數是否?是否為空的函數是?(2分)
答:isset($str),empty($str);
48、取得查詢結果集總數的函數是?(1分)
答:mysql_num_rows($result);
49簡述如何得到當前執行腳本路徑,包括所得到參數。
echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER
['QUERY_STRING'];
//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
50請舉例說明在你的開發過程中用什么方法來加快頁面的加載速度
要用到服務器資源時才打開
及時關閉服務器資源,
數據庫添加索引,
頁面可生成靜態,圖片等大文件單獨服務器。
使用代碼優化工具啦
51. 給定一個用逗號分隔一組值的字符串,以下哪個函數能在僅調用一次的情況下就
把每個獨立的值放入一個新創建的數組?
A.strstr()
B.不可能只調用一次就完成
C.extract()
D.explode()√
E.strtok()
52.如果用+操作符把一個字符串和一個整型數字相加,結果將怎樣?
A.解釋器輸出一個類型錯誤
B.字符串將被轉換成數字,再與整型數字相加
C.字符串將被丟棄,只保留整型數字√
D.字符串和整型數字將連接成一個新字符串
E.整形數字將被丟棄,而保留字符串
53.以下腳本輸出什么?
$s = '12345';
$s[$s[1]] = '2';
echo $s;
?>
A.12345
B.12245√
C.22345
D.11345
54.以下腳本輸出什么?
$x = 'apple';
echo substr_replace ($x, 'x', 1, 2);
?>
A.x
B.axle√
C.axxle
D.applex
E.xapple
55. 函數______能讀取文本文件中的一行。讀取二進制文件或者其他文件時,應當
用______函數。
A.fgets(), fseek()
B.fread(), fgets()
C.fputs(), fgets()
D.fgets(), fread()√
E.fread(), fseek()
56.哪個函數能夠往文本文件中寫入一個字符串?
答案:fwrite()和fputs()兩個函數在這里都可以,而后者其實是前者的別名。在
PHP中,寫入二進制數據和寫入字符串沒有區別。
57.函數______能判斷一個文件是否可寫。
答案:is_writeable
58.以下哪個選項能將文件指針移到開頭?
A.reset()
B.fseek(-1)
C.fseek(0, SEEK_END)
D.fseek(0, SEEK_SET)√
E.fseek(0, SEEK_CUR)
59、include的功能和require一樣,不同的是,require不能用在[?? ]
A、判斷語句或循環里,
B、連接語句里
C、聲明語句里
D、文件的開頭
E、文件的中間√
50、下面建立與MySQL Server的連接語法正確的是:[? ]
A、$link=connect("host_name","user_name","password");
B、$link=mysql_connect("host_name","user_name","password");√
C、$link=mysqlconnect("host_name","user_name","password");
D、$link=mysql_pconnect("host_name","user_name","password");√
E、$link=pconnect("host_name","user_name","password");
51.將字符串轉換成小寫
strtolower(): 該函數將傳入的字符串參數所有的字符都轉換成小寫,并以小定形式
放回這個字符串
52.將字符轉成大寫
strtoupper(): 該函數的作用同strtolower函數相反,是將傳入的字符參數的字符全
部轉換成大寫,并以大寫的形式返回這個字符串.用法同strtolowe()一 樣.
53.將字符串首字符轉換成大寫
ucfirst(): 該函數的作用是將字符串的第一個字符改成大寫,該函數返回首字符大
寫的字符串.用法同strtolowe()一樣.
54.將字符串每個單詞的首字符轉換成大寫
ucwords(): 該函數將傳入的字符串的每個單詞的首字符變成大寫.如"hello
world",經過該函數處理后,將返回"Hello Word".用法同strtolowe()一樣.
55、NoSQL:Not Only SQL
思想:網站產生的數據,一部分存儲數據庫、一部分存到NoSQL相關產品
NoSQL產品
1、Memcache:內存(速度快、數據量小)、數據的過期時間
2、MongoDB:文檔數據庫
3、Redis:內存(速度快、數據量小)、庫、沒有過期時間
什么樣的數據,存儲在什么位置?
MySQL:穩定的數據
NoSQL:活躍的數據
57緩存分類
1、緩存數據存儲位置不同
1)文件緩存
2)內存緩存
2、緩存的數據量的不同
1)頁面緩存
2)局部緩存
3)局部不緩存
4)數據緩存(變量緩存、動態緩存)
Memcache:內存緩存、變量緩存
58 .LINUX命令
查看當前目錄下所有內容??????? ls
在當前目錄下,新建一個文件夾? mkdir 文件夾名
刪除指定的文件夾????????????? rmdir 文件夾名?? 只能刪除空目錄
在當前目錄下新建一個空白文件? touch 文件名
刪除當前目錄下的一個文件????? unlink文件名
刪除文件或文件夾????????????? rm
復制文件????????????????????? cp
移動文件或文件夾????????????? mv
文件或文件夾重命名 ??????????mv
查看完整的工作目錄??????????? pwd
切換目錄:??????????????????? cd???? cd/ 返回根目錄
文件傳輸????????????????????? ftp
查看文件內容????????????????? cat 文件名
查看文件編碼????????????? ????file 文件名
查找文件????????????????????? find 路徑 -name 文件名
修改文件或文件夾權限
權限種類:r 4(讀)、w 2(寫)、x 1(執行)
權限操作符:+(賦予權限)、-(收回權限)
用戶種類:a(所有人)、u(文件擁有者)、g(組用戶)、o(其他用戶)
查看權限:ls -l
-rw-r--r--? a.txt
drwxr-xr-x? hello
第1位:是文件還是文件夾(-文件、d文件夾)
第234位:u用戶的權限
第567位:g用戶的權限
最后三位:o用戶的權限
1)將最大權限賦予a.txt
chmod a+r+w+x a.txt
chmod 777 a.txt
2)設置a.txt權限,收回o用戶的wx權限
chmod o-w-x a.txt
4)設置a.txt權限:u:rw? g:r? o:r
chmod 644 a.txt
5)設置hello文件夾權,給予最大權限(不影響子文件)
chmod 777 hello
6)設置hello文件夾權,給予最大權限(影響子文件)
chmod -R 777 hello
59、創建文件exer1,設置訪問權限為rw-r--r--,現要增加所有用戶的執行權限和同組用戶的寫權限,寫出操作過程的命令(10分)
touch exer1
chmod 644? exer1
增加權限
chmod a+x? exer1
chmod g+w? exer1
或者
chmod 775 exer1
60易出現編碼的地方
文件保存格式的編碼
Header();
Msq本身的編碼(修改ini)
Set names gbk;
Mysql_query(“set names utf8”);
Iconv()PHP的系統函數進行轉碼
61.PHP工作原理
一個網站運行時客戶端有無數個,服務器通常只有一個(負載均衡)
開發環境的安裝2,PHP5.4,MYSQL5.3-------開源,可以跨平臺
配置文件:conf(Apache), php.ini my.ini
PHP文檔組成:HTML,css,js,jquery,PHP
PHP語法風格:xml風格,短風格,ASP風格(已過時),腳本風格
<?php ?>注意:位置任意,同一頁面可以出現多次,不能嵌套,里面只能出現php代碼,需要轉字符串輸出
運行在服務器端
注釋:單行注釋,多行注釋
62數據類型:
標量類型:integer,Float,String,boolean
復合類型:Array,Object
特殊類型:Resource,Null
偽類型:mixed,number,callback(回調函數)
63.PHP中被認為是false的值:
0,???? 0.0,?????? null,?????? 空數組,??????? 空字符串,??? false
64.求兩個日期的差數,例如2012-2-27 ~ 2013-05-6的日期差數
function get_days($date1, $date2){
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
echo get_days("2013-05-6", "2012-2-27");
?>
65什么是MVC?
回答:MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個不同層的PHP代碼。
Model:數據信息存取層。
View:view層負責將應用的數據以特定的方式展現在界面上。
Controller:通常控制器負責從視圖讀取數據,控制用戶輸入,并向模型發送數據。
66.PHP中獲取圖像尺寸大小的方法是什么?
回答:getimagesize () 獲取圖片的尺寸
Imagesx () 獲取圖片的寬度
Imagesy () 獲取圖片的高度
67.如何在PHP中定義常量?
回答:PHP中使用Define () 來定義常量。
define (“Newconstant”, 30);
68.如何不使用submit按鈕來提交表單?
如果我們不想用submit按鈕來提交表單,我們也可以用超鏈接來提交,我們可以這樣寫代碼:
Submit Me
69.簡述論壇中無限分類的實現原理。
答:無限極分類,那么應該是考察遞歸函數吧!
第一步:建立測試數據庫:
CREATE TABLE `category` (? `id` smallint(5) unsigned NOT NULL auto_increment,? `fid` smallint(5) unsigned NOT NULL default '0',? `value` varchar(50) NOT NULL default '',? PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第二步:插入測試數據:
INSERT INTO `category` ( `fid`, `value`) VALUES? (0, 'PHP點點通博客PHPDDT.COM'), (1,'a'), (1,'b'), (2,'c'), (2,'d'), (4,'e')
第三步:遞歸輸出分類:
70.試述isset()和empty()的區別
isset() 測試變量是否存在 empty() 測試變量是否為空
71.請用盡可能少的語句實現對輸入Email地址進行驗證的功能
eregi('^[_a-z0-9]+(/.[_a-z0-9-]+)*@[a-z0-9]+(/.[a-z0-9-]+)*$',$emailaddress)
72.使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組
/冒泡排序(數組排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(數組排序)
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
73、使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組
//二分查找(數組里查找某個元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//順序查找(數組里查找某個元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i
if($array[$i]==$k){
break;
}
}
if ($i
return $i;
}else{
return -1;
}
}
74.寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數
function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}
75.utf-8轉換成gbk的函數是?
iconv("gbk",""UTF-8,"我們"); mb_convert_encoding($str, "GBK", "UTF-8")
76.Php中分割字符串成數組的函數和連接數組成字符串的函分別有哪些?
explode() split() ;implode() join()
77.說幾個你知道的設計模式?
單例模式: 保證一個類僅有一個實例,并提供一個訪問他的全局訪問點例如框架中的數據庫連接
簡單工廠模式: 它具有創建對象的某些方法,可以使用工廠類創建對象,而不直接使用 new。例如初始化數據庫的時候會用到,比如MySQL,MSSQL
策略模式: 針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作
注冊模式: 提供了在程序中有條理的存放并管理一組全局對象 (object),例如ZF框架中的Zend_Registry::set
適配器模式: 將不同接口適配成統一的API接口,例如數據操作有mysql、mysqli、pdo等,可利用適配器模式統一接口
觀察者模式: 一個對象通過添加一個方法使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已注冊的觀察者。例如實現實現消息推送
裝飾器模式: 不修改原類代碼和繼承的情況下動態擴展類的功能,例如框架的每個Controller文件會提供before和after方法
迭代器模式: 提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承 Iterator 類
原型模式: 實現了一個原型接口,該接口用于創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數據庫操作之后被創建。
78.echo,print(),print_r(),printf(),sprintf(),var_dump()有什么區別?
echo :是語句不是函數,沒有返回值,可輸出多個變量值,不需要圓括號。不能輸出數組和對象,只能打印簡單類型(如int,string)
print :是語句不是函數,有返回值 1 ,只能輸出一個變量,不需要圓括號。不能輸出數組和對象,只能打印簡單類型(如int,string)。
print_r
:是函數,可以打印復合類型,例如:stirng、int、float、array、object等,輸出array時會用結構表示,而且可以通過print_r($str,true)來使print_r不輸出而返回print_r處理后的值
printf :是函數,把文字格式化以后輸出(參看C語言)
sprintf :是函數,跟printf相似,但不打印,而是返回格式化后的文字,其他的與printf一樣。
var_dump :函數,輸出變量的內容、類型或字符串的內容、類型、長度。常用來調試。
79.echo count(“abc”);輸出什么?
答案:1
寫個函數用來對二維數組排序。
答案:array_multisort() 。
81.對于大流量的網站,您采用什么樣的方法來解決訪問量問題?
首先,確認服務器硬件是否足夠支持當前的流量。
其次,優化數據庫訪問。
第三,禁止外部的盜鏈。
第四,控制大文件的下載。
第五,使用不同主機分流主要流量
第六,使用流量分析統計軟件。
82.error_reporting(2047)什么作用?
答案:相當于 error_reporting(‘E_ALL’); 輸出所有的錯誤。
83、 簡述如何得到當前執行腳本路徑,包括所得到參數。
訪問http://temp.com/phpinfo.php?id=1
echo $_SERVER['SCRIPT_URL']; //得到/phpinfo.php
echo $_SERVER["SCRIPT_URI"]; //得到http://temp.com/phpinfo.php
echo $_SERVER["SCRIPT_FILENAME"]; //得到F:/www/Temp/phpinfo.php
echo $_SERVER["REQUEST_URI"]; //得到/phpinfo.php?id=1
echo $_SERVER["SCRIPT_NAME"]; //得到/phpinfo.php
參考server.php http://lesson.com/test/server.php?id=1
寫出session的運行機制。
session創建時,是否會在服務端記錄一個cookie?cookie里面的內容是什么?
session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識-稱為sessionid,如果已包含一個sessionid則說明以前已經為此客戶端創建過session,服務器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則為此客戶端創建一個session并且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個sessionid將被在本次響應中返回給客戶端保存。_
保存這個sessionid的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發給服務器。一般這個cookie的名字都是類似于SEEESIONID。r
由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞回服務器。經常被使用的一種技術叫做URL重寫,就是把sessionid直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現形式為http://…../xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764比
另一種是作為查詢字符串附加在URL后面,表現形式為http://…../xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764參
為了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個SEEESIONID。
85.Cookie的原理及使用?
Cookie是網站保存在瀏覽器客戶端的信息,也就是說保存在訪客的機器里的變量,一般隨著HTTP頭發送到服務器端。在Cookie生效之后及失效之前,客戶每次發出頁面請求的時候(包括PHP頁面和靜態html頁面),都會把Cookie一塊發送到服務器,只要我們針對它進行相應的處理,就可以實現變量”追隨”。到
86.Form中的get和post方法,在數據傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區別如下:
a、Get是用來從服務器上獲得數據,而Post是用來向服務器上傳遞數據。
b、Get將表單中數據的按照variable=value的形式,添加到action所指向的URL后面,并且兩者使用”?”連接,而各個變量之間使用”&”連接;Post是將表單中的數據放在form的數據體中,按照變量和值相對應的方式,傳遞到action所指向URL。u
c、Get是不安全的,因為在傳輸過程,數據被放在請求的URL中,而如今現有的很多服務器、代理服務器或者用戶代理都會將請求URL記錄到日志文件中,然后放在某個地方,這樣就可能會有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數據,一些系統內部消息將會一同顯示在用戶面前。Post的所有操作對用戶來說都是不可見的。而
d、Get傳輸的數據量小,這主要是因為受URL長度限制;而Post可以傳輸大量的數據,所以在上傳文件只能使用Post(當然還有一個原因,將在后面的提到)。
e、Get限制Form表單的數據集的值必須為ASCII字符;而Post支持整個ISO10646字符集。
f、Get是Form的默認方法。
*.Post傳輸數據時,不需要在URL中顯示出來,而Get方法要在URL中顯示。
*.Post傳輸的數據量大,可以達到2M,而Get方法由于受到URL長度的限制,只能傳遞大約1024字節.
.Post顧名思義,就是為了將數據傳送到服務器段,Get就是為了從服務器段取得數據.而Get之所以也能傳送數據,只是用來設計告訴服務器,你到底需要什么樣的數據.Post的信息作為http請求的內容,而Get是在Http頭部傳輸的。提
87.PHP5中魔術方法函數有哪幾個,請舉例說明各自的用法
__sleep
__wakeup
__toString
__set_state
__construct,
__destruct
__call,
__get,
__set,
__isset,
__unset
__clone
__autoload
isset()和empty()的區別
兩者都是測試變量用的。但是isset()是 測試變量是否被賦值 ,而empty()是測試 一個已經被賦值的變量是否為空
。如果一個變量沒被賦值就引用在php里是被允許的,但會有notice提示。如果一個變量被賦空值,$foo=””或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會注銷一個變量。要注銷一個變量,可以用d
unset($foo)或者$foo=NULL。
89.以下哪一句不會把John新增到users陣列?
$users[] = ‘john’;
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= ‘john’;
語法錯誤。
90.以下哪一個函式可以把瀏覽器轉向到另一個頁面?
redir()這不是一個 PHP 函式,會引致執行錯誤。
header()這個是正確答案,header() 用來插入卷頭資料,可以用來使瀏覽器轉向到另一個頁面,例如:
header(“Location: http://www.phpmst.com/”);
location()這不是一個 PHP 函式,會引致執行錯誤。
redirect()這不是一個 PHP 函式,會引致執行錯誤。
91.PHP中的非靜態方法可以通過靜態調用嗎,反之呢?
其實問題是問沒有通過static定義的方法,能否通過”對象名::方法名“這樣的形式來調用。答案是會產生一個strict錯誤,但在會繼續執行代碼。
反之,能否通過“對象名->方法名“的形式來調用static定義的方法?答案是不能,會出錯并中斷程序執行。
92.使用utf-8編碼,以下代碼輸出結果是什么?strlen函數是計算字符串的字節數還是字符數?
$str = “您好hello”;
答案:echo strlen($str);
11 strlen() 函數返回字符串的長度。
93..什么是時間戳?時間戳能代表的最小年份和最大年份是多少?
答案:(格林威治時間 1970 年 1 月 1 日 00:00:00)到當前時間的秒數。
有效的時間戳典型范圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07。(此范圍符合
32 位有符號整數的最小值和最大值)。
不過在 PHP 5.1 之前此范圍在某些系統(如 Windows)中限制為從 1970 年 1 月 1 日到 2038 年 1 月 19 日。
MyISAM與innoDB存儲引擎有何差別?
答案:A、兩者在文件構成上有區別;
B、InnoDB支持事務處理,MyISAM不支持;
C、對無WHERE子句的COUNT(*)操作的不同:MyISAM中保存了該值,直接讀取,InnoDB需要作全表掃描;
D、鎖的區別:InnoDB支持表級鎖和行級鎖,MyISAM只支持表級鎖;
E、索引會緩存數據,而MYISAM不會;
F、INNODB不區分char和varchar;
G、INNODB支持hash索引,而MYISAM不支持;
H、InnoDB不支持FULLTEXT類型的索引;
I、InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from
table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含
where條件時,兩種表的操作是一樣的;
J、對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引;
K、DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除;
L、LOAD TABLE FROM
MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。
95..如何記錄php程序錯誤至系統日志?
答案:將PHP的log_errors開啟即可,默認是記錄到WEB服務器的日志文件里,比如Apache的error.log文件。
當然也可以記錄錯誤日志到指定的文件中。
代碼如下:
# vim /etc/php.inidisplay_errors = Off
log_errors = On
error_log = /var/log/php-error.log
另外也可以設定error_log = syslog,使這些錯誤信息記錄到操作系統的日志里。
display_errors = Off //不顯示錯誤
error_reporting 設定錯誤訊息回報的等級
96.用最少的代碼寫一個求3值最大值的函數.
答案: function($a,$b,$c){
return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c );
}
97.在PHP中,heredoc是一種特殊的字符串,它的結束標志必須?(1分)
答:heredoc的語法是用”<<
例子:
$str = <<
my name is Jiang Qihui!
SHOW;
98.字符串函數
chr — 通過ASCII碼值返回指定的字符
ord — 通過指定的字符返回ASCII碼值
explode — 使用一個字符串分割另一個字符串
implode — 將一個一維數組的值轉化為字符串
join — 別名implode
htmlspecialchars — 把預定義的字符轉換為HTML實體(比如說大于小于)
nl2br — 在字符串所有新行之前插入HTML換行標記
strip_tags — 從字符串中去除 HTML 和 PHP 標記
lcfirst — 使一個字符串的第一個字符小寫
ucfirst — 將字符串的首字母轉換為大寫
ucwords — 將字符串中每個單詞的首字母轉換為大寫
md5 — 加密,返回32位的字符串
sha1 — 加密,返回40位的字符串
number_format — 以千位分隔符方式格式化一個數字
trim — 去除字符串首尾處的空白字符(或者其他字符)
ltrim — 刪除字符串開頭的空白字符(或其他字符)
rtrim — 刪除字符串末端的空白字符(或者其他字符)
chop — rtrim 的別名
str_replace — 子字符串替換
str_ireplace — str_replace的忽略大小寫版本
str_pad — 使用另一個字符串填充字符串為指定長度
str_repeat — 重復一個字符串
str_shuffle — 隨機打亂一個字符串
str_split — 將字符串轉換為數組
strstr — 查找字符串的首次出現
strchr — 別名 strstr
stristr — strstr 函數的忽略大小寫版本
strrchr — 查找指定字符在字符串中的最后一次出現
strpos — 查找字符串首次出現的位置
stripos — 查找字符串首次出現的位置(不區分大小寫)
strripos — 計算指定字符串在目標字符串中最后一次出現的位置(不區分大小寫)
strrpos — 計算指定字符串在目標字符串中最后一次出現的位置
strlen — 獲取字符串長度
strrev — 反轉字符串
strtolower — 將字符串轉化為小寫
strtoupper — 將字符串轉化為大寫
substr — 截取字符串
99.數組函數
答案:
array_shift — 將數組開頭的單元移出數組
array_pop — 將數組最后一個單元彈出(出棧)
array_unshift — 在數組開頭插入一個或多個單元
array_push — 將一個或多個單元壓入數組的末尾(入棧)
array_keys — 返回數組中部分的或所有的鍵名
array_values — 返回數組中所有的值
in_array — 檢查數組中是否存在某個值
array_key_exists — 檢查給定的鍵名或索引是否存在于數組中
key_exists — 別名 array_key_exists
array_rand — 從數組中隨機取出一個或多個單元
array_reverse — 返回一個單元順序相反的數組
array_unique — 移除數組中重復的值
array_merge — 合并一個或多個數組
count — 計算數組中的單元數目或對象中的屬性個數
sizeof — count 的別名
array_sum — 計算數組中所有值的和
array_flip — 交換數組中的鍵和值
array_count_values — 統計數組中所有的值出現的次數
shuffle — 將數組打亂
reset — 將數組的內部指針指向第一個單元
prev — 將數組的內部指針倒回一位
current — 返回數組中的當前單元
pos — current 的別名
each — 返回數組中當前的鍵/值對并將數組指針向前移動一步
next — 將數組中的內部指針向前移動一位
end — 將數組的內部指針指向最后一個單元
sort — 對數組排序
rsort — 對數組逆向排序
asort — 對數組進行排序并保持索引關系
arsort — 對數組進行逆向排序并保持索引關系
ksort — 對數組按照鍵名排序
krsort — 對數組按照鍵名逆向排序
compact — 建立一個數組,包括變量名和它們的值
range — 快速創建數組
單例模式,創建mysqli數據庫鏈接的單例對象
class Db
{
private static $instance;
public $handle;
private function __construct($host, $username, $password, $dbname)
{
$this->handle = NULL;
$this->getcon($host, $username, $password, $dbname);
}
public static function getBb()
{
self::$instance = new Db();
return self::$instance;
}
private function getcon($host, $username, $password, $dbname)
{
if($this->handle!=NULL){
return true;
}
$this->handle = mysqli_connect($host, $username, $password,
$dbname);
}
}
總結
以上是生活随笔為你收集整理的mysql面试100题及答案_PHP面试100题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苏57对外宣布要出双座版,
- 下一篇: python列出文件夹所有文件_pyth