最近CSDN数据库泄露事件闹得沸沸扬扬,处于安全隐患考虑,就从网上下载了273M的sql文件,想查看下自己在csdn的注册信息是否遭到泄露。
另外,处于学习的目的,自己做了写了一个可以查询用户信息的小模块。
自己是个小菜鸟,写的过程中,遇到了很多问题,在此列出,希望大家帮忙指点迷津。。。。。。
FAQS:
①直接对sql文件进行操作的话,查找效率似乎很慢,如何提高呢?
②我是将数据写入数据库再对数据库操作的,但,每次要查询的时候,需要从头到尾遍历一遍,几十万条的数据量,也得花费很长时间,后面,对数据表进行索引,速度是提高了不少,但是还是有点差强人意,不知道还有什么优化的办法?
③php程序的默认的最长执行时间是30s,除了在文件头加上 ini_set("max_execution_time", "0")这句代码外,还有没有别的解决办法?
④如果是你写的话,你的思路是什么呢?
提交数据的界面(仿安全宝的界面):
查询结果界面:
将273MB的sql数据全部写入数据库中,使用php对数据库进行操作
将数据写入数据库的php代码:
<?php
header("content-type:text/html;charset=utf-8");
require_once('php.ini.php');
ini_set("max_execution_time", "0");
$filename="csdn.sql";
$fp=fopen($filename,"r");
while(!feof($fp)) {
$con=fgets($fp);
$sql="insert into all_user (user) values('".$con."')";
mysql_query($sql);
}
echo "数据插入成功";
?>
解释:
① ini.php中包含了连接选择数据库的代码
② ini_set("max_execution_time", "0");因为数据量过大,在php最长的执行时间(30s)内不能全部写入数据库,30s后服务器会强行终止正在执行的程序,30s内我只能写入13万条左右的记录,加上这句代码,数值0表示没有执行时间的限制,你的程序想要跑多久就跑多久
③ 函数feof()的作用是:用以检测文件指针$fp是否到达了文件末尾(eof),如果文件指针到了EOF或者出错时则返回TRUE,否则返回一个错误,其他情况返回false
④ 因为从网上下载的csdn数据库文件是以一条记录一行的形式给出的,所以使用fgets()函数,没循环一次就读取一行,并将数据通过sql语句写入的数据库当中
核心代码:
<?php
header("content-type:text/html;charset=utf-8");
require_once('php.ini.php');
ini_set('max_execution_time',0);
$info=$_POST['info'];//接收表单提交过来的信息
$flag=false;
$count=1;
$time_start=microtime();//查询开始时间
$sql="select * from all_user where MATCH(`user`) AGAINST ('$info' IN BOOLEAN MODE)";
$query=mysql_query($sql);
while($arr=mysql_fetch_array($query)){
$flag=true;
echo $count.")泄露信息: ".$arr['id']."---".$arr['user']."<br>";
$count+=1;
}
$time_end=microtime();//查询结束时间
echo "<br>此次查询共耗时:".($time_end-$time_start)."秒";
if(!$flag){
echo "<br>查无此信息";
}
?>
文章出自:WEB开发_小飞
转载请注明:http://www.cnblogs.com/hongfei/archive/2011/12/28/csdn_password.html