亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

PHP基礎教程十四之使用MySqli操作數據庫

2020-03-22 18:52:25
字體:
來源:轉載
供稿:網友
前言

在實際的開發中,PHP都是會和數據庫一起使用的,因為在后臺需要有太多的數據進行保存,而數據庫就是一種很好的保存數據的地方,我們PHP開發用到的數據庫是關系型數據庫mysql,而PHP和mysql數據庫只有連接,我們才能通過php代碼對數據庫進行操作。

相關mysql視頻教程推薦:《mysql教程》

MySqli

PHP的開發離不開數據庫,而在PHP中可以通過html' target='_blank'>MySQLi連接數據庫的。但是MySQLi只能連接mysql數據庫。同時mysqli是一種面向對象的技術。

MySQLi的特點:

  • 效率提高,穩定性強。

  • 對數據庫進行操作。

  • 支持面向對象開發。同時也支持面向過程開發。

想要在PHP中使用MySQLi功能需要在php.ini中加載php_mysql.dll這個動態連接文件。

操作流程
  1. 在mysql中創建一個數據庫當做操作對象。

  2. 打開PHP擴展庫

  3. 創建mysqli的對象

    $mysql = new MySQLi(主機,賬號,密碼,數據庫,端口號);

    里面有幾個參數。

  4. 設置字符集

    $mysql -> set_charset('utf8');
  5. 編寫sql語句并且執行。這個sql語句可以是dml,dql語句

    $mysql -> query($sql);
  6. 將取回的結果顯示頁面取出數據有四種方式(assoc、row、object、array)我們一般使用assoc這種方式。但是如果是dml語句則返回布爾值。

    $res -> fetch_assoc();
  7. 釋放結果集。關閉連接。

    $res -> free();$mysqli -> close();

當我們在進行插入,刪除,修改(dml)時,返回的是一個布爾值,但是我們并不知道里面有沒有變化。可以用$mysqli -> affected_rows,mysqli里面的屬性進行判斷,返回的結果是sql語句對數據表的影響行數。

<?php    //使用面向對象進行數據庫的連接,在創建對象的時候就自動的連接數據    $mySQLi = new MySQLi('localhost','root','123456','test',3306);    //判斷數據庫是否連接    if($mySQLi -> connect_errno){        die('連接錯誤' . $mySQLi -> connect_error);    }    //設置字符集    $mySQLi -> set_charset('utf8');    //編寫sql語句并執行    $sql = "select * from good";    //發送sql語句并執行,如果是select語句,返回的是一個對象,其他的返回來一個boolean.    $res = $mySQLi -> query($sql);    echo '<pre>';    //使用$res對象里面的fetch_assoc()取出里面的數據.    // while($row = $res->fetch_assoc()){    //  var_dump($row);    // }    // 使用fetch_row()方法    // while($row = $res -> fetch_row()){    //  var_dump($row);    // }    //使用fetch_array();    // while($row = $res -> fetch_array()){    //  var_dump($row);    // }    //fetch_object();    while($row = $res -> fetch_object()){        var_dump($row);    }    $res -> free();    $mySQLi -> close();

這里寫圖片描述

上面的代碼就是使用mysqli的具體實現。mysqli是使用面向對象的思想來寫的。關于其中的方法。

  • $mySQLi -> connect_errno返回連接的最后一次連接的錯誤,如果返回0則連接成功,返回非0則連接失敗

  • $mySQLi -> connect_error返回連接錯誤的原因。

  • $mySQLi -> set_charset(‘utf8’);設置字符集,里面的參數根據自己的情況寫。

  • sql)當寫完一個sql語句后,使用這個方法傳遞sql語句到數據庫執行。并且根據sql語句的類型不同,返回不同的結果上面返回的是一個mysqli_result對象


  • mysqli_result對象代表從一個數據庫查詢中獲取的結果集。也就是進行sql查詢從數據庫中返回的結果。得到里面的結果mysqli/_result對象提供了四種方法,他們有不同的區別。

    1. $mysqli_result -> fetch_assoc()返回結果集中的一條數據,這條數據是一個關聯數組,鍵是數據庫表的字段名,值是表里面的值。

      array(3) {  ["id"]=>  string(1) "1"  ["name"]=>  string(6) "張三"  ["price"]=>  string(7) "1234.60"}
    2. $mysqli_result -> fetch_row()返回的也是結果集中的一條數據,這條數據是一個索引數組。

      array(3) {  [0]=>  string(1) "1"  [1]=>  string(6) "張三"  [2]=>  string(7) "1234.60"}
    3. $mysqli_result = $res -> fetch_array()返回的一個數組,是一個關聯數組和索引數組組合的數組。

      array(6) {  [0]=>  string(1) "1"  ["id"]=>  string(1) "1"  [1]=>  string(6) "張三"  ["name"]=>  string(6) "張三"  [2]=>  string(7) "1234.60"  ["price"]=>  string(7) "1234.60"}
    4. $mysqli_result = $res -> fetch_object()返回一個有一條數據封裝成的對象。這個對象是使用了PHP的內置標準類。表的字段是類的屬性。

      object(stdClass)#3 (3) {  ["id"]=>  string(1) "1"  ["name"]=>  string(6) "張三"  ["price"]=>  string(7) "1234.60"}
mysqli的事務處理

mysqli處理mysql的事務一共提供了三種方式開啟事務。

  • $mySQLi -> query(‘start transaction’);

  • $mySQLi -> query(‘set autocommit = false’);

  • $mySQLi -> begin_transaction();

    <?php    //使用面向對象進行數據庫的連接,在創建對象的時候就自動的連接數據    $mySQLi = new MySQLi('localhost','root','123456','test',3306);//判斷數據庫是否連接if($mySQLi -> connect_errno){    die('連接錯誤' . $mySQLi -> connect_error);}//設置字符集$mySQLi -> set_charset('utf8');//編寫sql語句$sql1 = "insert into good values(null,'武松',2345.7)";$sql2 = "update good set price = 3546.67 where id = 2";//開啟事務$mySQLi -> query('start transaction');// $mySQLi -> query('set autocommit = false'); //第二種方式// $mySQLi -> begin_transaction();//第三種方式//發送sql語句,因為sql語句是插入和修改語句,返回的結果是一個布爾值。$res1 = $mySQLi -> query($sql1);$res2 = $mySQLi -> query($sql2);if($res1 && $res2){    echo '操作成功';    //提交事務。    $mySQLi -> commit();}else{    echo '操作失敗';    //進行數據的回滾    $mySQLi -> rollback();}$mySQLi -> close();

當語句執行失敗的時候可以進行數據的回滾。

mysqli批量執行sql語句

在用PHP操作數據庫時,有時候我們需要一次性執行多條sql語句,比如批量增加用戶,這時如果單條單條的向mysql數據庫發送sql指令,效率不高,這時可以考慮使用批量執行sql語句的方式。

mysqli批量執行sql語句的語法:

$sql = "sql語句1;sql語句2;sql語句3";$res = $mysqli -> multi_query();

當然對于批量操作,有不同的返回結果。

  1. 如果批量執行的是dml操作語句,那么 返回結果是布爾值

  2. 如果批量執行的是dql(select)操作語句,那么 返回結果是多個結果集.

批量執行dml語句:

<?php    //使用面向對象進行數據庫的連接,在創建對象的時候就自動的連接數據    $mySQLi = new MySQLi('localhost','root','123456','test',3306);    //判斷數據庫是否連接    if($mySQLi -> connect_errno){        die('連接錯誤' . $mySQLi -> connect_error);    }    //設置字符集    $mySQLi -> set_charset('utf8');    $sql = "insert into good values(null,'孫悟空',1234.8);";    $sql .= "insert into good values(null,'豬八戒',4564.3)";    //進行批量的sql語句執行。    $res = $mySQLi -> multi_query($sql);    if($res){        echo '添加成功';    }else{        echo '添加失敗' . $mySQLi -> error;    }    $mySQLi -> close();

這里寫圖片描述

在進行dml批量操作時,如果有一個語句錯誤,那么后面的sql語句就不執行了,并且在進行dml批量操作時,返回的布爾值的結果,就是第一條sql語句執行的結果。那么如果第一條語句執行成功,后面的語句執行失敗,得到的布爾值也是true。

批量執行dql語句

<?php    //使用面向對象進行數據庫的連接,在創建對象的時候就自動的連接數據    $mySQLi = new MySQLi('localhost','root','123456','test',3306);    //判斷數據庫是否連接    if($mySQLi -> connect_errno){        die('連接錯誤' . $mySQLi -> connect_error);    }    //設置字符集    $mySQLi -> set_charset('utf8');    $sql = 'select id,name from good;';    $sql .= 'select price from good';    echo '<pre>';    //這里返回的記過是一個布爾值。    if($mySQLi -> multi_query($sql)){        //得到里面的數據        do{            //通過這個函數返回查找的結果集,返回的是一個mysqli_result對象。            $res = $mySQLi -> store_result();            while($row = $res -> fetch_assoc()){                var_dump($row);            }            //判斷是否還有結果。如果沒有退出循環。            if(!$mySQLi -> more_results()){                break;            }        //相當于一個指針,指向下一個結果。        }while($mySQLi -> next_result());    }else{        echo '執行失敗';    }    $mySQLi -> close();

這里寫圖片描述

當執行的批量語句是dql語句時,數據庫會返回查找的結果。通過mysqli -> store_result()這個方法返回mysqli->result對象。上面的代碼中批量執行了兩句select,數據庫會返回兩個結果集,而通過store_result()方法返回的是一條select語句的結果。當顯示完數據后通過more_results()方法進行判斷是否還有數據。如果沒有,跳出循環。有數據的話通過next_result()方法指向下一個結果集。

more_results()方法是判斷有沒有下一個結果集,但是結果集的指針并不會執行下一個結果集。而next_result()方法是把指針向前挪移一位。

mysqli預處理技術

在PHP操作數據庫中使用預處理技術可以大大提高我們的sql語句執行速度。關于sql語句在dbms中的執行時間消耗的步驟如圖:

這里寫圖片描述

在其中dbms進行分析sql語句的時間大約占20%,而預處理就是把分析sql語句這個步驟省略,從而提高執行sql語句效率。預處理就是通過把我們想傳入的參數使用占位符?來表示,通過預處理對象綁定真實的參數。

<?php    //使用面向對象進行數據庫的連接,在創建對象的時候就自動的連接數據    $mySQLi = new MySQLi('localhost','root','123456','test',3306);    //判斷數據庫是否連接    if($mySQLi -> connect_errno){        die('連接錯誤' . $mySQLi -> connect_error);    }    //設置字符集    $mySQLi -> set_charset('utf8');    $sql = "INSERT INTO good VALUES(?,?,?)";    //通過prepare()方法返回一個預處理的對象。    $mysql_stmt = $mySQLi -> prepare($sql);    $id = 18;    $name = '松江';    $price = 2344.45;    //綁定參數    $mysql_stmt -> bind_param('iss',$id,$name,$price);    //通過預處理對象執行。    if($mysql_stmt -> execute()){        echo '執行成功';    }else{        echo '執行失敗';    }    //當我們還想添加一條數據時,dbms不用分析sql語句。    $id = 19;    $name = '武松';    $price = 2346.45;    //綁定參數,    $mysql_stmt -> bind_param('iss',$id,$name,$price);    //通過預處理對象執行。    if($mysql_stmt -> execute()){        echo '執行成功';    }else{        echo '執行失敗';    }

這里寫圖片描述

在上面的代碼中,通過mysqli -> prepare()方法得到預處理對象,而sql語句里面的參數是通過占位符?表示。得到預處理對象后通過定義想傳遞的參數,使用bind_param()方法進行參數的綁定。然后通過execute()方法進行執行,之后如果執行同樣的參數,只要把參數定義完之后,進行綁定執行就行了。

bind_param(參數1,參數2):這個方法是綁定參數的方法,里面一共有兩個參數,第一個參數是我們綁定參數的類型,我們一般用到三個值:

  • i int類型

  • d double類型,也就是小數類型

  • s 字符串類型
    第二個參數是對象第一個參數的變量的值。

上面的是插入的時候時候預處理,在dml,dql都可以使用預處理。

DaoMysqli.class.php開發

PHP是面向對象的語言,而在操作數據庫時,我們可以把一些功能進行封裝,創建成對象。使用DaoMySqli這個封裝好的類,可以簡化我們的項目,體現面向對象的思想。

DaoMysqli.class這個類的實現:

  1. 使用單例模式控制資源,始終只有一個對象。

  2. 使用final關鍵字修飾類防止被繼承。

  3. 使用魔術方法__clone(),防止克隆。

  4. 通過在類里面創建mysqli對象,連接數據庫。

  5. 通過mysqli在類里面進行數據的增刪改查等操作,把操作過程封裝起來。


單例模式
//把構造函數私有化,在類外部創建不了對象。    private function __construct($canshu){        $this -> initMySQLi($canshu);    }public static function getInstrance($canshu){            if(!(self::$daoMysqli instanceof DaoMysqli)){                self::$daoMysqli = new DaoMysqli($canshu);            }            return self::$daoMysqli;}

把構造函數私有化,在類外面不能創建對象。同時提供一個創建對象的靜態方法,在靜態里面創建DaoMysqli對象和mysqli對象。

防止繼承、克隆
//防止繼承。final class DaoMysqli{//防止克隆。private function __clone(){}
創建mysqli對象
//初始化mysqli對象。        private function initMySQLi($canshu){            $this -> host = isset($canshu[0]) ? $canshu[0] : '';            $this -> user = isset($canshu[1]) ? $canshu[1] : '';            $this -> password = isset($canshu[2]) ? $canshu[2] : '';            $this -> db_name = isset($canshu[3]) ? $canshu[3] : '';            //如果端口號沒有傳入,默認是3306            //編碼默認是utf8。            $this -> duankou = isset($canshu[4]) ? $canshu[4] : 3306;            $this -> charset = isset($canshu[5]) ? $canshu[5] : 'utf8';            if($this -> host == '' || $this -> user == '' || $this -> password == '' || $this -> db_name == ''){                die('參數不能為空');            }            $this -> mySQLi = new MySQLi($this -> host,$this -> user,$this -> password,$this -> db_name,$this -> duankou);            if($this -> mySQLi -> connect_errno){                    die('連接錯誤,錯誤信息是' . $this -> mySQLi -> connect_error);            }            $this -> mySQLi -> set_charset($this -> charset);        }

在類里面通過調用私有的構造函數進行對象的創建。

通過mysqli對象操作數據庫
//dql操作返回一個數組。        public function mySelect($sql){            if($res = $this -> mySQLi -> query($sql)){                $res = $this -> mySQLi -> query($sql);                $rows = array();                while($row = $res -> fetch_assoc()){                    $rows[] = $row;                }                return $rows;            }else{                die('錯誤,' . $this -> mySQLi -> error);            }        }        //dml操作。        public function dml($sql){            return $this -> mySQLi -> query($sql);        }

當時dql語句時,可以在方法里面進行處理,直接把數據解析出來,放到一個數組里面進行返回。

源代碼
<?phpfinal class DaoMysqli{    private static $daoMysqli; //類本身對象    private $mySQLi; //mysqli對象,在類里面操作數據庫。    private $host; //主機名    private $user;//用戶名    private $password;//密碼    private $db_name;//數據庫名字    private $duankou; //數據庫占用的端口號。    private $charset; //使用的字符集    //把構造函數私有化,在類外部創建不了對象。    private function __construct($canshu){        $this -> initMySQLi($canshu);    }    //初始化mysqli對象。    private function initMySQLi($canshu){        $this -> host = isset($canshu[0]) ? $canshu[0] : '';        $this -> user = isset($canshu[1]) ? $canshu[1] : '';        $this -> password = isset($canshu[2]) ? $canshu[2] : '';        $this -> db_name = isset($canshu[3]) ? $canshu[3] : '';        //如果端口號沒有傳入,默認是3306        //編碼默認是utf8。        $this -> duankou = isset($canshu[4]) ? $canshu[4] : 3306;        $this -> charset = isset($canshu[5]) ? $canshu[5] : 'utf8';        if($this -> host == '' || $this -> user == '' || $this -> password == '' || $this -> db_name == ''){            die('參數不能為空');        }        $this -> mySQLi = new MySQLi($this -> host,$this -> user,$this -> password,$this -> db_name,$this -> duankou);        if($this -> mySQLi -> connect_errno){                die('連接錯誤,錯誤信息是' . $this -> mySQLi -> connect_error);        }        $this -> mySQLi -> set_charset($this -> charset);    }    //防止克隆。    private function __clone(){}    public static function getInstrance($canshu){        if(!(self::$daoMysqli instanceof DaoMysqli)){            self::$daoMysqli = new DaoMysqli($canshu);        }        return self::$daoMysqli;    }    //dql操作返回一個數組。    public function mySelect($sql){        if($res = $this -> mySQLi -> query($sql)){            $res = $this -> mySQLi -> query($sql);            $rows = array();            while($row = $res -> fetch_assoc()){                $rows[] = $row;            }            return $rows;        }else{            die('錯誤,' . $this -> mySQLi -> error);        }    }    //dml操作。    public function dml($sql){        return $this -> mySQLi -> query($sql);    }}
測試
<?php    require './DaoMysqli.php';    $canshu = array('localhost','root','123456','test','3306');    $dao = DaoMysqli::getInstrance($canshu);    $sql = "select * from good";    $res = $dao -> mySelect($sql);    foreach ($res as $value) {        var_dump($value);        echo '<br>';    }

參數是通過一個數組傳進去的。

這里寫圖片描述

總結

PHP操作數據庫的方法中很多中,mysqli只是其中的一種,這種操作方式我們更容易理解和掌握,但是mysqli還是有一些不足,我們在PHP開發中有時候使用的數據庫并不是mysql數據庫,而是別的數據庫,這時,mysqli這種方式就顯得有些無力,mysqli只是純粹的操作mysql數據庫,對于別的數據庫沒有辦法操作。

以上就是PHP基礎教程十四之使用MySqli操作數據庫的內容,更多相關內容請關注PHP (www.49028c.com)!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久av| 欧美性猛交xxxx乱大交蜜桃| 国产欧美欧洲在线观看| 成人黄色av免费在线观看| 国产精品精品国产| 亚洲区免费影片| 国产z一区二区三区| 国产极品精品在线观看| 国产精品视频永久免费播放| 国产精品久久久精品| 国产精品吹潮在线观看| 亚洲电影免费观看高清完整版| 亚洲成人久久网| 国产精品日日摸夜夜添夜夜av| 蜜臀久久99精品久久久久久宅男| 欧美国产日韩免费| 日韩中文综合网| 91麻豆桃色免费看| 欧美视频在线观看免费| 欧美日韩综合视频网址| 欧美国产日本高清在线| 97精品久久久中文字幕免费| 日韩欧美亚洲成人| 超碰精品一区二区三区乱码| 97av在线视频| 视频在线观看一区二区| 中文字幕欧美精品在线| 亚洲va欧美va国产综合剧情| 亚洲人成电影网站色| 日韩中文字幕av| 91网站免费观看| 欧美国产日韩在线| 91精品视频在线播放| 日韩成人在线播放| 中文字幕亚洲欧美日韩高清| 国产激情久久久久| 亚洲精品国产精品乱码不99按摩| 91视频88av| 日本久久精品视频| 亚洲精品有码在线| 欧美精品一区三区| 欧美韩日一区二区| 国产精品成人品| 一级做a爰片久久毛片美女图片| 成人妇女免费播放久久久| 国产精品pans私拍| 狠狠久久五月精品中文字幕| 精品国产欧美一区二区五十路| 国产成人久久精品| 国产精品视频久久| 久久久久久久久久久久久久久久久久av| 91国自产精品中文字幕亚洲| 日韩av在线网| 欧美日韩在线观看视频小说| 亚洲一区制服诱惑| 亚洲第一综合天堂另类专| 日本高清不卡在线| 91精品国产高清久久久久久久久| 亚洲精品国产精品国自产观看浪潮| 亚洲午夜久久久影院| 国产精品久久久久久av下载红粉| 奇米成人av国产一区二区三区| 国产精品日韩一区| 黑丝美女久久久| 日韩av快播网址| 中文字幕不卡av| 国产精品99导航| 亚洲男人天堂网| 中文字幕国产精品久久| 久久人人爽人人爽人人片av高清| 欧美性xxxx极品高清hd直播| 日韩在线视频观看| 秋霞午夜一区二区| 欧美电影免费观看| 国产精品r级在线| 国产精品高潮在线| 在线播放国产一区二区三区| 国自在线精品视频| 日韩在线观看免费高清| 奇米4444一区二区三区| 亚洲国产日韩欧美在线图片| 91最新在线免费观看| 在线视频国产日韩| 国产91在线视频| 国产精品久久久久久影视| 成人精品视频99在线观看免费| 中文字幕少妇一区二区三区| 欧美日韩中文字幕| 欧美福利视频在线观看| 亚洲天堂成人在线视频| 亚洲国产欧美自拍| 欧美日韩亚洲高清| 精品偷拍各种wc美女嘘嘘| 国产成人jvid在线播放| 日本午夜人人精品| 久久视频免费在线播放| 国产精品午夜国产小视频| 欧美性色xo影院| 国产一区二区三区毛片| 亚洲天堂av在线免费| 国内精品小视频| 日韩av在线免费播放| 91精品久久久久久综合乱菊| 欧美成人h版在线观看| 亚洲女同精品视频| 国产91av在线| 欧美一级电影久久| 91精品视频免费| 国产精品久久久久久婷婷天堂| 久久91精品国产91久久跳| 久久人人97超碰精品888| 日韩激情片免费| 91精品免费久久久久久久久| 亚洲影院色在线观看免费| 日韩在线免费高清视频| 国产伊人精品在线| 伊人激情综合网| 国产成人精品电影久久久| 最新国产精品拍自在线播放| 午夜精品久久久久久久白皮肤| 中文国产成人精品久久一| 国产精品亚洲片夜色在线| 亚洲福利视频网| 久久久久久国产精品久久| 日韩有码在线视频| 亚洲精品色婷婷福利天堂| 91天堂在线视频| 国产精品人成电影在线观看| 欧美大尺度激情区在线播放| 亚洲精品v天堂中文字幕| 日本不卡高字幕在线2019| 欧美日韩国产色| www.日韩.com| 日本一区二区在线播放| 日韩av影片在线观看| 欧美成人性色生活仑片| 最近更新的2019中文字幕| 亚洲精品wwwww| 久久精品国产成人精品| 久久香蕉精品香蕉| 日韩成人久久久| 欧美色另类天堂2015| 久久免费视频在线| 国产一区红桃视频| 欧美激情亚洲国产| 欧美性生交大片免网| 精品久久久久久久中文字幕| 欧美一级bbbbb性bbbb喷潮片| 色偷偷91综合久久噜噜| 久久99久久亚洲国产| 日本最新高清不卡中文字幕| 久久综合伊人77777蜜臀| 亚洲第一色中文字幕| 国产欧美久久久久久| 亚洲精品永久免费精品| 北条麻妃久久精品| 欧美性视频在线| 日韩视频在线观看免费| 久久精品这里热有精品| 欧美激情手机在线视频| 久久久久久有精品国产| 亚洲跨种族黑人xxx| 欧美黑人巨大精品一区二区| 久久av中文字幕|