u 使用php 的mysqli扩展库去操作mysql数据库
简单介绍:
mysqli (mysql improve mysql扩展库的增强版)
mysql 扩展库 和 mysqli 扩展库的比较
1. mysqli 的稳定性和安全性,效率有所提高
2. mysqi 支持面向对象编程 ,同时 mysqli 扩展库考虑到php老程序员,提供面向过程的编程风格.
mysqli 有两套编程风格:
用appserver
php版本5.2.x
$mysqli=new MySQLi(“localhost”,”root”,”roo3t”,”test”);
//安照变相对象的方式
if($mysqli->connect_error){
die($mysqli->connect_error);
}
// 考虑兼容低版本
if(mysqli_connect_error()){
die(“连接error”. mysqli_connect_error())
}
u mysqli 编程的快速入门
编写一个程序,这个程序从user1表中读取数据,并打印在网页中。(使用mysqli完成.)
1. 先使用mysqli面向对象的风格,完成案例
1.1. 配置php.ini 文件让php支持mysqli扩展库
extension=php_mysqli.dll
1.2 建库,建表.
这里我们使用原来的user1表.
1.3 编写代码
<?php
header("Content-type: text/html;charset=utf-8");
//mysqli操作mysql数据库(面向对象风格)
//1.创建MySQLi 对象
$mysqli=new MySQLi("localhost","root","root","test");
//验证是否ok
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
//2. 操作数据库(发送sql)
$sql="select * from user1";
//$res 是结果集.mysqli result
$res=$mysqli->query($sql);
//var_dump($res);
//3. 处理结果 mysql_fetch_row();
while($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4. 关闭资源
//释放内存
$res->free();
//关闭连接
$mysqli->close();
?>
我们再使用面向过程的方式给大家演示一下.
代码:
//1.得到mysqli连接
header("Content-type: text/html;charset=utf-8");
$mysqli=mysqli_connect("localhost","root","root","test");
if(!$mysqli){
die("连接失败".mysqli_connnect_error($mysqli));
}
//2.向数据库发送sql语句(ddl,dml dql ...)
$sql="select * from user1";
$res=mysqli_query($mysqli,$sql);
//var_dump($res);
//3.处理得到的结果
//循环取出$res中的数据mysqli_fetch_row mysql_fetch_row
while($row=mysqli_fetch_row($res)){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//4.关闭资源
mysqli_free_result($res);
mysqli_close($mysqli);
☞ 在mysqli 扩展中,也提供了四种方式来获取mysqli result结果集mysqli_result::fetch_assoc <==> mysql_fetch_assoc
mysqli_result::fetch_row <==> mysql_fetch_row
mysqli_result::fetch_array <===> mysql_fetch_array
mysqli_result::fetch_object<===> mysql_fetch_object
这里我们推荐大家使用前两种效率较高
☞ 在mysqli释放结果集有三种方式:
void mysqli_result::free ( void )
void mysqli_result::close ( void )
void mysqli_result::free_result ( void )
☞ mysql 的sql 语句的特别说明:
如果操作的字段类型是 string型,则要求我们的 要用 ‘’ 包括。
如果操作的字段类型是 数值型,则可以用 ’80’ 包括,也可以不用
u mysqli的增强-批量执行sql语句
批量执行 dml语句
基本语法
$sqls=”sql1;sql2;...”
mysqli::multi_query($sqls)
体验案例: PHP 网站
请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义 吴用
代码:
<?php
//请使用mysqli的mysqi::multi_query() 一次性添加三个用户 宋江 卢俊义 吴用
//1.得到mysqli对象
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sqls="insert into user1 (name,password,email,age) values('宋江','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age) values('卢俊义','aaa','aa@shu.com',45);";
$sqls.="insert into user1 (name,password,email,age) values('吴用','aaa','aa@shu.com',45);";
//$sqls.="update ;";
//$sqls.="delete ;";
//dml 和 dql
$b=$mysqli->multi_query($sqls);
if(!$b){
echo "执行失败".$mysqli->error;
}else{
echo "ok";
}
//关闭资源
$mysqli->close();
?>
☞ 批量执行dml语句可以混合使用 delete insert update,但是最好不要使用select
u 批量执行 dql语句
它的作用是可以一次性的取回多个结果集
<?php
//练习2: 请使用mysqli的mysqi::multi_query() 一次性查询并显示①users表的结构 、 ② users表中用户id ,和用户名字
//1.得打mysqli对象(究竟是什么 代表的是和mysql数据库的连接. $conn)
$mysqli=new MySQLi("localhost","root","hsp123","test");
//2.批量查询
$sqls="select * from emp;";
$sqls.="select * from user1;";
$sqls.="desc user1";
//3.处理结果
//如果成功,则至少有一个结果集
$mysqli 对象 中 $mysqli result 数组
if($res=$mysqli->multi_query($sqls)){
do{
//从mysqli连接取出第一个结果集
$result=$mysqli->store_result();
//显示mysqli result对象
while($row=$result->fetch_row()){
foreach($row as $key => $val){
echo "--$val";
}
echo "<br/>";
}
//及时释放$result;
$result->free();
if(!$mysqli->more_results()){
break;
}
echo "<br/>******新的结果集*******<br/>";
}while($mysqli->next_result());
}
//4.关闭资源
$mysqli->close();
?>
u mysql的事务处理
看一个实际情况
有一张银行账号表
create table account
(id int primary key,
balance float);
现在有一段php程序, 要完成 把 1号 10 元钱,转到 2号账号上
<?php
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) or die($mysqli->error);
$b2=$mysqli->query($sql2) or die($mysqli->error);
if(!$b1||!$b2){
echo "失败";
}else{
echo "成功";
}
$mysqli->close();
?>
这时,我们需要有一种方法来控制两句sql语句同时成功,同时失败.
->事务
u 事务
基本:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性
现在我们使用事务来完成上面的代码
代码:
<?php
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//将提交设为false[事务一旦提交就没有机会回滚.]
$mysqli->autocommit(false);
//-> savepoint a;会把但前情况记录
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) ;
$b2=$mysqli->query($sql2) ;
if(!$b1||!$b2){
echo "失败,回滚".$mysqli->error;
//回滚!
$mysqli->rollback();
}else{
//提交[一旦提交没有机会回滚]
$mysqli->commit();
}
$mysqli->close();
//显示控制台
?>
☞ 在mysql控制台可以使用事务来操作,具体步骤如下
1. 开启一个事务
start transaction
2. 做保存点
savepoint 保存点名称
3. 操作....
4. 可以回滚,可以提交
4.1 如果没有问题提交
commit
4.2 如果你觉得有问题,就回滚
rollback to 保存点.
u 事务的acid特性
原子性,一致性,持久性,隔离性.
--上次课没有拷贝过来的代码
<?php
$mysqli=new MySQLi("localhost","root","hsp123","test");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//将提交设为false[事务一旦提交就没有机会回滚.]
$mysqli->autocommit(false);
//-> savepoint a;会把但前情况记录
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account2 set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1) ;
$b2=$mysqli->query($sql2) ;
if(!$b1||!$b2){
echo "失败,回滚".$mysqli->error;
//回滚!
$mysqli->rollback();
}else{
//提交[一旦提交没有机会回滚]
$mysqli->commit();
}
$mysqli->close();
//显示控制台
?>
在path进行配置:
把MySQL的bin路径设置到环境变量里的path变量值里,就可以直接在cmd里输入程序名称来运行它;
也可以在cmd里跳转到那个bin目录下,在执行 ./程序名称 ,也可以运行这个程序