php与mysql交互 面向过程
1.建立、关闭与MySQL服务器的连接
1)连接指定的mysql服务器
$mysqli_connect=@mysqli_connect($host, $user, $password,$database,$port);
2)连接错误时的提示
int mysqli_connect_errno ();//返回最后一次连接调用的错误代码
string mysqli_connect_error ();//返回一个字符串描述的最后一次连接调用的错误代码
3)设置默认字符编码
bool mysqli_set_charset ( mysqli $link , string $charset )
4)选择特定的数据库
bool mysqli_select_db ( mysqli $link , string $dbname);
5)关闭与mysql服务器的连接
bool mysqli_close ( mysqli $link );
执行sql语句
1)对数据库执行一条SQL语句
1>mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] );
①对于insert,update,delete等不会返回数据的SQL语句,在执行没有错误时将返回true。
②对于返回数据的SQL语句执行成功的时候会返回结果集对象可以使用操作结果集对象的函数来从中获取数据
其中模式参数
③MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT决定了mysqli client和server之间取结果集的方式。
MYSQLI_STORE_RESULT:执行SQL时提取结果集返回给client,并分配内存,存储到用户程序空间中,之后mysqli_fetch_array()
相当于是从本地取数据;而MYSQLI_USE_RESULT方式下,mysqli_fetch_array()每次都要向server请求结果行。
MYSQLI_USE_RESULT:执行SQL的时候并没有从server将结果集取回
2>bool mysqli_real_query ( mysqli $link , string $query );
也可以使用本函数对数据库执行一条SQL语句,返回结果为布尔值,不返回结果集。
如果想获取结果集可以使用mysqli_store_result()获取结果集对象.
3>如果在执行SQL语句的时候发生错误,以上两个函数都将返回false,并且可以使用以下函数处理错误原因
int mysqli_errno ( mysqli $link );
string mysqli_error ( mysqli $link );
2)操作结果集对象的函数
1>从结果集对象中解析数据的常见函数
①以索引数组的方式获取一条记录的数据
mixed mysqli_fetch_row ( mysqli_result $result );
重复使用以获取下一条记录的数据
②以关联数组的方式获取一条记录的数据
array mysqli_fetch_assoc ( mysqli_result $result );
重复使用以获取下一条记录的数据
③以索引数组或关联数组的方式获取一条记录的数据
mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] );
重复使用以获取下一条记录的数据
④以索引数组或关联数组的方式获取全部记录的数据
mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] );
⑤返回结果集中的下一个字段信息
object mysqli_fetch_field ( mysqli_result $result );
⑥返回一个代表结果集字段的对象数组
array mysqli_fetch_fields ( mysqli_result $result );
⑦获取结果中行的数量
int mysqli_num_rows ( mysqli_result $result );
注意:如果使用MYSQLI_USE_RESULT模式则必须在获取完结果集才可使用该函数。
2>释放与一个结果集相关的内存
返回的结果集在数据量很大的时候需要很多的内存支持,所以在操作完结果集的时候有必要立刻释放与一个结果集相关的内
存, 释放之后,结果集就不可用了
void mysqli_free_result ( mysqli_result $result );
3)其他常用函数
1>获取前一个Mysql操作的受影响行数
int mysqli_affected_rows ( mysqli $link );
2>返回最后一次操作自动生成并使用的id
mixed mysqli_insert_id ( mysqli $link );
3>转义用于SQL语句中的特殊字符防止SQL语句出错
string mysqli_real_escape_string ( mysqli $link , string $escapestr );
比如你像数据库插入的文本里面有特殊符号,使用这个函数可以解决。sql语句就可以使用定界符来定义字符串<<<STER insert into ....... STER;
不返回结果集对象 insert update delete
<?php header('Content-type:text/html;charset=utf8'); //返回连接对象结果集 创建数据库连接,参数1 连接地址 参数2 用户名 参数3 密码 参数4 数据库(也可以不指定,后续再指定) //参数5 端口3306; $connection=mysqli_connect('localhost','root','123456','t3',3306); //判断是否有连接的错误,返回错误代码 0表示没有错误 if(mysqli_connect_errno()){ //返回一个字符串描述的最后一次连接调用的错误代码,并且结束整个程序exit; exit(mysqli_connect_error()); } //设置连接字符编码 mysqli_set_charset($connection,'utf8'); //指定连接的数据库,这里也可以不指定,如果后续需要更换数据库的时候可以使用 // mysqli_select_db($connection,'t1'); //执行SQL数据 //1)对数据库执行一条SQL语句,只能执行 inert update delete; //$sqlstr='update tech set id=10 where pwd=123456 '; 返回true // $sqlstr='insert into tech (id,name,pwd) values (1,"杜伟",198988)'; 返回true var_dump(mysqli_query($connection,$sqlstr));//关闭数据库连接 mysqli_close($connection); ?>
返回结果集 select
<?php header('Content-type:text/html;charset=utf8'); //返回连接对象结果集 创建数据库连接,参数1 连接地址 参数2 用户名 参数3 密码 参数4 数据库(也可以不指定,后续再指定) //参数5 端口3306; $connection=mysqli_connect('localhost','root','123456','t3',3306); //判断是否有连接的错误,返回错误代码 0表示没有错误 if(mysqli_connect_errno()){ //返回一个字符串描述的最后一次连接调用的错误代码,并且结束整个程序exit; exit(mysqli_connect_error()); } //设置连接字符编码 mysqli_set_charset($connection,'utf8'); //指定连接的数据库,这里也可以不指定,如果后续需要更换数据库的时候可以使用 // mysqli_select_db($connection,'t1'); //执行SQL数据 //1)对数据库执行一条SQL语句,只能执行 inert update delete; //$sqlstr='update tech set id=10 where pwd=123456 '; 返回true // $sqlstr='insert into tech (id,name,pwd) values (1,"杜伟",198988)'; 返回true //2)对于返回数据的sql语句执行成功会返回结果集对象。 $sqlstr='select * from tech'; //查询语句返回结果集对象 $result=mysqli_query($connection,$sqlstr); //返回结果集对象,我们还需要对结果集解析 //1 print_r(mysqli_fetch_row($result)); //返回索引数组形式第一条数据,在执行 就是下一条 //循环输出返回的结果集; // while($data=mysqli_fetch_row($result)){ // print_r($data); // } //2 print_r(mysqli_fetch_assoc($result)); //以关联数组的形式返回 //3 print_r(mysqli_fetch_array($result)); //返回以关联数组和索引数组的形式; //4 print_r(mysqli_fetch_all($result,MYSQLI_ASSOC)); //返回结果集所有记录,默认使用索引数组,MYSQLI_ASSOC关联模式 //5 print_r(mysqli_fetch_field($result)); //返回一个结果集中字段的信息 //6 print_r(mysqli_fetch_fields($result)); //返回所有字段信息的数组。 echo mysqli_num_rows($result); //返回结果中的行数量 //释放连接内存 // mysqli_free_result($result); //关闭数据库 mysqli_close($connection); ?>
使用mysqli_real_query和mysqli_store_result
<?php header('Content-type:text/html;charset=utf8'); $link=mysqli_connect('localhost','root','123456','t3',3306); if(mysqli_connect_errno()){ echo mysqli_connect_error(); } mysqli_set_charset($link,'utf8'); //$sqlstr='insert into tech values (4,"徐海风",456789)'; //下列函数只返回false true 不返回结果集,多用于判断 //mysqli_real_query($link,$sqlstr); $selstr='select * from tech'; //利用mysqli_real_query 返回true 或false 来判断是否有数据 if(mysqli_real_query($link,$selstr)){ //mysqli_store_result函数只返回结果集 来获取结果集 $result= mysqli_store_result($link); print_r(mysqli_fetch_all($result)); } mysqli_close($link); ?>
一次执行多条sql语句,每个sql语句用分号隔开
bool mysqli_multi_query ( mysqli $link , string $query );
<?php header('Content-type:text/html;charset=utf8'); $link=mysqli_connect('localhost','root','123456','t3',3306); if(mysqli_connect_errno()){ print_r(mysqli_connect_error()); } mysqli_set_charset($link,'utf8'); //一次性插入3条语句 $str='insert into tech values (2,"夏远静",789789);insert into tech values (5,"夏天",789789);insert into tech values (6,"于海燕",786789);'; mysqli_multi_query($link,$str); //使用mysqli_multi_query()函数 mysqli_close($link); ?>
预处理机制
1)准备一个用于执行的SQL语句
mysqli_stmt mysqli_prepare ( mysqli $link , string $query );
2)将变量作为参数绑定到prepared语句上
bool mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] );
参数string $types说明:表示后面多个可选参数变量的数据类型,一一对应.
i:int类型
d:double或者float类型
s:字符串类型
b:二进制数据类型(BLOB、二进制字符串)
3)执行一个prepared准本好的语句
bool mysqli_stmt_execute ( mysqli_stmt $stmt );
上述三步骤举例
$query='insert into t1(id,info,content,filed1) values(?,?,?,?)';
//准备要执行的SQL语句
$stmt=mysqli_prepare($link, $query);
//为?绑定变量
mysqli_stmt_bind_param($stmt,'issd',$val1,$val2,$val3,$val4);
$val1=1;
$val2='第五代青蛙';
$val3='的武器大全我带我去';
$val4=60.5;
//执行准备好的SQL语句
var_dump(mysqli_stmt_execute($stmt));
<?php header('Content-type:text/html;charset=utf8'); $link=mysqli_connect('localhost','root','123456','t3',3306); if(mysqli_connect_errno()){ print_r(mysqli_connect_error()); } mysqli_set_charset($link,'utf8'); //预处理机制 //? 占位符,表示你要代替的变量 $str='insert into tech values (?,?,?)'; //预备一个用于执行的sql语句,它返回mysqli_stmt (数据库类型) $stmt=mysqli_prepare($link,$str); //将变量作为参数绑定prepare语句上, //1.第一个参数为数据库类型对象 //2.第二个参数为 ?占位符的数据类型字符串 i=int s=stirng d=double //3.第三个参数为?站位的变量,有?就写几个变量 mysqli_stmt_bind_param($stmt,'isi',$id,$name,$pwd); $id=8; $name="夏洛特"; $pwd=456789; //执行语句;此函数不返回结果集 mysqli_stmt_execute($stmt); //成功添加数据库 mysqli_close($link); ?>
如果是select之类的语句需要具体的结果;
4)将查询出的数据绑定到PHP变量上
bool mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] );
5)从一个prepared语句中抓取结果到指定变量中
bool mysqli_stmt_fetch ( mysqli_stmt $stmt );
<?php header('Content-type:text/html;charset=utf8'); $link=mysqli_connect('localhost','root','123456','t3',3306); if(mysqli_connect_errno()){ print_r(mysqli_connect_error()); } mysqli_set_charset($link,'utf8'); $str='select * from tech where id<?'; //预备一个用于执行的sql语句,它返回mysqli_stmt (数据库类型) $stmt=mysqli_prepare($link,$str); //绑定变量 mysqli_stmt_bind_param($stmt,'i',$fid); $fid=6; //返回结果集的(select) //绑定返回的结果集到PHP变量上 mysqli_stmt_bind_result($stmt,$id,$name,$pwd); //执行sql语句 mysqli_stmt_execute($stmt); //抓取结果集 mysqli_stmt_fetch($stmt); //输出结果 echo "{$id}->{$name}-----{$pwd}"; //优化下 if(mysqli_stmt_execute($stmt)){ mysqli_stmt_bind_result($stmt,$fid,$fname,$fpwd); while(mysqli_stmt_fetch($stmt)){ echo "{$fid}->{$fname}----{$fpwd}".'<br>'; } } mysqli_close($link); ?>
6)从一个prepared语句返回结果集元数据,配合相关函数,可以用来获得字段的相关信息
mysqli_result mysqli_stmt_result_metadata ( mysqli_stmt $stmt );
①mysqli_fetch_field();
②mysqli_fetch_fields();
7)取回一个结果集
bool mysqli_stmt_store_result ( mysqli_stmt $stmt );
取回之后可以使用int mysqli_stmt_num_rows ( mysqli_stmt $stmt );返回语句结果集中的行数
8)释放给定语句处理存储的结果集所占内存
void mysqli_stmt_free_result ( mysqli_stmt $stmt );
9)关闭一个prepared语句
bool mysqli_stmt_close ( mysqli_stmt $stmt );