从php5.0以上版本出现了mysqli 数据库连接的升级版本,对比mysql效率上有一定的提升,
它是从面向过程到面向对像的转变。
//属性
#连接使用的属性
$mysqli->connect_errno
$mysqli->connnect_error
#执行所有方法后得到的一个errno 或 error 错误
$mysqli->errno
$mysqli->error
$mysqli->affected_rows //得到影响的条数
$mysqli->insert_id
//方法
$mysqli->query($sql);
$mysqli->select_db($dbName);
$result=$mysqli->query($sql);
$_data=[];
while($row=$result->fetch_object()){
$_data[]=$row;
}
$result->free_result();
$mysqli->close();
那么我们来看一看是如何使用的吧:
1、插入数据 query 方法
header("Content-type:text/html;charset=utf-8"); //连接数据库 test $mysqli=new mysqli("localhost","root","song","test"); if($mysqli->connect_errno){ die("数据库连接失败:".$mysqli->error); } //如果执行到这里,证明数据库连接成功 $sql="insert into web_account(username,pricle,posttime)values('yonglin',3000,".time().")"; $res=$mysqli->query($sql); if($res){ echo "insert success:".$mysqli->insert_id; } $mysqli->close();
2、使用execute() 方法插入数据 适用于批量
header("Content-type:text/html;charset=utf-8"); //连接数据库 test $mysqli=new mysqli("localhost","root","song","test"); if($mysqli->connect_errno){ die("数据库连接失败:".$mysqli->error); } //使用execute方法 执行 $sql="INSERT INTO web_account(username,pricle,posttime)VALUES(?,?,?)"; $statement=$mysqli->prepare($sql); $statement->bind_param("sdi",$username,$pricle,$posttime); //这里写它的变量 以上为什么这样写呢? //就是在sql中全部把它编译好,我们直接使用循环中数据进行填充即可 $_data=[ array("username"=>"yx","pricle"=>433,"posttime"=>time()), array("username"=>"yx1","pricle"=>4133,"posttime"=>time()) ]; foreach($_data as $k=>$val){ $username=$val['username']; $pricle=$val['pricle']; $posttime=$val['posttime']; $statement->execute(); } if($mysqli->errno){ die("sql error:".$mysqli->error); }else{ echo "insert success"; } $mysqli->close();
#绑定参数说明:
#1、这是字符串类型,必须填写和后面的参数一一对应
# s 代表string i代表整数数字 b代表blog d代表浮点 小数
#sql语句包含几个问号,这里就要绑定几个参数
header("Content-type:text/html;charset=utf-8"); //连接数据库 test $mysqli=new mysqli("localhost","root","song","test"); if($mysqli->connect_errno){ die("数据库连接失败:".$mysqli->error); } //使用execute方法 执行 $sql="INSERT INTO web_account(username,pricle,posttime)VALUES(?,?,?)"; $statement=$mysqli->prepare($sql); $statement->bind_param("sdi",$username,$pricle,$posttime); //这里写它的变量 以上为什么这样写呢? $username="mouse"; $pricle=11; $posttime=time(); $statement->execute(); if($mysqli->errno){ die("sql error:".$mysqli->error); }else{ echo "insert success"; } $mysqli->close();
3、查询数据
header("Content-type:text/html;charset=utf-8"); //连接数据库 test $mysqli=new mysqli("localhost","root","song","test"); if($mysqli->connect_errno){ die("数据库连接失败:".$mysqli->error); } //使用execute方法 执行 $sql="SELECT * FROM web_account ORDER BY id DESC"; $result=$mysqli->query($sql); if($result){ $_data=array(); while($row=$result->fetch_object()){ $_data[]=$row; } echo "<pre style='color:blue;'>"; print_r($_data); echo "</pre>"; } $mysqli->close();
4、如何使用事务
msyql的默认行为是在每条sql语句执行后执行一个commit语句,从而有效的将每一条sql语句独立为一个事务。
但根据我们的业务需求,需要多条语句放在一起执行才可以。这样我们就需要设置一个mysql的autocommit为 0
不让它自动提交。
同时还需要设置一下 start transaction;
下面我们来看看如何使用事务: 要使用事务的表必须是支持的事务的。常用支持事务的表是 InnoDB
php如何使用:
header("Content-type:text/html;charset=utf-8"); //面向对象 mysqli 连接使用方法 $mysqli=new mysqli("localhost","root","song"); //判断是否连接成功 if($mysqli->connect_errno){ exit("数据库连接失败:".$mysqli->connect_error()); } //选择数据库 $mysqli->select_db("test"); //关闭自动提交事务 $mysqli->autocommit(false); //等同于 set autocommit=0; start transaction; 开启事务 //存钱 $sql="INSERT INTO web_account(username,pricle,posttime)VALUES(?,?,?)"; $statement=$mysqli->prepare($sql); $statement->bind_param("sdi",$username,$pricle,$posttime); $username="xi"; $pricle=1500; $posttime=time(); if($statement->execute()){ P("插入ID:".$mysqli->insert_id); } if(!$msyqli->errno){ $mysqli->commit(); //等同于 commit }else{ $mysqli->rollback(); //等同于 rollback; }
以下操作是mysql客户端:
#查看表的详细信息 show table status like 'web_account'; #查看表的详细信息
解析说明:
所有的DML都需要使用commit或rollback进行提交或回滚。
像DDL和DCL都是隐式提交, create table .... / grant 等都是自动提交。不用使用commit。
说明一下:
开启了事务 start transaction ,下面需要执行 create table 或 DDL /DCL 语句都是先提交commit
再进行提交。