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

这篇文章主要介绍了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. }