標籤:
主要講5個方面:
- PHP與web頁面的互動:表單傳值,檔案的上傳與下載
- http協議
- PHP的會話技術:cookie和session
- PHP的映像技術:GD庫,映像的常見的製作和操作,驗證碼,二維碼,浮水印、縮圖,3D圖等等
- 檔案操作:開啟、關閉、讀取檔案、寫入檔案,遍曆目錄等
一、PHP與web頁面的互動:表單傳值,檔案的上傳與下載1、表單傳值
1.1、單選框
single.html
<!DOCTYPE html>
<html>
<head>
<title>單選項傳值</title>
<meta charset="utf-8">
</head>
<body>
<form method="GET" action="single.php">
<p>使用者名稱:<input type="text" name="username" /></p>
<p>
性 別:
<input type="radio" name="gender" value="1" />男
<input type="radio" name="gender" value="2" />女
<input type="radio" name="gender" value="3" />保密
</p>
<p>密 碼:<input type="password" name="password" /></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
single.php
<?php
header(‘Content-type:text/html;charset=utf8‘);
echo ‘<pre>‘;
var_dump($_GET);
注意:
- 一組選擇的name值必須相同;
- 必須要有value屬性,且value屬性的值不能相同。
1.2、多選框
muliSelect.html
<!DOCTYPE html>
<html>
<head>
<title>單選項傳值</title>
<meta charset="utf-8">
</head>
<body>
<form method="POST" action="muliSelect.php">
<p>使用者名稱:<input type="text" name="username" /></p>
<p>
愛 好:
<input type="checkbox" name="hobby[]" value="唱歌">唱歌
<input type="checkbox" name="hobby[]" value="跳舞">跳舞
<input type="checkbox" name="hobby[]" value="電影">電影
<input type="checkbox" name="hobby[]" value="籃球">籃球
</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
muliSelect.php
<?php
header(‘Content-type:text/html;charset=utf8‘);
/*echo ‘<pre>‘;
var_dump($_POST);*/
// 1,串連資料庫
mysql_connect(‘localhost:3306‘,‘root‘,‘aaa‘);
mysql_query(‘set names utf8‘);
mysql_query(‘use php2018‘);
// 2,接收資料
$user_name = trim($_POST[‘username‘]);
$user_gender = $_POST[‘gender‘];
$hobby = $_POST[‘hobby‘];
$user_password = md5(trim($_POST[‘password‘]));
// 將數群組轉換成字串才能寫入資料庫
$user_hobby = implode(‘,‘,$hobby);
// 3,資料入庫
$sql = "insert into user values
(null,‘$user_name‘,‘$user_gender‘,‘$user_hobby‘,‘$user_password‘)";
$result = mysql_query($sql);
if($result) {
echo ‘插入成功‘;
}else {
echo ‘插入失敗‘;
}
/*create table user(
user_id int primary key auto_increment,
user_name varchar(20) not null default ‘匿名‘,
user_gender enum(‘1‘,‘2‘,‘3‘) comment ‘1是男2是女3是保密‘,
user_hobby set(‘唱歌‘,‘跳舞‘,‘電影‘,‘籃球‘),
user_password char(32)
);*/
注意:
- 當我們用PHP擷取多選框的值時,會獲得一個數組;
- 當我們將多選框的值存入資料庫時,需要將獲得的數組用 implode() 函數分成一個字串,再存入資料庫中。
2、檔案上傳
實現檔案上傳,由下面幾步:
1)、在伺服器端要開啟檔案上傳功能;
2)、在瀏覽器端提供能夠進行檔案上傳的表單。其實就是給表單添加屬性:enctype=”multipart/form-data”;
3)、使用$_FILES接收上傳的檔案的相關資訊;
4)、驗證檔案;
5)、將檔案從臨時檔案夾移動到指定的目錄下。
其實就是利用一個函數:move_upload_file(臨時檔案名稱,目標存放的目錄及檔案名稱);有一個傳回值,如果上傳成功就返回true,否則就返回false;
PHP預設的上傳臨時檔案夾是在C盤下,有時候因為許可權問題會導致上傳失敗, 因此我們一般會修改上傳的臨時檔案夾。
封裝檔案上傳函數
upload.php
<?php
# 檔案上傳函數
/**
* 檔案上傳
* @param array $file 上傳檔案的資訊(是一個數組,有5個元素)
* @param array $allow 檔案上傳的類型
* @param string & $error 參考型別,用來記錄錯誤資訊
* @param string $path 檔案上傳的路徑
* @param int $maxsize = 2*1024*1024 允許上傳的檔案的大小
* @return false|$newname 如果上傳失敗就返回false,成功則返迴文件的新名字
*/
function upload($file,$allow,& $error,$path,$maxsize=2097152){
# 1,判斷系統錯誤
switch ($file[‘error‘]) {
case 1:
$error = ‘上傳錯誤,超出了檔案限制的大小!‘;
return false;
case 2:
$error = ‘上傳錯誤,超出了表單允許的大小!‘;
return false;
case 3:
$error = ‘上傳錯誤,檔案上傳不完整!‘;
return false;
case 4:
$error = ‘請先選擇要上傳的檔案!‘;
return false;
case 6:
case 7:
$error = ‘對不起,伺服器繁忙,請稍後再試!‘;
return false;
}
# 2,判斷邏輯錯誤
// 2.1,判斷檔案大小
if ($file[‘size‘] > $maxsize) {
$error = ‘超出檔案大小,允許的最大值為:‘. $maxsize . ‘位元組‘;
return false;
}
// 2.2,判斷檔案類型
if (!in_array($file[‘type‘], $allow)) {
//檔案類型非法
$error = ‘上傳的檔案類型不正確,允許的類型有:‘ . implode(‘,‘, $allow);
return false;
}
# 3, 得到檔案的新名字
$newname = randName($file[‘name‘]);
# 4,移動臨時檔案到指定路徑
$target = $path . ‘/‘ . $newname;
if (move_uploaded_file($file[‘tmp_name‘], $target)) {
return $newname;
}else {
$error = ‘發生未知錯誤,上傳失敗!‘;
return false;
}
}
# 定義一個產生隨機名字的函數
/**
* @param string $filename 檔案的舊名字
* @param string $newname 檔案的新名字
*/
function randName($filename) {
//組建檔案名的時間部分
$newname = date(‘YmdHis‘);
//加上隨機的六位元
$str = ‘0123456789‘;
//得到六位隨機數
for ($i=0; $i < 6; $i++) {
//將每次得到的隨機數加到新名字後
$newname .= $str[mt_rand(0,strlen($str))];
}
// 加上尾碼名
$newname .= strrchr($filename, ‘.‘);
return $newname;
}
?>
3、檔案下載
二、http協議 1、請求協議
1.1、組成:請求行、要求標頭、空行、請求資料
1.1.1、請求行。分為三個部分:請求方式、請求路徑、協議版本
1.1.2、要求標頭。
要求標頭就是所有當前需要用到的協議項的集合!
協議項就是瀏覽器在請求伺服器的時候事先告訴伺服器的一些資訊,而且每一個協議項都要單獨的佔用一行!
常見的要求標頭:
- host:當前url中所要請求的伺服器的主機名稱(網域名稱)
- accept-encoding:是瀏覽器發給伺服器,聲明瀏覽器支援的壓縮編碼類別型 比如gzip
- accept_charset:表示,瀏覽器支援的字元集
- referer:表示,此次請求來自哪個網址
- accept-language:可以接收的語言類型,cn,en等
- cookie:
- user-agent:使用者代理程式,當前發起請求的瀏覽器的核心資訊
- accept:表示瀏覽器可以接收的資料類型,text/html,image/img
- content-length(post):只有post提交的時候才會有的要求標頭,顯示當前提交的資料長度(位元組)
- if-modified-since(get):在用戶端向伺服器請求某個資源檔時,詢問此資源檔是否被修改過
- content-type(post):定義網路檔案的類型和網頁的編碼,決定瀏覽器將以什麼形式、編碼讀取這個檔案
1.1.3、空行
用來分離要求標頭和請求資料,意思就是要求標頭到處結束!
1.1.4、請求資料
2、響應協議
2.1、組成:響應行、回應標頭、空行、響應主體
三、會話技術 1、cookie
1.1、基本操作
- 增刪改:setCookie(名,值)
- 查:$_COOKIE
1.2、屬性
- 有效期間:預設一個會話周期。可通過setCookie第三個參數設定;
- 有效路徑:預設目前的目錄及其子目錄。可通過第四個參數設定;
- 有效域:預設當前網站(子域),可通過第五個參數設定;
- 是否僅安全傳輸:預設否,第六個參數設定;
- HTTPONLY:預設否,第七個參數設定。
1.3、注意事項
- cookie的值,僅僅支援字串類型;
- cookie的鍵(下標),可以寫成數組下標的形式。
2、session
2.1、基本操作
增刪該查都是通過$_SESSION數組來完成的。
2.2、屬性
session的實現需要cookie的支援,它的屬性和cookie的屬性一樣。
2.3、注意事項
- session資料可以是任意類型的資料(cookie只能是字串類型)
- $_SESSION數組元素的下標只能是字串型(關聯型),不能是索引數組
2.4、session的銷毀
- unset():銷毀session中某個資料,並沒有銷毀會話資料區;
- $_SESSION = ARRAY():清空$_SESSION,並沒有銷毀會話資料區;
- session_desroy(():銷毀會話資料區。
3、cookie和session的區別
| |
cookie |
session |
| 儲存位置 |
瀏覽器端 |
伺服器端 |
| 資料量 |
大 |
小 |
| 儲存的資料類型 |
只能是字串 |
任意類型 |
| 安全性 |
較低 |
較高 |
| 預設的有效路徑 |
只能是目前的目錄及其子目錄 |
整站有效 |
四、映像技術 1、GD圖片製作
1.1、建立畫布
imagecreatetruecolor(width,height);
1.2、建立畫筆顏色
imagecolorallocate(img,red,green,blue);
1.3、繪製文字(在畫布上畫畫)
imagestring(img,size,x,y,string,color);
1.4、輸出或儲存圖片
輸出前要:
1)、設定回應標頭資訊:header("content-type:image/png");
2)、清除緩衝區資料:ob_clean();
- 儲存:imagepng(圖片資源,路徑/圖片名稱);
2、實現驗證碼
<?php
# 1、建立畫布
$canWidth = 170; // 畫布的寬
$canHei = 40; // 畫布的高
$img = imagecreatetruecolor($canWidth, $canHei);
# 2、為畫布填充背景色
$bgColor = imagecolorallocate($img, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
imagefill($img, 1, 1, $bgColor);
#/3、定義在畫布上的顯示文字
// 顯示隨機字元的範圍
$arr = array_merge(range(‘a‘, ‘z‘), range(‘A‘, ‘Z‘), range(0, 9));
// 得到指定位元的隨機字元
$str = ‘‘;
shuffle($arr);
$charNum = 4; //驗證碼個數
$keyArr = array_rand($arr,$charNum);
foreach ($keyArr as $value) {
$str .= $arr[$value];
}
// 4、將字元寫入到畫布
$span = ceil($canWidth/($charNum+1));
for ($i=1; $i <= $charNum; $i++) {
// 為畫布建立畫筆色
$charColor = imagecolorallocate($img, mt_rand(120,255), mt_rand(120,255), mt_rand(120,255));
imagestring($img, 5, $span*$i, 12, $str[$i-1], $charColor);
}
// 5、建立幹擾線
for ($i=0; $i < 8; $i++) {
//建立幹擾線顏色
$linColor = imagecolorallocate($img, mt_rand(75,150), mt_rand(75,150), mt_rand(75,150));
//建立幹擾線
imageline($img, mt_rand(0,$canWidth-1), mt_rand(0,$canHei-1), mt_rand(0,$canWidth-1), mt_rand(0,$canHei-1), $linColor);
}
// 6、顯示圖片
header(‘content-type:image/png‘);
ob_clean();
imagepng($img);
?>
五、檔案操作 1、目錄基本操作
- 建立目錄:mkdir(目錄位址和名字,許可權);
- 刪除刪除:rmdir(目錄位址);
- 移動/重新命名目錄:rename(原始檔案路徑,新的檔案路徑);
(此處的移動實質上也是重新命名,不過目錄的名字不單單是檔案名稱,還包括目錄的路徑,當我們改變目錄的路徑時,既是移動目錄,也可以說是重新命名;)
- 開啟目錄,opendir,得到一個目錄控制代碼(目錄資源);
- 依次讀取目錄內的檔案,readdir;
- 關閉目錄控制代碼(closedir);
1.2、常用目錄操作函數
- getcwd:擷取當前的工作路徑;
- chdir:改變當前的工作路徑;
- rewinddir:重設資源指標,回到第一個;
- scandir:瀏覽某一目錄,以索引數組的形式返回目錄中內容。
1.3、遞迴遍曆目錄
bianli.php
<?php
/**
* 遞迴遍曆檔案
* @param string $path 目錄路徑(地址)
* @param int $deep=0 目前的目錄的深度
*/
function readDirs($path,$deep=0) {
$dir_handle = openDir($path); //得到$path目錄的控制代碼
while (false !== $file = readDir($dir_handle)) {
//篩選掉./和../
if ($file == "." || $file == "..") {
continue;
}
//輸出檔案
echo str_repeat(‘-‘, $deep*3),$file,‘<br/>‘;
//進入遞迴點和遞迴出口
if (is_dir($path . ‘/‘ .$file)) {
readDirs($path . ‘/‘ .$file,$deep+1);
}
}
}
$path = ‘./‘;
readDirs($path);
?>
2、檔案操作
2.1、檔案基本操作
- 讀:file_get_contents;讀取指定路徑的檔案內容,以字串形式返回;
- 寫:file_put_contents;覆蓋寫,往指定檔案寫入指定資料,並覆蓋以前的內容。如果需要追加資料,則需要設定第三個參數FILE_APPEND;
2.2、熱門檔案函數
- filetype:擷取一個檔案的類型。windows下檔案類型有三種,dir、file、unknown。
- file_exists:判斷一個檔案是否存在;
- is_dir:判斷一個檔案是否是dir檔案;
- is_file:判斷一個檔案是否是file檔案;
PHP中WEB典型應用技術