当前位置:中国反病毒小组 >> 解决方案 >> 服务器安全 >> 浏览文章
查询mysql总结及预处理
作者:佚名 日期:2011年11月01日 来源:本站原创 浏览: 【字体:
核心提示:任务:进一步深入mysqli_multi_query()用法。   一、连接到mysql:   $dbc = mysqli_connect(host,user,password,databasename);   等价于:   $dbc = mysqli_connect(host,user,pwd);   mysqli_select_
保护您的计算机 打造洁净网络 中国反病毒小组给您安全的保障
MYSQL安装图解 PHP MYSQL MYSQL下载 iis下载 iis php IIS是什么
中国反病毒小组网2011年11月01日消息:

任务:进一步深入mysqli_multi_query()用法。
  一、连接到mysql:
  $dbc = mysqli_connect(host,user,password,databasename);
  等价于:
  $dbc = mysqli_connect(host,user,pwd);
  mysqli_select_db($dbc,db_name);
  如果发生错误,可以调用:mysqli_connect_error() 返回错误信息,不带参数。
  $dbc = @mysqli_connect(host,user,pwd,db) or die('无法连接到mysql:'.mysqli_connect_error());
  @是错误控制运算符,防止在web浏览器显示php错误。此外,@也可以放在mysqli_query前面。上面是一种首选做法,因为错误将由or die处理。die()会终止脚本执行。
  可以将连接文件放在路径外。
  设置编码:mysqli_query("set names gb2312");
  二、执行查询:
  不管是select, delete, update,insert 查询都是用:
  $result=mysqli_query($dbc,SQL);
  对于insert ,delete,update等查询不会返回结果,$result将返回true或false,因此可以用这个来判断下一步:
  $result = mysqli_query($dbc,sql);
  if($result) {//susses}
  如果查询没有成功,必定发生某种mysql错误,可能调用
  mysqli_error($dbc)    //注意和mysqli_connect_error()区别
  三、关闭连接:
  mysqli_close($dbc) 这不是必需要的,php会在脚本最后自动关闭,但最好写上。
  四、多条查询:
  mysqli_multi_query()允许同时执行多条查询。但语法更复杂一点。特别是当返回结果时。
  五、检索select查询结果:
  mysqli_fetch_array($result [, type])是最常用的,以数组格式一次返回一行数据。由它来配合while()来遍历返回数据。带有一个可选参数type,用于指定返回的数组类型:关联的还是索引的,或二者均可。参数类型如下:
  MYSQLI_ASSOC   示例:$rows['columnName']
  MYSQLI_NUM 示例:$rows[0] ,这一种效率较高一点。
  MYSQLI_BOTH 示例:$rows[0]或$rows['columnName']
  当使用mysqli_fetch_array($result [, type])后,可以采取一个可选步聚的是:一旦查询结果完成了工作,即可释放这些信息,来消除$result占用的系统内存开销。这一步是可选的,PHP同样也在会结果时自动清理:
  mysqli_free_result($result)   //注意参数是不是$rows!
  流程如下:
  while($rows=mysqli_fetch_array($result))   //或while($rows=mysqli_fetch_array($result,MYSQLI_ASSOC))
  {//遍历
  ……code do something……
  echo $rows[0]
  mysqli_free_result($result)
  }
  注意:
  mysqli_fetch_array()和mysqli_fetch_array($result,MYSQLI_NUM)等价。
  mysqli_fetch_assoc()和mysqli_fetch_array($result,MYSQLI_ASSOC)等价。
  六、确保sql安全,使用转义函数:
  mysqli_real_escape_string($dbc,para)
  该函数用于检验用户提交的并将组合到sql查询语句的变量值,它将转义那些有可能无意或带恶意的字符。如单引号,在外国人的姓名有可能会包含该符号(如O'Toole),这时就需要用它。
  案例:
  $name = $_POST['name'];
  $name = mysqli_real_escape_string($dbc,$name);
  $query = "Select … From tb where name='$name'"; //这样可以确保带入sql 时参数的安全。
  注意:如果在使用php6之前的版本,若启用MAGIC QUOTES魔法引用时,那么在使用mysqli_real_escape_string前,需要用stripslashes(para)删除魔法引用添加的任何斜杠,如下:
  $fn = mysqli_real_escape_string($dbc,trim(stripslashes($_POST['firstName'])));
  七、统计select返回的记录数:
  使用mysqli_num_rows($result)统计select 返回的结果行数。$num=mysqli_num_rows($r),对于上面所说的while流程,可以更改成以下更严谨的写法,而不只是分析查询是否成功,因为如果数据库为空的话,就不会出错。
  $sql = "select * from tb where id=$id";
  $r = @mysqli_query($dbc,$sql);
  $num = mysqli_num_rows($r);
  if($num>0){ //这样比if($r)更准确。不是仅仅分析是否成功运行。
  // Do something;
  mysqli_free_result($r)
  }
  mysqli_close($dbc);
  八、返回insert ,update,delete受影响行数:
  和上面不同的是,如果查询不是select则用mysqli_affected_rows()函数返回受影响行数。用法如下:
  $num = mysqli_affected_rows($dbc); //注意参数是$dbc;
  如:
  $q = "update tb set pass=SHA1('$newpassword') where id=$row[0]";
  $r = @myslqi_query($dbc,$q);
  if(mysqli_affected_rows($dbc)==1){
  //Do something
  }else{
  echo mysqli_error($dbc);
  exit(); //终止脚本。
  }
  注意:
  1、如果使用truncate tb清空表时,则mysqli_affected_rows()会返回0,即使查询成功执行并且删除了每一行。
  2、如果用update查询时,但实质上没有更改任何列的值,比如用相同的密码代替一个旧密码,则也会返回0。
  九、批量查询:预处理语句(第12章第4节:P311)
  版本:MYSQL 4.1开始添加预处理。php5可以使用。
  预处理的好处:
  1、更大安全性。2、更好性能。3、批量查询。
  对于预处理语句,只会把查询本身发送给mysql,并且只会解析一次,然后单独把值发送给mysql。
  $q = 'Insert into tb(num) values (?)'; 

中国反病毒小组
此文章对你有帮助吗?如果未能解决你的困扰,请访问我们的论坛发帖求助吧,我要求助!
分享按钮
Tegs:
责任编辑:xyulab
上一篇文章:菜鸟mysql错误代码和消息对照表 下一篇文章:301重定向代码汇总
Copyright 2007-2011 AntiVirus.com, ALL Rights Reserved.
保护您的计算机 打造洁净网络 中国反病毒小组给您安全的保障
豫ICP备11016355号-1