方法的表單發送的信息,對任何人都是不可見的(不會顯示在瀏覽器的地址欄),並且對發送信息的量也沒有限制。
然而,默認情況下,POST 方法的發送信息的量最大值爲 8 MB(可通過設置 php.ini 文件中的 post_max_size 進行更改)。
eg:<?php echo $_POST["fname"]; ?>
<?php echo $_POST["age"]; ?>
$_REQUEST
包含了 $_GET、$_POST 和 $_COOKIE 的內容。
可用來收集通過 GET 和 POST 方法發送的表單數據。
eg:<?php echo $_REQUEST["fname"]; ?>
<?php echo $_REQUEST["age"]; ?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
日期
date()將時間戳轉化爲可讀性好的日期
eg:
<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>
http://www.runoob.com/php/php-date.html
include & require
在服務器執行php之前在該文件中插入一個文件的內容
include如果出錯,會繼續執行下去
require如果出錯,會終止後續的執行
eg:
<?php include 'header.php'; ?>
文件
fopen() 用於打開文件
fclose()用於關閉文件
feof() 檢測文件是否到達末尾
fgets() 逐行讀取文件
fgetc() 逐字符讀取文件
http://www.runoob.com/php/php-file.html
文件上傳
文件上傳表單+處理php代碼
表單:
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
enctype表示提交表單時使用的內容類型
type="file"規定將輸入作爲文件處理
文件上傳是一個安全風險,要謹慎開放
使用$_FILES作爲文件上傳的容器
通過對$_FILES的各個屬性做限制來約束上傳文件的屬性
$_FILES["file"]["name"] - 上傳文件的名稱
$_FILES["file"]["type"] - 上傳文件的類型
$_FILES["file"]["size"] - 上傳文件的大小,以字節計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
上傳之後還需要保存的操作,將其拷貝到upload文件夾下,否則只有一個臨時的文件副本。
eg:
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " 文件已經存在。 ";
} else {
// 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"];
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
Cookie
常用於識別用戶
是一種服務器留在用戶計算機上的小文件,當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送cookie
setcookie() 設置cookie值 必須位於<html>標籤之前
setcookie(name, value, expire, path, domain); //cookie名,值,過期時間(單位是秒),路徑,主機名
setrowcookie() 設置原始cookie,不會被URL編碼
$_COOKIE['cookie名'] 取回cookie值
eg:
<?php
if (isset($_COOKIE["user"]))
echo "歡迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通訪客!<br>";
?>
將expire的時間設置爲過去,值設置爲空即可刪除該cookie
eg:
<?php
// 設置 cookie 過期時間爲過去 1 小時
setcookie("user", "", time()-3600);
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
Session
用於存儲關於用戶會話的信息,或者更改用戶會話的設置。
Session 變量存儲單一用戶的信息,並且對於應用程序中的所有頁面都是可用的。
Session 的工作機制:
爲每個訪客創建一個唯一的 id (UID),並於這個 UID 來存儲變量。UID 存儲在 cookie 中,或者通過 URL 進行傳導。
啓動會話
session_start()
必須位於<html>標籤之前
向服務器註冊會話以便保存用戶信息並分配一個UID
存儲和引用Session
$_SESSION['session名']
銷燬Session
unset($_SESSION['session名']) 釋放指定的session變量
session_destroy() 徹底銷燬session 將會重置session會失去所有爲未儲的session
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
E-mail
mail(to,subject,message,headers,parameters)
*需要有一個已安裝且正在運行的郵件系統,通過php.ini設置
爲了防止注入攻擊需要對輸入做檢查和過濾
filter_var()
錯誤處理
報錯時會直接將錯誤發送給瀏覽器包含文件名,行號,錯誤的消息,但這顯然是不安全的
解決辦法:
A. die(),用if...else...添加判斷,如果出錯,用die()返回提示消息,但是這種辦法會終止腳本的執行
eg:
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
B. 創建自定義錯誤處理器
error_function(error_level,error_message,error_file,error_line,error_context)
http://www.runoob.com/php/php-error.html
eg:
function customError($errno, $errstr)// 錯誤處理函數
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "腳本結束";
die();
}
set_error_handler("customError");// 設置錯誤處理函數
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
異常
try throw catch結構來實現,總體和Java是類似的
可以拋出多個異常被多個catch捕獲並處理
可以重新拋出異常,對用戶顯示友好的提示,對後臺顯示真正的錯誤位置(在catch塊中再次throw)
頂層異常處理器,用於處理所有未被捕獲的異常,set_exception_handler()
過濾器
過濾的目的是防止非安全來源的數據對系統造成破壞
表單數據,cookies,web服務數據,服務器變量,數據庫查詢結果都是外部數據都需要過濾
filter_var() - 通過一個指定的過濾器來過濾單一的變量
filter_var_array() - 通過相同的或不同的過濾器來過濾多個變量
filter_input - 獲取一個輸入變量,並對它進行過濾
filter_input_array - 獲取多個輸入變量,並通過相同的或不同的過濾器對它們進行過濾
參數包含待過濾的變量和過濾器(例如,FILTER_VALIDATE_EMAIL用於驗證傳入的變量是否是一個email地址)
過濾器種類和過濾函數參考鏈接http://www.runoob.com/php/php-ref-filter.html
過濾器有兩類Validating和Sanitizing
V用於驗證用戶輸入,有嚴格的格式規則(URL,E-mail),如果成功則返回預期的類型否則返回false
S用於允許或禁止字符串中指定的字符,無數據格式規則,始終返回字符串
通過filter callback可以調用自己設置的過濾器,參數有一個關聯數組,鍵爲options
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_runoob_com!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>
http://www.runoob.com/php/php-filter.html
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
PHP與mySQL
A. 連接和關閉數據庫
有mysqli和PDO兩種辦法,mysqli專用,PDO通用
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 創建連接
$conn = new mysqli($servername, $username, $password);
// 檢測連接
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}
echo "連接成功";
//關閉連接
$conn->close();
?>
PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
//需要指定數據庫名
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
echo "連接成功";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
//關閉連接
$conn = null;
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
B. 創建數據庫
mysqli:
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "數據庫創建成功";
} else {
echo "Error creating database: " . $conn->error;
}
PDO:
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// 設置 PDO 錯誤模式爲異常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,因爲沒有結果返回,如果出錯會拋出異常進入catch塊
$conn->exec($sql);
echo "數據庫創建成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
C. 創建表
和標準sql一樣的辦法,執行過程與B類似,mysqli判斷返回值真假,PDO直接exec()
D. 插入、修改、刪除數據
和標準sql一樣的辦法,執行過程與B類似,mysqli判斷返回值真假,PDO直接exec()
E. 查詢數據
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢測連接
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);//返回查詢結果集
if ($result->num_rows > 0) {
// 輸出每行數據
while($row = $result->fetch_assoc()) {//fetch_assoc用於取出每一個結果
echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"];
}
} else {
echo "0 個結果";
}
$conn->close();
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
PDO:
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th><th>Email</th><th>Reg date</th></tr>";//設置表頭
class TableRows extends RecursiveIteratorIterator { //構造出一個表的結構
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM MyGuests");
$stmt->execute();
// 設置結果集爲關聯數組
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
$dsn = null;
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
F. 預處理語句
目的:
在大量重複操作時,提高數據庫操作效率,節省帶寬
防止SQL注入攻擊,
mysqli:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢測連接
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}
// 預處理及綁定
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);//sss表示後續共三個參數,每個參數都是string類型 i(int) d(double) s(string) b(BLOB二進制大對象)
// 設置參數並執行
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "新記錄插入成功";
$stmt->close();
$conn->close();
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 設置 PDO 錯誤模式爲異常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 預處理 SQL 並綁定參數,這裏與mysqli略有不同
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 插入行
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// 插入其他行
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// 插入其他行
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "新記錄插入成功";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>