一.Mysqli概念
从PHP5.0开始可以使用Mysqli,是一个面向对象的技术
mysql是非持续链接数据库,mysql每次链接都会打开一个链接的进程
mysqli是永久链接函数,多次运行mysqli将使用同一链接进程,从而减少服务器的开销
功能增加了,mysqli封装了诸如事物等一些高级操作


二.Mysqli扩展
1.使用Mysqli,需要加载Mysqli扩展库,请确定 php.ini 开启MySQLi库扩展:
extension_dir = "F:/wamp/php-5.4.45/ext"
extension=php_mysqli.dll
2.使用 extension_loaded() 函数可以检测MySQLi库扩展是否开启
bool extension_loaded('mysqli');


三.使用Mysqli操作数据库
在PHP脚本中使用MySQLi操作数据库步骤如下:
连接MySQL数据库服务器
选择数据库
设置字符集
准备并执行SQL语句
处理结果集
释放结果集资源
关闭数据库连接


四.链接Mysql,并选择数据库
1.方法一:
    $mysqli=new mysqli("127.0.0.1:3306","root","123456","eshop");
方法二:
    $mysqli=new mysqli();
    $mysqli->connect("127.0.0.1:3306","root","123456");
    $mysqli->select_db("eshop");


2.$mysqli->connect_errno;
返回错误号
如果未发生任何错误,connect_errno()函数将返回0
$mysqli->connect_error;
返回错误信息


3.设置汉字编码
$mysqli->set_charset("utf8");


五.执行SQL语句
$mysqli->query($sql);
描述:执行SQL查询(查询指所有SQL命令的统称)
如果SQL为select、show等查询语句,正确执行时将返回资源结果集,错误执行将返回false;
如果SQL为insert、update、delete等操作语句时,正确执行将返回true,错误执行将返回false。


六.处理资源结果集
$result->num_rows
描述:返回结果集包含的记录数目
$result->fetch_row()
描述:从结果集抽取一行作为索引数组返回,如果没有更多的行,则返回false
$result->fetch_assoc()
描述:从结果集抽取一行作为关联数组返回,如果没有更多的行,则返回false
$result->fetch_array( MYSQLI_BOTH| MYSQLI_ASSOC |MYSQLI_NUM )
描述:从结果集抽取一行作为索引数组/关联数组/两者兼有返回,如果没有更多的行,则返回false
$result->fetch_all(MYSQLI_NUM | MYSQLI_ASSOC | MYSQLI_BOTH)
描述:从结果集抽取所有记录


七.处理非查询语句
$mysqli->affected_rows
返回受影响记录的行数
-1代表操作失败
0代表没有受影响记录


$mysqli->insert_id
在插入记录时,返回最后插入记录的主键id


八.释放结果集资源,关闭数据库连接
$result->free_result()
描述:释放结果集


$mysqli->close();
描述:关闭连接


九.Mysqli_stmt预处理类
和mysqli和mysqli_result相比优点:
1. mysqli和mysqli_result完成的功能,都可以使用mysqli_stmt完成
2. 效率上:高, 就是如果执行多次相同的语句,只有语句数据不同, 因为将一条语句在服务器端准备好,然后将不同的值传给服务器,再让这条语句执行编译一次,使用多次
3. 安全上:SQL注入(? 占位) ,后期传的值不会当成SQL语句


mysqli_stmt的处理过程
1.链接数据库
$mysqli=new Mysqli('主机名','用户名','密码','库名');
例:$mysqli=new mysqli("127.0.0.1:3306",'root','123456','yhshop');
2.//设置客户端的汉字编码
$mysqli->set_charset("utf8");
3.sql语句准备
插入语句
$sql="insert into yhshop(字段名,...)values(?,?,?...)";
例:
//准备一个要处理的SQL语句
$sql="insert into yh_admin(username,password) value(?,?)";
4.预处理对象初始化
第一种进行预处理
$stmt=$mysqli->stmt_int();
$stmt->prepare($sql);
例:
    $stmt=$mysqli->stmt_init();
    $stmt->prepare($sql);
第二种进行预处理
$stmt=$mysqli->prepare($sql);
例:
$stmt=$mysqli->prepare($sql);
mysqli中也有prepare方法,并直接返回stmt预处理对象,可以省去stmt_init()方法
5.绑定参数
$stmt->bind_param('字段类型',分别对应的?的变量名);
例:
$stmt->bind_param('ss',$username,$password);
类型有i-整型,d-浮点型,s-字符串,b-二进制
6.给参数赋值
例:
   $username='php1';
   $password=md5('123');
执行SQL语句
$stmt->execute();
最后一次插入的ID
$stmt->insert_id;
最后一次操作影响的行数
$stmt->affected_rows;
例:
if($stmt->execute()){
     echo $stmt->insert_id;
 };
有结果集的绑定结果集
$stmt->bind_result(分别对应结果集中的列所设置的变量);
结果集操作
while($stmt->fetch()){ 绑定的变量 }


一次性将结果全部取出
$stmt->store_result();
结果条数
$stmt->num_rows;
指针移动到n(先运行store_result)
$stmt->data_seek(n);
释放预处理结果
$stmt->close();
关闭mysqli
$mysqli->close();


十.事务处理
(多个SQL要完成的任务看为是一个事务)一件事(有任何一个环节出错,都整个事务撤消, 如果都成功才去提交)
  目前只有InnoDB和BDB支持事务
  默认表都是自动提交的(autocommit)
  步骤:
  关闭自动提交 set autocommit=0
  开启事务 start transaction
  sql执行
  语句执行成功提交,语句执行失败则回滚commit/rollback


关闭自动提交
    $mysqli->autocommit(0);
开启事务(php5.5之后才支持)
   $mysqli->begin_transaction();
执行要操作sql语句
    $res1=$mysqli->query("update yh_member set money=money-500 where user_name='rose'");
    $res2=$mysqli->query("update yh_member set money=money+500 where user_name1='jack'");
出现错误则进行回滚,没有错误则进行提交
    if(!$res1 || !$res2){
        echo $mysqli->error;
        $mysqli->rollback();
    }else{
        $mysqli->commit();
    }
开启自动提交
   $mysqli->autocommit(1);