• mysqli函数库的使用


    综述

    1.什么是mysqli

    PHP-MySQL 函数库是 PHP 操作 MySQL 资料库最原始的扩展库,PHP-MySQLi 的 i 代表 Improvement ,相当于前者的增强版,也包含了相对进阶的功能,另外本身也增加了安全性,比如可以大幅度减少 SQL 注入等问题的发生。

    2. mysql与mysqli的概念相关

    (1)mysql与mysqli都是php方面的函数集,与mysql数据库关联不大。

    (2)在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程

    (3)在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库

    3. mysql与mysqli的主要区别

    (1)mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程,所以mysqli耗费资源少一些。

    (2)mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。

    (3)mysqli提供了面向对象编程方式和面向过程编程方式,而mysql则只可以面向过程。

    例如如下代码分别是mysqli的面向对象编程方式和面向过程方式

    面向对象方式

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <?php

    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");

    /* check connection */

    if (mysqli_connect_errno()) {

        printf("Connect failed: %s ", mysqli_connect_error());

        exit();

    }

    printf("Host information: %s ", $mysqli->host_info);

    /* close connection */

    $mysqli->close();

    ?>

    面向过程方式

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <?php

    $link = mysqli_connect("localhost", "my_user", "my_password", "world");

    /* check connection */

    if (!$link) {

        printf("Connect failed: %s ", mysqli_connect_error());

        exit();

    }

    printf("Host information: %s ", mysqli_get_host_info($link));

    /* close connection */

    mysqli_close($link);

    ?>

    (4)mysqli 可以通过预处理语句来减少开销和SQL注入的风险,而mysql则做不到。

    综上所述,如果大家用的是PHP5,而且mysql版本在5.0以上,希望大家以后能用mysqli的就尽量使用mqsqli,不仅高效,而且更安全,而且推荐大家使用面向对象编程方式。

    在这里,我们也只介绍面向对象编程方式。

    函数使用

     1. 连接数据库并获取相关信息

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    <?php

        $mysqli=@new mysqli("localhost", "root", "", "mysql");

        //如果连接错误

        if(mysqli_connect_errno()){

            echo "连接数据库失败:".mysqli_connect_error();

            $mysqli=null;

            exit;

        }

        //获取当前字符集

        echo $mysqli->character_set_name()."<br>";

        //获取客户端信息

        echo $mysqli->get_client_info()."<br>";

        //获取mysql主机信息

        echo $mysqli->host_info."<br>";

        //获取服务器信息

        echo $mysqli->server_info."<br>";

        //获取服务器版本

        echo $mysqli->server_version."<br>";

        //关闭数据库连接

        $mysqli->close();

    ?>

    如果连接成功则运行结果

    latin1
    mysqlnd 5.0.10 – 20111026 – $Id: e707c415db32080b3752b232487a435ee0372157 $
    localhost via TCP/IP
    5.6.12-log
    50612

    如果连接失败则可能结果为

    连接数据库失败:Access denied for user ‘root’@’localhost’ (using password: YES)

    连接数据库失败:Unknown database ‘hello’

    2.查询数据

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    <?php

        $mysqli=@new mysqli("localhost", "root", "", "design");

        //如果连接错误

        if(mysqli_connect_errno()){

            echo "连接数据库失败:".mysqli_connect_error();

            $mysqli=null;

            exit;

        }

        //构造SQL语句

        $query = "SELECT * FROM  designer order by ID LIMIT 3";

        //执行SQL语句

        $result = $mysqli->query($query);

        //遍历结果

        while($row = $result->fetch_array(MYSQLI_BOTH)){

            echo "id".$row['id']."<br>";

        }

        //释放结果集

        $result->free();

        //关闭数据库连接

        $mysqli->close();

    ?>

    运行结果

    1

    2

    3

    id10062

    id10063

    id10064

    在这里需要注意的是

    1

    fetch_array(MYSQLI_BOTH)

    这个方法,参数有三个,分别是 MYSQLI_BOTH,MYSQLI_NUM,MYSQLI_ASSOC。

    如果参数传入了 MYSQLI_BOTH,返回数组的索引既包括数字和名称。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    array (size=26)

      0 => string '10062' (length=5)

      'id' => string '10062' (length=5)

      1 => string '??' (length=2)

      'name' => string '??' (length=2)

      2 => string '1016903103@qq.com' (length=17)

      'email' => string '1016903103@qq.com' (length=17)

      3 => string '18366119732' (length=11)

      'phone' => string '18366119732' (length=11)

    如果参数传入了 MYSQLI_NUM,返回数组的索引只包含数字。

    1

    2

    3

    4

    5

    array (size=13)

      0 => string '10062' (length=5)

      1 => string '??' (length=2)

      2 => string '1016903103@qq.com' (length=17)

      3 => string '18366119732' (length=11)

    如果参数传入了 MYSQLI_BOTH,返回数组的索引只包含名称。

    1

    2

    3

    4

    5

    array (size=13)

      'id' => string '10062' (length=5)

      'name' => string '??' (length=2)

      'email' => string '1016903103@qq.com' (length=17)

      'phone' => string '18366119732' (length=11)

    其实还有等价的方法 fetch_row(),fetch_assoc()

    他们之间的关系如下

    $result->fetch_row() =  mysql_fetch_row() = $result->fetch_array(MYSQLI_NUM) = mysql_fetch_array(MYSQLI_NUM)  返回索引数组

    $result->fetch_assoc() =  mysql_fetch_assoc() = $result->fetch_array(MYSQLI_ASSOC) = mysql_fetch_array(MYSQLI_ASSOC)  返回索引列名

    如果 fetch_array()方法什么也不传,则默认传入了 MYSQLI_BOTH

    3.插入数据

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    <?php

        $mysqli=@new mysqli("localhost", "root", "", "design");

        //如果连接错误

        if(mysqli_connect_errno()){

            echo "连接数据库失败:".mysqli_connect_error();

            $mysqli=null;

            exit;

        }

        //插入数据

        $sql="insert into designer(name,phone) values('hello','18352682923')";

        //执行插入语句

        $result=$mysqli->query($sql);

        //如果执行错误

        if(!$result){

            echo "SQL语句有误<br>";

            echo "ERROR:".$mysqli->errno."|".$mysqli->error;

            exit;    

        }

        //如果插入成功,则返回影响的行数

        echo $mysqli->affected_rows;

        //关闭数据库连接

        $mysqli->close();

    ?>

    如果插入成功,那么结果则会是1,如果失败,则会报出错误。

    4.修改内容

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    <?php

        $mysqli=@new mysqli("localhost", "root", "", "design");

        //如果连接错误

        if(mysqli_connect_errno()){

            echo "连接数据库失败:".mysqli_connect_error();

            $mysqli=null;

            exit;

        }

        //插入数据

        $sql="update designer set name = 'hello' where id = 10062";

        //执行插入语句

        $result=$mysqli->query($sql);

        //如果执行错误

        if(!$result){

            echo "SQL语句有误<br>";

            echo "ERROR:".$mysqli->errno."|".$mysqli->error;

            exit;    

        }

        //如果插入成功,则返回影响的行数

        echo $mysqli->affected_rows;

        //关闭数据库连接

        $mysqli->close();

    ?>

    如果修改成功,同样返回被修改的行数。

    5.预处理语句

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    <?php

        $mysqli = @new mysqli("localhost", "root", "", "design");

        //如果连接错误

        if(mysqli_connect_errno()){

            echo "连接数据库失败:".mysqli_connect_error();

            $mysqli=null;

            exit;

        }

        //准备好一条语句放到服务器中,插入语句

        $sql = "insert into designer(name, email) values(?, ?)";

        //生成预处理语句

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

        //给占位符号每个?号传值(绑定参数) i  d  s  b,第一个参数为格式化字符,ss代表两个字符串,d代表数字

        $stmt->bind_param("ss", $name, $email);

        //为变量赋值

        $name = "Mike";

        $email = "mike@live.cn";

        //执行

        $stmt->execute();

        //为变量赋值

        $name = "Larry";

        $email = "larry@live.cn";

        //执行

        $stmt->execute();

        //最后输出

        echo "最后ID".$stmt->insert_id."<br>";

        echo "影响了".$stmt->affected_rows."行<br>";

        //关闭数据库连接

        $mysqli->close();

    ?>

    通过以上的预处理语句,我们也可以实现数据插入。

    那么预处理语句有什么特点呢?

    1. 效率上更高, 就是如果执行多次相同的语句,只有语句数据不同, 因为将一条语句在服务器端准备好,然后将不同的值传给服务器,再让这条语句执行。相当于编译一次,使用多次。

    2. 安全上:可以防止SQL注入(? 占位)这样就可以防止非正常的变量的注入。

    所以,推荐大家使用mysqli的预处理语句的方式,不仅效率高,而且更加安全。

    综述

    以上就是对mysqli的一些方法的介绍,更加详细的内容,请查看 PHP 手册。

    希望对大家有帮助!

    转载请注明:静觅 » PHP高级特性八之mysqli函数库的使用

  • 相关阅读:
    我爱Java系列之---【SpringBoot打成war包部署】
    279. Perfect Squares
    矩阵dfs--走回路
    112. Path Sum
    542. 01 Matrix
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    Invert Binary Tree
    563 Binary Tree Tilt
    145 Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/lurenjiashuo/p/php-mysqli.html
Copyright © 2020-2023  润新知