对于许多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
原文地址:https://www.cnblogs.com/CD3245/p/10260949.html