- Linux文件系统安全攻略
- 简析防止黑客入侵服务器的三步曲
- 网站服务器被黑或挂马的解决思路
- 防止数据丢失 服务器硬盘之安全插拔
- 服务器进机房前的安全准备
- CTO和CIO注意:网络安全的八个“潜规则”
- 几招技巧彻底加强Windows文件保护稳定性
- 提高安全减少风险 网络服务器保护方法
- 网管员知识 服务器托管不可不知五大问题
- 关于服务器虚拟化知识十二问
- IIS6.0不能上传大于200K文件解决办法
- 详解:九大Linux编辑器
- 可以关闭企业网络内所有IPv6通道吗?
- 修复系统有妙招 重装不是首选
- 如何计算WEB服务器的最大负载量
- 用服务器的站长常犯的错误
- 服务器常见故障的诊断与解决
- 增加服务器稳定性12种技术
- 数据中心服务器的温度多少最合适
- 服务器管理最容易犯的十大错误
任务:进一步深入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 (?)';
