Mysqli

參考資料:預存程序

參考資料:php文件


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 結束 ==============

其他

其他注意事項 :

  1. 一定要關閉連線
  2. 釋放資源
// 一定要關閉連線

$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)

results matching ""

    No results matching ""