3、数据库操作函数
文件位置:inc/mysql.inc.php
void单词本意: 空的、不需要参数
本节难点:一次执行多条sql的编写。
1)连接数据库
核心函数:mysqli_connect()
function connect($host=DB_HOST,$user=DB_USER,$pwd=DB_PASSWORD,$db=DB_DATABASE,$port=DB_PORT){
//建立一个新连接
$link = @mysqli_connect($host,$user,$pwd,$db,$port);
var_dump($link);exit;
//如果返回值不为0 就结束代码 输出错误描述
if (mysqli_connect_errno()){
exit(mysqli_connect_error());
}
//设置默认字符集
mysqli_set_charset($link,'utf8');
return $link;//返回连接对象
}
用到的函数:
1、mysqli_connect(主机名,用户名,密码,数据库名,端口号);打开到MySQL服务器的新连接 返回值:返回一个表示与MySQL服务器的连接的对象
2、mysqli_connect_errno(void);返回最后一次连接数据库的错误代码 0表示没有错误
3、mysqli_connect_error(void);返回上一个连接错误的字符串说明
2)执行一条语句 返回结果集或布尔值
核心函数:mysqli_query()
function execute($link,$sql){
$result = mysqli_query($link,$sql); //如果有错打印错误信息 if (mysqli_errno($link)) { exit(mysqli_error($link)); } return $result; }
用到的函数:
1、mysqli_query($link,$sql);对数据库执行一次查询
返回值:失败返回false,成功执行select,show,describe或explain会返回一个mysqli_result 对象,其他查询则返回TRUE。
describe:查询表的结构
explain:查看SQL的执行计划
2、mysqli_errno($link);最近一次函数调用所产生的错误代码 返回值:0表示没有错误
3、mysql_error($link);最近一次错误代码的描述,类型是字符串
3)执行一条语句 只返回布尔值
function execute_bool($link,$sql){
$bool = mysqli_real_query($link,$sql);
if (mysqli_errno($link)){
exit(mysqli_error($link));
}
return $bool;
}
核心函数:
mysqli_real_query($link,$sql);执行一个mysql查询 返回值:布尔类型
4)获取记录数
核心逻辑:sql语句必须带统计函数
统计函数返回的结果集只有一行,我们取出来这一行就可以了
select count(*) from bbs_category;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
------------------------------------------------------------
function num($link,$sql_count){ $result = execute($link,$sql_count); $num = mysqli_fetch_row($result);//以一个枚举数组方式返回一行结果 return $num[0]; }
------------------------------------------------------------
另一种方式:sql语句不使用统计函数
$sql = "select * from bbs_category;
$result = mysqli_query($link,$sql);
$res = mysqli_num_rows($result);//获取结果中行的数量 返回值 int
var_dump($res);
5)数据入库之前 转义函数
function escape($link,$data){ //1 如果是字符串就转义一下返回 if (is_string($data)){ return mysqli_real_escape_string($link,$data);//函数返回转义后的字符串 } //2 用递归的方式遍历数组 if (is_array($data)){ foreach ($data as $k=>$v){ $data[$k] = escape($link,$v); } } return $data; }
核心函数:mysqli_real_escape_string($link,$str);根据当前连接的字符集,对于 SQL 语句中的特殊字符进行转义
6)关闭连接
function close($link){
mysqli_close($link);
}
$link = connect();
clos($link);
在函数里面关闭了$link,函数外面这个$link有没有受到影响?
答案是:外面这个也关闭了。
为什么可以关闭成功?
当对象作为函数的参数值,对象直接把自己本身传递过去了,而不是复制一份传递给函数,就像引用传参一样。
----------------------------------------------------------------------------------
//按值传参
function demo($i){
echo $i = $i+10;
}
$a = 5;
demo($a);//输出15 函数里面的$a已经是15了
echo $a;//输出5 函数外面的$a还是5
//引用传参
$error = '';
function say(&$error){
echo $error = '我是引用传参';
}
say($error);//输出了 我是引用传参
echo $error;//也输出了 我是引用传参 函数外的变量$error已经被改变
-------------------------------------------------------------------------------------------------------------------------------
7)执行多条sql语句
核心函数:
mysqli_multi_query 执行一个 SQL 语句,或者多个使用分号分隔的 SQL 语句。
要获得执行结果中的第一个结果集,请使用 mysqli_use_result() 或 mysqli_store_result() 函数。
要读取后续的结果集, 请使用 mysqli_more_results() 和 mysqli_next_result() 函数。
执行多条语句得到了多个结果集
函数实现
function execute_multi($link,$arr_sqls,&$error){
$sqls=implode(';',$arr_sqls).';';
if(mysqli_multi_query($link,$sqls)){
$data=array();
$i=0;//计数
do {
if($result=mysqli_store_result($link)){
$data[$i]=mysqli_fetch_all($result);
mysqli_free_result($result);
}else{
$data[$i]=null;
}
$i++;
if(!mysqli_more_results($link)) break;
}while (mysqli_next_result($link));
if($i==count($arr_sqls)){
return $data;
}else{
$error="sql语句执行失败:<br /> 数组下标为{$i}的语句:{$arr_sqls[$i]}执行错误<br /> 错误原因:".mysqli_error($link);
return false;
}
}else{
$error='执行失败!请检查首条语句是否正确!<br />可能的错误原因:'.mysqli_error($link);
return false;
}
}
参数说明和调用示范
参数说明 $link:连接 $arr_sqls:数组形式的多条sql语句 $error:传入一个变量,里面会存储语句执行的错误信息
使用示范: $arr_sqls=array( 'select * from sfk_father_module', 'select * from sfk_father_module', 'select * from sfk_father_module', 'select * from sfk_father_module' ); var_dump(execute_multi($link, $arr_sqls,$error)); echo $error;

浙公网安备 33010602011771号