2017.8.15
一、PHP JSON
環境配置
在 php5.2.0 及以上版本已經內置 JSON 擴展。
JSON 函數
函數 | 描述 |
---|---|
json_encode | 對變量進行 JSON 編碼 |
json_decode | 對 JSON 格式的字符串進行解碼,轉換為 PHP 變量 |
json_last_error | 返回最後發生的錯誤 |
1、json_encode
PHP json_encode() 用於對變量進行 JSON 編碼,該函數如果執行成功返回 JSON 數據,否則返回 FALSE 。
語法
string json_encode ( $value [, $options = 0 ] )
參數
- value
- options:由以下常量組成的二進制掩碼:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
實例
以下實例演示了如何將 PHP 數組轉換為 JSON 格式數據:
<?php $arr = array(‘a‘ => 1, ‘b‘ => 2, ‘c‘ => 3, ‘d‘ => 4, ‘e‘ => 5);echo json_encode($arr); ?>
以上代碼執行結果為:
{"a":1,"b":2,"c":3,"d":4,"e":5}
以下實例演示了如何將 PHP 對象轉換為 JSON 格式數據:
<?php class Emp { public $name = ""; public $hobbies = ""; public $birthdate = ""; } $e = new Emp(); $e->name = "sachin"; $e->hobbies = "sports";$e->birthdate = date(‘m/d/Y h:i:s a‘, "8/5/1974 12:20:03 p"); $e->birthdate = date(‘m/d/Y h:i:s a‘, strtotime("8/5/1974 12:20:03")); echo json_encode($e); ?>
以上代碼執行結果為:
{"name":"sachin","hobbies":"sports","birthdate":"08\/05\/1974 12:20:03 pm"}
2、json_decode
PHP json_decode() 函數用於對 JSON 格式的字符串進行解碼,並轉換為 PHP 變量。
語法
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
參數
-
json_string: 待解碼的 JSON 字符串,必須是 UTF-8 編碼數據
-
assoc: 當該參數為 TRUE 時,將返回數組,FALSE 時返回對象。默認為FALSE。
-
depth: 整數類型的參數,它指定遞歸深度
-
options: 二進制掩碼,目前只支持 JSON_BIGINT_AS_STRING 。
實例
以下實例演示了如何解碼 JSON 數據:
<?php $json = ‘{"a":1,"b":2,"c":3,"d":4,"e":5}‘; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?>
以上代碼執行結果為:
object(stdClass)#1 (5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) } array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
二、PHP MySQL 預處理語句
預處理語句對於防止 MySQL 註入是非常有用的。
2.1、預處理語句及綁定參數
預處理語句用於執行多個相同的 SQL 語句,並且執行效率更高。
預處理語句的工作原理如下:
-
預處理:創建 SQL 語句模板並發送到數據庫。預留的值使用參數 "?" 標記 。例如:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
-
數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出。
-
執行:最後,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
相比於直接執行SQL語句,預處理語句有兩個主要優點:
-
預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。
-
綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
-
預處理語句針對SQL註入是非常有用的,因為參數值發送後使用不同的協議,保證了數據的合法性。
2.2、MySQLi 預處理語句
實例 (MySQLi 使用預處理語句)
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; //1、 創建連接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢測連接 if ($conn->connect_error) { die("連接失敗: " . $conn->connect_error); } //2、 預處理及綁定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); //3、 設置參數並執行 $firstname = "John"; $lastname = "Doe"; $email = "[email protected]";
execute函數是用於執行已經預處理過的語句,只是返回執行結果成功或失敗。也就是說execute需要配合prepare函數使用,
這個的確是麻煩了一點,每次都要先prepare,然後才能exec。 $stmt->execute();//插入第一條數據
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute(); //插入第二條數據 echo "新記錄插入成功"; $stmt->close(); $conn->close();//關閉數據庫連接 ?>
解析以下實例的每行代碼:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"
在 SQL 語句中,我們使用了問號 (?),在此我們可以將問號替換為整型,字符串,雙精度浮點型和布爾值。
接下來,讓我們來看下 bind_param() 函數:
$stmt->bind_param("sss", $firstname, $lastname, $email);
該函數綁定了 SQL 的參數,且告訴數據庫參數的值。 "sss" 參數列是其余參數的數據類型。s 字符告訴數據庫該參數為字符串。
參數有以下四種類型:
- i - integer(整型)
- d - double(雙精度浮點型)
- s - string(字符串)
- b - BLOB(binary large object:二進制大對象)
每個參數都需要指定類型,即參數個數和前面的類型個數必須一致。
通過告訴數據庫參數的數據類型,可以降低 SQL 註入的風險。
2017.8.15