1. 什麼事面向對象?主要特征是什麼? 面向對象是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特征:封裝、繼承、多態。 更多學習內容請訪問: 怎麼從一名碼農成為架構師的必看知識點:目錄大全(不定期更新) 2. SESSION 與 COOKIE的區別是什麼,請從協議,產生的原因 ...
1. 什麼事面向對象?主要特征是什麼?
面向對象是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特征:封裝、繼承、多態。
更多學習內容請訪問:
怎麼從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)
2. SESSION 與 COOKIE的區別是什麼,請從協議,產生的原因與作用說明?
1、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看做是同一個用戶。
2、SESSION存儲在伺服器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。
禁用cookie後,session不能正常使用。Session的缺點:保存在伺服器端,每次讀取都從伺服器進行讀取,對伺服器有資源消耗。Session保存在伺服器端的文件或資料庫中,預設保存在文件中,文件路徑由php配置文件的session.save_path指定。Session文件是公有的。
3. HTTP 狀態中302、403、 500代碼含義?
一二三四五原則: 一. 消息系列 二 成功系列 三. 重定向系列 四. 請求錯誤系列 五. 伺服器端錯誤系列
302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:伺服器內部錯誤 401代表未授權。
4. Linux 下建立壓縮包,解壓縮包的命令
Tar.gz:
打包: tar czf file.tar.gz file.txt
解壓: tar xzf file.tar.gz
Bz2:
打包: bzip2 [-k] 文件
解壓: bunzip2 [-k] 文件
Gzip(只對文件,不保留原文件)
打包: gzip file1.txt
解壓: gunzip file1.txt.gz
Zip: -r 對目錄
打包: zip file1.zip file1.txt
解壓: unzip file1.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慢。
創建索引:alert table tablename add index (`欄位名`)
7. 不使用cookie向客戶端發送一個cookie.
理解:session_start()開啟時,生成一個常量 SID,當COOKIE開啟時,這個常量為空,當COOKIE關閉時,這個常量中存儲了PHPSESSID的值。通過在URL後加一個SID參數來傳遞SESSIONID的值,從而使客戶端頁面可以使用SESSION裡面的值。 當客戶端開啟COOKIE和伺服器端開啟SESSION時。 瀏覽器第一次請求,伺服器會向瀏覽器端發送一個COOKIE裡面存儲SESSIONID. 當瀏覽器第二次請求時,會把已存在
8. isset() 和 empty() 區別
Isset判斷變數是否存在,可以傳入多個變數,若其中一個變數不存在則返回假,empty判斷變數是否為空為假,只可傳一個變數,如果為空為假則返回真。
9. 如何在頁面之間傳遞變數(至少兩種方式) ? GET,POST,COOKIE,SESSION,隱藏表單
1. 寫出匹配URL的正則表達式.
‘/^(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|cn|org)(\/[\w-\.\/\?\%\&\=]*)?/i’
2. 請寫出常見的排序演算法,並用PHP實現冒泡排序,將數組$a = array()按照從小到大的方式進行排序。
常見的排序演算法: 冒泡排序法、快速排序法、簡單選擇排序法、堆排序法、直接插入排序法、希爾排序法、合併排序法。
冒泡排序法的基本思想是:對待排序記錄關鍵字從後往前(逆序)進行多遍掃描,當發現相鄰兩個關鍵字的次序與排序要求的規則不符時,就將這兩個記錄進行交換。這樣,關鍵字較小的記錄將逐漸從後面向前面移動,就象氣泡在水中向上浮一樣,所以該演算法也稱為氣泡排序法。
// 冒泡排序法
Function mysort($arr){
For($i=0; $i<count($arr); $i++){
For($j=0; $j<count($arr)-1-$i; $j++){
If($arr[$j] > $arr[$j+1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
}
}
}
Return $arr;
}
$arr=array(3,2,1);
print_r(mysort($arr));
3. 請說明 PHP 中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?
按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字元串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要複製值,對於性能提高很有好處。
在PHP中error_reporting這個函數有什麼作用?
設置 PHP 的報錯級別並返回當前級別。
請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。
if(isset($_POST['action']) && $_POST['action']==’submitted’){
$email=$_POST['email'];
if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){
echo “電子郵件檢測失敗”;
}else{
echo “電子郵件檢測成功”;
}
}
使用PHP描述快速排序演算法,對象可以是一個數組?
原理:快速排序使用分治策略來把待排序數據序列分為兩個子序列,具體步驟為:
(1)從數列中挑出一個元素,稱該元素為“基準”。
(2)掃描一遍數列,將所有比“基準”小的元素排在基準前面,所有比“基準”大的元素排在基準後面。
(3)通過遞歸,將各子序列劃分為更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列排序。
//快速排序(數組排序)
function QuickSort($arr){
$num = count($arr);
$l=$r=0;
for($i=1;$i<$num;$i++){
if($arr[$i] < $arr[0]){
$left[] = $arr[$i];
$l++;
}else{
$right[] = $arr[$i];
$r++;
}
}
if($l > 1){
$left = QuickSort($left);
}
$new_arr = $left;
$new_arr[] = $arr[0];
if($r > 1){
$right = QuickSort($right);
}
for($i=0;$i<$r;$i++){
$new_arr[] = $right[$i];
}
return $new_arr;
}
使用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;
}
}
寫一個二維數組排序演算法函數,能夠具有通用性,可以調用php內置函數(array_multisort())
//二維數組排序, $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";
}
請寫一段程式,在伺服器創建一個文件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);
單例模式,創建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);
}
}
windows平臺, Apache Http Server啟動失敗, 排錯思路是什麼?
檢查apache使用的80埠是否被占用,如果被占用,先停止占用80埠的服務,然後啟動apache伺服器
PHP session擴展預設將session數據儲存在哪裡? D
A) SQLite Database
B) MySQL Database
C) Shared Memory
D) File System
E) 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編碼, 以下程式輸出結果是什麼? B
<?php
$str = ’hello你好世界’;
echo strlen($str);
?>
A) 9 B) 13(gbk) C) 18 D) 17(utf8)
你所知道的php數組相關的函數?
array()----創建數組
array_combine()----通過合併兩個數組來創建一個新數組
range()----創建並返回一個包含指定範圍的元素的數組
compact()----建立一個數組
array_chunk()----將一個數組分割成多個
array_merge()----把兩個或多個數組合併成一個數組
array_slice()----在數組中根據條件取出一段值
array_diff()----返回兩個數組的差集數組
array_intersect()----計算數組的交集
array_search()----在數組中搜索給定的值
array_splice()----移除數組的一部分且替代它
array_key_exists()----判斷某個數組中是否存在指定的key
shuffle()----把數組中的元素按隨機順序重新排列
array_flip()----交換數組中的鍵和值
array_reverse()----將原數組中的元素順序翻轉,創建新的數組並返回
array_unique()----移除數組中重覆的值
php讀取文件內容的幾種方法和函數?
打開文件,然後讀取。Fopen() fread()
打開讀取一次完成 file_get_contents()
以下程式,變數str什麼值的情況下輸入111?
if( ! $str ) { echo 111; }
在$str值為:0,’0′,false,null,”"
你所知道的PHP的一些技術(smarty等)?
Smarty,jquery,ajax,memcache,div+css,js,mysqli,pdo,svn,thinkphp,brophp,yii
你所熟悉的PHP論壇系統 有哪些?
Discuz
你所熟悉的PHP商城系統 有哪些?
Ecshop
你所熟悉的PHP開發框架 有哪些?
Brophp,thinkphp
說說你對緩存技術的瞭解?
1、緩存技術是將動態內容緩存到文件中,在一定時間內訪問動態頁面直接調用緩存文件,而不必重新訪問資料庫。
2、使用memcache可以做緩存。
你所知道的設計模式有哪些?
工廠模式、策略模式、單元素模式、觀察者模式、命令鏈模式
說說你對代碼管理的瞭解? 常使用那些代碼版本控制軟體?
通常一個項目是由一個團隊去開發,每個人將自己寫好的代碼提交到版本伺服器,由項目負責人按照版本進行管理,方便版本的控制,提高開發效率,保證需要時可以回到舊版本。
常用的版本控制器:SVN
說說你對SVN的瞭解?優缺點?
SVN是一種版本控制器,程式員開發的代碼遞交到版本伺服器進行集中管理。
SVN的優點:代碼進行集中管理,版本控制容易,操作比較簡單,許可權控制方便。
缺點:不能隨意修改伺服器項目文件夾。
怎麼找到PHP.ini的路徑?
一般都在php的安裝目錄下,或者window系統的windows目錄下。
PHP加速模式/擴展? PHP調試模式/工具?
Zend Optimizer加速擴展
調試工具:xdebug
你常用到的mysql命令?
Show databases
Show tables
Insert into 表名() values()
Update 表名 set 欄位=值 where ...
Delete from 表名 where ...
Select * from 表名 where 條件 order by ... Desc/asc limit ... Group by ... Having ...
進入mysql管理命令行的命令?
Mysql -uroot -p 回車 密碼
show databases; 這個命令的作用?
顯示當前mysql伺服器中有哪些資料庫
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 ni, exist, not exist的作用和區別?
in在什麼中
Not in 不在什麼中
Exists 存在
Not exists 不存在
怎麼找到資料庫的配置文件路徑?
在資料庫安裝目錄下,my.ini
簡述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:
1. 設計一個頁面(4個 div 第一個div 寬960px 居中;第2-4個div 3等分960px;)
<style>
Body{ Text-align:center; Margin:0; Padding:0; }
#box{ Width:960px; Margin:0 auto; }
.small{ Width:320px; Float:left; }
</style>
<div id=’box’>
<div class=’small’></div>
<div class=’small’></div>
<div class=’small’></div>
</div>
用javascript取得一個input的值?取得一個input的屬性?
document.getElementById(‘name’).value;
document.getElementById(‘name’).type;
用Jquery取得一個input的值?取得一個input的屬性?
$(“input[name='aa']“).val();
$(“input[name='aa']“).attr(‘type’);
請您寫一段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);
簡述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
l 增加一個欄位性別sex,寫出修改語句
Alert table user add sex enum(’0′,’1′);
查詢出年齡介於20歲到30歲之間的用戶
Select * from user where age>20 and age<30
如果是一個Web頻繁訪問的查詢,上題的查詢如何優化?
可對where後面的欄位 age 建立索引,也可對語句建立存儲過程。
echo(),print(),print_r()的區別?
Echo,print是PHP語句, print_r是函數,
Print()只能列印出簡單類型變數的值(如int,string),有返回值。
print_r()可以列印出複雜類型變數的值(如數組,對象)
echo 輸出一個或者多個字元串,無返回值
什麼是模板技術、能夠使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:$_SERVER(“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);
或 $ch=curl_init();
curl_setopt($ch,CURLOPT_URL,’’);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_exec($ch);
curl_close($ch);
請寫一個函數驗證電子郵件的格式是否正確
function checkemail($email){
echo preg_match(‘/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+\.[0-9a-zA-Z]+$/’,$email)?’email格式正確‘:’email格式不正確‘;
}
簡述如何得到當前執行腳本路徑,包括所得到參數
用$_SERVER['SCRIPT_FILENAME'].$_SERVER['REQUEST_URI'];取得當前頁面的完整路徑和參數。
取得參數:$_SERVER['QUERY_STRING'];
JS表單彈出對話框函數是?獲得輸入焦點函數是?
Alert(); focus();
寫一個函數,算出兩個文件的相對路徑
如 $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);
$flag=false;
for($i=0;$i<count($arr);$i++){
if($arr[$i]!==$brr[$i]){
$ab[$i]='..';
if(!$flag){
for($j=$i;$j<count($brr);$j++){
$bb[]=$brr[$j];
}
$flag=true;
}
}
}
$cha=array_merge($ab,$bb);
$cha=implode('/',$cha);
print_r($cha);
寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
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;
}
}
資料庫索引有幾類,分別是什麼?什麼時候該用索引?
普通索引、主鍵索引、唯一索引
並非所有的資料庫都以相同的方式使用索引,作為通用規則,只有當經常查詢列中的數據時才需要在表上創建索引。
寫幾個魔術方法並說明作用?
__call()當調用不存在的方法時會自動調用的方法
__autoload()在實例化一個尚未被定義的類是會自動調用次方法來載入類文件
__set()當給未定義的變數賦值時會自動調用的方法
__get()當獲取未定義變數的值時會自動調用的方法
__construct()構造方法,實例化類時自動調用的方法
__destroy()銷毀對象時自動調用的方法
__unset()當對一個未定義變數調用unset()時自動調用的方法
__isset()當對一個未定義變數調用isset()方法時自動調用的方法
__clone()克隆一個對象
__tostring()當輸出一個對象時自動調用的方法
$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILES的意思是什麼?
它們都是PHP預定義變數
$_REQUEST用來獲取post或get方式提交的值
$_POST用來獲取post方式提交的值
$_GET用來獲取get方式提交的值
$_COOKIE用來獲取cookie存儲的值
$_SESSION用來獲取session存儲的值
$_FILES用來獲取上傳文件表單的值
數組中下標最好是什麼類型的,為什麼?
數組的下標最好是數字類型的,數字類型的處理速度快。
++i和i++哪一個效率高,為什麼?
++i效率比i++的效率更高,因為++i少了一個返回i的過程。
magic_quotes_gpc()、magic_quotes_runtime()的意思是什麼?
Magic_quotes_gpc()是php配置文件中的,如果設置為on則會自動POST,GET,COOKIE中的字元串進行轉義,在‘之前加\
Magic_quotes_runtime()是php中的函數,如果參數為true則會資料庫中取出來的單引號、雙引號、反斜線自動加上反斜杠進行轉義。
框架中什麼是單一入口和多入口,單一入口的優缺點?
1、多入口就是通過訪問不同的文件來完成用戶請求。
單一入口指web程式所有的請求都指向一個腳本文件的。
2、單一入口更容易控制許可權,方便對http請求可以進行安全性檢查。
缺點:URL看起來不那麼美觀,特別是對搜索引擎來說不友好。
你對Memcach的理解,優點有哪些?
Memcache是一種緩存技術,在一定的時間內將動態網頁經過解析之後保存到文件,下次訪問時動態網頁就直接調用這個文件,而不必在重新訪問資料庫。使用memcache做緩存的好處是:提高網站的訪問速度,減輕高併發時伺服器的壓力。
Memcache的優點:穩定、配置簡單、多機分散式存儲、速度快。
對關係型資料庫而言,索引是相當重要的概念,請回答有關索引幾個問題:
a) 索引的目的是什麼?
1、快速訪問數據表中的特定信息,提高檢索速度
2、創建唯一性索引,保證資料庫表中每一行數據的唯一性
3、加速表和表之間的連接
4、使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
b) 索引對資料庫系統的負面影響是什麼?
負面影響:創建索引和維護索引需要耗費時間,這個時間隨著數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對錶進行增、刪、改的時候索引也要動態維護,這樣就降低了數據的維護速度。
c) 為數據表建立索引的原則有哪些?
1、在最頻繁使用的、用以縮小查詢範圍的欄位上建立索引
2、在平頻繁使用的、需要排序的欄位上建立索引
d) 什麼情況下不宜建立索引?
1、對於查詢中很少涉及的列或者重覆值比較多的列,不宜建立索引
2、對於一些特殊的數據類型,不宜建立索引,比如文本欄位(text),值範圍較少的知道等。
web應用中,資料庫的讀取頻率遠高於寫入頻率, 如何優化MySQL而應對此種情景?
使用memcache緩存技術,將動態數據緩存到文件,訪問動態頁面時直接調用緩存文件,而不必重新訪問資料庫,這樣就減少了查詢資料庫的次數。
如果網站的訪問量很大,可以把資料庫讀寫伺服器分開,使用多台伺服器去處理資料庫查詢,使用較少的伺服器去處理資料庫的寫入和修改。
include與require的區別?
1.include()在執行文件時每次都要進行讀取和評估
require()文件只處理一次(實際上文件內容替換了require()語句)
2.require()通常放在PHP腳本程式的最前面
include()的使用和require()一樣,一般放在流程式控制制的處理區段中,PHP腳本文件讀到include()語句時,才將它包含的文件讀進來,這種方式,可以把程式執行時的流程簡單化
3,require()和include()語句是語言結構,不是真正的函數,可以像PHP的其他語言結構一樣
4,include_once()和require_once()語句也是在腳本執行期間包括並運行指定文件,與include()require()唯一的區別是如果文件中的代碼已經被包括了,則不會再次包括.
5,require()包含文件失敗,停止執行,給出錯誤(致命的)
include()常用於動態包含.
通常是自動載入的文件,即使載入出錯,整個程式還是繼續執行
一個頁面聲明,另一個頁面調用
包函文件失敗,繼續向下執行,返回一條警告
PHP字元串中單引號與雙引號的區別?
單引號不能解釋變數,而雙引號可以解釋變數。
單引號不能轉義字元,在雙引號中可以轉義字元。
php中,模板引擎的目的是什麼? 你用過哪些模板引擎?
使用模板引擎的目的是使程式的邏輯代碼和html界面代碼分離開,是程式的結構更清晰。
使用過的模板引擎:Smarty、ThinkPHP的ThinkTemplate
指出以下代碼片段中的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);
分別指出php.ini中 magic_quotes_gpc, magic_quotes_runtime兩項參數的作用.
Magic_quotes_gpc的作用是在POST、GET、COOKIE數據上使用addslashes()自動轉義。
Magic_quotes_runtime參數的作用是設置狀態,當狀態為0時則關閉自動轉義,設置為1則自動轉義,將資料庫中取出來的單引號、雙引號、反斜線這些字元加上反斜杠轉義。
寫出以下php代碼的運行結果:
<?php
function foo($i) {
$i++;
echo $i ;
}
function bar(&$i) {
}
$i = 10 ;
echo $i++ , ++$i; 輸出:10,12
foo($i); 輸出:13
bar($i); 輸出:無輸出
如何快速下載一個遠程http伺服器上的圖片文件到本地?
$file=”";
$fp=fopen($file,’rb’);
$img=fread($fp,10000);
$dir=”./”;
$local=fopen($dir.’/’.basename($file),’w');
Fwrite($local,$img);
什麼是時間戳? 如何取得當前時間戳?
時間戳是從1970年1月1日 00:00:00到指定日期的秒數。
獲取當前時間戳:time()
瞭解XSS攻擊嗎? 如何防止 ?
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個特權模式去執行攻擊者構造的腳本,然後利用不安全的Activex控制項執行惡意的行為。
使用htmlspecialchars()函數對提交的內容進行過濾,使字元串裡面的特殊符號實體化。
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、控制錯誤信息,不要再瀏覽器上輸出錯誤信息,將錯誤信息寫到日誌文件中。
一個位元組占多少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類文件
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
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>
//正在瀏覽當前頁面用戶的 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”);
9、把 John 新增到 users 陣列?
$users[] = ‘john’; array_push($users,‘john’);
在PHP中error_reporting這個函數有什麼作用?
error_reporting() 設置 PHP 的報錯級別並返回當前級別。
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”);
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);
}
}
使用五種以上方式獲取一個文件的擴展名
要求: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 ? ‘相等’ : ‘不相等’;
?>
相等 相等 不相等
MySQL資料庫中的欄位類型varchar和char的主要區別是什麼?那種欄位的查找效率要高,為什麼?
Varchar是變長,節省存儲空間,char是固定長度。查找效率要varchar型快,因為varchar是非定長,必須先查找長度,然後進行數據的提取,比char定長類型多了一個步驟,所以效率低一些
請使用JavaScript寫出三種產生一個Image 標簽的方法(提示:從方法、對象、HTML角度考慮)
(1)var img = new Image();
(2)var img = document.createElement(“image”)
(3)img.innerHTML = “<img src=”xxx.jpg” />”
請描述出兩點以上XHTML和HTML最顯著的區別
(1)XHTML必須強制指定文檔類型DocType,HTML不需要
(2)XHTML所有標簽必須閉合,HTML比較隨意
寫出三種以上MySQL資料庫存儲引擎的名稱(提示:不區分大小寫)
MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十幾個引擎
求兩個日期的差數,例如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 計算時間差
請寫一個函數,實現以下功能:
字元串“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’)));
一個表中的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
js中網頁前進和後退的代碼
前進: history.forward();=history.go(1);
後退: history.back();=history.go(-1);
echo count(“abc”); 輸出什麼?
答案:1
count — 計算數組中的單元數目或對象中的屬性個數
int count ( mixed$var [, int $mode ] ), 如果 var 不是數組類型或者實現了 Countable 介面的對象,將返回1,有一個例外,如果 var 是 NULL 則結果是 0。
對於對象,如果安裝了 SPL,可以通過實現 Countable 介面來調用 count()。該介面只有一個方法 count(),此方法返回 count() 函數的返回值。
有一個一維數組,裡面存儲整形數據,請寫一個函數,將他們按從大到小的順序排列。要求執行效率高。並說明如何改善執行效率。(該函數必須自己實現,不能使用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。
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來傳送的。
更多學習內容請訪問:
怎麼從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)