php操作MySQL数据库的方法和解析

Posted cd3245

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php操作MySQL数据库的方法和解析相关的知识,希望对你有一定的参考价值。

对于许多web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储所有你想要检索和更新的任何信息

下面介绍两种数据库的访问方式:

①. mysqli 访问MySQLi (面向对象)数据库,其中MYSQLi又分为 面向对象 和 面向过程两种形式

②. PDO访问MYSQL数据库

MySQLi 和 PDO那个更好???

MySQLi 和 PDO 各有优势
1.MySQLi只针对MySQL数据库,PDO支持12种数据库
2.两者都是面向对象, 但 MySQLi 还提供了 API 接口
3.两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。

下面实例来展示一下它们的不同之处:

先创建数据库和表

create database regist;

use database

CREATE TABLE `user` (
  `name` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

定义数据库连接所需的参数

<meta charset="utf-8">
<?php

    $dbtype="mysql";//使用的数据库类型
    $servername="localhost";//数据库服务器主机名
    $user="root";//数据库连接用户名
    $pass="root";//数据库连接密码
    $dbname="regist";//选用的数据库名
?>

 

1.MySQLi (面向对象) 连接

<?php
    //连接时指定数据库名
    //$conn=new mysqli($servername,$user,$pass,$dbname);
    //连接时不指定数据库名
    $conn=new mysqli($servername,$user,$pass);
    if(!$conn){
        die("数据库连接失败" . mysqli_connect_error());
    }else{
        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";
    }
    
    //注:执行query()方法返回的是一个Statement对象,表示执行成功或执行失败

    
    //设置数据库输出为utf8编码
    // mysqli_query($conn,"set names ‘utf8‘");
    $conn->query("set names ‘utf8‘");
    //选择数据库
    $conn->select_db($dbname);

    //增加
    $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "插入成功"."<br>";
    }

    //修改
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "修改成功"."<br>";
    }

    //查询
    $sql="select*from user";
    // $stmt=mysqli_query($conn,$sql);
    $result=$conn->query($sql);
    if($result->num_rows>0){
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

    //删除
    $sql="delete from user where name=‘aa‘";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "删除成功"."<br>";
    }

    //关闭数据库
    // mysqli_close($conn);
    $conn->close();
    echo "已关闭!!";
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!!

 

2.MySQLi (面向过程) 连接

<?php
    //连接时指定数据库名
    //$conn=mysqli_connect($servername,$user,$pass,$dbname);
    //连接时不指定数据库名
    $conn=mysqli_connect($servername,$user,$pass);
    if(!$conn){
        die("数据库连接失败" . mysqli_connect_error());
    }else{
        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";
    }

    //执行query()方法返回的是一个Statement对象,表示执行成功或执行失败

    //设置数据库输出为utf8编码
    mysqli_query($conn,"set names ‘utf8‘");
    // $conn->query("set names ‘utf8‘");
    //选择数据库
    $conn->select_db($dbname);

    //增加
    $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "插入成功"."<br>";
    }

    //修改
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "修改成功"."<br>";
    }

    //查询
    $sql="select*from user";
    $result=mysqli_query($conn,$sql);
    // $result=$conn->query($sql);
    //判断结果集行数是否大于0
    if($result->num_rows>0){
        //检索结果集的下一行,将检索的结果放到关联数组中,并通过while()循环输出结果集
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

    //删除
    $sql="delete from user where name=‘aa‘";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "删除成功"."<br>";
    }

    //关闭数据库
    mysqli_close($conn);
    // $conn->close();
    echo "已关闭!!";
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!!

 

3.PDO连接

<?php
    try{
        //这里注意: 等号两边不能存在空格,不然会报错,如:dbname = $dbname这样写就会报错
        $conn=new PDO("$dbtype:host=$servername;dbname=$dbname",$user,$pass);
        
        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";
    
        //注:执行exec()方法PDOStatement对象,表示执行成功或执行失败
    
        //设置数据库输出为utf8编码
        $conn->exec("set names ‘utf8‘");

        //增加
        $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "插入成功!"."<br>";
        }

        //修改
        $sql="update user set pass=‘123456‘ where name=‘aa‘";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "修改成功!"."<br>";
        }

        //查询
        $sql="select*from user";
        $result=$conn->query($sql);
        if($result->rowCount()>0){
            while($row=$result->fetch()){
                echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
        echo "结果集行数为:".$result->rowCount()."<br>";

        //删除
        $sql="delete from user where name=‘aa‘";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "删除成功!"."<br>";
        }

        //关闭数据库
        $stmt=$conn = null;
        if($stmt){
            echo "已关闭!"."<br>";
        }
    }catch(PDOException $e){
        print "error!".$e->getMeddage();
    }
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!

 


MySQLi和PDO在连接数据库上的不同

一.
①.MySQLi仅针对MYSQL数据库,所以在连接数据库时无需指定数据库类型(就一种数据库,哪还有什么类型可选,直接就默认为MySQL啦!)
②.PDO支持多种数据库的访问,所以在连接数据库时必须指定数据库类型,不然会报错(PDO可以访问那么多种数据库,你不指定鬼知道你要访问哪种类型的数据库呀!)

二.
①.MySQLi连接数据库时,可以指定数据库名,也可以不指定数据库名
②.PDO连接数据库时,必须指定数据库名,不然会报错


MySQLi面向对象和面向过程方式的异同

一.

MySQLi面向对象:$conn=new mysqli($servername,$user,$pass);
MySQLi面向过程:$conn=mysqli_connect($servername,$user,$pass);

 

我也刚开始学PHP访问数据库,所以我除了它们的连接上有明显区别之外,还没发现MySQLi面向对象 和 MySQLi面向过程的其他不同之处!!!

刚开始的时候,我发现别人在
使用MySQLi面向对象方式连接数据库时,都是使用$conn->query($sql)来执行sql语句的;
使用$conn->close()来关闭数据库。
使用MySQLi面向过程方式连接数据库时,都是用mysqli_query($conn,$sql)来执行sql语句的;
使用mysqli_close($conn)来关闭数据库。

但是在尝试上面的实例时,我发现
不管是MySQLi面向对象还是MySQLi面向过程都可以使用$conn->query($sql)或mysqli_query($conn,$sql)来执行sql语句; 
使用$conn->close()或mysqli_close($conn)来关闭数据库

 

一直以来都以为$conn->query($sql)是MySQLi面向对象专用的,mysqli_close($conn)是MySQLi面向过程专用的,没想到不是!
我想了解这其中的区别?希望有那位了解的大佬能告诉我,谢谢!


PDO执行sql语句所用方法解析

一.
①.当执行insert,update,delete等没有返回结果集的查询时,用PDO对象中的exec()方法来执行,执行成功后会返回受影响的行数
注意:exec()方法不能用于执行select查询,因为执行select查询会返回结果集

如:
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    $stmt=$conn->exec($sql);
    print_r($stmt);
浏览器显示:
    PDOStatement Object ( [queryString] => update user set pass=‘123456‘ where name=‘aa‘ ) 

 

二.
①. 当执行返回结果集的select查询,则使用PDO对象中的query()方法来执行;
该方法成功执行后,会返回一个结果集,并且可以通过PDOStatement对象中的rowCount()方法来获取返回结果集的行数

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    if($result->rowCount()>0){
        while($row=$result->fetch()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
    echo "结果集行数为:".$result->rowCount()."<br>";
浏览器显示:
    查询结果:name: aa, pass: 123456
    结果集行数为:1

 

②. MYSQLi访问数据库时,可以通过num_rows来获取返回结果集的行数

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    //判断结果集行数是否大于0
    if($result->num_rows>0){
        //检索结果集的下一行,将检索的结果放到关联数组中,并通过while()循环输出结果集
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

 

三.
①. execute()用于执行prepare预处理语句。
在执行prepare预处理语句时,可以使用bindParam()方法来绑定参数,并对参数进行编码,然后给execute()执行。
也可以在执行execute()方法绑定参数

②.1.MySQLi 执行prepare()预处理语句时,使用bind_param()方法来绑定参数

如:
    //预处理sql语句
    $stmt=$conn->prepare("insert into user(username,password) values(?,?)");
    //使用bind_param()方法绑定参数
    $stmt->bind_param("ss",$username,$password); 
    //(编辑参数)为绑定的参数赋值
    $username=‘马云‘;
    $password=‘123456‘;
    //执行
    $stmt->execute();

 

2.PDO执行prepare()预处理语句时,使用bindParam()方法来绑定数据库

    //预处理sql语句
    $stmt=$conn->prepare("insert into user(name,pass) values(:name,:pass)");
    //使用bind_param()函数绑定参数
    $stmt->bindParam(‘:name‘,$name); 
    $stmt->bindParam(‘:pass‘,$pass);   
    //(编辑参数)为绑定的参数赋值
    $name=‘王健林‘;
    $pass=‘1234ab‘;
    //执行
    $result=$stmt->execute();

 

3.直接在执行execute()方法时绑定参数

如:
    //预处理sql语句
    $stmt=$dbh->prepare("select * from user where name=?");
    ////执行execute()方法返回的是一个Statement对象,表示执行成功或执行失败
    if($stmt->execute([‘马云‘])){
        //使用fetch()获取结果集并放到关联数组中
        while($row=$stmt->fetch()){
            echo $row[‘name‘]."<br>";
        }
        echo "行数为:".$count=$stmt->rowcount()."<br>";
    }

 

PDO获取结果集的方法

①. 获取结果集的的方法。fetch() ,fetchAll() , . . .
1.fetch()
fetch()用于获取结果集的下一行,一次检索一行,然后将获取的数据放到关联的数组中。

2.fetchAll()
fetchAll()方法用于获取结果集中的所有行,其返回值是一个包含结果集中所有数据的二进制数组。

②.结果集的返回方式
众所周知,我们平时获取数组的值时,一般都是通过数字索引或者是其字符串键来获取的
fetch()方法返回结果集的方式是由其参数控制,
参数为为PDO::FETCH_ASSOC,即通过列名作为数组索引来获取
参数为PDO::FETCH_NUM时,通过列号作为索引来获取
参数为PDO::FETCH_BOTH时,即可通过列名来获取也可通过列号来获取,不写参数时,默认为PDO::FETCH_BOTH

参数为PDO::FETCH_BOTH时

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch()){
            // echo $row[‘name‘].", " .$row[‘pass‘]."<br>";
            echo $row[‘0‘].", " .$row[‘1‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";
    
不写参数时默认为PDO::FETCH_BOTH, 此时可通过列名$row[‘name‘]来获取结果集, 也可通过列号$row[‘0‘]来获取结果集

 

参数为PDO::FETCH_ASSOC

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
            echo $row[‘name‘].", " .$row[‘pass‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";
    
参数为PDO::FETCH_ASSOC时,仅可以通过列名$row[‘name‘]来获取结果集, 不可以通过列号$row[‘0‘]来获取结果集

 

参数为PDO::FETCH_NUM

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch(PDO::FETCH_NUM)){
            echo $row[‘0‘].", " .$row[‘1‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";
    
参数为PDO::FETCH_NUM时,仅可以通过列号$row[‘0‘]来获取结果集, 不可以通过列名$row[‘name‘]来获取结果集

 

参考资料
http://www.runoob.com/php/php-mysql-connect.html
http://blog.okbase.net/phpchina/archive/731.html
https://blog.csdn.net/sck0088/article/details/45674193
https://www.cnblogs.com/dee0912/p/4093014.html
https://www.jb51.net/article/105797.htm

 
































以上是关于php操作MySQL数据库的方法和解析的主要内容,如果未能解决你的问题,请参考以下文章

LNMP平台

在php中操作mysql数据库

PHP- MySQL 数据库插入操作不起作用 [重复]

LAMP应用

LNMP架构搭建Discuz论坛(实战!)

php+MySQL实战案例php数据库辅助类