恢復內容開始 1.下麵程式輸出是什麼? 結果: 5 2. 寫一個函數Check_ip,使用正則表達式檢測一個IPV4的IP是否正確,正確返回1,錯誤返回0,例如 Check_ip(‘127.0.0.1’)。 3. 請指出以下代碼的錯誤之處(圈出來並加以改正): 4. 有一數組 $a=array(4, ...
---恢復內容開始---
1.下麵程式輸出是什麼?
$int_a = 5; function factorial() { for($int_i=$int_a; $int_i>0; $int_i--) { $int_a = $int_a * $int_i; } } factorial(); echo $int_a;
結果: 5
2. 寫一個函數Check_ip,使用正則表達式檢測一個IPV4的IP是否正確,正確返回1,錯誤返回0,例如 Check_ip(‘127.0.0.1’)。
function check_ip($mact){ $a='/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/'; $v=preg_match($a,$mact); if ($v!=0) { return 1; } else { return 0; } }
3. 請指出以下代碼的錯誤之處(圈出來並加以改正):
<? function baz($y $a) { $x = new Array(); $x[sales] = 60; $x[profit] = 20; foreach($x as $key = $value) { echo $key + “ ” + $value + “<br>”; } }
<?php //參考答案 function baz($y,$a){ $x=array(); $x[‘sales’]=60; $x[‘profit’]=20; foreach($x as $key=>$value){ echo $key.””.$value.”<br>”; } } ?>
4. 有一數組 $a=array(4,3,8,9,2); 寫一個排序函數對數組進行排序操作,要求使用快速排序法.快速排序的基本思想是:在待排序記錄序列中,任取其中的一個記錄(這裡取了第一個)並以該記錄的關鍵字作為基準,經過一趟排序後,所有關鍵字比它小的記錄都交換到它的左邊,比它大的記錄都交換到它的右邊.然後再分別對劃分到它左,右兩部分記錄序列重覆上述過程,直至每一部分最終劃分為一個記錄時為止即完成了排序工作.
//參考答案 function kuaiSort($arr) { //遞歸的出口 if (count($arr) <= 1) return $arr; //取出第一個元素 $flag = $arr[0]; //聲明兩個數組 $left = []; $right = []; //註意這裡的索引是從1開始的 for ($i = 1; $i < count($arr); $i++) { if ($arr[$i] > $flag) { $right[] = $arr[$i]; } else { $left[] = $arr[$i]; } } $left = kuaiSort($left); $right = kuaiSort($right); return array_merge($left, [$flag], $right); }
5. 有一表 menu(id, pid, name),請用遞歸法列印樹形菜單,將所有的menu列出來.
/* 參考sql create table menu ( id int auto_increment primary key, pid int, name varchar(255) )engine MyISAM default charset=utf8; insert into menu values (1,0,'服裝'),(2,0,'數位'),(3,1,'外套'),(4,3,'男裝'),(5,2,'手機'),(6,3,'女裝'); */ //函數實現 function getMenu($pid) { $pdo= new PDO('mysql:host=localhost;dbname=lamp;charset=utf8','root',''); //獲取pid為 $pid的菜單 $stmt = $pdo->query("select * from menu where pid = $pid"); $menus = $stmt->fetchAll(PDO::FETCH_ASSOC); //判斷 if(empty($menus)) { return; } $res = []; foreach ($menus as $key => $value) { $value['submenu'] = getMenu($value['id']); $res[] = $value; } return $res; } $res = getMenu(0);
6. 在開發項目中,需要上傳超過8M的文件,請說明在php.ini需要修改的配置項。
post_max_size=2M(預設)
Upload_max_filesize=8M(預設)
7. 寫出session的運行機制,session與cookie的區別。多台WEB伺服器如何共用session。
(1)session的運行機制:
用戶A訪問站點Y,如果站點Y指定了session_start();(以下假設session_start()總是存在)那麼會產生一個session_id,這個session_id一般會以COOKIE的形式保存到用戶A(我們可以通過在php.ini里設置session.use_only_cookies為1,強制SESSIONID必須以COOKIE專遞。)。這時候SESSION ID表現為$_COOKIE[‘PHPSESSID’];(PHPSESSID可用session_name()函數來下修改),用戶A接著訪問,這個session id($_COOKID[‘PHPSESSID’])就會在A每次訪問Y的時候傳送到站點Y。在站點Y上,會有這麼一個目錄,是用來保存SESSION的實際數據的。站點Y接收到session id,然後通過session id,來獲得與SESSION數據的關聯,並返回SESSION數據
(2)session與cookie的區別:
1. 存儲位置
Cookie在客戶端存儲,消耗客戶端資源, session在伺服器存儲,消耗伺服器資源.
2. 安全性
Session相對安全, cookie相對不安全, 因為用戶可以看到傳遞的信息
3. 大小限制
單個cookie的最大長度為4k, session沒有大小限制
4. 過期機制
Cookie的過期是實時, 過期時間一到cookie就會失效, 但session的過期是概率性觸發, 也就是說即時session過期並不是立即就失效.
(3)多台伺服器如何共用SESSION:
session專門存儲到一臺獨立的伺服器上,存資料庫,memcache,redis都可以, 多台伺服器都來這台伺服器上操作session即可.
8. SQL中LEFT JOIN 的含義是什麼? 如果tbl_user記錄了學生的姓名(name)和學號(ID),tbl_score記錄了學生(有的學生考試以後被開除了,沒有記錄)的學號(ID)和考試成績(score)以及考試科目(subject),要想列印出各個學生姓名及對應的各科總成績,請寫出SQL語句.
學號 | id |
姓名 | name |
學號 | id |
成績 | score |
科目 | subject |
id |
name |
1 |
a |
2 |
b |
Id |
Score |
subject |
1 |
10 |
語文 |
1 |
20 |
數學 |
2 |
30 |
語文 |
2 |
40 |
數學 |
答:left join 的含義:LEFT JOIN是以左
表為基準進行外聯查詢。
SQL: select tbl_user.name sum(tbl_score.score) from tbl_user left join tbl.score on tbl_user.id=tbl_score.id;
9. 讀代碼
<?php $data = array(‘a’, ‘b’, ‘c’); foreach($data as $key=>$val) { $val = &$data[$key]; //輸出數組 var_dump($data); } ?>
問題1:程式執行時,每一次迴圈結束後變數$data的值是什麼?請解釋
答:第一次迴圈時,把下表為0的成員,引用賦值給變數$val,$val與$data[0]內容相同,
要是其中一個改變,另一個也改變,此時,$data原樣輸出,只是$data[0]變成了引用
輸出結果 a b c
第二次迴圈時,$key的值為1,把$data[1]引用複製給$val.
由於$val與$data[0]也是引用關係,所以這時,$val,$data[0],$data[1]三者值同為’B’
$val不再與$data[0]有關係了,只與$data[1]是引用關係
// b b c
第三次迴圈時,$key的值為2,把$data[2]引用複製給$val,
由於$data[1]與$val是引用關係,所以都將改變$data[1]、$val、$data[2]三者值一樣
//b c c
問題2:程式執行完後,變數$data的值是什麼?請解釋。(10分)
答:結果為B c c