>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

黄舟
黄舟원래의
2017-03-01 10:16:1923006검색

머리말

실제 개발에서는 백그라운드에 너무 많은 데이터를 저장해야 하기 때문에 PHP를 데이터베이스와 함께 사용하게 됩니다. 우리가 PHP 개발에 사용하는 데이터베이스는 관계형 데이터베이스인 mysql인데, PHP와 mysql 데이터베이스가 연결되어 있어야만 PHP 코드를 통해 데이터베이스를 운영할 수 있습니다.

추천 mysql 비디오 튜토리얼: "mysql 튜토리얼"

MySqli

PHP 개발은 떼려야 뗄 수 없는 데이터베이스 , PHP에서는 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. 검색된 결과 표시 페이지에서 데이터를 검색하는 방법에는 4가지가 있습니다(assoc, row, object, array). 일반적으로 assoc를 사용합니다. 방법. 그러나 dml 문인 경우 Boolean 값이 반환됩니다.

    $res -> fetch_assoc();
  7. 결과 세트를 릴리스합니다. 연결을 닫습니다.

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

삽입, 삭제, 수정(dml)을 하면 불리언 값이 반환되는데, 변화가 있는지는 알 수 없습니다. $mysqli -> Affected_rows를 사용하여 판단할 수 있습니다. 반환된 결과는 데이터 테이블의 SQL 문의 영향을 받은 행 수입니다.

<?php

    //使用面向对象进行数据库的连接,在创建对象的时候就自动的连接数据
    $mySQLi = new MySQLi(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,3306);

    //判断数据库是否连接
    if($mySQLi -> connect_errno){
        die(&#39;连接错误&#39; . $mySQLi -> connect_error);
    }
    //设置字符集
    $mySQLi -> set_charset(&#39;utf8&#39;);
    //编写sql语句并执行
    $sql = "select * from good";

    //发送sql语句并执行,如果是select语句,返回的是一个对象,其他的返回来一个boolean.
    $res = $mySQLi -> query($sql);

    echo &#39;<pre class="brush:php;toolbar:false">&#39;;
    //使用$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();

PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

위 코드는 mysqli를 이용한 구체적인 구현이다. mysqli는 객체 지향적 사고를 사용하여 작성되었습니다. 방법에 대해.

  • $mySQLi -> connect_errno가 0을 반환하면 연결이 성공한 것입니다.

  • $mySQLi -> connect_error는 연결 오류의 원인을 반환합니다.

  • $mySQLi -> set_charset('utf8'); 문자셋을 설정하고, 상황에 맞게 매개변수를 작성하세요.

  • sql) sql 문을 작성한 후 이 방법을 사용하여 sql 문을 데이터베이스로 전송한다. 실행. 그리고 sql 문의 종류에 따라 다른 결과가 반환됩니다. 위에서 반환된 것은 mysqli_result 객체입니다.


  • mysqli_result 객체는 SQL 문에서 얻은 데이터를 나타냅니다. 데이터베이스 쿼리 결과 세트. 즉, 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 트랜잭션 처리 시 트랜잭션을 시작하는 총 3가지 방법을 제공한다.

  • $mySQLi -> query('트랜잭션 시작');

  • $mySQLi -> );

  • $mySQLi -> Begin_transaction();

    <?php
        //使用面向对象进行数据库的连接,在创建对象的时候就自动的连接数据
        $mySQLi = new MySQLi(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,3306);
    
    //判断数据库是否连接
    if($mySQLi -> connect_errno){
        die(&#39;连接错误&#39; . $mySQLi -> connect_error);
    }
    //设置字符集
    $mySQLi -> set_charset(&#39;utf8&#39;);
    
    //编写sql语句
    $sql1 = "insert into good values(null,&#39;武松&#39;,2345.7)";
    $sql2 = "update good set price = 3546.67 where id = 2";
    
    //开启事务
    $mySQLi -> query(&#39;start transaction&#39;);
    // $mySQLi -> query(&#39;set autocommit = false&#39;); //第二种方式
    // $mySQLi -> begin_transaction();//第三种方式
    
    
    
    //发送sql语句,因为sql语句是插入和修改语句,返回的结果是一个布尔值。
    $res1 = $mySQLi -> query($sql1);
    $res2 = $mySQLi -> query($sql2);
    
    if($res1 && $res2){
        echo &#39;操作成功&#39;;
        //提交事务。
        $mySQLi -> commit();
    }else{
        echo &#39;操作失败&#39;;
        //进行数据的回滚
        $mySQLi -> rollback();
    }
    
    $mySQLi -> close();

문 실행 실패 시 데이터를 롤백할 수 있습니다.

SQL 문의 일괄 실행을 위한 Mysqli 구문:
$sql = "sql语句1;sql语句2;sql语句3";
$res = $mysqli -> multi_query();
물론 일괄 작업에 대한 반환 결과가 다릅니다.

dml 연산문을 일괄적으로 실행하면 반환 결과는 Boolean 값이다

    dql(select) 연산문이 다음과 같은 경우 일괄적으로 실행된 경우 반환된 결과는
  1. dml 문 일괄 실행

    :

    입니다.
    <?php
    
        //使用面向对象进行数据库的连接,在创建对象的时候就自动的连接数据
        $mySQLi = new MySQLi(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,3306);
    
        //判断数据库是否连接
        if($mySQLi -> connect_errno){
            die(&#39;连接错误&#39; . $mySQLi -> connect_error);
        }
        //设置字符集
        $mySQLi -> set_charset(&#39;utf8&#39;);
    
        $sql = "insert into good values(null,&#39;孙悟空&#39;,1234.8);";
        $sql .= "insert into good values(null,&#39;猪八戒&#39;,4564.3)";
    
        //进行批量的sql语句执行。
        $res = $mySQLi -> multi_query($sql);
    
        if($res){
            echo &#39;添加成功&#39;;
        }else{
            echo &#39;添加失败&#39; . $mySQLi -> error;
        }
    
        $mySQLi -> close();

    PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

    在进行dml批量操作时,如果有一个语句错误,那么后面的sql语句就不执行了,并且在进行dml批量操作时,返回的布尔值的结果,就是第一条sql语句执行的结果。那么如果第一条语句执行成功,后面的语句执行失败,得到的布尔值也是true。

    批量执行dql语句

    <?php
    
        //使用面向对象进行数据库的连接,在创建对象的时候就自动的连接数据
        $mySQLi = new MySQLi(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,3306);
    
        //判断数据库是否连接
        if($mySQLi -> connect_errno){
            die(&#39;连接错误&#39; . $mySQLi -> connect_error);
        }
        //设置字符集
        $mySQLi -> set_charset(&#39;utf8&#39;);
    
        $sql = &#39;select id,name from good;&#39;;
        $sql .= &#39;select price from good&#39;;
        echo &#39;<pre class="brush:php;toolbar:false">&#39;;
        //这里返回的记过是一个布尔值。
        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 &#39;执行失败&#39;;
        }
        $mySQLi -> close();

    PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

    当执行的批量语句是dql语句时,数据库会返回查找的结果。通过mysqli -> store_result()这个方法返回mysqli->result对象。上面的代码中批量执行了两句select,数据库会返回两个结果集,而通过store_result()方法返回的是一条select语句的结果。当显示完数据后通过more_results()方法进行判断是否还有数据。如果没有,跳出循环。有数据的话通过next_result()方法指向下一个结果集。

    more_results()方法是判断有没有下一个结果集,但是结果集的指针并不会执行下一个结果集。而next_result()方法是把指针向前挪移一位。

    mysqli预处理技术

    在PHP操作数据库中使用预处理技术可以大大提高我们的sql语句执行速度。关于sql语句在dbms中的执行时间消耗的步骤如图:

    PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

    在其中dbms进行分析sql语句的时间大约占20%,而预处理就是把分析sql语句这个步骤省略,从而提高执行sql语句效率。预处理就是通过把我们想传入的参数使用占位符?来表示,通过预处理对象绑定真实的参数。

    <?php
    
        //使用面向对象进行数据库的连接,在创建对象的时候就自动的连接数据
        $mySQLi = new MySQLi(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,3306);
    
        //判断数据库是否连接
        if($mySQLi -> connect_errno){
            die(&#39;连接错误&#39; . $mySQLi -> connect_error);
        }
        //设置字符集
        $mySQLi -> set_charset(&#39;utf8&#39;);
    
        $sql = "INSERT INTO good VALUES(?,?,?)";
    
        //通过prepare()方法返回一个预处理的对象。
        $mysql_stmt = $mySQLi -> prepare($sql);
    
        $id = 18;
        $name = &#39;松江&#39;;
        $price = 2344.45;
        //绑定参数
        $mysql_stmt -> bind_param(&#39;iss&#39;,$id,$name,$price);
        //通过预处理对象执行。
        if($mysql_stmt -> execute()){
            echo &#39;执行成功&#39;;
        }else{
            echo &#39;执行失败&#39;;
        }
    
        //当我们还想添加一条数据时,dbms不用分析sql语句。
        $id = 19;
        $name = &#39;武松&#39;;
        $price = 2346.45;
        //绑定参数,
        $mysql_stmt -> bind_param(&#39;iss&#39;,$id,$name,$price);
        //通过预处理对象执行。
        if($mysql_stmt -> execute()){
            echo &#39;执行成功&#39;;
        }else{
            echo &#39;执行失败&#39;;
        }

    PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

    在上面的代码中,通过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] : &#39;&#39;;
                $this -> user = isset($canshu[1]) ? $canshu[1] : &#39;&#39;;
                $this -> password = isset($canshu[2]) ? $canshu[2] : &#39;&#39;;
                $this -> db_name = isset($canshu[3]) ? $canshu[3] : &#39;&#39;;
                //如果端口号没有传入,默认是3306
                //编码默认是utf8。
                $this -> duankou = isset($canshu[4]) ? $canshu[4] : 3306;
                $this -> charset = isset($canshu[5]) ? $canshu[5] : &#39;utf8&#39;;
                if($this -> host == &#39;&#39; || $this -> user == &#39;&#39; || $this -> password == &#39;&#39; || $this -> db_name == &#39;&#39;){
                    die(&#39;参数不能为空&#39;);
                }
    
                $this -> mySQLi = new MySQLi($this -> host,$this -> user,$this -> password,$this -> db_name,$this -> duankou);
                if($this -> mySQLi -> connect_errno){
                        die(&#39;连接错误,错误信息是&#39; . $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(&#39;错误,&#39; . $this -> mySQLi -> error);
                }
            }
            //dml操作。
            public function dml($sql){
                return $this -> mySQLi -> query($sql);
            }

    当时dql语句时,可以在方法里面进行处理,直接把数据解析出来,放到一个数组里面进行返回。

    源代码

    <?php
    final 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] : &#39;&#39;;
            $this -> user = isset($canshu[1]) ? $canshu[1] : &#39;&#39;;
            $this -> password = isset($canshu[2]) ? $canshu[2] : &#39;&#39;;
            $this -> db_name = isset($canshu[3]) ? $canshu[3] : &#39;&#39;;
            //如果端口号没有传入,默认是3306
            //编码默认是utf8。
            $this -> duankou = isset($canshu[4]) ? $canshu[4] : 3306;
            $this -> charset = isset($canshu[5]) ? $canshu[5] : &#39;utf8&#39;;
            if($this -> host == &#39;&#39; || $this -> user == &#39;&#39; || $this -> password == &#39;&#39; || $this -> db_name == &#39;&#39;){
                die(&#39;参数不能为空&#39;);
            }
    
            $this -> mySQLi = new MySQLi($this -> host,$this -> user,$this -> password,$this -> db_name,$this -> duankou);
            if($this -> mySQLi -> connect_errno){
                    die(&#39;连接错误,错误信息是&#39; . $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(&#39;错误,&#39; . $this -> mySQLi -> error);
            }
        }
        //dml操作。
        public function dml($sql){
            return $this -> mySQLi -> query($sql);
        }
    }

    测试

    <?php
        require &#39;./DaoMysqli.php&#39;;
        $canshu = array(&#39;localhost&#39;,&#39;root&#39;,&#39;123456&#39;,&#39;test&#39;,&#39;3306&#39;);
        $dao = DaoMysqli::getInstrance($canshu);
        $sql = "select * from good";
        $res = $dao -> mySelect($sql);
        foreach ($res as $value) {
            var_dump($value);
            echo &#39;<br>&#39;;
        }

    参数是通过一个数组传进去的。

    PHP 기본 튜토리얼 14: MySqli를 사용하여 데이터베이스 작동

    总结

    PHP操作数据库的方法中很多中,mysqli只是其中的一种,这种操作方式我们更容易理解和掌握,但是mysqli还是有一些不足,我们在PHP开发中有时候使用的数据库并不是mysql数据库,而是别的数据库,这时,mysqli这种方式就显得有些无力,mysqli只是纯粹的操作mysql数据库,对于别的数据库没有办法操作。

    위 내용은 MySqli를 이용한 데이터베이스 운용에 대한 PHP 기본 튜토리얼 14번째 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.