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


Posted in PHP onMarch 07, 2019

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

1、需求:

已知:

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

array (
   0 =>
   array (
    'title' => '九十九',
   ),
   1 =>
   array (
    'title' => '电脑九十九',
   ),
   2 =>
   array (
    'title' => '手机九十九',
   ),
   3 =>
   array (
    'title' => '手机电脑九十九',
   ),
);

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框架):

<?php
/**
 * @todo 组词
 * Class CommunityController
 */
class CombinwordController extends Rest{
  /**
   * @todo 判断.json数据是否存在,存在把数据往前排
   * @linux 212 /usr/local/php7/bin/php /var/www/web/shop/public/cli.php request_uri="/v1/combinword/index"
   */
  public function indexAction(){
    set_time_limit ( 0 );  //设置时间不过时
    $data = $this->getjson();  //获取json数据
    $dbfile_path = APP_PATH.'/data/combinword/20180824.db';
    $db = new PDO("sqlite:{$dbfile_path}");
    //设置数据库句柄    属性 PDO::ATTR_ERRMODE:错误报告。   PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //加combinword字段 START
    $add_filed = 'word_sort';
    $add_filed_sql = "alter table report add {$add_filed} TEXT(32)";
    try {
      $db->beginTransaction();//启动事务
      $db->exec($add_filed_sql);  //加字段
      $db->commit();//提交事务
    }catch(PDOException $e){
      //$e->getMessage();//获取错误信息。
      echo '字段已经存在'.PHP_EOL;
      $db->rollBack();//回滚,如果一个地方出现错误,回到总体操作之前。
    }
    //加combinword字段 END
    $addStep = 5000;  //每次操作的数据
    $word_cnt = 0;
    $succ_cnt = 0;
    $sort = 0;
    $total = count($data);
    for ( $x=0; $x<$total; $x += $addStep ){
      $temp_json = array_slice($data, $x, $addStep);  //批量操作 100条
      $temp_json = array_column( $temp_json, "title" );
      $temp_json = array_unique($temp_json);
      $temp_str = $this->getStrByArr($temp_json);
      $temp_sql = "select * from report where words IN ({$temp_str})";
      $res = $db->query($temp_sql);
      $result = $res->fetchAll(PDO::FETCH_ASSOC);  //获取数组结果集
      $words_result = array_column($result, 'words'); //结果去重
      $unique_result = array_unique($words_result);
      //var_export($unique_result);die;
      //批量更新 START
      $update_sql = "UPDATE report SET {$add_filed} = CASE words ";
      foreach ($unique_result as $k => $v){
        $updateValue = $v;
        $update_sql .= " WHEN '{$updateValue}' THEN ".$sort++;
      }
      $sort += count($unique_result);  //加上排序字段
      $update_sql_str = $this->getStrByArr( $unique_result );
      $update_sql .= " END WHERE words IN ({$update_sql_str})";
        //var_export($update_sql);die;
      try {
        $db->beginTransaction();//启动事务
        $cnt = $db->exec($update_sql);  //加字段
        $db->commit();//提交事务
        $word_cnt += count($result);
        $succ_cnt += $cnt;
        echo "更新了[{".count($result)."}]个关键字,共影响了[{$cnt}]条数据 ".PHP_EOL;
      }catch(PDOException $e){
        //$e->getMessage();//获取错误信息。
        echo "批量更新失败 ".PHP_EOL;
        $db->rollBack();//回滚,如果一个地方出现错误,回到总体操作之前。
      }
      //批量更新END
    }
    echo "一共更新了[{$word_cnt}]个关键字,共影响了[{$succ_cnt}]条数据 ".PHP_EOL;
    die;
  }
  /**
   * @todo 根据数组返回拼接的字符串
   * @param unknown $temp_json 数组
   * @return string 字符串
   */
  function getStrByArr($temp_json){
    $temp_str = '';
    $count = count($temp_json);
    $lastValue = end($temp_json);//var_export($lastValue);die;  //获取数组最后一个元素
    foreach ($temp_json as $k => $v){
      $next_str = '';
      if($v != $lastValue ){  //不是最后一个
        $next_str = ',';
      }else{
        $next_str = '';
      }
      $temp_str .= "'".$v."'{$next_str}";
    }
    return $temp_str;
  }
  /**
   * @todo 获取json数据
   */
  public function getjson(){
    $filename = APP_PATH.'/data/combinword/jsonlist.json';
    $json = file_get_contents($filename);
    $array = json_decode($json, true);
    return $array;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php生成EXCEL的东东
Oct 09 PHP
php addslashes和mysql_real_escape_string
Jan 24 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
php 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
购物车实现的几种方式优缺点对比
May 02 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
php访问对象中的成员的实例方法
Nov 17 PHP
php使用fullcalendar日历插件详解
Mar 06 #PHP
PHP封装XML和JSON格式数据接口操作示例
Mar 06 #PHP
浅谈PHP封装CURL
Mar 06 #PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 #PHP
PHP实现的敏感词过滤方法示例
Mar 06 #PHP
详解PHP 二维数组排序保持键名不变
Mar 06 #PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 #PHP
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
JS实现星星海特效
2019/12/24 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
python实现ipsec开权限实例
2014/11/11 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python使用smtplib模块发送邮件
2020/12/17 Python
劲霸男装广告词改编版
2014/03/21 职场文书
文秘自荐信
2014/06/28 职场文书
小学家长意见怎么写
2015/06/03 职场文书
教师听课学习心得体会
2016/01/15 职场文书
2019消防宣传标语!
2019/07/10 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技