php数据库编程—mysqli

基本介绍

mysqli ,mysql improve mysql扩展库的增强版

mysql 扩展库 和 mysqli 扩展库的比较

  • mysqli 的稳定性和安全性,效率有所提高
  • mysqi 支持面向对象编程 ,同时 mysqli 扩展库考虑到php老程序员,提供面向过程和面向对象两种编程风格
  • mysqli 的面向过程风格基本类似于mysql,个别不同下面会讲到

mysqli 有两套编程风格
在这里插入图片描述

快速入门案例

首先要在php.ini中启动mysql扩展库,通过phpinfo()函数可以查看php支持哪些扩展库

创建user表

mysql> create table user(
    -> id int primary key auto_increment,
    -> name varchar(32) not null,
    -> password varchar(64) not null,
    -> email varchar(128) not null,
    -> age tinyint unsigned not null
    -> );
Query OK, 0 rows affected (0.10 sec)

insert into user(name,password,email,age) values('zs',md5(12345),'zs@qq.com',30);
insert into user(name,password,email,age) values('ls',md5(12345),'ls@qq.com',20);
insert into user(name,password,email,age) values('王五',md5(12345),'ww@qq.com',10);
Query OK, 3 row affected (0.04 sec)

mysql> select * from user;
+----+------+----------------------------------+-----------+-----+
| id | name | password                         | email     | age |
+----+------+----------------------------------+-----------+-----+
|  1 | zs   | 827ccb0eea8a706c4c34a16891f84e7b | zs@qq.com |  30 |
|  2 | ls   | 827ccb0eea8a706c4c34a16891f84e7b | ls@qq.com |  20 |
|  3 | 王五 | 827ccb0eea8a706c4c34a16891f84e7b | ww@qq.com |  10 |
+----+------+----------------------------------+-----------+-----+
3 rows in set (0.00 sec)

面向过程风格(dql)

//1.创建对象 连接数据库 选择数据库
$conn = mysqli_connect('localhost','root','','test');

//这里也可以用 !$conn 或 mysqli_connect_error()
if (mysqli_connect_errno()){
    //这里要用mysqli_connect_error,不能用mysqli_error
    die('连接失败'.mysqli_connect_error());
}else{
    echo '连接成功';
}

//2.设置数据库,一般可省略(可修改步骤1设置的数据库)
mysqli_select_db($conn,'test1') or die('无此数据库'.mysqli_error($conn));

//3.设置字符集
mysqli_query($conn,'set names utf8');

//4.查询数据
$sql = 'select * from user';
$res = mysqli_query($conn,$sql);
if (!$res){
    die('读取数据失败<br>'.mysqli_error($conn));
}else{
    echo '读取数据成功<br>';
}

//5.处理数据
while ($row = mysqli_fetch_row($res)){
    foreach ($row as $k=>$v){
        echo "$v--";
    }
    echo '<br>';
}

//6.关闭资源,关闭连接
mysqli_free_result($res);
mysqli_close($conn);

面向过程风格(dml)

//1.创建对象 连接数据库 选择数据库
$conn = mysqli_connect('localhost','root','','test');

//这里也可以用 !$conn 或 mysqli_connect_error()
if (mysqli_connect_errno()){
    //这里要用mysqli_connect_error,不能用mysqli_error
    die('连接失败'.mysqli_connect_error());
}else{
    echo '连接成功';
}

//2.设置数据库,一般可省略(可修改步骤1设置的数据库)
mysqli_select_db($conn,'test1') or die('无此数据库'.mysqli_error($conn));

//3.设置字符集
mysqli_query($conn,'set names utf8');

//4.操作数据(dml)
$sql = "insert into user(id,name,password,email,age) values(5,'小李',md5(12345),'xl@qq.com',25)";
//$sql = 'delete from user where id=10';
$res = mysqli_query($conn,$sql);
if (!$res){
    die('操作失败<br>'.mysqli_error($conn));
}
if (mysqli_affected_rows($conn)>0){
    echo '操作成功';
}else{
    echo '未进行数据操作';
}

//5.关闭连接
mysqli_close($conn);

函数详解

mysqli 函数中,有的需要传连接标识符$conn,有的不需要,没啥规律,且需要传标识符的函数不能像mysql的函数一样省略标识符

mysqli_connect()

mysqli_connect() 函数打开一个到 MySQL 服务器的新的连接
mysqli_connect(host,username,password,dbname,port,socket) 参数均为可选;
成功返回一个 mysql 连接标识 link_identifier,失败返回 false

mysqli_connect_error()

返回一个描述错误的字符串。如果没有错误发生则返回 NULL
mysqli_connect_error()专用于mysqli_connect()的错误处理,即数据库连接发生的问题
没有mysql_connect_error()函数,mysql的错误处理全部用mysql_error()

mysqli_error()

返回一个带有错误描述的字符串。如果没有错误发生则返回 ""
mysqli_error() 函数来报告源于运行查询的错误,注意和mysql_connect_error()使用场景的区分
mysqli_error()必须有参数 $link_identifier,mysql_error()可省略参数

mysqli_query()

如果执行的是dml 语句,则返回bool
如果执行的是 dql 语句,则返回一个资源标识符,如果查询执行不正确则返回 false
创建 / 删除数据库,设置字符集等有专用函数,但是可以用mysql_query()函数代替,返回bool

mysqli_affected_rows()

mysqli_affected_rows() 函数返回前一次 MySQL 操作(SELECTINSERTUPDATEREPLACEDELETE)所影响的记录行数
mysql_affected_rows() 取得最近一次与 link_identifier 关联的 INSERTUPDATEDELETE 查询所影响的记录行数,注意区别

处理资源$res的几种函数

mysqli_fetch_row(),从结果集中取得一行,并作为索引数组返回

Array ( [0] => 1 [1] => zs [2] => ** [3] => zs@qq.com [4] => 30 )

mysqli_fetch_assoc(),从结果集中取得一行,并作为关联数组返回

Array ( [id] => 1 [name] => zs [password] => ** [email] => zs@qq.com [age] => 30 )

mysqli_fetch_array() ,从结果集中取得一行,并作为索引数组和关联数组返回

Array ( [0] => 1 [id] => 1 [1] => zs [name] => zs [2] => ** [password] => ** [3] => zs@qq.com [email] => zs@qq.com [4] => 30 [age] => 30 )

mysqli_fetch_object() ,从结果集中取得一行,并作为对象返回

mysqli 过程化风格细节

mysqli 的面向过程风格基本类似于mysql,

连接数据库

mysqli_connect()mysql_connect() 的参数不一样,mysqli_connect() 中可以直接选择数据库和端口
mysqli_connect()mysql_connect() 返回值一样,成功返回一个 mysql 连接标识,失败返回 false
mysqli_connect() 有专用的错误处理函数 mysqli_connect_error(),该函数无参数,不会因为返回false,导致错误处理失效

mysqli_connect_error() 和 mysqli_error() 的区别

在 mysqli 中,错误报告函数被分为了“连接”和“运行查询”两种
也就是说原来统一的 mysql_error() 被分为 mysqli_connect_error()mysqli_error()
mysqli_connect_error() 不需要参数,mysqli_error() 需要参数

如果连接数据库连接发生问题,就可以调用 mysqli_connect_error(),它将返回出错信息
如果其他问题,调用mysqli_error() 函数来报告源于运行查询的错误

面向对象风格(dql)

//1.创建对象 连接数据库 选择数据库
//mysqli_connect() 对应的面向对象风格 mysqli::__construct 并没有 mysqli::connect
$conn = new mysqli('localhost','root','','test');

//不管是否连接成功$conn都是object类型,不能用!$conn
//$conn->connect_error 和 $conn->connect_errno都行,这俩是属性哦(不知道怎么拿到返回值的 不懂)
if ($conn->connect_errno){
    die('连接失败'.$conn->connect_error);
}

//2.设置数据库,一般可省略(可修改步骤1设置的数据库)
$conn->select_db('test') or die('无此数据库'.$conn->error);

//3.设置编码
$conn->query('set names utf8');

//4.查询数据
$sql = 'select * from user';
$res = $conn->query($sql);
if (!$res){
    die('读取数据失败<br>'.$conn->error);
}else{
    echo '读取数据成功<br>';
}

//5.处理数据
while ($row = $res->fetch_row()){
    foreach ($row as $k=>$v){
        echo "$v--";
    }
    echo '<br>';
}

//6.关闭资源,关闭连接
$res->free();
$conn->close();

面向对象风格(dml)

//1.创建对象 连接数据库 选择数据库
//mysqli_connect 对应的面向对象风格 mysqli::__construct 并没有 mysqli::connect
$conn = new mysqli('localhost','root','','test');

//不管是否连接成功$conn都是object类型,不能用!$conn
//$conn->connect_error 和 $conn->connect_errno都行,这俩是属性哦(不知道怎么拿到返回值的 不懂)
if ($conn->connect_errno){
    die('连接失败'.$conn->connect_error);
}

//2.设置数据库,一般可省略(可修改步骤1设置的数据库)
$conn->select_db('test') or die('无此数据库'.$conn->error);

//3.设置编码
$conn->query('set names utf8');

//4.操作数据
//$sql = "insert into user(id,name,password,email,age) values(5,'小李',md5(12345),'xl@qq.com',25)";
$sql = 'delete from user where id=5';
$res = $conn->query($sql);
if (!$res){
    die('操作失败<br>'.$conn->error);
}
if ($conn->affected_rows>0){
    echo '操作成功';
}else{
    echo '未进行数据操作';
}

//5.关闭连接
$conn->close();

mysqli 面向对象风格细节

mysqli 面向对象风格基本上就是把过程化风格的函数封装成属性和方法,通过对象(连接标识符)来访问,不知道有的属性怎么取到的返回值

连接数据库

面向对象风格是通过构造函数连接数据库的,面向过程风格则是通过mysqli_connect()函数
mysqli_connect() 对应的面向对象风格 mysqli::__construct() 并不是 mysqli::connect(),根本没有 mysqli::connect()

释放资源

//mysqli面向过程风格
void  mysqli_free_result ( mysqli_result  $result )

//mysqli面向对象风格(三种都可以)
void  mysqli_result::free (void)
void  mysqli_result::close (void)
void  mysqli_result::free_result (void)

mysqli 增删改查工具类

class sqlHelper{
    private $host;
    private $user;
    private $password;
    private $dbname;
    private $conn;

    public function __construct($host,$user,$password,$dbname){
        $this->host = $host;
        $this->user = $user;
        $this->password = $password;
        $this->dbname = $dbname;

        //1.连接数据库 选择数据库
        $this->conn = new mysqli($this->host,$this->user,$this->password,$this->dbname);
        if ($this->conn->connect_errno){
            die('连接失败'.$this->conn->connect_errno);
        }

        //2.设置编码
        $this->conn->query('set names utf8');
    }

    //3.获取数据(dql)
    public function execute_dql($sql){
        $res = $this->conn->query($sql);
        if (!$res){
            die('操作失败'.mysqli_error($this->conn).'<br>');
        }else{
            echo '操作成功<br>';
        }
        while ($row = $res->fetch_row()){
            foreach ($row as $k=>$v){
                echo "$v--";
            }
            echo '<br>';
        }

        //4.释放资源 关闭连接
        $res->free();
        //$this->conn->close();
    }

    //3.获取数据(dml)
    public function execute_dml($sql){
        $res = $this->conn->query($sql);
        if (!$res){
            die('操作失败'.mysqli_error($this->conn));
        }
        if ($row = $this->conn->affected_rows>0){
            echo '操作成功';
        }else{
            echo '未进行数据操作';
        }

        //4.关闭连接
        //$this->conn->close();
    }

}

$db = new sqlHelper('localhost','root','','test');
$sql = 'select * from user';
$db->execute_dql($sql);
$sql = 'delete from user where id=5';
$db->execute_dml($sql);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值