【问题标题】:how to import txt to mysql direct or through php如何直接或通过php将txt导入mysql
【发布时间】:2012-02-12 16:14:17
【问题描述】:

我需要将我的.txt 导入到MySQL ` 只有一个字段 像这样我尝试了很多方法但失败了:(

你能帮帮我吗 如果有人对 php 有想法,那也是可以接受的。我为此花了两个不幸的是还没有成功:(

提前致谢

【问题讨论】:

    标签: php mysql sql database phpmyadmin


    【解决方案1】:

    可以使用Mysql LOAD DATA LOCAL INFILE语法

    LOAD DATA LOCAL INFILE '/path/to/file.txt' 
        INTO TABLE 'table1'
        LINES TERMINATED BY '\n'
    

    为此,请确保 Mysql 有权访问 /path/to/file.txt。此外,执行查询的用户必须具有 FILE 权限。

    使用纯 PHP 很容易。读取文件,构建查询,执行它。 您需要构建查询,以免最终导致缓慢的循环查询。

    $data = file("/path/to/file.txt", FILE_SKIP_EMPTY_LINES);
    
    // make sure you have valid database connection prior to this point.
    // otherwise mysql_real_escape_string won't work
    $values = "('". implode("'), ('", array_map('mysql_real_escape_string', $data)). "')";
    
    $query = "INSERT INTO `TABLE1` (`COLUMN1`) VALUES $values";
    
    // Now just execute the query once.
    mysql_query($query);
    

    【讨论】:

    • 为什么你们都使用preg_split? php.net/manual/en/function.file.php 不再起作用了还是什么?
    • `我使用它是因为可能有空条目。
    • 不客气。)(如果我听起来很粗鲁,我很抱歉,不是故意的)......那些正则表达式解决方案很好,但程序员经常忘记他们可以使用更多有效的程序/顺序解决方案。
    【解决方案2】:

    为什么不使用一些正则表达式基本上用新行来分割它,即。

    $array = preg_split("/[\r\n]+/", file_get_contents("path/to/file.txt"));
    

    然后做一个foreach循环,即:

    foreach($array as $line){
       // insert into database
    }
    

    然后您需要做的就是填写上面的行,将其插入数据库中的正确字段,逐行 - 但请清理每一行,以免向数据库注入任何不良内容!

    【讨论】:

    • 你应该使用preg_split而不是explode来解释操作系统中不同的换行符:$lines = preg_split("[\r\n]+", $txt);
    • 我是个白痴,忽略了模式分隔符,所以你可能想再更新一次。 "[\r\n]+" 应该是 "/\r?\n/" ...我编辑了模式以使其更有用。
    • 哈哈——我自己应该也发现了!
    【解决方案3】:

    在 phpMyAdmin 中使用 csv 导入

    phpMyAdmin 支持CSV files 导入,更多详情请查看this article(之后的第一个结果:phpMyAdmin csv

    使用 mysqlimport

    Mysql 提供 CLI 应用,mysqlimport,示例用法(又是 CSV):

    mysqlimport --fields-optionally-enclosed-by='"' --fields-terminated-by=, \
        --lines-terminated-by="\r\n" --user=YOUR_USERNAME --password \
        YOUR_DATABASE YOUR_TABLE.csv
    

    MysqlLOAD DATA

    Mysql本身(客户端,查询)支持LOAD DATA INFILE命令,示例语法:

    LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
    

    使用 php 构建 sql 查询(并手动插入)

    您将在 php 中解析文本文件,输出将是一个大的 INSERT 语句(当/如果您无法从运行脚本的服务器连接到 mysql 时,这将很有用:

    // This will escape values correctly
    function escapeValues( &$val){
        // mysql_real_escape_string is not an option (remote server not accessible
        // in this case)
        return "'" . addslashes( $val) . "'"; 
    }
    
    $fp = fopen( $filename, 'r') or die( 'Cannot open');
    $result = array();
    while( $row = fgets( $fp)){
        $values = explode( '/', $row);
        array_walk( $values, 'escapeValues');
        $results[] = '(' . implode( ', ', $values) . ')';
    }
    
    fclose( $fp);
    
    if( !count( $results){
       die();
    }
    
    echo 'INSERT INTO tableName (col1, col2, ... colN) VALUES ';
    echo implode( ",\n", $results);
    echo "\n";
    

    直接连接和直接导入

    这应该是最适合您的方法。

    $conn = mysql_connect( ...) or die(...);
    mysql_select_db(...);
    
    // Now we need to build small class which will allow us escape values properly
    // mysql_escape_string is DEPRECATED and mysql_real_escape_string
    // requires connection parameter
    // Ps: choose better name
    class CallbackHack {
        public $connection = null;
        public function escapeValue( &$val){
            $val = "'" . mysql_real_escape_string( $val, $this->connection) . "'";
        }
    }
    $hack = new CallbackHack();
    $hack->connection = $conn;
    
    $fp = fopen( $filename, 'r') or die( 'Cannot open');
    mysql_query( 'BEGIN TRANSACTION;'); // Increases insert performance for InnoDb
    while( $row = fgets( $fp)){
        $values = explode( '/', $row);
        array_walk( $values, array( $hack, 'escapeValue'));
        $sql = 'INSERT INTO tableName (col1, col2, ... colN) VALUES (' .
                implode( ', ', $values) . ');';
        mysql_query( $sql);
    }
    
    mysql_query( 'COMMIT;'); // Make sure it will run
    fclose( $fp);
    

    【讨论】:

      【解决方案4】:
      <?php
      $con = mysql_connect("localhost","peter","abc123");
      if (!$con)
        {
        die('Could not connect: ' . mysql_error());
        }
      
      mysql_select_db("my_db", $con);
      
      
      $file = fopen("welcome.txt", "r") or exit("Unable to open file!");
          //Output a line of the file until the end is reached
      
          while(!feof($file))
            {
      
      $data = mysql_real_excape_string(fgets($file));
      mysql_query("INSERT INTO Persons (filedata)
      VALUES ($data)");
      //make sure above query is right according to your table structure
            }
          fclose($file);
      
      mysql_close($con);
      ?> 
      

      【讨论】:

        【解决方案5】:
        <?php
        $array = preg_split("[\r\n]+", file_get_contents("path/to/file.txt"))
        
        foreach ($array as $line) {
        mysql_query("INSERT INTO `dbname` (colmun1) VALUES ('$line')");
        }
        ?>
        

        也要经常消毒!

        【讨论】:

        • 从其他答案复制/粘贴代码是不安全的! preg_split 模式需要分隔符!请参阅其他答案的最后一条评论。
        • 是的,为了胜利而拨号,唯一的答案是我开始写作时他的第一个答案......对不起......
        猜你喜欢
        • 2013-08-30
        • 2016-02-26
        • 2017-03-29
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 2014-08-03
        相关资源
        最近更新 更多