程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php操作mysqli(示例代碼)

php操作mysqli(示例代碼)

編輯:PHP綜合
<?php
define("MYSQL_OPEN_LOGS",true);
class mysqliHelp
{

    private $db;

    public function __construct()
   {
    //如果要查詢日志log的話,怎麼辦

   }

    public function __get($name )
    {
      //echo "__GET:",$name;
      if(in_array($name,array("db"),true))//或者isset($this->$name)
      return $this->$name;
      return null;

    }
    public function connect($host,$user,$pass,$db,$charSet='utf8',$force=false)
    {

        if($this->db && ($this->db instanceof mysqli) && !$force)
        {
            return ;
        }       
        $this->db=new mysqli($host,$user,$pass,$db);
        if (mysqli_connect_error()) {
        die('Connect Error (' . mysqli_connect_errno() . ') '
                . mysqli_connect_error());
        }
        $this->db->set_charset($charSet);

  

    }

     

   
     //$dbname string
     //返回值 如果成功則返回 TRUE,失敗則返回 FALSE。
    function select_db ($dbname )
    {
        return $this->db->select_db($dbname); 
    }

    //$query mysqli_result 
    //$resulttype int  MYSQLI_ASSOC, MYSQLI_NUM, or MYSQLI_BOTH. Defaults to MYSQLI_BOTH.
    //返回值 Returns an array of strings that corresponds to the fetched row or NULL if there are no more rows in resultset.   
    function fetch_array(/*mysqli_result*/ $query, $resulttype = MYSQLI_ASSOC) 
    {
        //var_dump(!null);
        if(!$query || !($query instanceof mysqli_result))
        return NULL;
        return $query->fetch_array($resulttype);// 
    }

    function data_seek($result,$offset)
    {

       return $result->data_seek($offset);

    }

     

    function fetch_assoc($query) 
    {

        return $query->fetch_assoc();// 關聯數組
    }

    function fetch_row($query) 
    {
        return $query->fetch_row();// 索引數組,數字0,1。eg。。。
    }

    function fetch_fields($query)
    {
         return $query->fetch_fields();
    }

  //$query string
  //$resultmode int
  //返回值 如果成功則返回 TRUE,失敗則返回 FALSE。 For SELECT, SHOW, DESCRIBE or EXPLAIN mysqli_query() will return a result object. 
    public function query($sql ,$resultmode=MYSQLI_STORE_RESULT  )
    {
        if(MYSQL_OPEN_LOGS) {

            $sqlstarttime = $sqlendttime = 0;

            $mtime = explode(' ', microtime());
            $sqlstarttime = $mtime[1]+ $mtime[0] ;

  
        }

        //真正查詢
        $query=$this->db->query($sql,$resultmode);

        if(MYSQL_OPEN_LOGS) {
                       // sleep(1);
            $mtime = explode(' ', microtime());
            $sqlendttime =  $mtime[1] + $mtime[0]  ;
            $sqlQueryTime = number_format($sqlendttime - $sqlstarttime,6);
            //dblogs($sql, $sqlQueryTime,1);
            $explain = array();
            $info = $this->db->info;
            if($query && preg_match("/^(select )/i", $sql)) {
                $explain = $this->fetch_array($this->db->query('EXPLAIN '.$sql), MYSQLI_ASSOC );
            }
            $GLOBALS['mysql_debug_query'][] = array('sql'=>$sql, 'time'=>$sqlQueryTime, 'info'=>$info, 'explain'=>$explain);
        }       

          
        if(!$query)
        {
          $this->halt('MySQL Query Error', $sql);
        }

         
        return $query;

    }

    //返回值 mysqli_stmt對象
    function prepare($sql)
    {
      return $this->db->prepare($sql);

    }

    function affected_rows() {

         
        return  $this->db->affected_rows;
    }
    function  error() 
    {
        return  $this->db->error;

    }
    function errno()
    {
        return  $this->db->errno;
    }
    //result 沒有

    function num_rows($query)
    {
        return $query->num_rows;

    }

    //返回值 int  The number of fields from a result set. 
    //也可以用另外一種方式  mysqliHelp->db->field_count返回。
    function num_fields($query)
    {
        return  $query->field_count;
    }

    function free_result($query)
    {
        //all methods are equivalent;
        $query->free();
        //$query->free_result();
        //$query->close();
    }

    function insert_id() 
    {

         if(($id = $this->db->insert_id)>= 0)
         {

            return $id;
         }else
         {
            $idArr=$this->fetch_array($this->query("SELECT last_insert_id() as id"));
            return  intval($idArr[0]);
         }

         
        //return ($idArr=$this->fetch_array($this->query("SELECT last_insert_id() as id")))[0]
        //return ($id = $this->db-insert_id)>= 0 ? $id : 0 ;
    }

    function close() {

        return $this->db->close();
    }

     
    function halt($message,$sql)
    {
        $dberror = $this->error();
        $dberrno = $this->errno();
        $help_link = "http://faq.comsenz.com/?type=mysql&dberrno=".rawurlencode($dberrno)."&dberror=".rawurlencode($dberror);
        echo "<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\">
                <b>MySQL Error</b><br>
                <b>Message</b>: $message<br>
                <b>SQL</b>: $sql<br>
                <b>Error</b>: $dberror<br>
                <b>Errno.</b>: $dberrno<br>
                <a href=\"$help_link\" target=\"_blank\">Click here to seek help.</a>
                </div>";
        exit();
    }

    function __destruct() 
    {

         
       $this->db=null;

    }

             
    /*  MySQLi類
        面向對象接口  面向過程接口  別名  描述
        屬性
        $mysqli->affected_rows   mysqli_affected_rows()  N/A 獲取前一個Mysql操作的受影響行數
        $mysqli->client_info mysqli_get_client_info()    N/A 返回字符串類型的Mysql客戶端版本信息
        $mysqli->client_version  mysqli_get_client_version() N/A 返回整型的Mysql客戶端版本信息
        $mysqli->connect_errno   mysqli_connect_errno()  N/A 返回最後一次連接調用的錯誤代碼
        $mysqli->connect_error   mysqli_connect_error()  N/A 返回一個字符串描述的最後一次連接調用的錯誤代碼
        $mysqli->errno   mysqli_errno()  N/A 返回最近的函數調用產生的錯誤代碼
        $mysqli->error   mysqli_error()  N/A 返回字符串描述的最近一次函數調用產生的錯誤代碼
        $mysqli->field_count mysqli_field_count()    N/A 返回最近一次查詢獲取到的列的數目
        $mysqli->host_info   mysqli_get_host_info()  N/A 返回一個能夠代表使用的連接類型的字符串
        $mysqli->protocol_version    mysqli_get_proto_info() N/A 返回使用的Mysql協議的版本信息
        $mysqli->server_info mysqli_get_server_info()    N/A 返回Mysql服務端版本的信息
        $mysqli->server_version  mysqli_get_server_version() N/A 返回整型的Mysql服務端版本信息
        $mysqli->info    mysqli_info()   N/A 最近一次執行的查詢的檢索信息
        $mysqli->insert_id   mysqli_insert_id()  N/A 返回最後一次查詢自動生成並使用的id
        $mysqli->sqlstate    mysqli_sqlstate()   N/A 返回前一個Mysql操作的SQLSTATE錯誤
        $mysqli->warning_count   mysqli_warning_count()  N/A 返回給定鏈接最後一次查詢的警告數量
        方法
        mysqli->autocommit() mysqli_autocommit() N/A 打開或關閉數據庫的自動提交功能
        mysqli->change_user()    mysqli_change_user()    N/A 更改指定數據庫連接的用戶
        mysqli->character_set_name(), mysqli->client_encoding mysqli_character_set_name() mysqli_client_encoding()    返回數據庫連接的默認字符集
        mysqli->close()  mysqli_close()  N/A 關閉先前打開的數據庫連接
        mysqli->commit() mysqli_commit() N/A 提交當前事務
        mysqli::__construct()   mysqli_connect()    N/A 打開一個到Mysql服務端的新的連接[注意:靜態方法]
        mysqli->debug()  mysqli_debug()  N/A 執行調試操作
        mysqli->dump_debug_info()    mysqli_dump_debug_info()    N/A 將調試信息轉儲到日志中
        mysqli->get_charset()    mysqli_get_charset()    N/A 返回對象的字符集
        mysqli->get_connection_stats()   mysqli_get_connection_stats()   N/A 返回客戶端連接的統計信息。 僅可用於 mysqlnd。
        mysqli->get_client_info()    mysqli_get_client_info()    N/A 返回字符串描述的Mysql客戶端版本
        mysqli->get_client_stats()   mysqli_get_client_stats()   N/A 返回每個客戶端進程的統計信息。 僅可用於 mysqlnd。
        mysqli->get_cache_stats()    mysqli_get_cache_stats()    N/A 返回客戶端的zval緩存統計信息。 僅可用於 mysqlnd。
        mysqli->get_server_info()    mysqli_get_server_info()    N/A 沒有文檔
        mysqli->get_warnings()   mysqli_get_warnings()   N/A 沒有文檔
        mysqli::init()  mysqli_init()   N/A 初始化mysqli並且返回一個由mysqli_real_connect使用的資源類型。[不是在對象上,是它返回的$mysqli對象]
        mysqli->kill()   mysqli_kill()   N/A 請求服務器殺死一個Mysql線程
        mysqli->more_results()   mysqli_more_results()   N/A 檢查一個多語句查詢是否還有其他查詢結果集
        mysqli->multi_query()    mysqli_multi_query()    N/A 在數據庫上執行一個多語句查詢
        mysqli->next_result()    mysqli_next_result()    N/A 從multi_query中准備下一個結果集
        mysqli->options()    mysqli_options()    mysqli_set_opt()    設置選項
        mysqli->ping()   mysqli_ping()   N/A ping一個服務器連接,或者如果那個連接斷了嘗試重連
        mysqli->prepare()    mysqli_prepare()    N/A 准備一個用於執行的SQL語句
        mysqli->query()  mysqli_query()  N/A 在數據庫上執行一個查詢
        mysqli->real_connect()   mysqli_real_connect()   N/A 打開一個到Mysql服務端的連接
        mysqli->real_escape_string(), mysqli->escape_string() mysqli_real_escape_string() mysqli_escape_string()  轉義字符串中用於SQL語句中的特殊字符,這個轉換會考慮連接的當前字符集。
        mysqli->real_query() mysqli_real_query() N/A 執行一個SQL查詢
        mysqli->rollback()   mysqli_rollback()   N/A 回滾當前事務
        mysqli->select_db()  mysqli_select_db()  N/A 為數據庫查詢選擇默認數據庫
        mysqli->set_charset()    mysqli_set_charset()    N/A 設置默認的客戶端字符集
        mysqli->set_local_infile_default()   mysqli_set_local_infile_default()   N/A 清除用戶為load data local infile命令定義的處理程序
        mysqli->set_local_infile_handler()   mysqli_set_local_infile_handler()   N/A 設置LOAD DATA LOCAL INFILE命令執行的回調函數
        mysqli->ssl_set()    mysqli_ssl_set()    N/A 使用SSL建立安裝連接
        mysqli->stat()   mysqli_stat()   N/A 獲取當前系統狀態
        mysqli->stmt_init()  mysqli_stmt_init()  N/A 初始化一個語句並且返回一個mysqli_stmt_prepare使用的對象
        mysqli->store_result()   mysqli_store_result()   N/A 傳輸最後一個查詢的結果集
        mysqli->thread_id()  mysqli_thread_id()  N/A 返回當前連接的線程ID
        mysqli->thread_safe()    mysqli_thread_safe()    N/A 返回是否設定了線程安全
        mysqli->use_result() mysqli_use_result() N/A 初始化一個結果集的取回
    */

    /*
            MySQL_STMT
        面向對象接口  過程化接口   別名(不要使用)    描述
        屬性
        $mysqli_stmt->affected_rows  mysqli_stmt_affected_rows() N/A 返回最後一條倍執行的語句改變,刪除或插入的總行數
        $mysqli_stmt->errno  mysqli_stmt_errno() N/A 返回最近一次語句調用的錯誤代碼
        $mysqli_stmt->error  mysqli_stmt_error() N/A 返回最後一條語句錯誤的字符串描述
        $mysqli_stmt->field_count    mysqli_stmt_field_count()   N/A 返回給定語句得到的字段數量
        $mysqli_stmt->insert_id  mysqli_stmt_insert_id() N/A 獲取前一個INSERT操作生成的ID
        $mysqli_stmt->num_rows   mysqli_stmt_num_rows()  N/A 返回語句結果集中的行數
        $mysqli_stmt->param_count    mysqli_stmt_param_count()   mysqli_param_count()    返回給定語句中參數數量
        $mysqli_stmt->sqlstate   mysqli_stmt_sqlstate()  N/A 返回前一個語句操作的SQLSTATE錯誤代碼
        方法
        mysqli_stmt->attr_get()  mysqli_stmt_attr_get()  N/A 用於獲取語句屬性的當前值
        mysqli_stmt->attr_set()  mysqli_stmt_attr_set()  N/A 用於修改prepared語句的行為
        mysqli_stmt->bind_param()    mysqli_stmt_bind_param()    mysqli_bind_param() 將一個變量作為參數綁定到prepared語句上
        mysqli_stmt->bind_result()   mysqli_stmt_bind_result()   mysqli_bind_result()    將一個變量綁定到一個prepared語句上用於結果存儲
        mysqli_stmt->close() mysqli_stmt_close() N/A 關閉一個prepared語句
        mysqli_stmt->data_seek() mysqli_stmt_data_seek() N/A 查看語句結果集中的任意行
        mysqli_stmt->execute()   mysqli_stmt_execute()   mysqli_execute()    執行一個prepared查詢
        mysqli_stmt->fetch() mysqli_stmt_fetch() mysqli_fetch()  從一個prepared語句中抓取結果到限定變量中
        mysqli_stmt->free_result()   mysqli_stmt_free_result()   N/A 釋放給定語句處理存儲的結果集所占內存
        $mysqli_stmt->get_result()   mysqli_stmt_get_result  N/A 沒有文檔 僅可用於 mysqlnd。
        mysqli_stmt->get_warnings()  mysqli_stmt_get_warnings()  N/A 沒有文檔
        $mysqli_stmt->more_results() mysqli_stmt_more_results()  N/A 沒有文檔 僅可用於 mysqlnd。
        $mysqli_stmt->next_result()  mysqli_stmt_next_result()   N/A 沒有文檔 僅可用於 mysqlnd。
        mysqli_stmt->num_rows()  mysqli_stmt_num_rows()  N/A 查閱屬性$mysqli_stmt->num_rows
        mysqli_stmt->prepare()   mysqli_stmt_prepare()   N/A 准備一個SQL語句用於執行
        mysqli_stmt->reset() mysqli_stmt_reset() N/A 重置一個prepared語句
        mysqli_stmt->result_metadata()   mysqli_stmt_result_metadata()   mysqli_get_metadata()   從一個prepared語句返回結果集元數據
        mysqli_stmt->send_long_data()    mysqli_stmt_send_long_data()    mysqli_send_long_data() 發送數據塊
        mysqli_stmt->store_result()  mysqli_stmt_store_result()  N/A 從一個prepared語句中傳輸一個結果集

    */

    /*
            MySQLi_RESULT
        面向對象接口  過程化接口   別名(不要使用)    描述
        屬性
        $mysqli_result->current_field    mysqli_field_tell() N/A 獲取當前字段在結果集指針中的開始位置
        $mysqli_result->field_count  mysqli_num_fields() N/A 獲取結果中字段數量
        $mysqli_result->lengths  mysqli_fetch_lengths()  N/A 返回結果集中當前行的每列的值得長度,返回數組
        $mysqli_result->num_rows mysqli_num_rows()   N/A 獲取結果中行的數量
        方法
        mysqli_result->data_seek()   mysqli_data_seek()  N/A 將結果中的結果指針調整到任意行
        mysqli_result->fetch_all()   mysqli_fetch_all()  N/A 抓取所有的結果行並且以關聯數據,數值索引數組,或者兩者皆有的方式返回結果集。僅可用於 mysqlnd。
        mysqli_result->fetch_array() mysqli_fetch_array()    N/A 以一個關聯數組,數值索引數組,或者兩者皆有的方式抓取一行結果
        mysqli_result->fetch_assoc() mysqli_fetch_assoc()    N/A 以一個關聯數組方式抓取一行結果
        mysqli_result->fetch_field_direct()  mysqli_fetch_field_direct() N/A 抓取一個單字段的元數據
        mysqli_result->fetch_field() mysqli_fetch_field()    N/A 返回結果集中的下一個字段
        mysqli_result->fetch_fields()    mysqli_fetch_fields()   N/A 返回一個代表結果集字段的對象數組
        mysqli_result->fetch_object()    mysqli_fetch_object()   N/A 以一個對象的方式返回一個結果集中的當前行
        mysqli_result->fetch_row()   mysqli_fetch_row()  N/A 以一個枚舉數組方式返回一行結果
        mysqli_result->field_seek()  mysqli_field_seek() N/A 設置結果指針到特定的字段開始位置
        mysqli_result->free(), mysqli_result->close, mysqli_result->free_result    mysqli_free_result()    N/A 釋放與一個結果集相關的內存
    */
    /*注意 MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的區別
     其實這兩個參數的區別還是很大的。
    (1)區別在於從服務器上檢索結果集的行。
    (2)MYSQLI_USE_RESULT 啟動查詢,但實際上並未獲取任何行
    (3)MYSQLI_STORE_RESULT 立即檢索所有的行
    (4)MYSQLI_STORE_RESULT 從服務器上檢索結果集時,就提取了行,並為之分配內存,存儲到客戶機中,隨後調用
         mysqli_fetch_array()就再也不會返回錯誤,因為它僅僅是把行脫離了已經保留結果集的數據結 構,mysqli_fetch_array()返回 NULL始終表示已經到達結果集的末端。
    (5)MYSQLI_USE_RESULT 本身不檢索任何行,而只是啟動一個逐行的檢索,就是說必須對每行調 用
        mysqli_fetch_array()來自己完成。既然如此,雖然正常情況下,mysqli_fetch_array()返回NULL仍然表示此 時已到達結果集的末端,但也可能表示在與服務器通信時發生錯誤。

     
     如果是MYSQLI_USE_RESULT,query以後得到mysqli_result對象後,執行data_seek會出錯,因為
     mysqli_result::data_seek() [mysqli-result.data-seek]: Function cannot be used with MYSQL_USE_RESULT 

     與MYSQLI_USE_RESULT相比,MYSQLI_STORE_RESULT 有著較高的內存和處理需求,因為是在客戶機上維護整個結果集,所以內存分配和創建數據結構的耗費是非常巨大的,如果想一次檢索多個行,可用 MYSQLI_USE_RESULT。
     MYSQLI_USE_RESULT有著較低的內存需求,因為只需給每次處理的單行分配足夠的空間。這樣速度就較快,因為不必為結果集建立復雜的數據結構。
     另一方面,MYSQLI_USE_RESULT把較大的負載加到了服務器上,它必須保留結果集中的行,直到客戶機看起來適合檢索所有的行。
    */
}

$dbHelper=new mysqliHelp;
$dbHelper->connect('localhost', 'root', '', 'tt');

//$dbHelper->db->select_db("tt");
//$dbHelper->db->set_charset("utf8");

 
//這裡如果是MYSQLI_USE_RESULT,下面的$dbHelper->data_seek($query,10);就會出錯
$query=$dbHelper->query("select id,cateid,title from product limit 22",MYSQLI_STORE_RESULT );
//$query=$dbHelper->query("update product set  createtime=UNIX_TIMESTAMP()  limit 22");

//$query=$dbHelper->query("insert  into `product`(`cateid`,`title`,`text`,`createtime`) values (2,'test','content',1284822691)");
//$query=$dbHelper->query("delete from `product` where id=1");
//$query=$dbHelper->query("replace into product(id,cateid,title,text,createtime) values(1,2,'this is demo','test',UNIX_TIMESTAMP())");

 
echo $query->num_rows."總數";

//var_dump($query);

 
//$row=$dbHelper->fetch_array($query);

//var_dump($row);

 
//finfo = $dbHelper->fetch_fields($query);

//var_dump($finfo);
// foreach ($finfo as $val) {

    // printf("Name:     %s\n", $val->name);
    // printf("Table:    %s\n", $val->table);
    // printf("max. Len: %d\n", $val->max_length);
    // printf("Flags:    %d\n", $val->flags);
    // printf("Type:     %d\n\n", $val->type);
// }

//如果是查詢操作affected_rows行數為1,num_rows為查詢結果行數,num_fields為字段數目
//如果是更新或者刪除操作affected_rows為受影響的行數,num_rows為null,num_fields為null
//
$dbHelper->data_seek($query,10);

$row=$dbHelper->fetch_row($query);

var_dump($row);

 

echo "影響行數:", "<br/>";
var_dump($dbHelper->affected_rows());
//var_dump($dbHelper->db->affected_rows );

echo "查詢行數","<br/>";
var_dump($dbHelper->num_rows($query));
echo "列數:","<br/>";
var_dump($dbHelper->num_fields($query));

  
//第1種 
$sql="select id,cateid,title from product where cateid=? and title like  ? and createtime<".time();

$stmt=$dbHelper->prepare($sql);

var_dump($stmt);
$stmt->bind_param('is',$cateid,$title);

$title="%%";
$cateid=10;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);

 
/* fetch values */
while ($stmt->fetch()) {
    printf("%s %s"."<br/>", $col1, $col3);
}

echo "<br/>";
$title="%%";
$cateid=4;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);

 
/* fetch values */
while ($stmt->fetch()) {
    printf("%s %s %s"."<br/>", $col1, $col2,$col3);
}

$stmt->close();

 
//第2種

$stmt=$dbHelper->db->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('is',$cateid,$title);

$title="%%";
$cateid=10;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);

 
/* fetch values */
while ($stmt->fetch()) {
    //printf("%s %s"."<br/>", $col1, $col3);
}

echo "<br/>開始multi_query:<br/>";

 
//multi_query實例
//multi_query()方法的返回值,以及 //mysqli的屬性errno、error、info等只與第一條SQL命令有關,無法判斷第二條及以後的命令是否在執行時發生了錯誤。所以在執行 //multi_query()方法的返回值是TRUE時,並不意味著後續命令在執行時沒有出錯。

$sql="select id,cateid,title from product where cateid=4;";
$sql.="select id,cateid,title from product where cateid=10";

$query=$dbHelper->db->multi_query($sql);

if($query)
{
      do {
        /* store first result set */
        //下面兩種方法有什麼區別?
        // if ($result = $dbHelper->db->store_result()) {
            // while ($row = $result->fetch_row()) {
                // $data[]=$row;
            // }
            // $result->free();
        // }
        if ($result = $dbHelper->db->use_result()) {//返回mysqli_result類型
            //$result->data_seek(0);//返回bool
            while ($row = $result->fetch_row()) {
                $data[]=$row;
            }
            //$result->close();
        }

         
        /* print divider */
        if ($dbHelper->db->more_results()) {
            printf("-----------------\n");
            $data[]="_______________________________";
        }
    } while ($dbHelper->db->next_result());

}
var_dump($data);
//exit;
//執行事務 實例
//確保操作的表時innodb類型的表
//如果是MyISAM,邏輯出錯的話, 會執行所有操作,不回滾
$price=1;
$success=true;
$dbHelper->db->autocommit(0);
$result=$dbHelper->query("update product set cateid=cateid-$price where id=1000" );
if(!$result  || $dbHelper->affected_rows()!=1)
{
    $success=false;

}

$result=$dbHelper->query("update product set cateid=cateid+$price where id=2");
if(!$result  || $dbHelper->affected_rows()!=1)
{
    $success=false;

}

if($success)
{
$dbHelper->db->commit();
echo "成功";

}else
{
$dbHelper->db->rollback();
echo "失敗";

}
$dbHelper->db->autocommit(1);

 
//var_dump(  $dbHelper->insert_id());
var_dump($mysql_debug_query);  //打印sql查詢信息

 
//
?>
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved