刚刚接触sqlite,准备将一个文件中的ip库导入到sqlite中,刚刚开始巨慢,吓到我了,10条数据就要一秒钟,后来在网上查了一下,加了事务的处理,1000条数据也只要0.2秒了。可是每次插入到三千多条的时候就出问题了。$sqlite_name="";
function UpdateIPDB()
{
$page=new pageTime();
global $ipDBPath,$sqlite_name,$ipTXTPath;
$sqlite_name=$ipDBPath;
if(!file_exists($ipDBPath)){
$sql="CREATE TABLE ip(id INTEGER PRIMARY KEY, sip TEXT, eip TEXT,city TEXT,addr TEXT)";
sqlite_exe($sql);
}
$sql="delete from ip";
sqlite_exe($sql);
$sql="BEGIN TRANSACTION";
sqlite_exe($sql);
$fhandle=fopen($ipTXTPath,"r");
echo "开始:".$page->get()."<br>";

while(!feof($fhandle))
{
$i++;
$arr=fgets($fhandle,4096);
while(strpos($arr,"  ")){$arr=str_replace("  "," ",$arr);}  //处理空格,拆分字符串
ArrayToEncoding($arr,"UTF-8");  //转换编码
$record=explode(" ",$arr);
                 //if($i%1000==0) echo "从TXT中读取完毕:".$page->get().$arr;
$sql="INSERT INTO ip values(null,'$record[0]','$record[1]','$record[2]','$record[3]')";
sqlite_exe($sql);
$sql="delete from ip";
//sqlite_exe($sql);
if($i%1000==0) 
{
//$sql="COMMIT TRANSACTION";
echo "插入sqlite完毕:".$page->get().$arr."<br>";
//$sql="BEGIN TRANSACTION";
//sqlite_exe($sql);
//print_r($record);
}
}
$sql="COMMIT TRANSACTION";
sqlite_exe($sql);
fclose($fhandle);
}sqliteexe函数:$sqlite_conn="";
function sqlite_exe($sql)
{
global $sqlite_name,$db_charset,$sqlite_conn;
if($sqlite_conn=="")
{
echo $sqlite_conn;
$sqlite_conn= sqlite_popen($sqlite_name) or die ("ERROR: Cannot open database");
//if($sqlite_charset==""){$sqlite_charset="utf8";sqlite_exe("SET NAMES $db_charset");}
}
$result = sqlite_query($sqlite_conn, $sql) or die("Error in query execution: " .             sqlite_error_string(sqlite_last_error($sqlite_conn)));
return $result;
}输出:
开始:115.21ms27.109.104.0 27.109.107.255 新加坡 CZ88.NET 
插入sqlite完毕:632.45ms
41.78.164.0 41.78.167.255 南非 CZ88.NET 
插入sqlite完毕:894.01ms
46.102.0.0 46.102.255.255 欧洲 CZ88.NET 
Error in query execution: SQL logic error or missing database在while循环中换成执行别的sql语句是没问题的。就是insert数据就会出现SQL logic error or missing database
这个错误,都是在插入三千多的位置。 

解决方案 »

  1.   

    以前我也曾研究過sqllite,不過多人同時操作的時候就會掛掉,最後放棄了,還是mysql比較穩妥.
      

  2.   

    Error in query execution: SQL logic error or missing database
    查询执行中的错误:SQL逻辑错误或丢失的数据库
      

  3.   

     SQL logic error or missing database
    查询执行中的错误:SQL逻辑错误或丢失的数据库
       就是不知道为什么会这样,我试过每次循环插3000条然后break,多运行几次也是可以插入的,我就怀疑是不是一次提交事务的限制,于是我又在while循环中每一千条加入了提交和开启事务,但还是每次到3千多条就出错。 
      

  4.   

    你用的是php5自带的sqlite,是sqlite2,不是sqlite3!加装pod模块,让php支持sqlite3,应该就没有问题了