• 利用fputcsv导出数据备份数据


    今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧

    讲之前先上一段获取数据库里面的所有表以及表对应的字段的代码。

    获取数据库所有表和字段

     
    1. $i = 0;
    2. $tables = $db->getAllTables();
    3. foreach ($tables as $key => $value) {
    4.     $rooters[$i]['tab'] = $value;
    5.     $fields = $db->getAllFields("$value");
    6.     foreach ($fields as $k => $v) {
    7.         $rooters[$i]['colus'] .= $v['name'].'('.$v['con'].'),';
    8.     }
    9.     $i++;
    10. }
    11. echo '<pre>';
    12. print_r($rooters);
    getAllTables和getAllFields,这两个方法封装到数据库操作类里面即可
     
    1. /*
    2.     * 获取数据库所有的表名
    3.     */
    4. static function getAllTables() {
    5.     $result = self::query("SHOW TABLES");//执行查询语句
    6.     $tables=array();
    7.     while($row = mysql_fetch_array($result))
    8.     {
    9.         $tables[] =$row[0];
    10.     }
    11.     return $tables;
    12. }
    13. /*
    14. *获取表里对应的字段
    15. */
    16. static function getAllFields($tableName) {
    17.     $dbName = self::$dbName;
    18.     $result = self::query("select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='$tableName' and table_schema='$dbName'");//table_name 换成你对应的表名
    19.     $tables=array();
    20.     $i = 0;
    21.     while($row = mysql_fetch_array($result))
    22.     {
    23.         $tables[$i]['name'] =$row['COLUMN_NAME'];
    24.         $tables[$i]['con'] =$row['column_comment'];
    25.         $i++;
    26.     }
    27.     return $tables;
    28. }
    终于进入正题了,简单的把两份代码结合起来,就可以实现导出数据的功能,只需要提供表名即可,但是根据上面获取数据库所有表的代码,再结合一下,就可以实现备份数据库了,代码这里就不写了,下面只是导出某个表的代码。ivutf8()不要认成内置函数了,只是我封装的一个公共方法,就是iconv('utf-8', 'gbk', $v);,看着这么长的代码要写好多遍,我的强迫症就犯了,就封装成公共方法了。
     
    1. $tableName = isset($_GET['tablename'])&&($_GET['tablename']!=='')?$_GET['tablename']:'xxxx';
    2. $rooters = array();
    3. $fields = $db->getAllFields($tableName);
    4. foreach ($fields as $k => $v) {
    5.     $rooters[$k] = $v['name'];
    6. }
    7. $sql = "select * from {$tableName}";
    8. $data = $db->read($sql);
    9. $con = array();
    10. $head = $rooters;
    11. foreach ($head as $i => $v2) {
    12.     $con[0] .= ivutf8($v2).',';
    13. }
    14. $con[0] = trim($con[0],' , ');
    15. $str = '';
    16. foreach ($data as $k => $v) {
    17.     foreach ($head as $key => $value) {
    18.          $str .= ivutf8($v[$value]).",";
    19.     }
    20.     $con[$k+1] = trim($str,' , ');
    21.     $str = '';
    22. }
    23. $file = fopen("{$tableName}.csv","w");
    24. foreach ($con as $line){
    25.     fputcsv($file,split(',',$line));
    26. }
    27. fclose($file);
    28. echo '---------------------------SUCCESS---------------------------';
    现在给你们说一下我遇到的问题,导出一部分表的时候,很顺利,都能打开,但是有时候导出另一部分表的时候,打开会提示 “您尝试打开的文件xxx.csv的格式与文件扩展名指定的格式不一致.......点击确认后,会提示Excel已检测到xxx.csv是SYLK文件,但是不能将其加载.................”。

    这是因为SYLK 文件是一个文本文件,开头的"ID"或"ID_xxxx",其中 xxxx 是文本字符串。 SYLK 文件的第一个的记录是在 ID_Number 记录。 Excel 将识别该文本在文本文件开头时, 它会将该文件解释为 SYLK 文件。 Excel 将尝试从该 SYLK 格式转换该文件,但不能这样做,因为"ID"字符后不有任何有效的 SYLK 代码。 因为 Excel 不能转换该文件,您收到错误消息。

    当您打开一个文本文件、 CSV 文件和文件的前两个字符是将大写字母"I","D"时,会发生此问题。

    例如文本文件可能包含以下文本:ID, STATUS 123, open 456, closed

    如果前两个字母小写"i"和"d"不会发生此问题的 。

    解决方案:
    若想在 Excel 中打开您的文件,可以在一个文本编辑器中打开该文件,然后插入第一行开头处加一个撇号。
    1.在文本编辑器 (如记事本) 中打开文本文件。 单击第一行文字在第一个字符之前。 按撇号键键盘 (') 上。
    2.在 文件 菜单中上, 单击 保存 。 退出文本编辑器。 现在可以在 Excel 中打开该文件。

  • 相关阅读:
    JavaScript中严格模式"use strict";需注意的几个雷区:
    React 学习,需要注意几点
    安装了VS2012 还有Update4 我的Silverlight5安装完后 我的Silverlight4项目打不开
    SilverLight抛出 System.InvalidOperationException: 超出了2083 的最大URI
    Dictionary集合运用
    配置OpenCV开发环境心得
    调用第三方库出现的问题
    7-19 答疑课小结
    工欲善其事必先利其器(篇一)
    VMware Ubuntu Kaldi
  • 原文地址:https://www.cnblogs.com/ftx5410/p/7145512.html
Copyright © 2020-2023  润新知