当前位置:首页 > PHP教程 > php应用 > 列表

PHP使用PDO操作sqlite数据库应用案例

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-11 17:02:36 浏览: 评论:0 

这篇文章主要介绍了PHP使用PDO操作sqlite数据库,结合实例形式分析了php基于yaf框架使用pdo操作sqlite数据的相关原理、步骤与操作技巧,需要的朋友可以参考下。

本文实例讲述了PHP使用PDO操作sqlite数据库,分享给大家供大家参考,具体如下:

1、需求:

已知:

1)、一个json文件,里面是一个二维数组,数组解析出来为:

  1. array ( 
  2.    0 => 
  3.    array ( 
  4.     'title' => '九十九'
  5.    ), 
  6.    1 => 
  7.    array ( 
  8.     'title' => '电脑九十九'
  9.    ), 
  10.    2 => 
  11.    array ( 
  12.     'title' => '手机九十九'
  13.    ), 
  14.    3 => 
  15.    array ( 
  16.     'title' => '手机电脑九十九'
  17.    ), 
  18. ); 

2)、一个sqlite数据库文件 20180824.db 新建一个sqlite数据库文件

新建表 report

表字段 id words time

求:

把从json中查到的数据,在sqlite中检索,判断是否存在;

如果存在就给sqlite加上一个 word_sort字段,把title在文件中是第几个(一次递增,不是json文件数组的键值)写入到word_sort字段

思路:

① 获取jsonlist.json文件内容并json_decode($str,true)转为二维数组

② 连接sqlite表

③ try{}catch(){} 给表增加 word_sort字段

④ 把json文件中的数据数组化

⑤ 每次循环5000条json数据,用 IN 在report表中查询(title字段需要拼接)

⑥ 把查询出来的数据用 sql的批量跟新语句拼接

⑦ try{}catch(){}批量更新report表数据

⑧ echo输出运行结果

2、PHP代码(yaf框架):

  1. <?php 
  2. /** 
  3.  * @todo 组词 
  4.  * Class CommunityController 
  5.  */ 
  6. class CombinwordController extends Rest{ 
  7.   /** 
  8.    * @todo 判断.json数据是否存在,存在把数据往前排 
  9.    * @linux 212 /usr/local/php7/bin/php /var/www/web/shop/public/cli.php request_uri="/v1/combinword/index" 
  10.    */ 
  11.   public function indexAction(){ 
  12.     set_time_limit ( 0 );  //设置时间不过时 
  13.     $data = $this->getjson();  //获取json数据 
  14.     $dbfile_path = APP_PATH.'/data/combinword/20180824.db'
  15.     $db = new PDO("sqlite:{$dbfile_path}"); 
  16.     //设置数据库句柄    属性 PDO::ATTR_ERRMODE:错误报告。   PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。 
  17.     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  18.     //加combinword字段 START 
  19.     $add_filed = 'word_sort'
  20.     $add_filed_sql = "alter table report add {$add_filed} TEXT(32)"
  21.     try { 
  22.       $db->beginTransaction();//启动事务 
  23.       $db->exec($add_filed_sql);  //加字段 
  24.       $db->commit();//提交事务 
  25.     }catch(PDOException $e){ 
  26.       //$e->getMessage();//获取错误信息。 
  27.       echo '字段已经存在'.PHP_EOL; 
  28.       $db->rollBack();//回滚,如果一个地方出现错误,回到总体操作之前。 
  29.     } 
  30.     //加combinword字段 END 
  31.     $addStep = 5000;  //每次操作的数据 
  32.     $word_cnt = 0; 
  33.     $succ_cnt = 0; 
  34.     $sort = 0; 
  35.     $total = count($data); 
  36.     for ( $x=0; $x<$total$x += $addStep ){ 
  37.       $temp_json = array_slice($data$x$addStep);  //批量操作 100条 
  38.       $temp_json = array_column( $temp_json"title" ); 
  39.       $temp_json = array_unique($temp_json); 
  40.       $temp_str = $this->getStrByArr($temp_json); 
  41.       $temp_sql = "select * from report where words IN ({$temp_str})"
  42.       $res = $db->query($temp_sql); 
  43.       $result = $res->fetchAll(PDO::FETCH_ASSOC);  //获取数组结果集 
  44.       $words_result = array_column($result'words'); //结果去重 
  45.       $unique_result = array_unique($words_result); 
  46.       //var_export($unique_result);die; 
  47.       //批量更新 START 
  48.       $update_sql = "UPDATE report SET {$add_filed} = CASE words "
  49.       foreach ($unique_result as $k => $v){ 
  50.         $updateValue = $v
  51.         $update_sql .= " WHEN '{$updateValue}' THEN ".$sort++; 
  52.       } 
  53.       $sort += count($unique_result);  //加上排序字段 
  54.       $update_sql_str = $this->getStrByArr( $unique_result ); 
  55.       $update_sql .= " END WHERE words IN ({$update_sql_str})"
  56.         //var_export($update_sql);die; 
  57.       try { 
  58.         $db->beginTransaction();//启动事务 
  59.         $cnt = $db->exec($update_sql);  //加字段 
  60.         $db->commit();//提交事务 
  61.         $word_cnt += count($result); 
  62.         $succ_cnt += $cnt
  63.         echo "更新了[{".count($result)."}]个关键字,共影响了[{$cnt}]条数据 ".PHP_EOL; 
  64.       }catch(PDOException $e){ 
  65.         //$e->getMessage();//获取错误信息。 
  66.         echo "批量更新失败 ".PHP_EOL; 
  67.         $db->rollBack();//回滚,如果一个地方出现错误,回到总体操作之前。 
  68.       } 
  69.       //批量更新END 
  70.     } 
  71.     echo "一共更新了[{$word_cnt}]个关键字,共影响了[{$succ_cnt}]条数据 ".PHP_EOL; 
  72.     die
  73.   } 
  74.   /** 
  75.    * @todo 根据数组返回拼接的字符串 
  76.    * @param unknown $temp_json 数组 
  77.    * @return string 字符串 
  78.    */ 
  79.   function getStrByArr($temp_json){ 
  80.     $temp_str = ''
  81.     $count = count($temp_json); 
  82.     $lastValue = end($temp_json);//var_export($lastValue);die;  //获取数组最后一个元素 
  83.     foreach ($temp_json as $k => $v){ 
  84.       $next_str = ''
  85.       if($v != $lastValue ){  //不是最后一个 
  86.         $next_str = ','
  87.       }else
  88.         $next_str = ''
  89.       } 
  90.       $temp_str .= "'".$v."'{$next_str}"
  91.     } 
  92.     return $temp_str
  93.   } 
  94.   /** 
  95.    * @todo 获取json数据 
  96.    */ 
  97.   public function getjson(){ 
  98.     $filename = APP_PATH.'/data/combinword/jsonlist.json'
  99.     $json = file_get_contents($filename); 
  100.     $array = json_decode($json, true); 
  101.     return $array
  102.   } 
  103. }

Tags: PDO sqlite

分享到: