首先,以特殊的方式定义query字符串,用’?'标识可能修改的值
$query ='select * from student where 姓名=? or 学号=? ';然后, 将query转换成预处理语句stmt
$stmt= mysqli_prepare($link,$query);//将query转换成预处理语句stmt第三步,为stmt中的每个‘?’绑定一个变量。函数的第二个参数,根据问号的个数和类型添加,详见百度
//为?绑定变量vall mysqli_stmt_bind_param($stmt,'si',$name,$sno);//si表示字符串加int类型为变量name和sno赋值,然后就可以执行sql语句了!
//为变量val赋值王二,然后执行sql语句 $ask_name="王二"; $ask_sno="3"; var_dump(mysqli_stmt_execute($stmt) );//执行成功返回true echo "<hr>";上面的函数无法获得结果集,那么如果想查看结果集的值怎么办?使用下面的操作
//绑定结果集的每个字段的值绑定到name、sno、sex变量中 mysqli_stmt_bind_result($stmt,$name,$sno,$sex) ; //抓取一个结果集中的一个记录,自动存在上面绑定的变量中 mysqli_stmt_fetch($stmt); echo "查1:{$name}->{$sno}->{$sex}<br>"; //再抓取一个结果集中的一个记录,自动存在上面绑定的变量中 mysqli_stmt_fetch($stmt); echo "查2:{$name}->{$sno}->{$sex}<br>"; //再抓取就会失败,因为结果集已经空了 var_dump( mysqli_stmt_fetch($stmt) );//打印NULL echo "查3:{$name}->{$sno}->{$sex}";//这些值仍然保持上次的结果运行结果: 代码整合:
//写好预处理语句,其中?是会改变的值 $query ='select * from student where 姓名=? or 学号=?'; $stmt= mysqli_prepare($link,$query);//将query转换成预处理语句stmt //var_dump($stmt); //为?绑定变量vall mysqli_stmt_bind_param($stmt,'si',$ask_name,$ask_sno); //为变量val赋值王二,然后执行sql语句 $ask_name="王二"; $ask_sno="3"; if(mysqli_stmt_execute($stmt)){//若执行sql语句成功 mysqli_stmt_bind_result($stmt,$name,$sno,$sex);//结果集的字段绑定到变量 while(mysqli_stmt_fetch($stmt) ){//若成功抓取结果集的一个记录 echo "{$name}->{$sno}->{$sex}<br>"; } }运行结果:
返回对象的方式,从一个prepared语句返回结果集元数据,配合相关函数,以用来获得字段的相关信息。关于结果集的处理方式在https://blog.csdn.net/sun_haoo/article/details/109153725中有介绍。下面的使用返回对象数组的方式处理结果集,函数mysqli_fetch_fields的功能详见https://www.runoob.com/php/func-mysqli-fetch-fields.html
if(mysqli_stmt_execute($stmt)){//若执行sql语句成功 $result =mysqli_stmt_result_metadata($stmt);//获取结果集元数据 var_dump($fieldsinfo=mysqli_fetch_fields($result) );//返回对象数组的方式 获取结果集的全部数据信息 }mysqli_stmt_store_result函数一般是配套另一些函数使用的,mysqli_stmt_num_rows函数就是其中之一。这种方法会用就行,也不是很懂。话说php好多奇怪的函数…
if(mysqli_stmt_execute($stmt)){//若执行sql语句成功 var_dump(mysqli_stmt_store_result($stmt));//获取结果集,函数具体功能详看百度 var_dump(mysqli_stmt_num_rows($stmt));//这个函数必须配合上面的函数使用 //这里应该加个释放结果集的函数,看下面。只要获取了结果集就记得释放,好习惯很重要。 }又是个奇怪的函数…
if(mysqli_stmt_execute($stmt)){//若执行sql语句成功 var_dump(mysqli_stmt_store_result($stmt)); mysqli_stmt_free_result($stmt);//释放~ }关闭prepared语句,执行下面的函数就ok了。好习惯很重要,预处理操作后,也是要释放的
mysqli_stmt_close($stmt);//stmt是之前定义的预处理语句函数多的一匹啊有木有,感觉这章就是在疯狂学函数了,有时候语言封装的过于强大也有坏处…明天正式就能开始学习写项目了,吼吼 最后总结本章学习的全部函数
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 ); 2.执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 ); 4)一次性执行多条SQL语句,多个SQL语句用分号隔开 bool mysqli_multi_query ( mysqli $link , string $query ); 3.预处理语句机制 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)); 如果是select之类的语句需要具体的结果; 4)将查询出的数据绑定到PHP变量上 bool mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] ); 5)从一个prepared语句中抓取结果到指定变量中 bool mysqli_stmt_fetch ( mysqli_stmt $stmt ); 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 );