看完這些題,媽媽不再用擔憂個人面試了javascript
優勢:php
1. 配置簡單,所有的配置使用PHP腳原本配置,執行效率高;具備基本的路由功能,可以進行必定程度的路由;具備初步的Layout功能,可以製做必定程度的界面外觀;數據庫層封裝的不錯,具備基本的MVC功能css
2. 快速簡潔,代碼很少,執行性能高,PHP框架簡單,容易上手,學習成本低,文檔詳細;自帶了不少簡單好用的library,框架適合小型應用html
缺點:前端
1. 把Model層簡單的理解爲數據庫操做vue
2. PHP框架略顯簡單,只可以知足小型應用,略微不太可以知足中型應用須要java
評價:node
整體來講,拿CodeIgniter來完成簡單快速的應用仍是值得,同時可以構造必定程度的layout,便於模板的複用,數據操做層來講封裝的不錯,而且CodeIgniter沒有使用不少太複雜的設計模式,執行性能和代碼可讀性上都不錯。至於附加的 library 也還不錯,簡潔高效。python
1. CakePHP是最相似於RoR的PHP框架,包括設計方式,數據庫操做的Active Record方式;設計層面很優雅,沒有自帶多餘的 library,全部的功能都是純粹的框架,執行效率還不錯;數據庫層的 hasOne, hasMany 功能很強大,對於複雜業務處理比較合適;路由功能,配置功能還不錯;自動構建腳手架(scaffold)很強大;適合中型應用;基本實現過了MVC每一層;具備自動操做命令行腳本功能;mysql
2. 文檔比較全,在國內推廣的比較成功,大部分都知道CakePHP,學習成本中等
缺點:
1. CakePHP很是嚴重的問題是把Model理解爲數據庫層操做,嚴重影響了除了數據庫以外的操做能力
2. CakePHP的cache功能略顯薄弱,配置功能稍嫌弱;CakePHP不適合大型應用,只適合中型應用,小型應用來講略微的學習成本高了點
評價:
整體來講CakePHP框架表明了PHP框架很重要的一個時代和表明,而且目前發揮着很重要的做用,很多本身寫的框架都模仿了CakePHP的方式,是個里程碑式的產品;CakePHP透露着RoR的敏捷開發方式和把數據庫操做認爲是惟一Model的設計思想,做爲開發快速應用和原型是絕好的工具;一樣,用來作Web2.0網站的開發框架,也是值得選擇的。
優勢:
1. 官方出品,自帶了很是多的 library,框架自己使用了不少設計模式來編寫,架構上很優雅,執行效率中等;MVC設計中,比較簡潔,具備路由功能,配置文件比較強大(可以處理XML和php INI),各類 library 很強大,是全部PHP框架中各類功能最全面的,包括它不只是一個PHP框架,更是一個大類庫(取代PEAR),這是它的主要特點;可以直觀的支持除數據庫操做以外的Model層(比 CodeIgniter 和 CakePHP 強),而且可以很輕易的使用Loader功能加載其餘新增長的Class;Cache功能很強大,從前端Cache到後端Cache都支持,後端Cache支持Memcache、APC、SQLite、文件等等方式;數據庫操做功能很強大,支持各類驅動(適配器)
2. 文檔很全,在國內社區很成熟,而且目前很多Web 2.0網站在使用,學習成本中等
缺點:
1. MVC功能完成比較弱,View層簡單實現(跟沒實現同樣),沒法很強大的控制前端頁面
2. 沒有自動化腳本,建立一個應用,包括入口文件,所有必須本身手工構建,入門成本高
3. Zend Framework 做爲一箇中型應用框架問題不大,也可以勉強做爲大型應用的PHP框架,可是做爲一個很成熟的大型PHP框架來講,還須要一些努力
評價:
做爲官方出品的框架,Zend Framework的野心是能夠預見的,想把其餘框架擠走,同時封裝不少強大的類庫,可以提供一站式的框架服務,而且他們的開發團隊很強大,徹底足夠有能力開發很強大的產品出來,因此基本能夠肯定的是Zend Framework前途無量,若是花費更多的時間去完善框架。一樣的,Zend Framework架構自己也是比較優雅的,說明Zend官方是有不少高手的,設計理念上比較先進,雖然有一些功能實現的不夠完善,好比View層,自動化腳本等等,這些都有賴於將來的升級。整體來講Zend Framework是最值得期待的PHP框架,固然,你目前要投入你的項目中使用也是徹底沒問題的
1.完整實現了MVC三層,封裝了全部東西,包括 $_POST,$_GET 數據,異常處理,調試功能,數據檢測;包含強大的緩存功能,自動加載Class(這個功能很爽),強大的i18n國家化支持;具備很強大的view層操做,可以零碎的包含單個多個文件;很是強大的配置功能,使用yml配置可以控制全部框架和程序運行行爲,強大到讓人無語;可以很隨意的定義各類本身的class,而且symfony可以自動加載(auto load)這些class,可以在程序中隨意調用;包含強大的多層級項目和應用管理:Project --> Application --> Module --> Action,可以知足一個項目下多個應用的須要,而且每層能夠定義本身的類庫,配置文件,layout;很是強大的命令行操做功能,包括創建項目、創建應用、創建模塊、刷新緩存等等;
2. Symfony絕對是開發大型複雜項目的首選,由於使用了Symfony,將大大節約開發成本,而且多人協做的時候,不會出現問題,在Project級別定義好基礎Class之後,任何模塊都可以重用,大大複用代碼
缺點:
1. 數據庫操做model採用了重量級的propel和creole,不過在我測試的版本中已經把他們移到了addon裏,可用可不用
2. 緩存功能沒法控制,每次開發調試老是緩存,須要執行 symfony cc, symfony rc 來清除和重建緩存;
3. 效率不是很高,特別是解析模板和讀取配置文件的過程,花費時間很多;
4. 學習成本很高,而且國內沒有成熟的社區和文檔,連中文手冊都沒有,相應的要掌握全部功能,須要花費比較多的時間
評價:
Symfony絕對是企業級的PHP框架,惟一可以貌似可以跟Java領域哪些強悍框架抗衡的東西;強悍的東西,天然學習複雜,可是相應的對項目開發也比較有幫助,天然是推薦複雜的項目使用Symfony來處理,以爲是值得,後期的維護成本比較低,複用性很強。相應的若是使用Symfony的應該都是比較複雜的互聯網項目,那麼相應的就要考慮關於數據庫分佈的問題,那麼就須要拋棄Symfony自帶的數據庫操做層,須要本身定義,固然了,Symfony支持隨意的構造model層。
3. php運行的3種模式例如Apache的mod_php5,相似的Apache內置的mod_perl能夠對perl支持;
這個就比如以前perl的CGI,該種方式的缺點是性能差,由於每次服務器遇到這些腳本都須要從新啓動腳本解析器來執行腳本而後將結果返回給服務器,另外一方面就是不太安全,
該方式幾乎不多使用了。
所謂FastCGI就是對CGI的改進。它通常採用C/S結構,通常腳本處理器會啓動一個或者多個daemon進 程,每次HTTPServer遇到腳本的時候,直接交付給FastCGI的進程來執行,而後將獲得的結果(一般爲html)返回給瀏覽器。
該種方法的問題存在一個小問題是當遇到大流量的頻繁請求的話,腳本處理器的daemon進程可能會超負荷從而變得很慢,甚至發生內存泄漏;
可是比較起Apache的內置模塊的方式的優勢是因爲Server和腳本解析器徹底分開各負其責,所以服務器再也不臃腫,能夠專心地進行靜態文件響 應或者將動態腳本解析器的結果返回給用戶客戶端。
因此比較起Apache的內置模塊方式,有時候性能要提升不少。
有人測試可能會達到 Apache+mod_php的5~10倍。
lightppd+spawn-fcgi
nginx+PHP-FPM
4.memcache與redis的區別//1.當前時間格式化打印//date_timezone_set('PRC');//設置中國時區//date_timezone_set("Etc/GMT-8");// 比林威治標準時間快8小時,是咱們的北京時間echo date('Y-m-d H:i:s');
echo '<hr/>';
//2.//字符串轉數組:print_r(str_split("Hello Shanghai"));
echo '<hr/>';
//字符串截取:substr($str,1,10);mb_substr()和mb_strcut(),mb_substr是按字來切分字符,而mb_strcut是按字節來切分字符,一個utf8中文字符佔三個字節echo mb_substr('這樣一來個人字符串就不會有亂碼^_^', 0, 7, 'utf-8');//輸出:這樣一來個人字echo '<hr/>';
echo mb_strcut('這樣一來個人字符串就不會有亂碼^_^', 0, 7, 'utf-8');//輸出:這樣一echo '<hr/>';
//分隔成數組:print_r(explode(' ',"Hello Shanghai"));
echo '<hr/>';
//字符串替換:echo str_replace("world","Shanghai","Hello world!");
echo '<hr/>';
//正則替換echo preg_replace('/\s+/', '','foo o');//剝離空白字符echo '<hr/>';
//數組轉字符串:print_r(implode(array('a'=>'aaa','b'=>'bbb')));
echo '<hr/>';
//3.字符串查找strpos,strrpos$str = '/web/a/b/index.html';
$index = strrpos($str,'/');
//截取網址文件部分echo substr($str,$index+1);//包含索引位置到結尾部分echo basename($str);//取文件名echo '<hr/>';
//截取網址路徑部分echo substr($str,0,$index);
echo dirname($str);//取路徑名echo '<hr/>';
//日期反轉$date = '18/02/2016';
echo preg_replace('/(\d+)\/(\d+)\/(\d+)/','$3/$2/$1',$date);
echo '<hr/>';
//寫一個函數,儘量高校的從一個url裏提取文件擴展名$url = 'http://www.test.com.cn/abc/dsg/del.inc.php';
$path = pathinfo($url);
//var_dump(parse_url($url));echo $path['extension'];// ["basename"]=> string(11) "del.inc.phpecho '<hr/>';
//複雜狀況$url1 = 'http://www.test.com.cn/abc/dsg/del.inc.php?id=6';
$arr = parse_url($url1);
$path1=$arr['path'];
$arr2 = pathinfo($path1);
//print_r($arr2);echo $arr2['extension'];
echo '<hr/>';
/** *一. 字符串函數join() implode() 的別名,返回由數組組成的字符串
strlen($str)
addslashes($str)在預約義字符前加/;預約義字符是:單引號(')雙引號(")反斜槓(\)NULL,也可在php.ini中設置magic_quotes_gpc=onget_magic_quotes_gpc()檢測字符串是否通過轉義,
strpos() 函數用於檢索字符串內指定的字符或文本。若是找到匹配,則會返回首個匹配的字符位置。若是未找到匹配,則將返回 FALSE。
strtolower() //全部大寫轉小寫;
strtoupper — 將字符串轉化爲大寫
ucfirst — 將字符串的首字母轉換爲大寫
lcfirst() 把字符串的首字符轉換爲小寫
ucwords — 將字符串中每一個單詞的首字母轉換爲大寫
strstr($str,search,before_search)(別名strchr) — 默認返回$search以及以後的部分,若before_search爲true則返回以前的部分。若是想要不區分大小寫,請用 stristr()。
chop($str,$charlist) 刪除$charlist指定的字符串,若charlist 參數爲空,則移除如下字符:"\0" - NULL,"\t" - 製表符,"\n" - 換行,"\x0B" - 垂直製表符,"\r" - 回車," " - 空格。
chunk_split($str,length,end) 把字符串分割爲一系列更小的部分,默認以默認是 \r\n,可經過end指定分隔符,length幾位一分隔,默認是 76
localeconv() 返回本地數字及貨幣格式信息number_format() 以千位分組來格式化數字
ltrim($str,$charlist) 移除$charlist指定字符串若省略第二參數則移除"\0" - NULL,"\t" - 製表符,"\n" - 換行,"\x0B" - 垂直製表符,"\r" - 回車," " - 空格*//** *
二.數組函數
sizeof() count() 的別名
pos() current() 的別名
implode() join()的別名,將數組分隔成字符串
array_reduce($arr,fun) 經過使用用戶自定義函數,將數組轉化爲字符串。
array_rand($arr,n)隨機取出數組的一個鍵
array_unshift($arr)向前插入數組元素,能夠傳入多個,返回插入的個數
array_push($arr)從尾部插入數組元素,返回插入個數
array_shift($arr)從前面彈出數組元素,從前面出棧,每次刪除一個
array_pop($arr)從後面彈出數組元素,從後面出棧,每次刪除一個
unset($arr[2]); 刪除指定數組元素
array_flip($arr);交換數組的鍵和值
array_unique() 刪除數組中的重複值
array_count_values() 用於統計數組中全部值出現的次數。
array_intersect() 比較數組,返回交集(只比較鍵值)。
array_intersect_assoc() 比較數組,返回交集(比較鍵名和鍵值)。
array_intersect_key() 比較數組,返回交集(只比較鍵名)
array_filter()用回調函數過濾數組中的元素。
array_reverse() 以相反的順序返回數組。
array_search() 搜索數組中給定的值並返回鍵名。
array_combine($arr1,$arr2)將第一個數組的值做爲第二個數組的鍵合併爲一個數組array_merge_recursive() 函數把一個或多個數組合併爲一個數組。該函數與 array_merge() 函數的區別在於處理兩個或更多個數組元素有相同的鍵名時。array_merge_recursive() 不會進行鍵名覆蓋,而是將多個相同鍵名的值遞歸組成一個數組。
array_map()把數組中的每一個值發送到用戶自定義函數,返回新的值。
array_slice($arr,2) 去掉數組前2個元素,返回數組剩餘的部分
$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,1,2));//Array ( [0] => green [1] => blue )
$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-2,1));//Array ( [0] => yellow )
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow"); $a2=array("a"=>"purple","b"=>"orange"); array_splice($a1,0,2,$a2); print_r($a1);//Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
$a1=array("0"=>"red","1"=>"green"); $a2=array("0"=>"purple","1"=>"orange"); array_splice($a1,1,0,$a2); print_r($a1);//Array ( [0] => red [1] => purple [2] => orange [3] => green )
array_product() 計算數組中全部值的乘積//數組排序
7.sort() - 以升序對數組排序
8.rsort() - 以降序對數組排序
9.asort() - 根據值,以升序對關聯數組進行排序
10.ksort() - 根據鍵,以升序對關聯數組進行排序
11.arsort() - 根據值,以降序對關聯數組進行排序
12.krsort() - 根據鍵,以降序對關聯數組進行排序
13.shuffle() 將數組打亂
預約義數組* __FILE__:當前文件在服務器的什麼地址上面;
__LINE__:對應的行號;
__FUNCTION__:當前函數名;
__CLASS__:當前的類名;
__METHOD__:當前的方法;
PHP_OS: 當前操做系統的版本;
PHP_VERSION: 當前的PHP的版本;
超全局數組
$_SERVER['HTTP_REFERER']; //上級來源
$_SERVER['HTTP_ACCEPT_LANGUAGE']; //字符集
$_SERVER['HTTP_HOST']; //當前服務器的IP地址
$_SERVER['REMOTE_ADDR']; //哪臺主機訪問,沒有獲取IP記錄的,只有它.
$_SERVER["SERVER_ADMIN"]; //管理員郵箱
防止sql注入:
1.$SERVER['HTTP_REFERER']判斷提交來源;
2.開啓addslashes和magic_quotes_gpc *
3.使用預處理(PDO)*//** *
防盜鏈*
1.利用apache或nginx的rewrite重寫功能基於來源作判斷*
2.經過$SERVER['HTTP_REFERER'];判斷*
$urlar=parse_url($_SESSION['HTTP_REFERER']);
if($_SERVER['HTTP_HOST'] != $urlar["host"] && $urlar["host"] != "202.102.110.204" && $urlar["host"] != "http://blog.163.com/fantasy_lxh/") {
header("location: login.php");
exit;
}
用php寫出一個安全的用戶登陸系統須要注意哪些方面*
1.加驗證碼*
2.三次失敗鎖定*
3.密碼不能ctrl+V,html加入οncοpy="return false;" οnpaste="return false;" oncut="return false;" *
4.密碼使用小鍵盤
5.動態口令卡
// echo false;結果爲空
echo true;//1
echo '<hr/>';
echo ord('a');//轉化爲ASCll碼
echo '<hr/>';
echo chr(97);//將ascll碼轉化爲string
echo '<hr/>';
$arr=array('a'=>'aaaaa','b'=>'bbbbb');
echo "A is {$arr['a']}";//對於雙引號內的數組引用若是下標加了引號則該變量必定要加{},不然會報錯
//靜態變量的值每次執行後會保存在內存中,不會自動銷燬
echo '<hr/>';
//heredoc技術
//session.use_trans_sid=1;(當客戶端禁用cookie時,瀏覽器自動帶上session_id,其餘頁面根據session_id取值)
echo '<hr/>';
/** * 把字符串轉換成數組可以使用函數有str_split()(每一個字符做爲一個數組元素)、explode()//每一個單詞做爲一個數組元素,preg_split()
* 把數組轉換在字符串implode(),join(),array_reduce($arr,fun) 經過使用用戶自定義函數,將數組轉化爲字符串。
寫一個函數將open_door轉化成OpenDoor
function _Ucwords($str){
return str_replace(' ','',ucwords(str_replace('_',' ',$str)));
//或者
return strtr(ucwords(str_replace('_',' ',$str)),array(' '=>''));
}
echo _Ucwords('open_door');
echo '<hr/>';
//或者function Ucword($str){
$arr = explode('_',$str);
foreach($arr as $k=>$v){
$arr[$k]=ucfirst($v);
}
return implode($arr);
}
echo Ucword('get_by_id');
echo '<hr/>';
//將12345657678轉化成12,345,657,678$number='12345657678';
number_format($number);
//或者function my_number_format($number){
$num=strrev($number);//反轉字符串$arr=str_split($num,3);
$num=strrev(implode(',',$arr));
//也能夠寫做$num=strrev(join(',',$arr));join()是implode的別名}
echo '<hr/>';
//將 HELLO WORLD轉化爲Hello Word$bar = '!HELLO WORLD';
$bar = ucwords(strtolower($bar));
echo $bar;
echo '<hr/>';
echo '<hr/>';
echo '<hr/>';
/** * 文件目錄操做*///經過 PHP 函數的方式對目錄進行遍歷,寫出程序
function dirList($path){
$arr =scandir($path);
foreach($arr as $file){
if($file !='.' && $file !='..'){
$pathNext =$path.'/'.$file;
echo $pathNext;
if(is_dir($pathNext)){
dirList($pathNext);
}else{
echo '<p>'.$pathNext.'</p>';
}
}
}
}
$path='D://WWW';
dirList($path);
echo '<hr/>';
$a=array("red","green","blue","yellow","brown");
$random_keys=array_rand($a,3); //隨機取n個鍵
var_dump($random_keys);
var_dump($a[$random_keys[1]]);
echo '<hr/>';
$str = "Shanghai";
echo chunk_split($str,2,'-');//Sh-an-gh-ai-
echo '<hr/>';
$str = 'sdgdg"sdsds"\//gh.ghnullNULL\'\'';
echo addslashes($str);
echo($str);
echo '<hr/>';
$str='i am da niu and you?';
echo strstr($str,'am');//am da niu and you?
echo '<hr/>';
sql語句
//有 A(id,sex,par,c1,c2),B(id,age,c1,c2)兩張表,其中 A.id 與 B.id 關聯, 如今要求寫一條SQL 語句,將 B 中 age>50 的記錄的 c1、c2 更新到 A 表中統一記錄中的 c1、c2 字段中。
$sql="update A,B set A.c1=B.c1,A.c2=B.c2 where A.id=B.id and B.age>50";
1.從login表中選出name字段包含admin字段的前十條結果* select * from login where name like '%admin%' limit 10 order by id;
*2通配符:* 咱們使用like和not like加上一個帶通配符的字符串就能夠了。共有兩個通配符」_」(單個字符)和」&」(多個字符)select concat(first_name,' ‘,last_name) as name,where last_name like ‘W%'; //找到以W或w開頭的人where last_name like ‘%W%'; //找到名字裏面W或w開頭的人*
3.使用擴展正則*SELECT * FROM `sunup_user` where username REGEXP 'test[0-9]+';
「.」匹配任何單個的字符;
一個字符類「[...]」匹配在方括號內的任何字符。例如,「[abc]」匹配「a」、「b」或「c」。爲了命名字符的一個範圍,使用一個「-」。「[a-z]」 匹配任何小寫字母,而「[0-9]」匹配任何數字;
「 * 」匹配零個或多個在它前面的東西。例如,「x*」匹配任何數量的「x」字符,「[0-9]*」匹配的任何數量的數字,而「.*」匹配任何數量的任何東西。正則表達式是區分大小寫的,可是若是你但願,你能使用一個字符類匹配兩種寫法。例如,「[aA]」匹配小寫或大寫的「a」而「[a-zA-Z]」匹配兩種寫法的任何字母。若是它出如今被測試值的任何地方,模式就匹配(只要他們匹配整個值,SQL模式匹配)。爲了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用「^」或在模式的結尾用「$」。爲了說明擴展正則表達式如何工做,上面所示的LIKE查詢在下面使用REGEXP重寫:爲了找出以「b」開頭的名字,使用「^」匹配名字的開始而且「[bB]」匹配小寫或大寫的「b」:mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]"; *
4.變量:* 變量的命名規格是:@name, 賦值語法是 @name:=value ( pascal?) 使用起來也簡單:select @birth:=birth from presidentwhere last_name ='adsltiger'; //執行完成後咱們就就會有一個@birth變量可用用一下試試:select concat(first_namem,' ‘,last_name) as name from presidentwhere birth<@birth order by birth; //看看那些人比我大!
mysql重啓後索引會回收
1.對象間的賦值默認是引用傳值,指向同一個內存空間;只有指向同一內存地址的兩個對象才相等;
2.只要在實例化後在類外改變了屬性和方法,無論在類內仍是類外調用都是改變後的值;
2.當構造方法__construct()有參數時,在實例化時在對象裏傳參;
3.__destruct()釋放程序資源,(unset操做,關閉文件,數據庫)當類執行完成後自動運行;析構函數不能傳參;當unset和給對象從新賦值時都會觸發;當程序運行完後php會自動銷燬變量和對象,釋放內存。故實例了幾個對象最後就會執行幾回__destruct();子類會繼承父類的構造方法,若子類也有定義,則會被覆蓋;
4.__get($param);當對象調用不存在的屬性時自動調用;做用:實現私有屬性在類外訪問(在__get()內部給返回值);
5.__set($param,$val);給私有屬性賦值時不會報錯,但調用賦值的屬性時得用__get();做用:對私有屬性賦值;
6.PHP不容許調用不存在的屬性但容許給類中不存在的屬性賦值,而不會報錯
7.__isset(isset調用的屬性名);當給一個屬性isset()判斷時自動調用此方法;
8.__unset(屬性名)當給一個屬性使用unset時,自動調用;
9.__call(不存在的方法名,調用不存在的方法時的全部參數(array)):調用不存在的方法是執行;做用:實現私有方法的外部調用;call_user_func_array(array(),)
10.__toString();將對象能夠以字符串方式輸出;
11.__autoload($classname);當實例化一個不存在的類時,程序自動調用該方法;做用:避免類的重複加載;
12.靜態屬性static,屬於整個類,而非某個對象。訪問方式 類名::$屬性名,還能夠用parent:$屬性名;子類繼承過來的屬性和方法用$this和$parent均可以訪問,但$this優先從子類開始尋找。還可用self:$屬性名; 靜態屬性不能重寫;
13.(1)靜態屬性存在於類空間,普通屬性存在於每一個對象中。類聲明完畢即存在,不依賴於對象,不實例化也能夠訪問。不依賴於對象(內存中只有一份)。靜態方法中不能含有非靜態屬性;
(2)還能夠不用實例化。直接使用類名::方法名(屬性名)來調用;
(3)在類中靜態方法訪問靜態屬性,使用類名::靜態屬性名便可調用類中的靜態屬性。
(4)在當前類中若是要訪問靜態成員能夠使用self::關鍵字進行訪問。
14.類常量定義 const name="liyong";訪問方式:類名::name;只能在類的內部訪問;const不能在條件語句中定義常量;const採用一個普通的常量名稱,define能夠採用表達式做爲名稱。const 老是大小寫敏感,然而define()能夠經過第三個參數來定義大小寫不敏感的常量使用const簡單易讀,它自己是一個語言結構,而define是一個方法,用const定義在編譯時比define快不少。
15.對象直接相互賦值是引用傳遞,而想要值傳遞用clon()方法;在類中定義__coln魔術方法;
16.抽象類不能被實例化,用來規範開發者定義方法的名稱;抽象方法不能有方法體;抽象方法必需要在子類中實現(重寫/覆蓋);抽象類中能夠存在非抽象方法,但必須有抽象方法;
17.接口只能聲明抽象類和常量;一樣不能實例化,只能實現implements,不叫繼承;子類必須實現接口的所有方法;一個類能夠實現多個接口;做用:用來規範開發,命名規範接口設計原則:儘可能避免臃腫,一個接口完成一件事,把共有的常量方法單獨封成接口;
18.對象串行化serialize()//對象轉字符串
19.設計模式:單件模式(單例模式Singleton),工廠方法模式(Factory Method),抽象工廠模式(Factory Abstract) 適配器模式(),觀察者模式,命令模式,策略模式
20.對象的回收機制:**//** * 接口和抽象類的區別:* 1.抽象類能夠有抽象的方法,而接口中只能有抽象方法
2.一個類能夠繼承多個接口但只能繼承一個抽象類* 接口經過implements實現,抽象類經過extends繼承*/
class Human{
public $name='張三';
public $gender=NULL;
public function __destruct() {
echo '發了';
}
}
$a= new Human();
$b=$c=$d=$a;
echo $a->name,'<br />';
echo $b->name,'<br />';
$b->name='李四';
echo $a->name,'<br />';
echo $b->name,'<br />';
//對象的相互賦值是引用傳遞,即$a,$b,$c,$d都指向同一個對象因此都會變成李四;unset($a);//注意這裏的unset對對象是無效的,由於還有$b,$c,$d指向這塊內存空間,只有當他們所有unset後纔會觸發析構函數;//unset($b);unset($c);unset($d);echo '<hr />';
//-----------------------兄弟連面向對象-------------------------------/**
數據庫設計時,常遇到的性能瓶頸有哪些,常有的解決方案?
1) 查詢速度慢 ,避免全盤掃描,由於全盤掃描會致使大量磁盤 I/O 操做 用 sphinx 來解決
2) 讀寫過於頻繁 讀寫分離來作
3) 設置主從,並作好冗餘備份
4) 數據庫壓力過大 採用分佈式數據庫負載均衡來解決
5) memcache 緩存層
6) 連接數據庫使用 PDO,或者 mysqli 預處理緩存字段
7) 索引優化
面向對象基礎
聲明:[修飾類的關鍵字]class 類名{ * 成員(成員屬性:變量;成員方法:函數) } *命名:類名.class.php,方便自動加載*變量和函數名駝峯式命名,類名首字母大寫;*$對象引用=new 類名; *變量成員的調用不用$
*構造方法就是對象建立完成後第一個調用的方法;*php4中和類名相同的就是構造方法; *php5中,構造方法使用魔術方法__construct();
*每一個魔術方法都在不一樣時刻爲了完成某一個功能自動調用的方法*__destruct();用於關閉資源,作一些清理工做。*例如類內調用的__get(),__set(),__isset(),__unset(),__clone(),__call(),__sleep(),__weakup(),__toString() *類外調用,惟一一個__autoload();
一.封裝:
就是把對象的成員(屬性和方法)結合成一個獨立的相同單位,並儘量隱藏對象的內部細節*封裝可提升安全性*封裝使用private(只能在對象內部用$this訪問
1.方法的封裝主要用於內部的一個主方法藉助其餘若干小方法工做,這些小方法沒有單獨存在的意義,就能夠用private把這些小方法封裝起來
2.屬性的封裝,只要變量在多個方法中都用到就將該變量聲明爲成員屬性。封裝屬性爲了避免讓屬性值在實例化後隨意讀取和更改。類內訪問不受影響。封裝後能夠經過調用共有方法傳參來改值,能夠在public方法中限制值的範圍。可經過方法的return來讀取私有屬性。
3.若是要設置和取值的屬性不少可用魔術方法__set和__get來操做。
4__get獲取成員屬性的值時自動調用,必須有一個參數__get($proname),爲傳進來的屬性名,實例化後獲取哪一個私有屬性就會把哪一個私有屬性傳進來,__get方法內使用$this->$proname;來獲取(ps:$proname只是一個參數,並非成員屬性,故調用時加上$),通過方法就能夠判斷傳進來的成員屬性是哪個,從而寫程序來控制。
5__set爲成員屬性設置值時自動調用,有兩個參數__set($proName,$proValue),__set方法內使用$this->$proName=$proValue;來設置值。
6__isset($proName)查看私有屬性是否存在時自動調用,方法內加上 return isset($this->$proName),禁止判斷是否設置可經過判斷傳進來的屬性名return false;便可
7__unset($proName)直接刪除對象中私有屬性時調用,方法中加上unset($this->$proName);
二.繼承
1.父類:基類; 子類:派生類*開放性,可擴充性,增長代碼的重用性,提升可維護性*若是兩個或兩個以上類中有公用的部分,那麼公用的部分就能夠做爲父類;*繼承就是在父類的基礎上「擴展」父類的功能;*C++多繼承,同一個類能夠有多個父類;PHP屬於單繼承,同一個類只能繼承一個父類;但一個類均可以有多個子類;
2.子類聲明用extends關鍵字,格式:class 子類名 extends 父類名{},子類不能繼承私有方法
3.成員屬性通常先聲明,加關鍵字private,protected,public再用__construct設置值,這樣即便是私有屬性子類也能夠用; *protected類內和子類可用,類外不能用;
4.子類重載父類的方法;重載即方法名相同但參數類型不一樣。強類型語言可經過指定參數類型實現。PHP中子類方法名與父類相同則會覆蓋父類同名方法,還能夠擴展此方法;*在覆蓋父類方法的子類中調用父類方法使用父類名::方法名();即對象->成員;類::成員;
5.藉助父類初始化:parent:: __construct(屬性1,屬性2,屬性3,........);
6.注意:子類只能放大權限不能縮小權限,例如父類爲public子類必須爲public,父類爲protected,則子類可爲protected或public。*
三.多態
多態: 多態是面向對象的三大特性之一*「多態」是面向對象設計的重要特性,它展示了動態綁定(dynamic binding)的功能,也稱爲「同名異式」(Polymorphism)。多態的功能可以讓軟件在開發和維護時,達到充分的延伸性(extension)。事實上,多態最直接的定義就是讓具備繼承關係的不一樣類對象,能夠對相同名稱的成員函數調用,產生不一樣的反應效果。例如:interface Test{fuanction aaa();fuanction bbb();}class one implements Test{function aaa(){echo "aaaaaaaaaaaaa";}function bbb(){echo "bbbbbbbbbbbbbbb";}}class Tow implements Test{function aaa(){echo "11111111111111111";}function bbb(){echo "2222222222222222222";}}$a=new Two;$b=new one;$a->aaa();$b->aaa(); * *1抽象類是一種特殊的類,接口是一種特殊的抽象類,多態就是要用到抽象類和接口*抽象類和接口的做用同樣,功能有所不一樣*抽象方法:若一個類中的方法沒有方法體,而直接使用;結束的就是抽象類。方法體就是方法中的{},例如:function test(); *若一個方法是抽象方法,就必須使用abstract關鍵字修飾,* 抽象類:若類中存在抽象方法,則該類就是抽象類;*抽象類也須要abstract關鍵字修飾,其特殊性就在於它有抽象方法;*抽象類不能實例化對象,類內的成員也不能直接被訪問。*要想使用一個抽象類就必須用一個類去繼承抽象類,子類不能再是抽象類,子類可重寫抽象類的方法,給抽象方法加上方法體便可實例化子類。*子類必須實現抽象類中抽象方法,即子類必須有抽象類的方法名。其本質就是定義一些規範讓子類按這些規範去實現本身的功能。*目的:將本身寫的程序塊加入到 原來寫好的程序中去;
2.接口是爲了解決PHP不能多繼承,若使用抽象類則繼承抽象類的子類就不能再繼承其餘類。若既想實現一些規範又想繼承其餘的類就要使用接口。
3.接口與抽象類的對比:
(1做用相同,都不能建立對象,都須要子類去實現
(2接口的聲明不同
(3 接口被實現的方式不同 ,interface 接口名{ }
(4接口的全部方法必須是抽象方法,但不須要abstract修飾
(5接口 的成員屬性只能聲明常量,用const HOST="localhost";常量可經過 類名::常量 直接訪問
(6接口中的成員訪問權限都必須是public,抽象類中最低的訪問權限是protected,
(7子類實現接口用implements關鍵字 ,接口之間的繼承仍是使用extends;*能夠使用抽象類去實現接口中的部分方法*若是想讓子類能夠建立對象,則必須實現接口中的所有抽象方法* * 能夠定義一個接口去繼承另外一個接口* * 一個類能夠去實現多個接口(按多個規範去開發子類), 使用逗號分隔多個接口名稱* * 一個類能夠在繼承一類的同時,去實現一個或多個接口(先繼承,再實現)
例如:class Man extends Person implements Woker,Students,Teachers{ } * 使用implements的兩個目的
1. 能夠實現多個接口 ,而extends詞只能繼承一個父類
2. 沒有使用extends詞,能夠去繼承一個類, 因此兩個能夠同時使用**
1 class 類名{ * * }//普通類* *
2 abstract class 類名 { * * }//抽象類* * 聲明方式* *
3 interface 接口名{ * * } //接口* * * * * *
四.PHP中經常使用的關鍵字和魔術方法
1.final不能修飾成員屬性,只能修飾類和方法;使用final修飾的方法不能被繼承和重寫(覆蓋)
2.static能夠修飾成員屬性和方法,不能修飾類static修飾的成員屬性能夠被同一類的全部對象共享;靜態數據存在內存中的數據段(初始化靜態段);靜態數據是在類第一次加載時分配到內存中的,之後直接在內存中調用
注意:(1.靜態成員直接使用類名去訪問,不用建立對象,訪問格式 類名::靜態成員,例如Parent::go();這種格式還用於覆蓋父類方法的子類中調用父類方法使用父類名::方法名()
(2.若在類中使用靜態成員可用self表明本類($this表明本對象),例如self::go(); *靜態的成員方法不能訪問非靜態的成員,由於非靜態的成員就必須用對象來訪問,$this就表示調用它的對象,而靜態成員不用對象來去調用,$this就不能表明哪一個對象
(3.若肯定一個方法不使用非靜態的成員則可將這個方法聲明爲靜態方法(不用建立對象直接經過類名就能夠訪問);
3.const只能修飾成員屬性,用於在類中聲明常量,與define功能相同,訪問方式和靜態成員相同。類內使用seif::常量 類外 類名::方法*常量必定要在聲明時給初值,存儲與數據段*__call($methodName,$arg1,$arg2....) 調用系統中不存在的方法時自動調用,用於處理調用不存在方法時的錯誤提示。
__toString(){return "wwwwwwwwwww";}直接輸出對象引用時調用
__clone()能夠沒參數。與原對象各佔一個內存空間,如果把對象引用賦值給一個變量,則這個變量和原對象指向同一個內存地址;*其做用與構造方法相似,用於給克隆方法初始化。其中的$this指的是克隆出來的副本的對象,$that表明本來對象;*用法:$p=new Person; $p1=clone $p;
4__autoload($className){include './'.$className.'class.php';}惟一一個不在類中添加的方法;用於在類外部自動加載類,只要用到外部類名就會被自動加載
5__sleep(),序列化時自動調用的方法;能夠將一個對象部分串行化。只要這個方法中返回一個數組,數組中有幾個成員屬性就序列化幾個成員屬性,若不加這個方法則全部成員都被序列化了,例如function __sleep(){return array(name,age);//將成員屬性name和age序列化} *其本質就是規定屬性中須要序列化的成員屬性* *對象串行化,將一個對象轉化成一個二進制串存儲於內存中;*用於將對象長時間存儲於數據庫或文件中,或將對象在多個PHP文件中傳輸時;*例如:$p=new Person();$str=serialize($p);//將對象轉化成二進制串file_put_contents("p.txt",$str);//寫入文件$str2=file_get_contents("p.txt");$pp=unserialize($str2)//反序列化.獲得的$pp與原對象$p相同;*6__wakeup()是在反序列化時自動調用的方法,爲序列化後的對象初始化(有對象誕生就要初始化);* * * * * * * * * * * */
class Person{
var $name;
var $age;
var $sex;
function say() {
echo"說話";
echo $this->name='888';
}
function run() {
echo "跑";
}
}
$p1=new Person;
$p2=new Person;
$p1->say();
echo $p1->name='李勇';
echo $p2->age;
/** * * javascript *//*explore=navigator.userAgent;if(explore.search('MSIE')>=0){ alert('ie 瀏覽器');}else{ alert('非IE')} *//** * linux基礎* 1.如何實現天天 0 點鐘從新啓動服務器crontab -e分 時 日 月 周00 00 * * * /sbin/init 6 * #!/bin/bash chown root /path/to * //shell遍歷目錄的腳本#!bin/bash tree chmod 777 tree.sh
1. 什麼事面向對象?主要特徵是什麼?
面象對象是把天然界的物體和概念直接映射到程序界的一種比較優雅的手段。主要特徵:抽象、繼承、封裝、多態 。
2. SESSION 與 COOKIE的區別是什麼,請從協議,產生的緣由與做用說明?
Session是服務器端保存客戶端狀態信息的方案,通常保存在服務器端內存中,session超時時間在服務器端進行設置。 Cookie是客戶端保存信息的方案,通常是以文件的形式進行保存,cookie清空時間是在客戶機瀏覽器設置。
3. HTTP 狀態中302、403、 500代碼含義?
302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:服務器內部錯誤 401表明未受權。
301" ; Moved Permanently
"302" ; Moved Temporarily
"304" ; Not Modified
"400" ; Bad Request
"401" ; Unauthorized
"403" ; Forbidden
4. Linux 下創建壓縮包,解壓縮包的命令
Tar -cvf demo.tar demo Tar -xcf demo.tar
Gzip demo guzip demo.gz gzip -d demo.gz
Bzip2 -k demo. Bunzip demo.bz2
Zip -r demo unzip demo.zip
5. 請寫出數據類型(int char varchar datetime text)的意思;請問 varchar 和 char有什麼區別?
Int 整數 char 定長字符 Varchar 變長字符 Datetime 日期型 Text 文本型 Varchar 與char的區別 char是固定長度的字符類型,分配多少空間,就佔用多長空間。 Varchar是可變長度的字符類型,內容有多大就佔用多大的空間,能有效節省空間。 因爲varchar類型是可變的,因此在數據長度改變的時,服務器要進行額外的操做,因此效率比char類型低。
6. MyISAM 和 InnoDB 的基本區別?
MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快,可是不提供事務支持,而InnoDB提供事務支持以及外部鍵等高級數據庫功能。
7. 不使用cookie向客戶端發送一個cookie.
理解:session_start()開啓時,生成一個常量 SID,當COOKIE開啓時,這個常量爲空,當COOKIE關閉時,這個常量中存儲了PHPSESSID的值。經過在URL後加一個SID參數來傳遞SESSIONID的值,從而使客戶端頁面能夠使用SESSION裏面的值。 當客戶端開啓COOKIE和服務器端開啓SESSION時。 瀏覽器第一次請求,服務器會向瀏覽器端發送一個COOKIE裏面存儲SESSIONID. 當瀏覽器第二次請求時,會把已存在的COOKIE一塊兒提交到服務器端。
10. isset() 和 empty() 區別,對不一樣數據的判斷結果,$a=0;$a='0';$a='';$a=false;$a=null;
Isset()判斷是否存在,存在就爲真無論是否爲假。
Empty()判斷是否爲空,爲空時爲真值,不存在也爲真值。
Isset(): true;true;true;true;false Empty():true;true;true;true;true
12. 如何在頁面之間傳遞變量(至少兩種方式) ? get,post
3、PHP 代碼題
1. 寫出匹配URL的正則表達式.
/^[a-zA-z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?/
2. 請寫出常見的排序算法,並用PHP實現冒泡排序,將數組$a = array()按照從小到大的方式進行排序。
$arr=array(233,5,6,75454,32);
Mao($arr);
Function mao($arr){
$n=count($arr);
For($i=0;$i<$n;$i++){
For($j=$n-1;$j>0;$j--){
If($arr[$j-1]>$arr[$j]){
$t=$arr[$j-1];
$arr[$j-1]=$arr[$j];
$arr[$j]=$t;
}
}
}
}
3. 在數據庫test中的一個表student,字段是name,class,score。分別表明姓名、所在班級,分數。
1) 學出每一個班級中的學生,按照成績降序排序;
2) 查出每一個班的及格人數和不及格人數,格式爲:class、及格人數、不及格人數;
3) 用PHP寫入鏈接數據庫("localhost","msuser","mspass")、執行以上SQL、顯示結果、判斷錯誤、關閉數據庫的過程;
1) SELECT * FROM student ORDER BY score desc;
<?php
$conn=mysql_connect('localhost','root','123456');
@mysql_select_db('test');
$sql="";
$result=Mysql_query($sql);
If($result && mysql_affected_rows()){ ............................. }
Mysql_close($conn);
1 請說明 PHP 中傳值與傳引用的區別。何時傳值何時傳引用?
答: 傳值只是把某一個變量的值傳給了另外一個變量,而引用則說明二者指向了同一個地方。
2 在PHP中error_reporting這個函數有什麼做用?
答: The error_reporting()
1 E_ERROR 致命的運行時錯誤(它會阻止腳本的執行)
2 E_WARNING 運行時警告(非致命的錯誤)
4 E_PARSE 解析錯誤
8 E_NOTICE 注意(事情多是或者可能不是一個問題)
256 E_USER_ERROR 用戶生成的錯誤消息,由trigger_error()函數生成
512 E_USER_WARNING 用戶生成的警告,由trigger_error()函數生成
1024 E_USER_NOTICE 用戶生成的注意,由trigger_error()函數生成
2048 E_STRICT 關於兼容性和互操做性的建議
8191 E_ALL 全部的錯誤、警告和建議
3 請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。
答:
php
if(isset($_POST['action']) &&
$_POST['action']==’submitted’)
{
$email=$_POST['email'];
if(!preg_match(「/^(w:?+.?)*w+@(?:w+.?)*w+$/」,$email))
{
echo
「電子郵件檢測失敗」;
}
else
{
echo
「電子郵件檢測成功」;
}
}
else
{
?>
1. 使用PHP描述冒泡排序和快速排序算法,對象能夠是一個數組
//冒泡排序(數組排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $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< $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);
}
2. 使用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<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
3. 寫一個二維數組排序算法函數,可以具備通用性,能夠調用php內置函數
//二維數組排序, $arr是數據,$keys是排序的健值,$order是排序規則,1是升序,0是降序
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;
}
題一:
/**
* 請以空格做爲間隔,拆分字符串’Apple Orange Banana Strawberry’,組成數組$fruit,
* 數組中全部元素都用小寫字母,並按照字母前後次序排序
*/
class sort
{
private $str;
public function __construct($str)
{
$this->str=strtolower($str);
}
private function explodes()
{
if(empty($this->str)) return array();
$arr=explode(」 「,$this->str);
return is_array($arr)?$arr:array($arr);
}
public function sort()
{
$explode=$this->explodes();
sort($explode);
return $explode;
}
}
//$str=’Apple Orange Banana Strawberry’;
////$sortob=new sort($str);
////var_dump($sortob->sort());
複製代碼題二:
/**
* 對於用戶輸入一串字符串$string,要求$string中只能包含大於0的數字和英文逗號,
* 請用正則 表達式驗證,對於不符合要求的$string返回出錯信息
*/
class regx
{
public static function check($str)
{
if(preg_match(「/^([1-9,])+$/」,$str))
{
return true;
}
return false;
}
}
$str=」12345,6″;
if(regx::check($str))
{
echo 「suc」;
}
else
{
echo 「fail」;
}
複製代碼題三:
<?php
/**
* 請寫一段程序,在服務器建立一個文件fruit.dat,將試題3中獲得的數組寫入到改文件中,
* 而後寫一段程序從文件中讀取並還原數組
* @author zhuwenqiong
*
*/
class sort
{
private $str;
public function __construct($str)
{
$this->str=strtolower($str);
}
private function explodes()
{
if(empty($this->str)) return array();
$arr=explode(」 「,$this->str);
return is_array($arr)?$arr:array($arr);
}
public function sort()
{
$explode=$this->explodes();
sort($explode);
return $explode;
}
}
class file
{
private $sort=null;
private $filepath;
public function __construct($arrobj,$path)
{
$this->sort=$arrobj;
$this->filepath=$path;
}
private function getresource($filename,$mode)
{
return fopen($this->filepath.$filename,$mode);
}
private function closeresource($resource)
{
fclose($resource);
}
public function savefile($filename)
{
$arr=$this->sort->sort();
$fopen=$this->getresource($filename,」a+」);
if(!$fopen){
echo 「文件打開失敗!」;exit;
}
var_dump($arr);
foreach($arr as $key=>$value)
{
fwrite($fopen,$value.」\n」);
}
$this->closeresource($fopen);
}
public function readfile($filename)
{
$this->savefile($filename);
$fopen=$this->getresource($filename,」r」);
if(!$fopen){
echo 「文件打開失敗!」;exit;
}
$arr=array();
while(!feof($fopen))
{
$get=fgets($fopen);
if(!empty($get))
$arr[]=str_replace(「\n」,」",$get);
}
$this->closeresource($fopen);
return $arr;
}
}
$file=new file(new sort(‘Apple Orange Banana Strawberry’),」E:\\」);
$arr=$file->readfile(「fruit.dat」);
var_dump($arr);
?>
複製代碼題四:
<?php
/**
* 單例模式,建立mysqli數據庫連接的單例對象
* @author zhuwenqiong
*
*/
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);
}
}
windows平臺, Apache Http Server啓動失敗, 排錯思路是什麼?
答:
檢查apache使用的80端口是否被佔用,若是被佔用,先中止佔用80端口的服務,而後啓動apache服務器
PHP session擴展默認將session數據儲存在哪裏? D
A) SQLite DatabaseB) MySQL DatabaseC) Shared Memory
D) File SystemE) Session Server
.若是你想要自動加載類,下面哪一種函數聲明是正確的 C
A) function autoload($class_name)B) function __autoload($class_name, $file)
C) function __autoload($class_name)D) function _autoload($class_name)
E) function autoload($class_name, $file)
PHP程序使用utf-8編碼, 如下程序輸出結果是什麼?D
<?php
$str = ’hello你好世界’;
echo strlen($str);
?>
A) 9B) 13C) 18D) 17
你所知道的php數組相關的函數?
答:
Array_flip()
Array_pop()
Array_push()
Array_unshift()
End()
Sort()
Rsort()
Usort()
Count()
Key()
Current()
List()
Each()
Foreach()
Array_count_values()
Array_difff()
Arrry_keys()
Array_merge()
Array_pad()
Array_rand()
Array_shift()
Array_unique()
Array_values()
Next()
Prev()
Reset()
php讀取文件內容的幾種方法和函數?
答:
打開文件,而後讀取。Fopen() fread()
打開讀取一次完成 file_get_contents()
如下程序,變量str什麼值的狀況下輸出111? if( ! $str ) { echo 111; }
答:
在$str值爲:0,’0′,false,null,」"
說說你對緩存技術的瞭解?
答:
1、緩存技術是將動態內容緩存到文件中,在必定時間內訪問動態頁面直接調用緩存文件,而沒必要從新訪問數據庫。
2、使用memcache能夠作緩存。
你所知道的設計模式有哪些?
答:
工廠模式、策略模式、單元素模式、觀察者模式、命令鏈模式
說說你對SVN的瞭解?優缺點?
答:
SVN是一種版本控制器,程序員開發的代碼遞交到版本服務器進行集中管理。
SVN的優勢:代碼進行集中管理,版本控制容易,操做比較簡單,權限控制方便。
缺點:不能隨意修改服務器項目文件夾。
PHP加速模式/擴展? PHP調試模式/工具?
答:
Zend Optimizer加速擴展
調試工具:xdebug
你經常使用到的mysql命令?
答:
Select * from table
Update table set field=’value’ where id=
Delete from where id=
Insert into table values(‘value1′,’value2′)
Create table tablename
Show tables
進入mysql管理命令行的命令?
答:
Mysql -u root -p
show create database mysql; 這個命令的做用?
答:顯示建立數據庫的sql語句
show create table user; 這個命令的做用?
答:顯示建立表的sql語句
desc user; 這個命令的做用?
答:查詢user表的結構
explain select * from user; 這個命令的做用?
答:獲取select相關信息
show processlist; 這個命令的做用?
答:顯示哪些線程正在運行
SHOW VARIABLES; 這個命令的做用?
答:
顯示系統變量和值
SHOW VARIABLES like ’%conn%’; 這個命令的做用?
答:顯示系統變量名包含conn的值
LEFT JOIN 寫一個SQL語句?
答:
Select A.id,A.class from A left join B on A.cid=B.id
in, not in, exist, not exist的做用和區別?
答:
in在什麼中
Not in 不在什麼中
Exists 存在
Not exists 不存在
怎麼找到數據庫的配置文件路徑?
答:
在數據庫安裝目錄下,my.ini
linux: rpm -qc mysql
簡述Linux下安裝PHP的過程?
答:
安裝軟件以前先安裝編譯工具gcc、gcc-c++
拷貝源碼包,解包解壓縮
Cd /lamp/php進入php目錄
./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc指定安裝目錄和配置文件目錄
Make 編譯
Make install安裝
簡述Linux下安裝Mysql的過程?
答:
Groupadd mysql 添加一個用戶組mysql
Useradd -g mysql mysql 添加一個mysql用戶指定分組爲mysql
Cd /lamp/mysql 進入mysql目錄
./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all
Make
Make all
簡述Linux下安裝apache的過程?
答:
Cd /lamp/httpd 進去apache軟件目錄
./configure –prefix=/usr/local/apache2/ –sysconfdir=/etc/httpd/ –with-included-apr
Make
Make all
HTML/CSS/DIV/Javascritp:
用javascript取得一個input的值?取得一個input的屬性?
答:
document.getElementById(‘name’).value;
document.getElementById(‘name’).getAttribute('name');
用Jquery取得一個input的值?取得一個input的屬性?
答:
$(「input[name='aa']「).val();
$(「input[name='aa']「).attr(‘name’);
請您寫一段ajax提交的js代碼,或者寫出ajax提交的過程邏輯。
答:
var xmlhttp;
if(window.XMLHttpRquest)
{
xmlhttp=new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP’);
}
xmlhttp.open(‘GET’,’1.php?aa=name’,true);
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4)
{
if(xmlhttp.status==200)
{
var text=xmlhttp.responseText;
}
}
}
xmlhttp.send(null);
寫出你認爲語言中的高級函數
答:
Imagecreate
Imagecolorallocate
Imagesetpixel
Imagettftext
Iconv
Mb_substr
Mysql_connect()
Mysql_select_db
Mysql_query
mysql_fetch_row
Mysql_close
簡述Cookie的設置及獲取過程
答:
設置COOKIE的值:
Setcookie(名稱,值,保存時間,有效域);
獲取值:$_COOKIE['名稱'];
面向對象中接口和抽象類的區別及應用場景
答:
1、有抽象方法的類叫作抽象類,抽象類中不必定有抽象方法,抽象方法必須使用abstract關鍵字定義。
2、接口中所有是抽象方法,方法不用使用abstract定義。
3、當多個同類的類要設計一個上層,一般設計爲抽象類,當多個異構的類要設計一個上層,一般設計爲接口。
用面向對象來實現A對象繼承B和C對象
答:
Interface B{
}
Interface C{
}
Class A implements B,C{
}
寫出Smarty模板引擎中你最經常使用的關鍵詞
答:
Assign
Display
Foreach
Section
Loop
Item
$smarty
Now
Const
get
MySQL存儲引擎中MyISAM和InnoDB,在一樣的應用場景中各有什麼優缺點,索引結構如何實現?
答:
MyISAM不支持外鍵和事務處理,可是查詢速度比InnoDB類型的稍快。
InnoDB類型數據庫支持外鍵和事務處理,查詢速度比MyISAM稍慢。
建立索引:alert table tablename add index (`字段名`)
以下user表結構
名稱 |
類型 |
說明 |
備註 |
Uid |
Int unsigned |
主鍵 |
|
Name |
Varchar(20) |
|
|
Age |
Tinyint unsigned |
|
|
需求:
l 增長一個字段性別sex,寫出修改語句
Alert table user add sex enum(’0′,’1′);
l 查詢出年齡介於20歲到30歲之間的用戶
Select * from user where age>20 and age<30
若是是一個Web頻繁訪問的查詢,上題的查詢如何優化?
使用memcache緩存技術,在必定時間內將動態內容緩存到文件中,訪問動態頁面時,直接調用緩存文件而沒必要從新查詢數據庫。
echo(),print(),print_r()的區別?
答:
Echo() 是PHP語法,能夠輸出多個值,不能輸出數組。
Print() 是PHP函數,能夠輸出單個簡單類型的變量值。
Print_r() 是php函數,能夠打印出複雜類型變量的值,如數組,對象。
什麼是模板技術、可以使HTML和PHP分離開使用的模板?
答:
模板技術就是使程序的邏輯代碼和界面分開的技術。
可以使HTML和PHP分開的模板有:Smarty、Template、PHPlib Template、FastTemplate
對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?
答:
優化程序,優化數據庫,若是程序和數據庫已經最優化,使用如下解決方法:
1、肯定當前服務器設備是否知足流量需求。
2、使用Memcache緩存技術,把動態內容緩存到文件中,動態網頁直接調用這些文件,而沒必要再訪問數據庫。
3、禁止外部盜鏈,圖片和文件外部盜鏈會給服務器帶來大量的負載壓力,能夠經過refer來禁止外部盜鏈,或者使用apache來配置禁止盜鏈。
4、控制大文件的下載,大文件的下載對於非SCSI硬盤來講會佔用大量的資源,致使服務器的響應能力降低。
5、使用不一樣的主機分流主要流量,使服務器均衡負載。
6、使用流量統計軟件統計分析網站流量,能夠知道哪些地方耗費了大量的流量,哪些頁面須要再進行優化。
mysql_fetch_row() 和mysql_fetch_array之間有什麼區別?
答:
Mysql_fetch_row()以索引數組的方式取查詢的結果集,mysql_fetch_array()以索引數組和關聯數組兩種方式取查詢的結果集。
實現中文字串截取無亂碼的方法
答:
Mb_substr();
用PHP寫出顯示客戶端IP與服務器IP的代碼
答:
獲取客戶端IP:get_env(「REMOTE_ADDR」);
獲取服務器端IP:$_SERVER["SERVER_ADDR"];
有一個網頁地址, 好比PHP開發資源網主頁: http://www.phpres.com/index.html,如何獲得它的內容?
答:
獲取網頁內容:
$url=」http://www.phpres.com/index.html「;
$str=file_get_contents($url);
請寫一個函數驗證電子郵件的格式是否正確
答:
function checkemail($email)
{
echo preg_match(‘/^[\w]+@[\w]+[\.]([\w]+)$/’,$email)?’email格式正確‘:’email格式不正確‘;
}
簡述如何獲得當前執行腳本路徑,包括所獲得參數
答:
用$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];取得當前頁面的完整路徑和參數。
取得參數:$_SERVER['QUERY_STRING'];
JS表單彈出對話框函數是?得到輸入焦點函數是?
答:
Alert();
Onfocus();
.寫一個函數,算出兩個文件的相對路徑
如 $a = ’/a/b/c/d/e.php’;
$b = ’/a/b/12/34/c.php’;
計算出 $b 相對於 $a 的相對路徑應該是 http://www.cnblogs.com/c/d將()添上
$a=」http://www.cnblogs.com/a/b/c/d/e.php」;
$b=」http://www.cnblogs.com/a/b/12/34/c.php」;
答:
$ainfo=parse_url($a);
$binfo=parse_url($b);
$apath=ltrim($ainfo['path'],’/');
$bpath=ltrim($binfo['path'],’/');
$arr=explode(‘/’,$apath);
$brr=explode(‘/’,$bpath);
$count=count($arr);
for($i=0;$i<$count;$i++)
{
if($arr[$i]==$brr[$i])
{
$brr[$i]=’..’;
}
else
{
break;
}
}
$cha=implode(‘/’,$brr);
print_r($cha);
寫一個函數,可以遍歷一個文件夾下的全部文件和子文件夾。
答:
function show($dirs){
$dir=opendir($dirs);
While($f=readdir($dir))
{
If($f!=’.' && $f!=’..’)
{
$file=$dirs.’/’.$f;
If(is_file($file))
{
Echo ’文件名:‘.$file.’<br/>’;
}
Else
{
Show($file);
}
}
}
}
Cookie和session的區別,禁止了cookie後session能正常使用嗎?session的缺點是什麼?session在服務器端是存在哪裏的?是共有的仍是私有的?
答:
COOKIE保存在客戶端,用戶經過手段能夠進行修改,不安全,單個cookie容許的最大值是3k。
而SESSION保存在服務器端,相對比較安全,大小沒有限制。
禁用了cookie以後session不能正常使用。
Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗。
Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。
Session文件是公有的。
數據庫索引有幾類,分別是什麼?何時該用索引?
答:
普通索引、主鍵索引、惟一索引
並不是全部的數據庫都以相同的方式使用索引,做爲通用規則,只有當常常查詢列中的數據時才須要在表上建立索引。
寫幾個魔術方法並說明做用?
答:
__call()當調用不存在的方法時會自動調用的方法
__autoload()在實例化一個還沒有被定義的類是會自動調用次方法來加載類文件
__set()當給未定義的變量賦值時會自動調用的方法
__get()當獲取未定義變量的值時會自動調用的方法
__construct()構造方法,實例化類時自動調用的方法
__destroy()銷燬對象時自動調用的方法
__unset()當對一個未定義變量調用unset()時自動調用的方法
__isset()當對一個未定義變量調用isset()方法時自動調用的方法
__clone()克隆一個對象
__tostring()當輸出一個對象時自動調用的方法
$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILE的意思是什麼?
答;
它們都是PHP預約義變量。
$_REQUEST用來獲取post或get方式提交的值。
$_POST用來獲取post方式提交的值。
$_GET用來獲取get方式提交的值。
$_COOKIE用來獲取cookie存儲的值,
$_SESSION用來獲取session存儲的值,
$_FILE用來獲取上傳文件表單的值
數組中下標最好是什麼類型的,爲何?
答:
數組的下標最好是數字類型的,數字類型的處理速度快。
++i和i++哪個效率高,爲何?
答:
++i效率比i++的效率更高,由於++i少了一個返回i的過程。
119.magic_quotes_gpc()、magic_quotes_runtime()的意思是什麼?
答:
Magic_quotes_gpc()是php配置文件中的,若是設置爲on則會自動POST,GET,COOKIE中的字符串進行轉義,在‘以前加\
Magic_quotes_runtime()是php中的函數,若是參數爲true則會數據庫中取出來的單引號、雙引號、反斜線自動加上反斜槓進行轉義。
120.Echo()、print()、print_r()的區別?
答:
Echo 是php語法,能夠輸出多個變量,不能輸出數組。
Print()是php中的函數,只能輸出簡單的變量。
Print_r()是php中的函數,能夠輸出變量也能夠輸出數組。
121.框架中什麼是單一入口和多入口,單一入口的優缺點?
答:
1、多入口就是經過訪問不一樣的文件來完成用戶請求。
單一入口只web程序全部的請求都指向一個腳本文件的。
2、單一入口更容易控制權限,方便對http請求能夠進行安全性檢查。
缺點:URL看起來不那麼美觀,特別是對搜索引擎來講不友好。
122.提示類型200、404、502是什麼意思。
答:
200是請求成功,404是文件未找到,502是服務器內部錯誤。
123.編寫一個自定義函數提取這段路徑的的後綴名。
答:
「Www/hello/test.php.html?a=3&b=4」
Function geturltype($url){
$info=parse_url($url);
Return end(explode(‘.’,$info['path']));
}
124.你對Memcach的理解,優勢有哪些?
答:
Memcache是一種緩存技術,在必定的時間內將動態網頁通過解析以後保存到文件,下次訪問時動態網頁就直接調用這個文件,而沒必要在從新訪問數據庫。使用memcache作緩存的好處是:提升網站的訪問速度,減輕高併發時服務器的壓力。
Memcache的優勢:穩定、配置簡單、多機分佈式存儲、速度快。
125.對關係型數據庫而言,索引是至關重要的概念,請回答有關索引幾個問題:
a) 索引的目的是什麼?
b) 索引對數據庫系統的負面影響是什麼?
c) 爲數據表創建索引的原則有哪些?
d) 什麼狀況下不宜創建索引?
答:
索引的目的:
1、快速訪問數據表中的特定信息,提升檢索速度
2、建立惟一性索引,保證數據庫表中每一行數據的惟一性
3、加速表和表之間的鏈接
4、使用分組和排序子句進行數據檢索時,能夠顯著減小查詢中分組和排序的時間
負面影響:建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;當對錶進行增、刪、改的時候索引也要動態維護,這樣就下降了數據的維護速度。
創建索引的原則:
1、在最頻繁使用的、用以縮小查詢範圍的字段上創建索引
2、在平頻繁使用的、須要排序的字段上創建索引
什麼狀況下不宜創建索引:
1、對於查詢中不多涉及的列或者重複值比較多的列,不宜創建索引
2、對於一些特殊的數據類型,不宜創建索引,好比文本字段(text)等。
126.web應用中,數據庫的讀取頻率遠高於寫入頻率, 如何優化MySQL而應對此種情景 ?
答:
使用memcache緩存技術,將動態數據緩存到文件,訪問動態頁面時直接調用緩存文件,而沒必要從新訪問數據庫,這樣就減小了查詢數據庫的次數。
若是網站的訪問量很大,能夠把數據庫讀寫服務器分開,使用多臺服務器去處理數據庫查詢,使用較少的服務器去處理數據庫的寫入和修改。
127.include與require的區別?
答:
Php在遇到include時就從新解釋一次,若是一個頁面中出現10次include,php就從新解釋10次,而php遇到require時只解釋一次,即便頁面中出現屢次require,php也直解釋一次。
使用require包含文件時,被包含的文件當成了當前文件的一個組成部分,若是被包含的文件中有語法錯誤或者文件不存在,程序就提示錯誤信息,並結束執行。
使用include包含文件時,至關於指定了文件的路徑,被包含的文件中有語法錯誤或者文件不存在時,頁面只是給出警告信息,不響應程序自己的執行。
128.PHP字符串中單引號與雙引號的區別?
答:
單引號不能解釋變量,而雙引號能夠解釋變量。
單引號不能轉義字符,在雙引號中能夠轉義字符。
132.指出如下代碼片斷中的SQL注入漏洞以及解決方法(magic_quotes_gpc = off)
答:
mysql_query(「select id,title from content where catid=’{$_GET[catid]}’ and title like ’%$_GET[keywords]%’」, $link);
注入漏洞主要存在用戶提交的數據上,這裏的注入漏洞主要是$_GET[catid]和$_GET[keyword]
解決注入漏洞:
$_GET[catid]=intval($_GET[catid]);
$sql=」select id,title from content where catid=’{$_GET[catid]}’ and title like ’%$_GET[keywords]%」;
$sql=addslashes($sql);
Mysql_query($sql);
133.分別指出php.ini中 magic_quotes_gpc, magic_quotes_runtime兩項參數的做用.
答:
Magic_quotes_gpc的做用是在POST、GET、COOKIE數據上使用addslashes()自動轉義。
Magic_quotes_runtime參數的做用是設置狀態,當狀態爲0時則關閉自動轉義,設置爲1則自動轉義,將數據庫中取出來的單引號、雙引號、反斜線這些字符加上反斜槓轉義。
134.寫出如下php代碼的運行結果:
<?php
function foo($i) {
$i++;
echo $i ;
}
function bar(&$i) {
}
$i = 10 ;
echo $i++ , ++$i; 輸出:10,12
foo($i); 輸出:13
bar($i); 輸出:無輸出
135.如何快速下載一個遠程http服務器上的圖片文件到本地?
答:
$file=」";
$fp=fopen($file,’rb’);
$img=fread($fp,10000);
$dir=」./」;
$local=fopen($dir.’/’.basename($file),’w');
Fwrite($local,$img);
136.什麼是時間戳? 如何取得當前時間戳?
答:
時間戳是從1970年1月1日 00:00:00到指定日期的秒數。
獲取當前時間戳:time()
137. 與cookie的區別與關係, 禁用cookie後, session可否正常使用?
答:
SESSION存儲在服務器端,COOKIE保存在客戶端。
Session比較安全,cookie用某些手段能夠修改,不安全。
Session依賴於cookie進行傳遞。
禁用cookie後,session不能正常使用。
138.HTTP/1.1協議中 200和404狀態碼是什麼含義?
答:
200是請求成功,404是文件未找到
139.瞭解XSS攻擊嗎? 如何防止 ?
答:
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個特權模式去執行攻擊者構造的腳本,而後利用不安全的Activex控件執行惡意的行爲。
使用htmlspecialchars()函數對提交的內容進行過濾,使字符串裏面的特殊符號實體化。
140.SQL注入漏洞產生的緣由 ? 如何防止?
答:
SQL注入產生的緣由:程序開發過程當中不注意規範書寫sql語句和對特殊字符進行過濾,致使客戶端能夠經過全局變量POST和GET提交一些sql語句正常執行。
防止SQL注入:
1、開啓配置文件中的magic_quotes_gpc和magic_quotes_runtime設置
2、執行sql語句時使用addslashes進行sql語句轉換
3、Sql語句書寫儘可能不要省略小引號和單引號
4、過濾掉sql語句中的一些關鍵字:update、insert、delete、select、*
5、提升數據庫表和字段的命名技巧,對一些重要的字段根據程序的特色命名,取不易被猜到的。
6、Php配置文件中設置register_globals爲off,關閉全局變量註冊
7、控制錯誤信息,不要再瀏覽器上輸出錯誤信息,將錯誤信息寫到日誌文件中。
141.一個字節佔多少bit ? 一個IPv4地址佔幾個字節? 一個IPv6地址呢?
答:
一個字節佔8bit,一個IPV4佔用4字節,一個IPV6佔用16字節。
142.M ADSL寬帶鏈接, 理想狀況下, 最大下載速度是多少KB/s ?
答:
256KB/s
143.請寫出一個正則表達式,用於匹配一個HTML文件中<img />標記中的圖片地址
答:
$url=」<img src=’11.jpg’/>」;
/<img[\s]*src=['|\"](.*)['|\"][\s]*\/>/
145.Fatal error: Call to undefined method ge_user() in /website/index.php on line 39
答:
調用了未定義的方法ge_user(),檢查程序中有沒有定義此方法
146.Fatal error: Class ’client’ not found in /website/index.php on line 173
答:
類client沒有找到,檢查文件中有沒有client類,或者有沒有包含client類文件
147.Warning: Cannot modify header information - headers already sent by (output started at /website/index.php:1) in /website/index.php on line 3
答:
提示文件前面有輸出,檢查是否有輸出,或者編碼
148.Warning:session_start(): open(/website/tmp/sess_47e067121facf033785f9a1cb16d243b, O_RDWR) failed: No such file or directory (2) in /website/index.php on line 10
答:
沒有找到文件或目錄,檢查文件是否存在
149.Parse error: syntax error, unexpected T_STRING in /website/index.php on line 18
答:
18行語法錯誤,檢查語法
150.Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /website/index.php on line 2
答:
沒有找到welcome.txt文件,檢查文件是否存在
1、抓取遠程圖片到本地,你會用什麼函數?
fsockopen, A
2、用最少的代碼寫一個求3值最大值的函數.
function($a,$b,$c){
* W0 z* u6 k+ e. L a: }5 } return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c );
5 O: F6 v1 W# U}
3、用PHP打印出前一天的時間,打印格式是2007年5月10日22:21:21
Echo date(‘Y-m-d H:i:s’,strtotime(‘-1 day’));
4、javascript可否定義二維數組,若是不能你如何解決?
javascript不支持二維數組定義,能夠用arr[0] = new array()來解決
5、假設a.html和b.html在同一個文件夾下面,用javascript實現當打開a.html五秒鐘後,自動跳轉到b.html。
<script>
function go2b(){
window.location = 「b.html」;
window.close();
}
setTimeout( 「go2b()」,5000 ); //5秒鐘後自動執行go2b()
</script>
6、//正在瀏覽當前頁面用戶的 IP 地址:127.0.0.1
echo $_SERVER["REMOTE_ADDR"].」<br />」;
//查詢(query)的字符串(URL 中第一個問號 ? 以後的內容):id=1&bi=2
echo $_SERVER["QUERY_STRING"].」<br />」;
//當前運行腳本所在的文檔根目錄:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"].」<br />」;
7、在HTTP 1.0中,狀態碼 401 的含義是未受權____;若是返回「找不到文件」的提示,則可用 header 函數,其語句爲header(「HTTP/1.0 404 Not Found」);
答:401表示未受權;header(「HTTP/1.0 404 Not Found」);
8、寫一個函數,可以遍歷一個文件夾下的全部文件和子文件夾。
<?php
function my_scandir($dir)
{
$files=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!=」.」 && $file!=」..」)
{
if(is_dir($dir.」/」.$file))
{
$files[$file]=my_scandir($dir.」/」.$file);
}
else
{
$files[]=$dir.」/」.$file;
}
}
}
closedir($handle);
return $files;
}
}
}
print_r(my_scandir(「D:Program FilesInternet ExplorerMUI」));
?>
9、把 John 新增到 users 陣列?
$users[] = ‘john’; array_push($users,‘john’);
10、在PHP中error_reporting這個函數有什麼做用?
答:error_reporting() 設置 PHP 的報錯級別並返回當前級別。
11、請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。
答:
<?php
$email=$_POST['email'];
if(!preg_match(‘/^[\w.]+@([\w.]+)\.[a-z]{2,6}$/i’,$email)) {
echo 「電子郵件檢測失敗」;
}else{
echo 「電子郵件檢測成功」;
}
?>
12、用PHP寫出顯示客戶端IP與服務器IP的代碼
答:打印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服務器IP:echo gethostbyname(「www.bolaiwu.com」)
13、如何修改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);
14、有一個網頁地址, 好比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」);
15、請說明php中傳值與傳引用的區別。何時傳值何時傳引用?(2分)
答:按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。
按引用傳遞則不須要複製值,對於性能提升頗有好處。
16、寫一個函數,儘量高效的,從一個標準 url 裏取出文件的擴展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 須要取出 php 或 .php
答案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(「.」,$file);
return $ext[1];
}
答案2:
function getExt($url) {
$url = basename($url);
$pos1 = strpos($url,」.」);
$pos2 = strpos($url,」?」);
if(strstr($url,」?」)){
return substr($url,$pos1 + 1,$pos2 – $pos1 – 1);
} else {
return substr($url,$pos1);
}
}
17、使用五種以上方式獲取一個文件的擴展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必須使用PHP自帶的處理函數進行處理,方法不能明顯重複,能夠封裝成函數,好比 get_ext1($file_name), get_ext2($file_name)
function get_ext1($file_name){
return strrchr($file_name, ‘.’);
}
function get_ext2($file_name){
return substr($file_name, strrpos($file_name, ‘.’));
}
function get_ext3($file_name){
return array_pop(explode(‘.’, $file_name));
}
function get_ext4($file_name){
$p = pathinfo($file_name);
return $p['extension'];
}
function get_ext5($file_name){
return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ‘.’)));
}
18、<?php
$str1 = null;
$str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’;
$str3 = 」;
$str4 = 0;
echo $str3==$str4 ? ‘相等’ : ‘不相等’;
$str5 = 0;
$str6 = ’0′;
echo $str5===$str6 ? ‘相等’ : ‘不相等’;
?>
相等 相等 不相等
19、MySQL數據庫中的字段類型varchar和char的主要區別是什麼?那種字段的查找效率要高,爲何?
Varchar是變長,節省存儲空間,char是固定長度。查找效率要char型快,由於varchar是非定長,必須先查找長度,而後進行數據的提取,比char定長類型多了一個步驟,因此效率低一些
20、請使用JavaScript寫出三種產生一個Image 標籤的方法(提示:從方法、對象、HTML角度考慮)
(1)var img = new Image();
(2)var img = document.createElementById(「image」)
(3)img.innerHTML = 「<img src=」xxx.jpg」 />」
21、16.請描述出兩點以上XHTML和HTML最顯著的區別
(1)XHTML必須強制指定文檔類型DocType,HTML不須要
(2)XHTML全部標籤必須閉合,HTML比較隨意
22、寫一個排序算法,能夠是冒泡排序或者是快速排序,假設待排序對象是一個維數組。
//冒泡排序(數組排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $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 quicksort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quicksort($left_arr);
$right_arr = quicksort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
23、寫出三種以上MySQL數據庫存儲引擎的名稱(提示:不區分大小寫)
MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十幾個引擎
24、求兩個日期的差數,例如2007-2-5 ~ 2007-3-6 的日期差數
方法一:
<?php
class Dtime
{
function get_days($date1, $date2)
{
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
}
$Dtime = new Dtime;
echo $Dtime->get_days(’2007-2-5′, ’2007-3-6′);
?>
方法二:
<?php
$temp = explode(‘-’, ’2007-2-5′);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(‘-’, ’2007-3-6′);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:echo abs(strtotime(「2007-2-1″)-strtotime(「2007-3-1″))/60/60/24 計算時間差
25、請寫一個函數,實現如下功能:
字符串「open_door」 轉換成 「OpenDoor」、」make_by_id」 轉換成 」MakeById」。
方法:
function str_explode($str){
$str_arr=explode(「_」,$str);$str_implode=implode(」 「,$str_arr); $str_implode=implode
(「」,explode(」 「,ucwords($str_implode)));
return $str_implode;
}
$strexplode=str_explode(「make_by_id」);print_r($strexplode);
方法二:$str=」make_by_id!」;
$expStr=explode(「_」,$str);
for($i=0;$i<count($expStr);$i++)
{
echo ucwords($expStr[$i]);
}方法三:echo str_replace(‘ ‘,」,ucwords(str_replace(‘_’,’ ‘,’open_door’)));
26、一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數,用SQL語句及視圖、
存儲過程分別實現。
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
方法:視圖:
create view v_countNum as select member_id,count(*) as countNum from member group by
member_id
select countNum from v_countNum where member_id=1
27、js中網頁前進和後退的代碼 ( 前進: history.forward();=history.go(1); 後退: history.back
();=history.go(-1); )
28、echo count(「abc」); 輸出什麼?
答案:1
count — 計算數組中的單元數目或對象中的屬性個數
int count ( mixed$var [, int $mode ] ), 若是 var 不是數組類型或者實現了 Countable 接口的對象,將返回1,有一個例外,若是 var 是 NULL 則結果是 0。
對於對象,若是安裝了 SPL,能夠經過實現 Countable 接口來調用 count()。該接口只有一個方法 count(),此方法返回 count() 函數的返回值。
29、有一個一維數組,裏面存儲整形數據,請寫一個函數,將他們按從大到小的順序排列。要求執行效率高。並說明如何改善執行效率。(該函數必須本身實現,不能使用php函數)
<?php
function BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>
30、請舉例說明在你的開發過程當中用什麼方法來加快頁面的加載速度
答:要用到服務器資源時纔打開,及時關閉服務器資源,數據庫添加索引,頁面可生成靜態,圖片等大文件單獨服務器。使用代碼優化工具
31、.如下的代碼會產生什麼?爲何?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
因爲函式 multiply() 沒有指定 $num 爲全域變量(例如 global $num 或者 $_GLOBALS['num']),因此 $num 的值是 10。
32. php class中static,public,private,protected的區別?
static 靜態,類名能夠訪問
public 表示全局,類內部外部子類均可以訪問;
private表示私有的,只有本類內部能夠使用;
protected表示受保護的,只有本類或子類或父類中能夠訪問;
33. HTTP協議中GET、POST和HEAD的區別?
HEAD: 只請求頁面的首部。
GET: 請求指定的頁面信息,並返回實體主體。
POST: 請求服務器接受所指定的文檔做爲對所標識的URI的新的從屬實體。
(1)HTTP 定義了與服務器交互的不一樣方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST 僅用於更新站點。
(2)在FORM提交的時候,若是不指定Method,則默認爲GET請 求,Form中提交的數據將會附加在url以後,以?分開與url分開。字母數字字符原樣發送,但空格轉換爲「+「號,其它符號轉換爲%XX,其中XX爲 該符號以16進製表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;
GET方式提交的數據最多隻能有1024字節,而POST則沒有此限制。
(3)GET 這個是瀏覽器用語向服務器請求最經常使用的方法。POST這個方法也是用來傳送數據的,可是與GET不一樣的是,使用POST的時候,數據不是附在URI後面傳遞的,而是要作爲獨立的行來傳遞,此時還必需要發送一個Content_length標題,以標明數據長度,隨後一個空白行,而後就是實際傳送的數據。網頁的表單一般是用POST來傳送的。
1.可以使html和php分離開使用的模板?
答:Smarty、template、PHPlibTemplate、FastTemplate
2.使用那些工具進行版本控制?
答:
Clear case
2.CVS
3.SVN
4.PVCS
5 Perforce
6.CCC
7.StarTeam
8.RCS
3.寫出Zend框架的目錄結構,簡單說明目錄做用?
答:
application/ – 存放應用程序的目錄,包括 MVC 系統、配置文件、服務以及引導程序(Bootstrap.php)
configs/ –配置文件目錄。
application/modules – 多模塊目錄結果例如admin(後臺前程),default(前臺),shop(商城)各個模塊下都有本身的controllers,modules,Views
controllers/models/views/ – 控制器/模型/視圖 目錄。
application/cache –存放緩存等數據
application/helpers/ – 這個是存放「行動助手」(action helper)的目錄。這些助手類默認的命名空間是「Controller_Helper_」,若是是多模塊那麼命令空間將是「<Module>_Controller_Helper」。
Bootstrap.php – 這個是應用程序入口文件。這個類的主要工做是引導應用程序,註冊並初始化組件(component)。注意:不要在這個文件調用前置控制器(front controller)的dispatch() 方法。
library/ – 存放類庫的目錄。第三方的類庫和本身寫的類庫放在這裏進行自動 加載 但要注意要用本身獨立的命名空間(建子目錄)。
public/ – 存放公開文件的目錄,也即網站的根目錄,存放能夠被用戶訪問的文件,例如js、css和圖片等等。index.php 是應用程序的單入口,其主要工做是創建php環境,引用Bootstrap.php來初始化,並調用前置控制器的dispatch()方法來分發請求。
4.談談對mvc的認識?
答:
MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分紅三個核心部件:模型、視圖、控制器。它們各自處理本身的任務。
視圖是用戶看到並與之交互的界面。
模型表示企業數據和業務規則。
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。
MVC的優勢:低耦合性、高重用性和可適用性、較低的生命週期成本、快速的部署、可維護性、可擴展性,有利於軟件工程化管理
MVC的缺點:沒有明確的定義,徹底理解MVC並不容易。不適合小型規模的應用程序。
5. PHP如何拋出和接收錯誤?
答:
使用try...catch,異常的代碼放在try代碼塊內,若是沒有觸發異常,則代碼繼續執行,若是異常被觸發,就會拋出一個異常。Catch代碼塊捕獲異常,並建立一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
6.下面的類是否正確,若是正確請補全方法輸入類屬性$_a;錯誤請修改並輸出屬性$_a
<?php
Class A
{
protected$a=1;
publicfunction test()
{
echo$this->a;
}
}
答:
$a=new A;
$a->test();
?>
7.請取出數組中的最大值?
$a=array(1,9,3,5,6,8);
$a=array(1,2,3,4,5,9);
答:
$b=max($a);
echo $b;
or
$a=array(1,9,3,5,6,8);
rsort($a);
Echo array_shift($a);
8.請說明PHP中傳值和引用的區別。何時傳值何時引用?
答:
按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略。
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改。
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。
按引用傳遞則不須要複製值,對於性能提升頗有好處。
若是不想改變原變量的值的時候就傳值,如
$a=1;
function aa($a){
echo ++$a;
}
aa($a);
若是可讓函數改變了原變量的值就能夠引用傳值,
$a=1;
function aa(&$a){
echo ++$a;
}
aa($a);
9.有一個一維數組,裏面存儲整形數據,請寫一個函數,將他們按從大到小的順序排列。要求執行效率高。並說明如何改善執行效率。(該函數必須本身實現,不能使用PHP函數)
答:
$a=array(1,9,3,5,6,8,7);
<?php
function getMinStr($str) {
for ($i=0;$i<count($str);$i++) {
for($j=$i+1;$j<count($str);$j++) {
if($str[$i]<$str[$j]) {
$tmp = $str[$i];
$str[$i]=$str[$j];
$str[$j]=$tmp;
}
}
}
return $str;
}
$str = array(4,3,8,9,2);
print_r(getMinStr($str));
10.請問同時知足這樣條件的數:被10除於9,被9除於8,被8除於7,在100—1000之間,有幾個這樣的數?(並寫出算法)
答:
A不存在,B 1個 C2個 D 3個
分析過程:
P除以10餘9:P+1就被10整除
P除以9餘8:P+1就被9整除
P除以8餘7:P+1就被8整除
因此P=8,9,10的功倍數-1
8=2*2*2,9=3*3,10=2*5
則P+1必定是2*2*2*3*3*5的倍數(只能約掉一個2 )
又100<=P<=1000
101<=P+1<=1001
因此P+1=360,720
因此P=359,719
11.請寫出一個簡單的靜態數組?
答:
Class A{
Static $a=array('11'=>'1111');
}
Print_r(A::$a);
12.寫一個簡單的jquery顯示隱藏代碼?
答:
$("#aa").hide();
$("#aa").show();
13.語句include和require的區別是什麼?
答:
PHP在遇到include時就必須從新解釋一次,若是在同一個頁面出現10次include,它便會從新解釋10次。PHP遇到require時,無論在同一個php網頁中出現幾回require,PHP只會解釋一次而已。
Require執行效率比include高。
Require包含進來的內容被當成當前文件的一個組成部分,因此當包含進來的文件有語法錯誤或者文件不存在的時候,那個PHP腳本都再也不執行。Include函數至關於指定這個文件的路徑,當被包含的文件有錯時不會影響到自己的程序執行。
Include能夠進行判斷是否包含,而require則是無論任何狀況都包含進來。
14.用PHP獲取當前時間並打印,打印格式:2006-5-10 22:21:21
答:
Echo Date("Y-m-d H:i:s");
15.字符串轉數組,數組轉字符串,字符串截取,字符串替換,字符串查找的函數分別是什麼?
答:
Implode()、explode()、substr()、str_replace()、strpos、strrpos、strstr
16.解釋一下PHP的類中:protect,public,private,interface,abstract,final,static的含義
答:
Protected受保護的,在本類和子類中有效。
Public 公共的,在本類、子類中、類外均可以使用。
Private 私有的,在本類中有效。
Interface 定義一個接口時使用的關鍵字。
Abstract 定義一個抽象類或者抽象方法時使用的關鍵字。
Final 用final申明的方法沒法被覆蓋,用final申明的類不能被繼承。
Static 定義靜態方法或者靜態屬性使用的關鍵字
17.寫出下列代碼的數據結果
答:
$date='08/26/2003';
print ereg_replace(「([0-9]+)/([0-9]+)/([0-9]+)」,2/1/3,$date,);
18.從表login中選出name字段包含admin的前10條結果全部信息的sql語句
答:
Select *from login where name like '%admin%' limit 0,10;
解釋:左鏈接,右鏈接,內鏈接,索引。
答:
1、內鏈接僅選出兩張表中互相匹配的記錄.所以,這會致使有時咱們須要的記錄沒有包含進來。內部鏈接是兩個表中都必須有鏈接字段的對應值的記錄,數據才能檢索出來。
2、左鏈接和右鏈接都是外部鏈接,也就是區別於內部鏈接,它對不知足鏈接條件的行並非象內部鏈接同樣將數據徹底過濾掉,而是保留一部分數據,行數不會減小。
3、左鏈接是隻要左邊表中有記錄,數據就能檢索出來,而右邊有的記錄必要在左邊表中有的記錄才能被檢索出來
4、右鏈接是隻要右邊表中有記錄,數據就能檢索出來 ;
5、全鏈接則會回返回兩個表中的全部記錄
20.簡述論壇中無限分類的實現原理。
答:
1、數據庫分類表的設計:id字段、父id字段、類名稱字段、path字段
2、Path字段存當前分類的路徑,格式:0,父類id,自己id
3、查詢分類:select * from 分類表order by path asc;
4、這樣就查出來每一個分類及其對應的子類。
1、命令注入(Command Injection)
2、eval注入(Eval Injection)
3、客戶端腳本攻擊(Script Insertion)
4、跨網站腳本攻擊(Cross Site Scripting, XSS)
5、SQL注入攻擊(SQL injection)
6、跨網站請求僞造攻擊(Cross Site Request Forgeries, CSRF)
7、Session 會話劫持(Session Hijacking)
8、Session 固定攻擊(Session Fixation)
9、HTTP響應拆分攻擊(HTTP Response Splitting)
10、文件上傳漏洞(File Upload Attack)
11、目錄穿越漏洞(Directory Traversal)
12、遠程文件包含攻擊(Remote Inclusion)
13、動態函數注入攻擊(Dynamic Variable Evaluation)
14、URL攻擊(URL attack)
15、表單提交欺騙攻擊(Spoofed Form Submissions)
16、HTTP請求欺騙攻擊(Spoofed HTTP Requests)
之後的每期連載,會逐個介紹這些漏洞的原理和防護方法。
幾個重要的php.ini選項
Register Globals
php>=4.2.0,php.ini的register_globals選項的默認值預設爲Off,當register_globals的設定爲On時,程序能夠接收來自服務器的各類環境變量,包括表單提交的變量,並且因爲PHP沒必要事先初始化變量的值,從而致使很大的安全隱患。
例1:
//check_admin()用於檢查當前用戶權限,若是是admin設置$is_admin變量爲true,而後下面判斷此變量是否爲true,而後執行管理的一些操做
//ex1.php
<?php
if (check_admin())
{
$is_admin = true;
}
if ($is_admin)
{
do_something();
}
?>
這一段代碼沒有將$is_admin事先初始化爲Flase,若是register_globals爲On,那麼咱們直接提交 http://www.sectop.com/ex1.php?is_admin=true,就能夠繞過check_admin()的驗證
例2:
//ex2.php
<?php
if (isset($_SESSION["username"]))
{
do_something();
}
else
{
echo 「您還沒有登陸!」;
}
?>
當register_globals=On時,咱們提交=dodo]http://www.sectop.com/ex2.php?_SESSION[username]=dodo,就具備了此用戶的權限
因此無論register_globals爲何,咱們都要記住,對於任何傳輸的數據要通過仔細驗證,變量要初始化
safe_mode
安全模式,PHP用來限制文檔的存取、限制環境變量的存取,控制外部程序的執行。啓用安全模式必須設置php.ini中的safe_mode = On
1、限制文件存取
safe_mode_include_dir = 「/path1:/path2:/path3″
不一樣的文件夾用冒號隔開
2、限制環境變量的存取
safe_mode_allowed_env_vars = string
指定PHP程序能夠改變的環境變量的前綴,如:safe_mode_allowed_env_vars = PHP_ ,當這個選項的值爲空時,那麼php能夠改變任何環境變量
safe_mode_protected_env_vars = string
用來指定php程序不可改變的環境變量的前綴
3、限制外部程序的執行
safe_mode_exec_dir = string
此選項指定的文件夾路徑影響system、exec、popen、passthru,不影響shell_exec和「` `」。
disable_functions = string
不一樣的函數名稱用逗號隔開,此選項不受安全模式影響
magic quotes
用來讓php程序的輸入信息自動轉義,全部的單引號(「’」),雙引號(「」」),反斜槓(「\」)和空字符(NULL),都自動被加上反斜槓進行轉義
magic_quotes_gpc = On 用來設置magic quotes 爲On,它會影響HTTP請求的數據(GET、POST、Cookies)
程序員也能夠使用addslashes來轉義提交的HTTP請求數據,或者用stripslashes來刪除轉義
1、 若是能將類的方法定義成static,就儘可能定義成static,它的速度會提高將近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print快,而且使用echo的多重參數(譯註:指用逗號而不是句點)代替字符串鏈接,好比echo$str1,$str2。
4、在執行for循環以前肯定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。
5、註銷那些不用的變量尤爲是大數組,以便釋放內存。
6、儘可能避免使用__get,__set,__autoload。
7、require_once()代價昂貴。
8、include文件時儘可能使用絕對路徑,由於它避免了PHP去include_path裏查找文件的速度,解析操做系統路徑所需的時間會更少。
9、若是你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER[‘REQUEST_TIME’]要好於 time()。
10、函數代替正則表達式完成相同功能。
11、str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
12、若是一個字符串替換函數,可接受數組或字符做爲參數,而且參數長度不太長,那麼能夠考慮額外寫一段替換代碼,使得每次傳遞參數是一個字符,而不是隻寫一行代碼接受數組做爲查詢和替換的參數。
13、使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句。
14、用@屏蔽錯誤消息的作法很是低效,極其低效。
15、打開apache的mod_deflate模塊,能夠提升網頁的瀏覽速度。
16、數據庫鏈接當使用完畢時應關掉,不要用長鏈接。
17、錯誤消息代價昂貴。
18、在方法中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度至關。
19、遞增一個全局變量要比遞增一個局部變量慢2倍。
20、遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變量慢3倍。
21、遞增一個未預約義的局部變量要比遞增一個預約義的局部變量慢9至10倍。
22、僅定義一個局部變量而沒在函數中調用它,一樣會減慢速度(其程度至關於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量。
23、方法調用看來與類中定義的方法的數量無關,由於我(在測試方法以前和以後都)添加了10個方法,但性能上沒有變化。
24、派生類中的方法運行起來要快於在基類中定義的一樣的方法。
25、調用帶有一個參數的空函數,其花費的時間至關於執行7至8次的局部變量遞增操做。相似的方法調用所花費的時間接近於15次的局部變量遞增操做。
26、Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。儘可能多用靜態HTML頁面,少用腳本。
27、除非腳本能夠緩存,不然每次調用時都會從新編譯一次。引入一套PHP緩存機制一般能夠提高25%至100%的性能,以避免除編譯開銷。
28、儘可能作緩存,可以使用memcached。memcached是一款高性能的內存對象緩存系統,可用來加速動態Web應用程序,減輕數據庫負載。對運算碼 (OP code)的緩存頗有用,使得腳本沒必要爲每一個請求作從新編譯。
29、當操做字符串並須要檢驗其長度是否知足某種要求時,你想固然地會使用strlen()函數。此函數執行起來至關快,由於它不作任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字符串長度。可是,因爲strlen()是函數,多多少少會有些慢,由於函數調用會通過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一塊兒執行。在某些狀況下,你能夠使用isset() 技巧加速執行你的代碼。
(舉例以下)
if (strlen($foo) < 5) { echo 「Foo is too short」$$ }
(與下面的技巧作比較)
if (!isset($foo{5})) { echo 「Foo is too short」$$ }
調用isset()恰巧比strlen()快,由於與後者不一樣的是,isset()做爲一種語言結構,意味着它的執行不須要函數查找和字母小寫化。也就是說,實際上在檢驗字符串長度的頂層代碼中你沒有花太多開銷。
34、當執行變量$i的遞增或遞減時,$i++會比++$i慢一些。這種差別是PHP特有的,並不適用於其餘語言,因此請不要修改你的C或 Java代碼並期望它們能當即變快,沒用的。++$i更快是由於它只須要3條指令(opcodes),$i++則須要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所做的那樣。牢記這個優化處理不失爲一個好主意,由於並非全部的指令優化器都會作一樣的優化處理,而且存在大量沒有裝配指令優化器的互聯網服務提供商(ISPs)和服務器。
35、並非事必面向對象(OOP),面向對象每每開銷很大,每一個方法和對象調用都會消耗不少內存。
36、並不是要用類實現全部的數據結構,數組也頗有用。
37、不要把方法細分得過多,仔細想一想你真正打算重用的是哪些代碼?
38、當你須要時,你總能把代碼分解成方法。
39、儘可能採用大量的PHP內置函數。
40、若是在代碼中存在大量耗時的函數,你能夠考慮用C擴展的方式實現它們。
41、評估檢驗(profile)你的代碼。檢驗器會告訴你,代碼的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程序,評估檢驗整體上能夠顯示出代碼的瓶頸。
42、mod_zip可做爲Apache模塊,用來即時壓縮你的數據,並可以讓數據傳輸量下降80%。
43、在能夠用file_get_contents替代file、fopen、feof、fgets等系列方法的狀況下,儘可能用 file_get_contents,由於他的效率高得多!可是要注意file_get_contents在打開一個URL文件時候的PHP版本問題;
44、儘可能的少進行文件操做,雖然PHP的文件操做效率也不低的;
45、優化Select SQL語句,在可能的狀況下儘可能少的進行Insert、Update操做;
46、儘量的使用PHP內部函數(可是我卻爲了找個PHP裏面不存在的函數,浪費了本能夠寫出一個自定義函數的時間,經驗問題啊!);
47、循環內部不要聲明變量,尤爲是大變量:對象(這好像不僅是PHP裏面要注意的問題吧?);
48、多維數組儘可能不要循環嵌套賦值;
49、在能夠用PHP內部字符串操做函數的狀況下,不要用正則表達式;
50、foreach效率更高,儘可能用foreach代替while和for循環;
51、用單引號替代雙引號引用字符串;
52、「用i+=1代替i=i+1。符合c/c++的習慣,效率還高」;
53、對global變量,應該用完就unset()掉。
. 如何用php的環境變量獲得一個網頁地址的內容?ip地址又要怎樣獲得?
程序代碼
echo $_SERVER ["PHP_SELF"];
echo $_SERVER ["SERVER_ADDR"];
2. 求兩個日期的差數,例如2007-2-5 ~ 2007-3-6 的日期差數
程序代碼
$begin=strtotime(「2007-2-5″);
$end=strtotime(「2007-3-6″);
echo ($end-$begin)/(24*3600);
3. 請寫一個函數,實現如下功能:
字符串「open_door」 轉換成 「OpenDoor」、」make_by_id」 轉換成 」MakeById」。
程序代碼
function changeStyle(& $str) {
/*$str = str_replace ( 「_」, 」 「, $str );
$str = ucwords ( $str );
$str = str_replace ( 」 「, 「」, $str );
return $str;*/
$arrStr=explode(「_」,$str);
foreach($arrStr as $key=>$value){
$arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1);
}
return implode(「」,$arrStr);
}
$s = 「open_door」;
echo changeStyle ( $s );
1. include和require有什麼區別?
區別在於他們如何處理失敗, 若是require的文件沒有找到, 會形成fatal error,腳本中止執行,若是include的文件沒有找到, 會顯示警告,可是腳本會繼續執行。
2. 給一個變量賦值爲0123,可是輸出該變量的值老是爲其餘數字,請問這是什麼問題?
PHP 解釋器會把以0開始的數字當作是八進制的,因此它的值會變成八進制的。
3. PHP裏面如何定義一個常量(constant)?
經過define()指令,例如:define(」MYCONSTANT」, 100)
4. 如何對一個變量進行值傳遞?
能夠像C++那樣, 在變量的前面加上&, 例如:$a = &$b
5. 在PHP裏面能夠對string 「10″ 和整型 11進行比較嗎?
能夠,PHP內部實現會把全部東西轉換成整型,因此數字10和11能夠進行比較
6. 在什麼狀況下須要用endif 來結束條件語句?
當if語句後面跟的是冒號」:」而不是大括號{時,須要用endif來結束條件語句
14.簡述論壇中無限分類的實現原理。
答:
<?php
/*
數據表結構以下:
CREATE TABLE `category` (
`categoryID` smallint(5) unsigned NOT NULL auto_increment,
`categoryParentID` smallint(5) unsigned NOT NULL default '0',
`categoryName` varchar(50) NOT NULL default '',
PRIMARY KEY (`categoryID`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES
(0, '一級類別'),
(1, '二級類別'),
(1, '二級類別'),
(1, '二級類別'),
(2, '三級類別'),
(2, '333332'),
(2, '234234'),
(3, 'aqqqqqd'),
(4, '哈哈'),
(5, '66333666');
*/
//指定分類id變量$category_id,而後返回該分類的全部子類
//$default_category爲默認的選中的分類
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
global $DB;
$sql = "SELECT * FROM category ORDER BY categoryID DESC";
$result = $DB->query( $sql );
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' => $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows
[categoryName]);
}
if (!isset($category_array[$category_id]))
{
return "";
}
foreach($category_array[$category_id] AS $key => $category)
{
if ($category['id'] == $default_category)
{
echo "
}else
{
echo " }
if ($level > 0)
{
echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "
\n";
}
else
{
echo ">" . $category['name'] . "
\n";
}
Get_Category($key, $level + 1, $default_category);
}
unset($category_array[$category_id]);
}
/*
函數返回的數組格式以下所示:
Array
(
[1] => Array ( [id] => 1 [name] => 一級類別 [level] => 0 [ParentID] => 0 )
[4] => Array ( [id] => 4 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 )
[3] => Array ( [id] => 3 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )
[2] => Array ( [id] => 2 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 )
[6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 )
[5] => Array ( [id] => 5 [name] => 三級類別 [level] => 2 [ParentID] => 2 )
[10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 )
)
*/
//指定分類id,而後返回數組
function Category_array($category_id = 0,$level=0)
{
global $DB;
$sql = "SELECT * FROM category ORDER BY categoryID DESC";
$result = $DB->query($sql);
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;
}
foreach ($category_array AS $key=>$val)
{
if ($key == $category_id)
{
foreach ($val AS $k=> $v)
{
$options[$k] =
array(
'id' => $v['categoryID'], 'name' => $v['categoryName'], 'level' => $level, 'ParentID'=>$v['categoryParentID']
);
$children = Category_array($k, $level+1);
if (count($children) > 0)
{
$options = $options + $children;
}
}
}
}
unset($category_array[$category_id]);
return $options;
}
?>
<?php
class cate
{
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
echo $category_id;
$arr = array(
'0' => array(
'1' => array('id' => 1, 'parent' => 0, 'name' => '1111'),
'2' => array('id' => 2, 'parent' => 0, 'name' => '2222'),
'4' => array('id' => 4, 'parent' => 0, 'name' => '4444')
),
'1' => array(
'3' => array('id' => 3, 'parent' => 1, 'name' => '333333'),
'5' => array('id' => 5, 'parent' => 1, 'name' => '555555')
),
'3' => array(
'6' => array('id' => 6, 'parent' => 3, 'name' => '66666'),
'7' => array('id' => 7, 'parent' => 3, 'name' => '77777')
),
'4' => array(
'8' => array('id' => 8, 'parent' => 4, 'name' => '8888'),
'9' => array('id' => 9, 'parent' => 4, 'name' => '9999')
)
);
if (!isset($arr[$category_id]))
{
return "";
}
foreach($arr[$category_id] AS $key => $cate)
{
if ($cate['id'] == $default_category)
{
$txt = "
}else{
$txt = " }
if ($level > 0)
{
$txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . "
\n";
}else{
$txt1 = ">" . $cate['name'] . "
\n";
}
$val = $txt.$txt1;
echo $val;
self::Get_Category($key, $level + 1, $default_category);
}
}
function getFlush($category_id = 0,$level = 0, $default_category = 0)
{
ob_start();
self::Get_Category($category_id ,$level, $default_category);
$out = ob_get_contents();
ob_end_clean();
return $out;
}
}
$id =$_GET['id'];
echo "
";
?>
1、 引言
PHP是一種力量強大但至關容易學習的服務器端腳本語言,即便是經驗很少的程序員也可以使用它來建立複雜的動態的web站點。然而,它在實現因特網服務的祕密和安全方面卻經常存在許多困難。在本系列文章中,咱們將向讀者介紹進行web開發所必需的安全背景以及PHP特定的知識和代碼-你能夠藉以保護你本身的web應用程序的安全性和一致性。首先,咱們簡單地回顧一下服務器安全問題-展現你如何存取一個共享宿主環境下的私人信息,使開發者脫離開生產服務器,維持最新的軟件,提供加密的頻道,而且控制對你的系統的存取。
而後,咱們討論PHP腳本實現中的廣泛存在的脆弱性。咱們將解釋如何保護你的腳本免於SQL注入,防止跨站點腳本化和遠程執行,而且阻止對臨時文件及會話的」劫持」。
在最後一篇中,咱們將實現一個安全的Web應用程序。你將學習如何驗證用戶身份,受權並跟蹤應用程序使用,避免數據損失,安全地執行高風險性的系統命令,並可以安全地使用web服務。不管你是否有足夠的PHP安全開發經驗,本系列文章都會提供豐富的信息來幫助你構建更爲安全的在線應用程序。
2、 什麼是SQL注入
若是你打算永遠不使用某些數據的話,那麼把它們存儲於一個數據庫是毫無心義的;由於數據庫的設計目的是爲了方便地存取和操做數據庫中的數據。可是,若是隻是簡單地這樣作則有可能會致使潛在的災難。這種狀況並不主要是由於你本身可能偶然刪除數據庫中的一切;而是由於,當你試圖完成某項」無辜」的任務時,你有可能被某些人所」劫持」-使用他本身的破壞性數據來取代你本身的數據。咱們稱這種取代爲」注入」。
其實,每當你要求用戶輸入構造一個數據庫查詢,你是在容許該用戶參與構建一個存取數據庫服務器的命令。一位友好的用戶可能對實現這樣的操做感受很滿意;然而,一位惡意的用戶將會試圖發現一種方法來扭曲該命令,從而致使該被的扭曲命令刪除數據,甚至作出更爲危險的事情。做爲一個程序員,你的任務是尋找一種方法來避免這樣的惡意攻擊。
3、 SQL注入工做原理
構造一個數據庫查詢是一個很是直接的過程。典型地,它會遵循以下思路來實現。僅爲說明問題,咱們將假定你有一個葡萄酒數據庫表格」wines」,其中有一個字段爲」variety」(即葡萄酒類型):
1. 提供一個表單-容許用戶提交某些要搜索的內容。讓咱們假定用戶選擇搜索類型爲」lagrein」的葡萄酒。
2. 檢索該用戶的搜索術語,而且保存它-經過把它賦給一個以下所示的變量來實現:
$variety = $_POST['variety'];
所以,變量$variety的值如今爲:
lagrein
3. 而後,使用該變量在WHERE子句中構造一個數據庫查詢:
$query = 「SELECT * FROM wines WHERE variety=’$variety’」;
因此,變量$query的值如今以下所示:
SELECT * FROM wines WHERE variety=’lagrein’
4. 把該查詢提交給MySQL服務器。
5. MySQL返回wines表格中的全部記錄-其中,字段variety的值爲」lagrein」。
到目前爲止,這應該是一個你所熟悉的並且是很是輕鬆的過程。遺憾的是,有時咱們所熟悉並感到溫馨的過程卻容易致使咱們產生自滿情緒。如今,讓咱們再從新分析一下剛纔構建的查詢。
1. 你建立的這個查詢的固定部分以一個單引號結束,你將使用它來描述變量值的開始:
$query = 」 SELECT * FROM wines WHERE variety = ‘」;
2. 使用原有的固定不變的部分與包含用戶提交的變量的值:
$query .= $variety;
3. 而後,你使用另外一個單引號來鏈接此結果-描述該變量值的結束:
$ query .= 「‘」;
因而,$query的值以下所示:
SELECT * FROM wines WHERE variety = ‘lagrein’
這個構造的成功依賴用戶的輸入。在本文示例中,你正在使用單個單詞(也多是一組單詞)來指明一種葡萄酒類型。所以,該查詢的構建是無任何問題的,而且結果也會是你所指望的-一個葡萄酒類型爲」lagrein」的葡萄酒列表。如今,讓咱們想象,既然你的用戶不是輸入一個簡單的類型爲」lagrein」的葡萄酒類型,而是輸入了下列內容(注意包括其中的兩個標點符號):
lagrein’ or 1=1;
如今,你繼續使用前面固定的部分來構造你的查詢(在此,咱們僅顯示$query變量的結果值):
SELECT * FROM wines WHERE variety = ‘
而後,你使用包含用戶輸入內容的變量的值與之進行鏈接(在此,以粗體顯示):
SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;
最後,添加上下面的下引號:
SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;’
因而,這個查詢結果與你的指望會至關不一樣。事實上,如今你的查詢包含的不是一條而是兩條指令,由於用戶輸入的最後的分號已經結束了第一條指令(進行記錄選擇)從而開始了一條新的指令。在本例中,第二條指令,除了一個簡單的單引號以外別無心義;可是,第一條指令也不是你所想實現的。當用戶把一個單引號放到他的輸入內容的中間時,他結束了指望的變量的值,而且引入了另外一個條件。所以,再也不是檢索那些variety爲」lagrein」的記錄,而是在檢索那些知足兩個標準中任何一個(第一個是你的,而第二個是他的-variety爲」lagrein」或1等於1)的記錄。既然1老是1,所以,你會檢索到全部的記錄!
你可能反對:我不會使用雙引號來代替單引號來描述用戶提交的變量嗎?不錯,這至少能夠減慢惡意用戶的攻擊。(在之前的文章中,咱們提醒過你:應該禁止全部對用戶的錯誤通知信息。若是在今生成一條錯誤消息,那麼,它有可能偏偏幫助了攻擊者-提供一個關於他的攻擊爲何失敗的具體的解釋。)
在實踐中,使你的用戶可以看到全部的記錄而不僅是其中的一部分乍看起來彷佛不太費事,但實際上,這的確費事很多;看到全部的記錄可以很容易地向他提供有關於該表格的內部結構,從而也就向他提供了使其之後實現更爲惡毒目的的一個重要參考。若是你的數據庫中不是包含顯然無害的酒之類信息而是包含例如一個含有僱員年收入的列表,那麼,剛纔描述情形會是特別真實的。
而從理論角度分析,這種攻擊也的確是一件很可怕的事情。因爲把意外的內容注入到你的查詢中,因此,此用戶可以實現把你的數據庫存取轉化爲用於實現他本身的目的。所以如今,你的數據庫已經對他打開-正如對你敞開同樣。
4、 PHP和MySQL注入
如咱們前面所描述的,PHP,從自己設計來講,並無作什麼特別的事情-除了按照你的指示操做以外。所以,若是爲惡意用戶所用,它也只是按照要求」容許」特別設計的攻擊-例如咱們前面所描述的那樣。
咱們將假定,你不會故意地或甚至是偶然地構造一個具備破壞性效果的數據庫查詢-因而,咱們假定問題出在來自你的用戶的輸入方面。如今,讓咱們來更爲細緻地分析一下用戶可能向你的腳本提供信息的各類途徑。
5、 用戶輸入的類型
現在,用戶可以影響你的腳本的行爲已變得愈來愈複雜。
用戶輸入最明顯的來源固然是表單上的一個文本輸入域。使用這樣的一個域,你簡直是在故意教唆一個用戶輸入任意數據。並且,你向用戶提供了一個很大的輸入範圍;沒有什麼辦法可以使你提早限制一個用戶可以輸入的數據類型(儘管你可以選擇限制它的長度)。這正是絕大多數的注入式攻擊源主要來自於無防備的表單域的緣由。
可是,還存在其它的攻擊源,而且稍加思考你就會想到的一種潛於表單後臺的技術-POST方法!經過簡單地分析顯示在瀏覽器的導航工具欄中的URI,一個善於觀察的用戶可以很容易地看出是什麼信息傳遞到了一個腳本。儘管典型狀況下這樣的URI是以編程方式生成的,可是,沒有什麼辦法可以阻止一個惡意的用戶簡單地把一個帶有一個不適當的變量值的URI輸入到一個瀏覽器中-而這樣潛在地打開一個可能會被其濫用的數據庫。
限制用戶輸入內容的一個經常使用策略是在一個表單中提供一個選擇框,而不是一個輸入框。這種控件可以強制用戶從一組預約義的值中進行選擇,而且可以在必定程度上阻止用戶輸入指望不到的內容。可是正如一個攻擊者可能」哄騙」一個URI(也便是,建立一個可以模仿一個可信任的卻無效的URI)同樣,他也可能模仿建立你的表單及其本身的版本,並所以在選項框中使用非法的而不是預約義的安全選擇。要實現這點是極其簡單的;他僅須要觀察源碼,而後剪切而且粘貼該表單的源代碼-而後一切爲他敞開大門。
在修改該選擇以後,他就可以提交表單,而且他的無效的指令就會被接受,就象它們是原始的指令同樣。所以,該用戶能夠使用許多不一樣的方法試圖把惡意的代碼注入到一個腳本中。
基礎題:
1.表單中 get與post提交方法的區別?
答:get是發送請求HTTP協議經過url參數傳遞進行接收,而post是實體數據,能夠經過表單提交大量信息.
2.session與cookie的區別?
答:session:儲存用戶訪問的全局惟一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來講是存儲在用戶WIN的Temp目錄中的。
二者均可經過時間來設置時間長短
3.數據庫中的事務是什麼?
答:事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做 完成,事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。
簡述題:
1、用PHP打印出前一天的時間格式是2006-5-10 22:21:21(2分)
答:echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));
2、echo(),print(),print_r()的區別(3分)
答:echo是PHP語句, print和print_r是函數,語句沒有返回值,函數能夠有返回值(即使沒有用)
print() 只能打印出簡單類型變量的值(如int,string)
print_r() 能夠打印出複雜類型變量的值(如數組,對象)
echo 輸出一個或者多個字符串
3、可以使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
5、使用哪些工具進行版本控制?(1分)
答:cvs,svn,vss;
6、如何實現字符串翻轉?(3分)
答:echo strrev($a);
7、優化MYSQL數據庫的方法。(4分,多寫多得)
答:
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) 8i VALUES (‘$name1′)」;
mysql_query(「SELECT * FROM `orderinfo` where customerid=」.$id」);
mysql_query(「COMMIT」);
5、鎖定表,優化事務處理:
a.咱們用一個 SELECT 語句取出初始數據,經過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE(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";
8、PHP的意思(送1分)
答:PHP是一個基於服務端來建立動態網站的腳本語言,您能夠用PHP和HTML生成網站主頁
9、MYSQL取得當前時間的函數是?,格式化日期的函數是(2分)
答:now(),date()
10、實現中文字串截取無亂碼的方法。(3分)
答:function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
$str=null;
$len=$start+$length;
for($i=$start;$i<$len;$i++){
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.’…’;
}else{
return $string;
}
}
11、您是否用過版本控制軟件? 若是有您用的版本控制軟件的名字是?(1分)
12、您是否用過模板引擎? 若是有您用的模板引擎的名字是?(1分)
答:用過,smarty
13、請簡單闡述您最得意的開發之做(4分)
答:信息分類
14、對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?(4分)
答:確認服務器硬件是否足夠支持當前的流量,數據庫讀寫分離,優化數據表,
程序功能規則,禁止外部的盜鏈,控制大文件的下載,使用不一樣主機分流主要流量
15、用PHP寫出顯示客戶端IP與服務器IP的代碼1分)
答:打印客戶端IP:echo $_SERVER['REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服務器IP:echo gethostbyname(「www.bolaiwu.com」)
16、語句include和require的區別是什麼?爲避免屢次包含同一文件,可用(?)語句代替它們? (2分)
答:require->require是無條件包含也就是若是一個流程里加入require,不管條件成立與否都會先執行require
include->include有返回值,而require沒有(可能由於如此require的速度比include快)
注意:包含文件不存在或者語法錯誤的時候require是致命的,include不是
17、如何修改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);
18、有一個網頁地址, 好比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」);
19、在HTTP 1.0中,狀態碼401的含義是(?);若是返回「找不到文件」的提示,則可用 header 函數,其語句爲(?);(2分)
答:狀態401表明未被受權,header(「Location:www.xxx.php」);
12、在PHP中,heredoc是一種特殊的字符串,它的結束標誌必須?(1分)
答:heredoc的語法是用」<<<"加上本身定義成對的標籤,在標籤範圍內的文字視爲一個字符串
例子:
$str = << my name is Jiang Qihui!
SHOW;
13、談談asp,php,jsp的優缺點(1分)
答:ASP全名Active Server Pages,是一個WEB服務器端的開發環境, 利用它能夠產生和運
行動態的、交互的、高性能的WEB服務應用程序。ASP採用腳本語言VB Script(Java script
)做爲本身的開發語言。
PHP是一種跨平臺的服務器端的嵌入式腳本語言. 它大量地借用C,Java和Perl語言的語法
, 並耦合PHP本身的特性,使WEB開發者可以快速地寫出動態生成頁面.它支持目前絕大多數數
據庫。還有一點,PHP是徹底免費的,不用花錢,你能夠從PHP官方站點(http://www.php.ne
t)自由下載。並且你能夠不受限制地得到源碼,甚至能夠從中加進你本身須要的特點。
JSP 是Sun公司推出的新一代站點開發語言,他徹底解決了目前ASP,PHP的一個通病--
腳本級執行(聽說PHP4 也已經在Zend 的支持下,實現編譯運行).Sun 公司藉助本身在Jav
a 上的不凡造詣,將Java 從Java 應用程序 和 Java Applet 以外,又有新的碩果,就是Js
p--Java Server Page。Jsp 能夠在Serverlet和JavaBean的支持下,完成功能強大的站點
程序。
三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。
但JSP代碼被編譯成 Servlet 並由 Java 虛擬機解釋執行,這種編譯操做僅在對 JSP 頁面的
第一次請求時發生。在 ASP 、PHP、JSP 環境下, HTML 代碼主要負責描述信息的顯示樣式
,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴於 Web 服務器,而 ASP 、PH
P、JSP 頁面須要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被從新嵌入到
HTML 代碼中,而後一塊兒發送給瀏覽器。 ASP 、PHP、 JSP三者都是面向 Web 服務器的技術
,客戶端瀏覽器不須要任何附加的軟件支持。
14、談談對mvc的認識(1分)
答:由模型(model),視圖(view),控制器(controller)完成的應用程序
由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視圖;
15、寫出發貼數最多的十我的名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
16. 請說明php中傳值與傳引用的區別。何時傳值何時傳引用?(2分)
答:按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。
按引用傳遞則不須要複製值,對於性能提升頗有好處。
17. 在PHP中error_reporting這個函數有什麼做用? (1分)
答:設置錯誤級別與錯誤信息回報
18. 請寫一個函數驗證電子郵件的格式是否正確 (2分)
dy@sina.com
8047@qq.com
yahu@.com.cn
dy@163.com
dy_35
答: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);
}
19. 簡述如何獲得當前執行腳本路徑,包括所獲得參數。(2分)
答:$script_name = basename(__file__); print_r($script_name);
21、JS表單彈出對話框函數是?得到輸入焦點函數是? (2分)
答: