面試題總結(41-60)

41.頁面字符出現亂碼,怎麼解決? (重點)javascript

 1.首先考慮當前文件是否是設置了字符集。查看是否是meta標籤中寫了charset,若是是php頁面還能夠看看是否是php

 在header()函數中指定了charset;css

 例如:html

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />java

 header(「content-type:text/html;charset=utf-8」);mysql

 

 2.若是設置了字符集(也就是charset),那麼判斷當前文件保存的編碼格式是否跟頁面設置的字符集保持一致,jquery

 二者必須保持統一;web

 

 3.若是涉及到從數據庫提取數據,那麼判斷數據庫查詢時的字符集是否跟當前頁面設置的字符集一致,二者必須統一,ajax

 例如:mysql_query(「set names utf8」)。正則表達式

 

42. 正則表達式是什麼?php中有哪些經常使用的跟正則相關的函數?請寫出一個email的正則,中國手機號碼和座機號碼的正則表達式? (重點)

 正則表達式是用於描述字符排列模式的一種語法規則。正則表達式也叫作模式表達式。

 網站開發中正則表達式最經常使用於表單提交信息前的客戶端驗證。

 好比驗證用戶名是否輸入正確,密碼輸入是否符合要求,email、手機號碼等信息的輸入是否合法。

 在php中正則表達式主要用於字符串的分割、匹配、查找和替換操做。

 

 preg系列函數能夠處理。具體有如下幾個:

 string preg_quote ( string str [, string delimiter] )

  轉義正則表達式字符 正則表達式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。

 preg_replace -- 執行正則表達式的搜索和替換

 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

 preg_replace_callback -- 用回調函數執行正則表達式的搜索和替換

 mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )

 preg_split -- 用正則表達式分割字符串

 array preg_split ( string pattern, string subject [, int limit [, int flags]] )

 

 

43. 若是想過濾掉某個字符串中全部的html標記使用哪一個函數?

strip_tags(string) 這樣就能夠過濾掉全部的html標籤了。

 

44. preg_replace()和 str_ireplace()兩個函數在使用上有什麼不一樣?

preg_split()和split()函數如何使用?

1,在字符串替換的函數裏,str_replace()的使用率是最高的,它的用法也比較簡單,而preg_replace()的使用率相對來講比較低,由於它須要你懂得寫正則表達式,而正則表達式有時候並不容易寫。

str_replace()與preg_replace()的用法場合是不一樣的,str_replace被替換(查找)的內容是固定的、肯定的,固然可使用變量,可是變量也表示固定的、肯定的內容,好比能夠完成把全部的\n替換爲<br>等場合。而preg_replace被替換(查找)的內容是用規則來描述的,好比能夠把全部的<和>之間的內容(HTML代碼)替換掉。固然preg_replace也能夠用來替換固定內容。

str_replace速度要比preg_replace快

二者比較,執行效率方面誰更好呢?這就涉及到速度問題了。有人測試發現,str_replace速度要比preg_replace快一些,但好像沒有某些人說的快4倍那麼多。10w次的兩個詞替換結果代表:str_replacece 耗時0.38 sec,preg_replace 耗時0.97sec。

str_replace()與str_ireplace()的區別

str_replace()與str_ireplace()的用法是相同的,它們的區別僅僅是str_replace()對大小寫敏感,而str_ireplace()不區分大小寫。

str_replace()與strtr() 誰的速度更快?

str_replace()與strtr()這二者的執行效率問題,許多人說法不一,有人說strtr()比str_replace()速度快,但有人通過實例證實了str_replace()比strtr()速度快一些。

 

2,preg_split() 函數使用了 Perl 兼容正則表達式語法,一般是比 split() 更快的替代方案。若是不須要正則表達式的威力,則使用 explode() 更快,這樣就不會招致正則表達式引擎的浪費

 

45. 獲取當前時間戳的函數主要有哪些?用PHP打印出今天的時間,格式是2017-12-10 22:21:21?

 用PHP打印出前一天的時間格式是2017-12-10 22:21:21?如何把2017-12-25 10:30:25變成unix時間戳?

 echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));  

 date('Y-m-d H:i:s',time());

 

 $unix_time = strtotime("2017-9-2 10:30:25");//變成unix時間戳

 echo date("Y-m-d H:i:s",$unix_time);//格式化爲正常時間格式

 

46. 在url中用get傳值的時候,若中文出現亂碼,應該用哪一個函數對中文進行編碼?

 用戶在網站表單提交數據的時候,爲了防止腳本攻擊(好比用戶輸入<script>alert(111);</script>),php端接收數據的時候,應該如何處理?

 使用urlencode()對中文進行編碼,使用urldecode()來解碼。 

 使用htmlspecialchars($_POST[‘title’])來過濾表單傳參就能夠避免腳本攻擊。

 

47. 鏈接數據庫操做的步驟是什麼?每一步的返回值是什麼數據類型?尤爲是mysql_query()返回什麼數據類型?

 

Step1:連接數據庫 mysqli_connect()

     參數:   ①主機地址

              ②mysql用戶名

              ③mysql密碼 

              ④選擇鏈接的數據庫

              ⑤端口號

  返回:若是鏈接成功,返回資源類型的標誌符號;若是鏈接失敗,返回false。

   若是咱們與mysql創建的鏈接不僅一條,那麼之後操做數據庫的各類函數都必須傳入返回的鏈接符號;

   若是咱們與mysql創建的鏈接只有一條,那麼之後操做數據庫的各類函數就沒必要傳入這個標識符號。建議都傳入。

 密碼爲空能夠省略密碼 $conn = mysqli_connect("localhost", "root");

 $conn = mysqli_connect("localhost", "root", "", "mydb");

 var_dump($conn);

 

 Step2:檢測數據庫鏈接是否成功? 

   mysqli_connect_errno()與 mysqli_connect_error() 

   mysqli_connect_errno(); 返回上次鏈接數據庫錯誤的錯誤號,鏈接成功返回0

   mysqli_connect_error(); 返回上次鏈接數據庫的錯誤信息

 if(mysqli_connect_errno($conn)){

 die("數據庫鏈接失敗!失敗信息:".mysqli_connect_error($conn));

 } 

   前面兩步合併的寫法(Step1+Step2):鏈接數據庫同時判斷 

 $conn = mysqli_connect("localhost", "root", "", "mydb") or die("數據庫鏈接失敗!失敗信息:".mysqli_connect_error($conn));

 

 Step3:選擇數據庫 mysqli_select_db($link,$dbname) 

   參數:①標識符 ②鏈接數據庫名稱

   鏈接成功,返回true;鏈接失敗,返回false

   若是修改數據庫成功,則資源標識符中的數據庫就會發生變更;

   若是修改失敗而沒有經過代碼終止操做,則後續代碼可使用原數據庫繼續執行

   mysqli_select_db($conn, "mydb") or die("數據庫選擇失敗!");

   

 Step4:設置字符集編碼格式

    mysqli_set_charset($link,$charset) 只能設置爲utf8而不能是utf-8

    mysqli_set_charset($conn,"utf8") or die("數據庫編碼集設置失敗!");

 

 Step5:編寫sql語句 

   $sql = "select * from tb1";

   

 Step6:執行sql語句 mysqli_query($link,$sql)

   若是是(DML)增、刪、改,將返回布爾類型是否成功

   返回上一次操做時受影響的行數 mysqli_affected_rows($link)

   若是是(DQL)查詢,將返回資源結果集

   返回資源結果集中的行數 mysql_num_rows($result) 

   返回資源結果集中的字段數 mysql_num_fields($result) 

   若是查詢失敗,返回false

   $res = mysqli_query($conn,$sql);

   mysqli_insert_id($conn); 執行插入語句是返回上次插入最新插入的主鍵ID

   

 Step7:解析結果集 

var_dump(mysqli_fetch_array($res)); 處理結果集,返回關聯數組和索引數組 不經常使用

  參數① 須要處理的結果集

  參數② 返回哪一種數組格式 

 MYSQL_ASSOC - 關聯數組

 MYSQL_NUM - 數字數組

 MYSQL_BOTH - 默認。同時產生關聯和數字數組

 echo "<table border='1' style='border-collapse:collapse;text-align:center;width:200px;'>";

 echo "<thead bgcolor='lightblue' style='color:#ffffff;'><td>ID</td><td>姓名</td><td>年齡</td><td>性別</td></thead>";

 while($row =mysqli_fetch_assoc($res)){               // 返回關聯數組 指針遍歷 經常使用

 echo "<tr>";

 foreach($row as $value){

 echo "<td>{$value}</td>";

 };

 echo "</tr>";

 }

 echo "</table>";

mysqli_data_seek($res,0); 設置結果集指針位置,此式表達復位至0

   var_dump(mysqli_fetch_object($res));

   var_dump(mysqli_fetch_row($res)); 返回索引數組

   var_dump(mysqli_fetch_object($res)); 返回對象

   var_dump(mysqli_fetch_fields($res)); 返回結果集中每一列的字段信息

   

Step8:關閉資源與結果集 mysqli_free_result()和mysqli_close()

    mysqli_free_result($res); //釋放查詢資源結果集

    mysqli_close($conn); //關閉數據庫鏈接

 

48. 說說mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之間有什麼區別?

 第一個是返回結果集中的一行做爲索引數組,第二個是返回關聯數組,而第三個既能夠返回索引數組也能夠返回關聯數組,取決於它的第二個參數 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默認爲MYSQL_BOTH

 $sql =」select * from table1」;

 $result = mysql_query($sql);

 mysql_fetch_array($result, MYSQL_NUM);

 

49. 請說出目前學過的返回是資源的函數?

 答: mysql_connect();

  mysql_query();只有這執行select的時候成功,才返回資源,失敗返回FALSE

  fopen();

 

50. 打開、關閉文件分別是什麼函數? 文件讀寫是什麼函數?刪除文件是哪一個函數? 判斷一個文件是否存在是哪一個函數?新建目錄是哪一個函數?

操做文件的經常使用方法:

flie_put_contents(url,str);

file_get_contents(url);

 
<?php
$str  = time();
$path  = './time.txt';
echo  '<hr>';
file_put_contents ( $path , $str );
echo  file_get_contents($path);
echo  '<hr>';
file_put_contents ( $path , "\r" . $str ,FILE_APPEND);
echo  file_get_contents($path);

運行效果圖以下:

當文件過大時,不能使用以上的方法一次性操做以上內容,使用下面的函數解決

fopen() 打開文件句柄(php與文件間的數據流通道)

參數1:文件地址

參數2:打開方式,打開文件後但願完成哪一種操做,能夠在模式位置進行限制

文件模式:

r(read) 讀模式 
w (write) 替換寫模式,將文件內容清零,不存在則建立 
a(append) 
x 替換寫模式,將文件內容清零,不存在不建立 
+擴展 
r+ 讀寫模式 ,將文件指針放在文件頭 
w+ 讀寫模式 ,將文件清零,將文件指針放在文件頭 
x+ 讀寫模式 ,將文件清零,將文件指針放在文件頭,不自動建立文件 
a+ 讀追加寫模式 ,寫操做永遠在末尾,讀操做受限於文件指針

在均可以讀寫操做時,不一樣的是文件的初始化

連續讀取:

fread(文件句柄[,長度]); 讀取指定長度(字節)的內容

fgets(文件句柄[,長度]); 讀取指定長度(字節)的內容

長度:指的是會讀取長度-1個字節

行末是函數的終止操做

fgetc(文件句柄) 一次讀取一個字節

fwrite(文件句柄,內容);

fclose(文件句柄);

ftell();尋找指針位置
fseek();定位指針位置

 
<?php
$stmt  = fopen('./rw.txt','r+');
echo  ftell($stmt);
fwrite( $stmt , '01234' . "\n" . '56789' );
echo  ' r '.ftell($stmt);
echo  '<br>';
fseek ( $stmt ,1);
fwrite( $stmt , 'ab' );
fseek ( $stmt ,1);
echo  fgets($stmt,8);
echo  '<br>';
echo  fgets($stmt,8);
fclose( $stmt );

rw.txt

r+ 讀寫受指針影響,寫替換原有指針內容 
w+ 清空內容 
a | a+ 指針具備不肯定因素,讀受指針影響,寫是追加

filemtime(url) 文件最後修改時間

filesize() 文件大小

51. 文件上傳須要注意哪些細節?怎麼把文件保存到指定目錄?怎麼避免上傳文件重名問題?

 1.首現要在php.ini中開啓文件上傳;

 2.在php.ini中有一個容許上傳的最大值,默認是2MB。必要的時候能夠更改;

 3.上傳表單必定要記住在form標籤中寫上enctype="multipart/form-data";

 4. 提交方式 method 必須是 post;

 5. 設定 type="file" 的表單控件;

 6.要注意上傳文件的大小MAX_FILE_SIZE、文件類型是否符合要求,上傳後存放的路徑是否存在。

 能夠經過上傳的文件名獲取到文件後綴,而後使用時間戳+文件後綴的方式爲文件從新命名,這樣就避免了重名。

 能夠本身設置上傳文件的保存目錄,與文件名拼湊造成一個文件路徑,使用move_uploaded_file(),就能夠完成

 將文件保存到指定目錄。

 

52. $_FILES是幾維數組?第一維和第二維的索引下標分別是什麼?批量上傳文件的時候須要注意什麼?

 二維數組。第一維是上傳控件的name,二維下標分別爲name/type/tmp_name/size/error.

 

53. header()函數主要的功能有哪些?使用過程當中注意什麼?

在php中header()函數是很大的做用能夠發送各類狀態代碼,也能夠實現一些輸出下載,下面咱們一塊兒來看看一些相關實例吧。

什麼是頭信息?
這裏只做簡單解釋,詳細的本身看http協議。
在 HTTP協議中,服務器端的回答(response)內容包括兩部分:頭信息(header) 和 體內容,這裏的頭信息不是HTML中的<head></head>部分,一樣,體內容也不是<BODY>< /BODY>。頭信息是用戶看不見的,裏面包含了不少項,包括:服務器信息、日期、內容的長度等。而體內容就是整個HTML,也就是你所能看見的全 部東西。

頭信息有什麼用呢?
頭信息的做用不少,最主要的有下面幾個:

一、跳轉:當瀏覽器接受到頭信息中的 Location: xxxx 後,就會自動跳轉到 xxxx 指向的URL地址,這點有點相似用 js 寫跳轉。可是這個跳轉只有瀏覽器知道,無論體內容裏有沒有東西,用戶都看不到。

二、指定網頁的內容: 一樣一個XML文件,若是頭信息中指定:Content-type: application/xml 的話,瀏覽器會將其按照XML文件格式解析。可是,若是頭信息中是:Content-type: text/xml 的話,瀏覽器就會將其看做存文本解析。(瀏覽器不是按照擴展名解析文件的)

三、附件:不知道你們有沒 有注意,有些時候在一些網站下載東西,點下載鏈接之後,結果瀏覽器將這個附件當成網頁打開了,裏面顯示的都是亂碼,這個問題也和頭信息有關。有時候瀏覽器 根據Content-type 來判斷是打開仍是保存,這樣有時就會判斷錯誤(主要是網站設計者忘記寫Content-type)。其實,還有一個能夠來指定該內容爲附件、須要保存,這 個就是:Content-Disposition: attachment; filename=」xxxxx」

 

54. 文件下載的時候若是使用header()函數?

 答:header("content-type: application/octet-stream;charset=UTF-8"); //在這裏加utf-8和在上面定義有什麼區別?、??

            header("accept-ranges: bytes");

            header("accept-length: ".filesize($filedir.$filename));

            header("content-disposition: attachment; filename=".$filedir.$filename);

 

55. 什麼是ajax?ajax的原理是什麼?ajax的核心技術是什麼?ajax的優缺點是什麼?

 ajax是asynchronous javascript and xml的縮寫,是javascript、xml、css、DOM等多個技術的組合。 '$'是jQuery的別名.

  頁面中用戶的請求經過ajax引擎異步地與服務器進行通訊,服務器將請求的結果返回給這個ajax引擎,

  最後由這個ajax引擎來決定將返回的數據顯示到頁面中的指定位置。Ajax最終實現了在一個頁面的指定位置能夠加載另外一個頁面全部的輸出內容。

 這樣就實現了一個靜態頁面也能獲取到數據庫中的返回數據信息了。因此ajax技術實現了一個靜態網頁在不刷新整個頁面的狀況下與服務器通訊,

 減小了用戶等待時間,同時也從而下降了網絡流量,加強了客戶體驗的友好程度。

 

 Ajax的優勢是:

 1.  減輕了服務器端負擔,將一部分之前由服務器負擔的工做轉移到客戶端執行,利用客戶端閒置的資源進行處理;

 2.  在只局部刷新的狀況下更新頁面,增長了頁面反應速度,使用戶體驗更友好。

 Ajax的缺點是不利於seo推廣優化,由於搜索引擎沒法直接訪問到ajax請求的內容。

 ajax的核心技術是XMLHttpRequest,它是javascript中的一個對象。

 

 

 

56. jquery是什麼?jquery簡化ajax後的方法有哪些?

 jQuery是Javascript的一種框架。

 $.get(),$.post(),$.ajax()。$是jQuery對象的別名。

 代碼以下:

 $.post(異步訪問的url地址 , {'參數名' : 參數值} , function(msg){

  $("#result").html(msg);

 });

 

 $.get(異步訪問的url地址 , {'參數名' : 參數值} , function(msg){

  $("#result").html(msg);

 });

 $.ajax({

  type: "post",

  url: loadUrl,

  cache:false,

  data: "參數名=" + 參數值,

  success: function(msg) {

   $("#result").html(msg);

  }

 });

 

57. 什麼是會話控制?

 簡單地說會話控制就是跟蹤和識別用戶信息的機制。會話控制的思想就是可以在網站中跟蹤一個變量,經過這個變量,

 系統能識別出相應的用戶信息,根據這個用戶信息能夠得知用戶權限,從而展現給用戶適合於其相應權限的頁面內容。

 目前最主要的會話跟蹤方式有cookie,session。

 

58. 會話跟蹤的基本步驟

 1).訪問與當前請求相關的會話對象

 2).查找與會話相關的信息

 3).存儲會話信息

 4).廢棄會話數據

 

59. 使用cookie的注意事項有哪些?

 1) setcookie()以前不能夠有任何頁面輸出,就是空格,空白行也不能夠;

 2) setcookie()後,在當前頁面調用$_COOKIE['cookiename']不會有輸出,必須刷新或到下一個頁面才能夠看到cookie值;

 3) 不一樣的瀏覽器對cookie處理不一樣,客戶端能夠禁用cookie,瀏覽器也能夠閒置cookie的數量,一個瀏覽器能建立的cookie數量最多300個,而且每一個不能夠超過4kb,

 每一個web站點能設置的cookie總數不能超過20個。

 4) cookie是保存在客戶端的,用戶禁用了cookie,那麼setcookie就不會起做用了。因此不能夠過分依賴cookie。

 

60. 使用session的時候,經過什麼來表示當前用戶,從而與其餘用戶進行區分?

 sessionid,經過session_id()函數能夠取得當前的session_id。

相關文章
相關標籤/搜索