对于许多web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储所有你想要检索和更新的任何信息
下面介绍两种数据库的访问方式:
①. MySQLi 访问MySQLi (面向对象)数据库,其中MYSQLi又分为 面向对象 和 面向过程两种形式
②. PDO访问MYSQL数据库
MySQLi 和 PDO那个更好???
MySQLi 和 PDO 各有优势
1.MySQLi只针对MySQL数据库,PDO支持12种数据库
2.两者都是面向对象, 但 MySQLi 还提供了 API 接口
3.两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。
下面实例来展示一下它们的不同之处:
先创建数据库和表
create database regist;usedatabase
CREATE TABLE `user` (
`name` varchar(255) NOT NULL,`pass` varchar(255) NOT NULL,PRIMARYKEY(`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
定义数据库连接所需的参数
$servername="localhost";//数据库服务器主机名
$user="root";//数据库连接用户名
$pass="root";//数据库连接密码
$dbname="regist";//选用的数据库名
?>
1.MySQLi (面向对象) 连接
//$conn=new mysqli($servername,$user,$pass,$dbname);
//连接时不指定数据库名
$conn=new mysqli($servername,$user,$pass);if(!$conn){die("数据库连接失败" . mysqli_connect_error());
}else{//弹出消息提示框
echo "";
}//注:执行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 "插入成功"."
";
}//修改
$sql="update user set pass='123456' where name='aa'";//$stmt=mysqli_query($conn,$sql);
$stmt=$conn->query($sql);if($stmt){echo "修改成功"."
";
}//查询
$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"]."
";
}
}echo "结果集行数为:".$result->num_rows."
";//删除
$sql="delete from user where name='aa'";//$stmt=mysqli_query($conn,$sql);
$stmt=$conn->query($sql);if($stmt){echo "删除成功"."
";
}//关闭数据库
// mysqli_close($conn);
$conn->close();echo "已关闭!!";?>浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456结果集行数为:1删除成功
已关闭!!
2.MySQLi (面向过程) 连接
//$conn=mysqli_connect($servername,$user,$pass,$dbname);
//连接时不指定数据库名
$conn=mysqli_connect($servername,$user,$pass);if(!$conn){die("数据库连接失败" . mysqli_connect_error());
}else{//弹出消息提示框
echo "";
}//执行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 "插入成功"."
";
}//修改
$sql="update user set pass='123456' where name='aa'";$stmt=mysqli_query($conn,$sql);//$stmt=$conn->query($sql);
if($stmt){echo "修改成功"."
";
}//查询
$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"]."
";
}
}echo "结果集行数为:".$result->num_rows."
";//删除
$sql="delete from user where name='aa'";$stmt=mysqli_query($conn,$sql);//$stmt=$conn->query($sql);
if($stmt){echo "删除成功"."
";
}//关闭数据库
mysqli_close($conn);//$conn->close();
echo "已关闭!!";?>浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456结果集行数为:1删除成功
已关闭!!
3.PDO连接
$conn=new PDO("$dbtype:host=$servername;dbname=$dbname",$user,$pass);//弹出消息提示框
echo "";//注:执行exec()方法PDOStatement对象,表示执行成功或执行失败
//设置数据库输出为utf8编码
$conn->exec("set names 'utf8'");//增加
$sql="insert into user(name,pass) values('aa','1234')";$stmt=$conn->exec($sql);if($stmt){echo "插入成功!"."
";
}//修改
$sql="update user set pass='123456' where name='aa'";$stmt=$conn->exec($sql);if($stmt){echo "修改成功!"."
";
}//查询
$sql="select*from user";$result=$conn->query($sql);if($result->rowCount()>0){while($row=$result->fetch()){echo "查询结果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."
";
}
}echo "结果集行数为:".$result->rowCount()."
";//删除
$sql="delete from user where name='aa'";$stmt=$conn->exec($sql);if($stmt){echo "删除成功!"."
";
}//关闭数据库
$stmt=$conn = null;if($stmt){echo "已关闭!"."
";
}
}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);
浏览器显示:
PDOStatementObject ( [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"]."
";
}
}echo "结果集行数为:".$result->rowCount()."
";
浏览器显示:
查询结果: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"]."
";
}
}echo "结果集行数为:".$result->num_rows."
";
三.
①. 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']."
";
}echo "行数为:".$count=$stmt->rowcount()."
";
}
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']."
";
echo $row['0'].", " .$row['1']."
";
}//输出结果集中的行数
echo "行数为:".$count=$stmt->rowcount()."
";
不写参数时默认为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']."
";
}//输出结果集中的行数
echo "行数为:".$count=$stmt->rowcount()."
";
参数为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']."
";
}//输出结果集中的行数
echo "行数为:".$count=$stmt->rowcount()."
";
参数为PDO::FETCH_NUM时,仅可以通过列号$row['0']来获取结果集, 不可以通过列名$row['name']来获取结果集