由于mysql连接方式被废除,据说在php7中要使用mysql_connect()还需要额外下载组件。
使用mysqli有面向过程和面向对象两种方式。
mysqli提供了三个类:
-
mysqli 连接相关的
-
mysqli_result 处理结果集
-
mysqli_stmt 预处理类
数据库连接
- <?php
- $db_host = 'localhost';
- $db_name = 'test';
- $db_user = 'root';
- $db_pwd = '';
- //面向对象方式
- $mysqli = new mysqli($db_host, $db_user, $db_pwd, $db_name);
- //面向对象的昂视屏蔽了连接产生的错误,需要通过函数来判断
- if(mysqli_connect_error()){
- echo mysqli_connect_error();
- }
- //设置编码
- $mysqli->set_charset("utf8");//或者 $mysqli->query("set names 'utf8'")
- //关闭连接
- $mysqli->close();
- //面向过程方式的连接方式
- $mysqli = mysqli_connect($db_host, $db_user, $db_pwd, $db_name);
- //判断是否连接成功
- if(!$mysqli ){
- echo mysqli_connect_error();
- }
- //关闭连接
- mysqli_close($mysqli);
- ?>
数据库查询
通用:执行sql语句都可用query(sql),执行失败会返回false,select成功则返回结果集对象,其他返回true,只要不是false就说明sql语句执行成功了。
- <?php
- //无结果集示例
- $sql = "insert into table_name (`name`, `address`) values ('xiaoming', 'adddddrrreess')";
- $result = $mysqli->query($sql);
- //或者
- $sql = "delete from table_name where name='xiaoming'";
- $result = $mysqli->query($sql);
- if($result === false){
- echo $mysqli->error;
- echo $mysqli->errno;
- }
- //影响条数
- echo $mysqli->num_rows;
- //插入的id
- echo $mysqli->insert_id;
- $mysqli->close();
- <?php
- $sql = "select * from table_name";
- $result = $mysqli->query($sql);
- if($result === false){//执行失败
- echo $mysqli->error;
- echo $mysqli->errno;
- }
- //行数
- echo $result->num_rows;
- //列数 字段数
- echo $result->field_count;
- //获取字段信息
- $field_info_arr = $result->fetch_fields();
- //移动记录指针
- //$result->data_seek(1);//0 为重置指针到起始
- //获取数据
- while($row = $result->fetch_assoc()){
- echo $row['name'];
- echo $row['address'];
- }
- //也可一次性获取所有数据
- //$result->data_seek(0);//如果前面有移动指针则需重置
- $data = $result->fetch_all(MYSQLI_ASSOC);
- $mysqli->close();
预处理示例
预处理能有效的防止sql注入的产生,mysqli_stmt是预处理类
- <?php
- $sql = "insert inro table_name ('name','address') values (?,?)";
- //获得预处理对象
- $stmt = $mysqli->prepare($sql);
- //绑定参数 第一个参数为绑定的数据类型
- /*
- i:integer 整型
- d:double 浮点型
- s:string 字符串
- b:a blob packets blob数据包
- */
- $name = "xiaoming";
- $address = "adddressss";
- $stmt->bind_param("ss", $name, $address);//绑定时使用变量绑定
- //执行预处理
- $stmt->execute();
- /*
- //可重新绑定 多次执行
- $stmt->bind_param("ss", $name, $address);
- $stmt->execute();
- */
- //插入的id 多次插入为最后id
- echo $stmt->insert_id;
- //影响行数 也是最后一次执行的
- echo $stmt->affected_rows;
- //错误号
- echo $stmt->errno;
- //错误信息
- echo $stmt->error;
- //关闭
- $stmt->close();
- $mysqli->close();
下面示例select的预处理
- //注释部分省略
- $sql = "select * from table_name where id<?";
- $stmt = $mysqli->prepare($sql);
- $id = 30;
- $stmt->bind_param("i", $id);
- $stmt->execute();
- //获取结果集
- $result = $stmt->get_result();//结果集取后的操作就和之前一样了
- //获取所有数据
- $data = $result->fetch_all(MYSQLI_ASSOC);
- $result->close();
- $mysqli->close();
一次执行多条sql语句multiquery(不推荐),执行结果不是结果集,affectd_rows是最后影响的条数
- <?php
- $sql_arr = array(
- "insert into table_name (`name`,`address`) values ('xiaoming','a')",
- "insert into table_name (`name`,`address`) values ('xiaohong','a')",
- 'delete from table_name where id=23',
- );
- $sql = implode(';', $sql_arr);
- $result = $mysqli->multi_query($sql);
- if($result === false){
- echo $mysqli->error;
- }
- $mysqli->close();