建立,关闭与MySQL服务器的连接
连接指定的mysql服务器
$mysqli_content = mysqli_connect($host,$user,$password,$database,$port,$socket)
$host —— ip地址,服务器的地址
$user —— 用户名,root
$password —— MySQL的密码
$database —— 数据库
$port —— 端口号,一般默认3306
$socket —— 使用很少,基本不用
<?php
$link = @mysqli_connect('localhost','root','root','php1',3306);
?>
//由于会出现错误,为防止错误信息直接暴露在页面,可以使用@屏蔽错误
连接错误时的提示
int mysqli_connect_errno();
// 返回最后一次连接调用的错误代码
string mysqli_content_error();
//返回一个字符串描述的最后一次连接调用的错误代码
密码或用户名错误的报错:
echo mysqli_connect_error();
//Access denied for user 'root'@'localhost' (using password: YES)
echo mysqli_connect_errno($link);
//1045
0 —— 表示连接成功
设置默认字符编码
bool mysqli_set_charset(mysqli $link , string $charset);
设置成功返回 true
mysqli_set_charset($link,'GBK');
mysqli_set_charset($link,'utf8');//注意 utf-8 省略 ‘-’
选择特定的数据库
bool mysqli_select_db(mysqli $link,string $dbname);
$link —— 建立的连接,mysqli_connect()
$abname —— 数据库名称
当没有指定数据库时,可以用此函数添加数据库
当指定数据库,需要切换数据库:
mysqli_select_db($link,$php2);
关闭与mysql服务器的连接
bool mysqli_close(mysqli $link);
$link —— 建立的连接,mysqli_connect()
mysqli_close($link);
执行mysql语句
mysqli_query()
在数据库中执行一条MySQL语句
mysqli_query(mysqli $link ,string $query,[int $resultmode = MYSQLI_STORE_RESULT]);
$link —— 建立的连接,mysqli_connect()
$query —— 查询字符串
$resultmode —— 决定获取结果的方式,可取值:
MYSQLI_USE_RESULT :mysqli_fetch_array()每次都要向server请求结果行,在执行MySQL时,并没有从server将结果取出
MYSQLI_STORE_RESULT :默认值(较常用的),具体结果一次性返回给客户端(PHP),相当于本地取数据
可选参数
- 对于delete,update,insert等不会返回数据的SQL语句,执行没有错误将返回true
// 创建表
$str = 'create table p3 (id int auto_increment primary key ,name varchar(10),class int(4),age int(3));';
var_dump(mysqli_query($link,$str));//true
// 添加数据
$str = 'insert into p3 (name,class,age) values ("Yz",1526,25),("Zs",1506,20),("Ys",1515,22);';
var_dump(mysqli_query($link,$str));//true
// 删除表
echo "<br>";
$str = 'drop table p3;';
var_dump(mysqli_query($link,$str));//true
- 对于返回数据的SQL语句,执行成功的时候返回结果 对象集合,可以使用操作结果 对象集合 的函数来从中获取数据
// 查询
$str = 'select * from p3';
$result = mysqli_query($link,$str);
var_dump($result);
//object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(4) ["lengths"]=> NULL ["num_rows"]=> int(3) ["type"]=> int(0) }
mysqli_real_query()
执行一个mysql查询
mysqli_real_query ( mysqli $link , string $query ) : bool
$link —— 建立的连接,mysqli_connect()
$query —— 查询字符串
返回值:成功时返回 true, 否则返回 false。
$str = 'select * from p3';
$result = mysqli_real_query($link,$str);
var_dump($result);//true
若想获取数据,需要使用 mysqli_store_result()
mysqli_store_result()
转移上一次查询返回的 结果集合(对象集合)
mysqli_store_result ( mysqli $link, [ int $option ] ) : mysqli_result
$option —— 可以取值 :
MYSQLI_STORE_RESULT_COPY_DATA 将结果集从 mysqlnd 的内部缓冲区复制到 PHP 变量中
默认情况下,mysqlnd 采取一种引用策略尽量避免在内容中复制多份同样的结果集。
例如:
if(mysqli_real_query($link,$str))
{
$result = mysqli_store_result($link,MYSQLI_STORE_RESULT_COPY_DATA);
}
print_r($result);//mysqli_result Object ( [current_field] => 0 [field_count] => 4 [lengths] => [num_rows] => 3 [type] => 0 )
执行MySQL语句报错
int mysqli_errno(mysqli $link); —— 返回报错数字码
string mysqli_error(mysqli $link); —— 返回报错内容
$str = 'create table p3 (id int auto_increment primary key ,name varchar(10),class int(4),age int(3));';
var_dump(mysqli_query($link,$str));
echo mysqli_errno($link).":".mysqli_error($link);//1050:Table 'p3' already exists , p3表已存在
$str = 'insert into p3 values ("Yz",25);';
var_dump(mysqli_query($link,$str));
echo mysqli_errno($link).":".mysqli_error($link);//1136:Column count doesn't match value count at row 1 , 列数与第1行的值数不匹配
mysqli_multi_query()
一次性执行多条SQL语句,多条SQL语句用逗号分隔
mysqli_multi_query ( mysqli $link , string $query ) : bool
$query —— 多条SQL语句。
返回值:当第一条语句执行就返回true
mysqli_multi_query($link,"create table p2 (id int auto_increment primary key , class varchar(15));insert into p2 (class) values (20180612515),(20180612506),(20180612525);");
mysqli_next_result
为读取 multi_query 执行之后的下一个结果集做准备
mysqli_next_result ( mysqli $link ) : bool
mysqli_multi_query() 函数执行之后, 为读取下一个结果集做准备, 然后可以使用 mysqli_store_result() 或 mysqli_use_result() 函数读取下一个结果集。
操作结果 对象集合 的函数
mysqli_fetch_row()
以索引数组的方式获取一条记录
mixed mysqli_fetch_row(mysqli_result $result);
$result —— 查询到的结果,形成的对象集合
返回值为array,每次返回一行MySQL的数据,从左到右保存在数组中
索引值为数字,从左到右从0开始
print_r(mysqli_fetch_row($result));//Array ( [0] => 1 [1] => Yz [2] => 1526 [3] => 25 )
print_r(mysqli_fetch_row($result));//Array ( [0] => 2 [1] => Zs [2] => 1506 [3] => 20 )
print_r(mysqli_fetch_row($result));//Array ( [0] => 3 [1] => Ys [2] => 1515 [3] => 22 )
mysqli_fetch_assoc()
以关联数组的方式获取一条记录的数据
array mysqli_fetch_assoc(mysqli_result $result);
$result —— 查询到的结果,形成的对象集合
返回值为array,每次返回一行MySQL的数据,从左到右保存在数组中
索引值为MySQL表的列字段
print_r(mysqli_fetch_assoc($result));//Array ( [id] => 1 [name] => Yz [class] => 1526 [age] => 25 )
print_r(mysqli_fetch_assoc($result));//Array ( [id] => 2 [name] => Zs [class] => 1506 [age] => 20 )
print_r(mysqli_fetch_assoc($result));//Array ( [id] => 3 [name] => Ys [class] => 1515 [age] => 22 )
mysqli_fetch_array()
以索引数组或关联数组的方式获取一条记录
mixed mysqli_fetch_array(mysqli_result $result,[$resulttype = MYSQLI_BOTH]);
$result —— 查询到的结果,形成的对象集合
$resulttype —— 可取值为:
MYSQLI_ASSOC :索引值为 MySQL列字段
MYSQLI_NUM : 索引值为数字
MYSQLI_BOTH : 默认值,索引值为数字和MySQL列字段
返回值为array,每次返回一行MySQL的数据,从左到右保存在数组中
默认情况下 —— 索引值为数字和MySQL列字段,每行每列先存储数字索引,然后是MySQL列字段索引,接着下一列······
print_r(mysqli_fetch_array($result));//Array ( [0] => 1 [id] => 1 [1] => Yz [name] => Yz [2] => 1526 [class] => 1526 [3] => 25 [age] => 25 )
print_r(mysqli_fetch_array($result,MYSQLI_NUM));//Array ( [0] => 2 [1] => Zs [2] => 1506 [3] => 20 )
print_r(mysqli_fetch_array($result,MYSQLI_ASSOC));//Array ( [id] => 3 [name] => Ys [class] => 1515 [age] => 22 )
mysqli_fetch_all()
以索引数组或关联数组的方式获取全部记录的数据
mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] ) ;
$result —— 查询到的结果,形成的对象集合
$resulttype —— 可取值为:
MYSQLI_ASSOC :索引值为 MySQL列字段
MYSQLI_NUM : 索引值为数字
MYSQLI_BOTH : 默认值,索引值为数字和MySQL列字段
返回值查询结果的所有数据,每一行组成一个数组,所有行组成一个二维数组
索引值为MySQL列字段
print_r(mysqli_fetch_all($result,MYSQLI_ASSOC));
//Array ( [0] => Array ( [id] => 1 [name] => Yz [class] => 1526 [age] => 25 ) [1] => Array ( [id] => 2 [name] => Zs [class] => 1506 [age] => 20 ) [2] => Array ( [id] => 3 [name] => Ys [class] => 1515 [age] => 22 ) )
索引值为数字,默认情况
//print_r(mysqli_fetch_all($result));
print_r(mysqli_fetch_all($result,MYSQLI_NUM));
//Array ( [0] => Array ( [0] => 1 [1] => Yz [2] => 1526 [3] => 25 ) [1] => Array ( [0] => 2 [1] => Zs [2] => 1506 [3] => 20 ) [2] => Array ( [0] => 3 [1] => Ys [2] => 1515 [3] => 22 ) )
索引值为数字和MySQL列字段,每行每列先存储数字索引,然后是MySQL列字段索引,接着下一列······
print_r(mysqli_fetch_all($result,MYSQLI_BOTH));
//Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => Yz [name] => Yz [2] => 1526 [class] => 1526 [3] => 25 [age] => 25 ) [1] => Array ( [0] => 2 [id] => 2 [1] => Zs [name] => Zs [2] => 1506 [class] => 1506 [3] => 20 [age] => 20 ) [2] => Array ( [0] => 3 [id] => 3 [1] => Ys [name] => Ys [2] => 1515 [class] => 1515 [3] => 22 [age] => 22 ) )
mysqli_fetch_filed()
返回集合中的下一个字段信息
object mysqli_fetch_filed(mysqli_result $result);
$str = 'select id num,name byte,class grade,age egg from p3 php3';
$result = mysqli_query($link,$str);
print_r(mysqli_fetch_field($result));
//stdClass Object ( [name] => num [orgname] => id [table] => php3 [orgtable] => p3 [def] => [db] => php1 [catalog] => def [max_length] => 1 [length] => 11 [charsetnr] => 63 [flags] => 49667 [type] => 3 [decimals] => 0 )
返回值:
- name —— 列的别名,查询时声明的
- orgname —— 原始列名
- table —— 表的别名,查询时声明的
- orgtable ——原始表名
- def —— 保留默认值,当前始终为“”
- db —— 数据库的名称
- catlog —— 目录名,总是“def”(因为PHP 5.3.6)
- max_length —— 结果集的字段的最大宽度。
- length —— 在表定义中指定的字段宽度。
- charsetnr —— 字段的字符集编号。
- flags —— 表示该字段的位标志的整数。
- type —— 用于此字段的数据类型
- decimals —— 使用的小数位数(用于整数字段)
获取对象集合中的数据:
每次返回一列字段信息
$object = mysqli_fetch_field($result);
echo $object->name;//num
echo $object->orgtable;//p3
mysqli_fetch_fileds()
返回表中所有字段的对象数组,组成一个结果集合
array mysqli_fetch_fileds(mysqli_result $result);
print_r(mysqli_fetch_fields($result));
// Array ( [0] => stdClass Object ( [name] => num [orgname] => id [table] => p3 [orgtable] => p3 [def] => [db] => php1 [catalog] => def [max_length] => 1 [length] => 11 [charsetnr] => 63 [flags] => 49667 [type] => 3 [decimals] => 0 )
// [1] => stdClass Object ( [name] => byte [orgname] => name [table] => p3 [orgtable] => p3 [def] => [db] => php1 [catalog] => def [max_length] => 2 [length] => 30 [charsetnr] => 33 [flags] => 0 [type] => 253 [decimals] => 0 )
// [2] => stdClass Object ( [name] => grade [orgname] => class [table] => p3 [orgtable] => p3 [def] => [db] => php1 [catalog] => def [max_length] => 4 [length] => 4 [charsetnr] => 63 [flags] => 32768 [type] => 3 [decimals] => 0 )
// [3] => stdClass Object ( [name] => egg [orgname] => age [table] => p3 [orgtable] => p3 [def] => [db] => php1 [catalog] => def [max_length] => 2 [length] => 3 [charsetnr] => 63 [flags] => 32768 [type] => 3 [decimals] => 0 ) )
获取数据(先以数组方式获取对象集合,然后利用对象获取数据):
$object =mysqli_fetch_fields($result);
for($i=0;$i<=3;$i++){
echo $object[$i]->orgname.',';
//id,name,class,age,
}
mysqli_num_rows()
获取结果中行的数量
int mysqli_num_rows(mysqli_result $result);
echo(mysqli_num_rows($result));//3
使用mysqli_query()设置参数MYSQLI_USE_RESULT模式必须在获取完结果集才可以使用此函数
$str = 'select id num,name byte,class grade,age egg from p3';
$result = mysqli_query($link,$str,MYSQLI_USE_RESULT);
print_r(mysqli_fetch_assoc($result));//第一行
echo(mysqli_num_rows($result));//报错
print_r(mysqli_fetch_assoc($result));//第二行
echo(mysqli_num_rows($result));//报错
print_r(mysqli_fetch_assoc($result));//第三行
echo(mysqli_num_rows($result));//报错
print_r(mysqli_fetch_assoc($result));
echo(mysqli_num_rows($result));//3
释放对象集合
返回的结果集合在数据量较大的时候需要很多的内存支持,所以需要在操作完结果集合之后释放其所占的内存,释放之后,结果集不可以
void mysqli_free_result(mysqli_result $result);
例如:
mysqli_free_result($result);
echo(@mysqli_num_rows($result));//会报错
其他常用函数
mysqli_affected_rows()
获取上一个MySQL操作中受影响的行数
mysqli_affected_rows ( mysqli $link ) : int
例如:
//改变了第二行数据,影响了第一行
$str = 'update p3 set name = "zhao" where id = 2;';
if(mysqli_query($link,$str))
{
echo mysqli_affected_rows($link);//1
}
mysqli_insert_id()
获取从之前的insert操作生成的ID
mysqli_stmt_insert_id ( mysqli $link ) : mixed
$str = 'insert p3 values (10,"ws",1506,20);';
if(mysqli_query($link,$str))
{
echo mysqli_insert_id($link);//10
}
mysqli_real__string
转义用于SQL语句中的特殊字符,防止SQL语句出错
mysqli_real_escape_string ( mysqli $link , string $escapestr ) : string
$escapest —— 需要转义的字符串
返回值 : 转义后的字符串。
也可以使用
addslashes(string $escapestr) : string
$s = <<<end
"dwdw"wdw"wdwd;"dw'q'd"d'w@dW"wdwq"
end;
$s = mysqli_real_escape_string($link,$s);
// $s = addslashes($s);
// echo $s;
$str = "alter table p3 modify column name varchar(255);";
mysqli_query($link,$str);
$str = "insert into p3 (name,class,age) values ('{$s}',1506,20)";//刚开始设置的长度太小
if(mysqli_query($link,$str))
{
echo $s;//\"dwdw\"wdw\"wdwd;\"dw\'q\'d\"d\'w@dW\"wdwq\"
}
else{
//没有转义,会报错
echo mysqli_errno($link).":".mysqli_error($link);
//1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '},1506,20)' at line 1
}
预处理语言机制
针对重复执行相似语句的情况,可以将整个语句只向MySQL服务器发送一次,以后只改变参数,这样减少了需要传输的数据量,还提高了语句的处理效率
//连接数据库,并创建一个表
<?php
//连接数据库
$link = mysqli_connect('localhost','root','888888','php1',3306);
if(mysqli_connect_errno($link)){
echo mysqli_connect_error();
}
else{
echo '连接成功';
}
mysqli_set_charset($link,'utf8');
$query = "create table p4 (id int auto_increment primary key ,name varchar(25),class int)";
if(mysqli_query($link,$query)){
echo "表创建成功";
}
else{
echo mysqli_errno($link).":".mysqli_error($link);
}
mysqli_prepare()
准备执行一个 SQL 语句
准备SQL语句,存在占位符 ?,来代表各种需要修改的数据
mysqli_prepare( mysqli $link,string $query) : mysqli_stmt
mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 false。
$query = " insert into p4 (name , class) values (?,?) ";
$stmt = mysqli_prepare($link,$query);
print_r($stmt);
//mysqli_stmt Object ( [affected_rows] => 0 [insert_id] => 0 [num_rows] => 0 [param_count] => 2 [field_count] => 0 [errno] => 0 [error] => [error_list] => Array ( ) [sqlstate] => 00000 [id] => 1 )
报错类型
mysqli_stmt_errno ( mysqli_stmt $stmt ) : int
mysqli_stmt_error ( mysqli_stmt $stmt ) : string
mysqli_stmt_bind_param ()
将变量绑定到准备好的语句作为参数
即 stmt类型 的 ? 绑定变量
mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [mixed &$... ] ) : bool
$stmt —— 一个 statement 对象
$type 取值:
Character | Description |
---|---|
i | 对应的变量具有整数类型 |
d | 对应的变量具有小数类型 |
s | 对应的变量具有字符串类型 |
b | 对应的变量是blob,将以数据包形式发送 |
&$var1 —— 与前边type对应,同时匹配 ? 所对应的参量
返回值:成功时返回 true, 或者在失败时返回 false。
var_dump(mysqli_stmt_bind_param($stmt,'si',$val_1,$val_2));//true
$val_1 = "小明";
$val_2 = 31122110;
mysqli_stmt_execute()
执行准备好的 SQL语句
mysqli_stmt_execute ( mysqli_stmt $stmt ) : bool
返回值:成功时返回true ,否则false
var_dump(mysqli_stmt_execute($stmt));//true
多次执行,只需要赋值,并使用mysqli_stmt_execute()执行语句
$val_1 = "小双";
$val_2 = 31200000;
var_dump(mysqli_stmt_execute($stmt));//true
传参例子
//准备执行一条SQL语句
$query = " insert into p4 (name , class) values (?,?) ";
$stmt = mysqli_prepare($link,$query);
// 给? 绑定变量
var_dump(mysqli_stmt_bind_param($stmt,'si',$val_1,$val_2));
//变量赋值
$val_1 = "小明";
$val_2 = 31122110;
//执行准备好的SQL语句
var_dump(mysqli_stmt_execute($stmt));
//继续执行SQL语句
$val_1 = "小双";
$val_2 = 31200000;
var_dump(mysqli_stmt_execute($stmt));
mysqli_stmt_bind_result()
将查询出的数据绑定到PHP变量
将变量绑定到准备好的语句以存储结果
mysqli_stmt_bind_result( mysqli_stmt $stmt , mixed &$var1 [mixed &$... ] ) : bool
返回值:成功时返回true ,否则false
mysqli_stmt_bind_result($stmt,$id,$name,$class);
//要查询的字段都要加列出来
mysqli_stmt_fetch()
从一个prepare 语句中抓取结果到指定变量中
mysqli_stmt_fetch( mysqli_stmt $stmt ) : bool
返回值:成功时返回true ,否则false
mysqli_stmt_fetch($stmt);
查询例子
//准备一条SQL语句
$query = "select * from p4 where id = ?";
$stmt = mysqli_prepare($link,$query);
//绑定变量
var_dump(mysqli_stmt_bind_param($stmt,"s",$val));
//执行准备好的SQL语句
$val = 3;
var_dump(mysqli_stmt_execute($stmt));
//将查询出的数据绑定到PHP变量
mysqli_stmt_bind_result($stmt,$id,$name,$class);
//从一个prepare 语句中抓取结果到指定变量中
mysqli_stmt_fetch($stmt);
//引用变量获取结果
echo $id."-".$name."-".$class;
//结果:1-小明-31122110
改进方案:
查询到多条结果,进行输出
$query = "select * from p4 where id < ?";
$stmt = mysqli_prepare($link,$query);
var_dump(mysqli_stmt_bind_param($stmt,"s",$val));
$val = 3;
if(mysqli_stmt_execute($stmt)){
mysqli_stmt_bind_result($stmt,$id,$name,$class);
while(mysqli_stmt_fetch($stmt))
{
echo "<br>".$id."-".$name."-".$class;
}
}
//结果:
//1-小明-31122110
//2-小明-31122110
$val = 5;
if(mysqli_stmt_execute($stmt)){
mysqli_stmt_bind_result($stmt,$id,$name,$class);
while(mysqli_stmt_fetch($stmt))
{
echo "<br>".$id."-".$name."-".$class;
}
}
//结果:
//1-小明-31122110
//2-小明-31122110
//3-小明-31122110
//4-小双-31200000
mysqli_stmt_result_metadata()
返回结果集合,配合相关函数,来可以获取字段的相关信息
mysqli_stmt_result_metadata(mysqli_stmt $stmt) : mysqli_result
返回值为集合对象,
配合使用的函数:
mysqli_num_fields()
mysqli_fetch_field()
mysqli_fetch_field_direct()
mysqli_fetch_fields()
mysqli_field_count()
mysqli_field_seek()
mysqli_field_tell()
mysqli_free_result()
$query = "select * from p4 where id < ?";
$stmt = mysqli_prepare($link,$query);
var_dump(mysqli_stmt_bind_param($stmt,"s",$val));
$val = 3;
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_result_metadata($stmt);
print_r(mysqli_fetch_fields($result));
//Array ( [0] => stdClass Object ( [name] => id [orgname] => id [table] => p4 [orgtable] => p4 [def] => [db] => php1 [catalog] => def [max_length] => 0 [length] => 11 [charsetnr] => 63 [flags] => 49667 [type] => 3 [decimals] => 0 )
// [1] => stdClass Object ( [name] => name [orgname] => name [table] => p4 [orgtable] => p4 [def] => [db] => php1 [catalog] => def [max_length] => 0 [length] => 75 [charsetnr] => 33 [flags] => 0 [type] => 253 [decimals] => 0 )
// [2] => stdClass Object ( [name] => class [orgname] => class [table] => p4 [orgtable] => p4 [def] => [db] => php1 [catalog] => def [max_length] => 0 [length] => 11 [charsetnr] => 63 [flags] => 32768 [type] => 3 [decimals] => 0 ) )
}
mysqli_stmt_store_result()
从准备好的语句传输结果集
mysqli_stmt_store_result ( mysqli_stmt $stmt ) : bool
$stmt —— 仅以过程化样式:由 mysqli_stmt_init() 返回的 statement 标识。
返回值:成功时返回true ,否则false
mysqli_stmt_num_rows()
返回语句结果集合的行数
mysqli_stmt_num_rows(mysqli_stmt $stmt ) : int
//查询有几条数据,需要mysqli_stmt_store_result($stmt)和mysqli_stmt_num_rows($stmt)配合使用
$query = "select * from p4 where id < ?";
$stmt = mysqli_prepare($link,$query);
var_dump(mysqli_stmt_bind_param($stmt,"s",$val));
$val = 3;
if(mysqli_stmt_execute($stmt)){
echo mysqli_stmt_store_result($stmt);//1
echo mysqli_stmt_num_rows($stmt);//2
}
mysqli_stmt_free_result()
释放给定语句处理存储的结果集合所占内存
mysqli_stmt_free_result ( mysqli_stmt $stmt ) : void
没有返回值
释放与该语句关联的结果内存,该内存由mysqli_stmt_store_result()分配。
mysqli_stmt_close()
关闭一个prepared语句,即关闭准备好的语句
mysqli_stmt_close ( mysqli_stmt $stmt ) : bool
返回值:成功时返回true ,否则false
var_dump(mysqli_stmt_close ($stmt ));
网友评论