日期:2014-05-16  浏览次数:20686 次

查询mysql总结和预处理

一、连接到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'])));

?

备注:

在PHP5.3版本之前, mysqli_real_escape_string()函数存在路径泄漏问题,远程攻击者可以利用漏洞获得服务器端脚本的实际路径。即如果传递的参数值为数组而不是字符串的情况下会发出警告,警告消息中会包含有当前服务端运行脚本的完整路径信息。
?测试方法:
http://localhost/cms/sqlfilter/sqlsanatizer.php?params []=
Warning: mysqli_real_escape_string() expects parameter 1 to be string,
array given in /var/www/vhosts/cms/sqlfilter/sqlsanatizer.php


七、统计select返回的记录数:

使用mysqli_num_rows($result)统计select 返回的结果行数。$num=mysqli_num_rows($r),对于上面所说的while流程,可以更改成以下更严谨的写法,而不只是分析查询是否成功,因为如果数据库为空的话,就不会出错。
$sql = "select * from tb where i