Mysqli
Mysqli_stmt
開啟資料庫連線
// 告訴PHP我們要輸出 UTF-8 程式碼
mb_internal_encoding('UTF-8');
// 告訴PHP我們要輸出 UTF-8 到瀏覽器
mb_http_output('UTF-8');
$db_host="localhost";
$db_user="username";
$db_pwd ="password";
$db_name="database";
// 基本
//$mysqli = new mysqli('localhost','username','password','database');
使用面向對象方式
$mysqli = new mysqli($db_host, $db_user, $db_pwd, $db_name);
//面向對象的屏蔽了連接產生的錯誤,需要通過函數來判斷
if(mysqli_connect_error()){
// echo mysqli_connect_error();//此處需要錯誤處理頁!!
}
// 關閉連線
// $mysqli->close();
面向過程方式的連接方式
$mysqli = mysqli_connect($db_host, $db_user, $db_pwd, $db_name);
//判断是否連接成功
if(!$mysqli ){
echo mysqli_connect_error();
}
//關閉連線
mysqli_close($mysqli);
設置資料庫內的編碼
//设置编码
$mysqli->set_charset("utf8");
//或者 $mysqli->query("set names 'utf8'")
// 測試接通
// echo mysqli_stat($mysqli);
常用函式
用來處理mysqli搜尋的資料
/**
* 用來處理mysqli搜尋的資料
*
* @param [type] $result [description]
* @return [type] [description]
*/
function fetch($result)
{
$array = array();
if($result instanceof mysqli_stmt)
{
$result->store_result();
$variables = array();
$data = array();
$meta = $result->result_metadata();
while($field = $meta->fetch_field())
$variables[] = &$data[$field->name]; // pass by reference
call_user_func_array(array($result, 'bind_result'), $variables);
$i=0;
while($result->fetch())
{
$array[$i] = array();
foreach($data as $k=>$v)
$array[$i][$k] = $v;
$i++;
// don't know why, but when I tried $array[] = $data
//, I got the same one result in all rows
}
}
elseif($result instanceof mysqli_result)
{
while($row = $result->fetch_assoc())
$array[] = $row;
}
return $array;
}
動態增加變數
class Mstmt{
var $type = ''; // s:string 字串 i:integer 數字 d:double 浮點數 b:blob 數據包
var $array = array(); // 照順序將
var $count = 0; //數量
var $a_params = array();
/**
* 準備綁定的資料型別 跟 將資料塞入 array
*
* @param string $type [資料型態] // s:string 字串 i:integer 數字 d:double 浮點數 b:blob 數據包
* @param [type] $value [資料]
*
* /
public function madd($type,$value){
$this->type.=$type;
$this->array[]=$value;
$this->count++;
}
/**
* 資料綁定 v1.0
* // 笨方法 // 但先留著吧
* @param [type] $stmt [description]
* @return [type] [description]
*/
public function mbindv($stmt){
switch ($this->count) {
case 1:
$stmt->bind_param($this->type,$this->array[0]);
break;
case 2:
$stmt->bind_param($this->type,$this->array[0],$this->array[1]);
break;
case 3:
$stmt->bind_param($this->type,$this->array[0],$this->array[1],
$this->array[2]);
break;
// ... 以此類推
default:
# code...
break;
}
// return $stmt;
}
/**
* 資料綁定 v2.0
* 網路資料
* 用我拜託!! 樓上是白癡 XD
* @param [type] $stmt [description]
* @return [type] [description]
*/
public function mbind($stmt){
/* with call_user_func_array, array params must be passed by reference */
$this->a_params[] = & $this->type;
for($i = 0; $i < $this->count; $i++) {
/* with call_user_func_array, array params must be passed by reference */
$this->a_params[] = & $this->array[$i];
}
/* use call_user_func_array, as $stmt->bind_param('s', $param);
does not accept params array */
call_user_func_array(array($stmt, 'bind_param'), $this->a_params);
// return $stmt;
}
}
實務上的處理方式
直接使用query
如果沒有要處理的資料直接用query就好
$sql = 'SELECT id, lastname FROM customers WHERE ' .
'category=' . $category_id . ' AND ' .
'lastname LIKE ' . "'%" . $mysqli->real_escape_string($lastname) . "%'";
$res = $mysqli->query($sql);
if($res === false) {
$this->last_error = 'Wrong SQL: ' . $sql . ' Error: ' . $mysqli->ErrorMsg();
} else {
$res->data_seek(0); // 指向第一筆資料
while($row = $res->fetch_assoc()) {
$a_data[] = $row;
}
}
使用預處理程式
$sql = 'SELECT id, lastname FROM customers WHERE ' .
'category = ? AND ' .
'lastname LIKE ?';
/* Prepare statement */
$stmt = $mysqli->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $mysqli->errno . ' ' . $mysqli->error, E_USER_ERROR);
}
$category_id = 1;
$lastname = '%Smith%';
/* Bind parameters. Types: s = string, i = integer, d = double, b = blob */
$stmt->bind_param('is', $category_id, $lastname);
/* Execute statement */
$stmt->execute();
/* Fetch result to array */
$res = $stmt->get_result();
while($row = $res->fetch_array(MYSQLI_ASSOC)) {
$a_data[] = $row;
}
使用預處理程式 並 動態增加變數
//=========== 資料取得處理 ===============
$q_boolean=false;
if(isset($_GET['q'])&&$_GET['q']!=''){ //你的判斷
$q=$_GET['q']; // 取值 // 數字可以用 intvail
$q_boolean=true; // 結論
}
//=========== 動態增加 sql ===============
$q_sql='';
if($q_boolean){
$q_sql='AND `id` = ? ';
}
//============ Module 開始 ==============
// 盡量不用 * 抓全部
$sql = "SELECT `id`,`name` FROM `account` WHERE `delete` = 0 {$q_sql} LIMIT ? , ? ";
//預處理程式
$stmt = $mysqli->prepare($sql);
// 動態變數處理 // 參考常用函式
$mstmt=new Mstmt;
if($q_boolean){$mstmt->madd('q',$q);} // 選擇性資料
$mstmt->madd('i',$jump); // 必須
$mstmt->madd('i',$each); // 必須
$mstmt->mbind($stmt); // 綁定 v2.0
$result = $stmt->execute(); // 抓資料
if($result === false ){
// 出錯囉
}
$stmt->store_result(); // 存資料
$snum=$stmt->num_rows; // 行數
// 取得資料
if($snum>0){
$rows=fetch($stmt); //參考常用函式
}
// 一定要關閉 // 不然有可能出錯
$stmt->close();
$mysqli->close();
//============ Module 結束 ==============
其他
其他注意事項 :
- 一定要關閉連線
- 釋放資源
// 一定要關閉連線
$stmt->close(); // mysqli_stmt_close($stmt);
$mysqli->close(); // mysqli_close($link);
// 如果運算量很大的話 // 請主動釋放資源
$mysqli->free_result(); // mysqli_close($link);
// 或 // 看你是用哪個連線
$stmt->free_result(); // mysqli_stmt_free_result($stmt);
小技巧:
1. 怕輸出單筆資料太長
如果你有很多很多很多資料要當一筆資料,一口氣輸出 (可能是)搭配 GROUP_CONCAT()
// 比如
$sql="GROUP_CONCAT(`name`) FROM `list` GROUP BY `group` ";
// 會輸出
// henry,steve,mark,johnson,jack,neo,larry,kobe,alice,...
假設這個 name
字串已經長到不能再長了,到XXX的長度就會開始不顯示後面的
// ** 先 ** // 使用
mysql_query("SET SESSION group_concat_max_len = 1000000;");
// 可以限制輸出資料數 // 避免太長 // 這樣就可以分開輸出了
2. 單筆資料 置頂(底) ORDER BY id
= 1
$sql="SELECT `name` FROM `list` ORDER BY `id` = 1 "; //這樣就可以了 (DESC) (ASC)