如何将csv文件中的数据插入mySQL数据库(大数据,快速方式)?

时间:2015-11-19 18:24:08

标签: php mysql csv

我想将csv文件中的数据插入我的数据库。

$myfile = "./files/data.csv";

这是我的联系:

class Database 
{
    private static $dbName = 'dbname' ; 
    private static $dbHost = 'localhost' ;
    private static $dbUsername = 'dbuser';
    private static $dbUserPassword = 'dbpassword';

    private static $cont  = null;

    public function __construct() {
        exit('Init function is not allowed');
    }

    public static function

 connect()
    {

   if ( null == self::$cont )
   {      
    try 
    {
      self::$cont =  new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);  
      self::$cont->query("SET NAMES utf8");
      self::$cont->query("SET CHARACTER SET utf8");
    }
    catch(PDOException $e) 
    {
      die($e->getMessage());  
    }
   } 
   return self::$cont;
}

public static function disconnect()
{
    self::$cont = null;
}

}

这就是我将数据插入数据库的方式:

error_reporting(E_ALL); ini_set('display_errors', 1);

try {
   $pdo = Database::connect();
   $sql = "LOAD DATA INFILE '$myfile'
   INTO TABLE `animals`
   FIELDS TERMINATED BY ','
   OPTIONALLY ENCLOSED BY '\"'
   LINES TERMINATED BY '\n'
   (id,name,animal)";
   $q = $pdo->query($sql);
   $q->execute();
} catch (PDOException $q) {
  echo 'Connection failed: ' . $q->getMessage();
}

我的csv文件如下所示:

12,fred,cat,
13,tom,dog,

这是我数据库中的动物表

╔════╦═════════╦════════╦════════╗
║ id ║  name   ║  age   ║ animal ║ 
╠════╬═════════╬════════╬════════╣
║    ║         ║        ║        ║
║    ║         ║        ║        ║
║    ║         ║        ║        ║
║    ║         ║        ║        ║
╚════╩═════════╩════════╩════════╝

不幸的是它不起作用,这意味着没有数据插入到我的数据库中。我希望你能帮忙:)。

1 个答案:

答案 0 :(得分:1)

MySQL服务器端有一些因素会影响使用LOAD DATA INFILE的行为。

MySQL配置

MySQL对本地和服务器文件系统访问都有自己的限制。一个这样的系统设置是--secure_file_priv,您可以read more about in the manual

  

--secure_file_priv

     

此变量用于限制数据导入和导出操作的效果,例如LOAD DATASELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。默认情况下,此变量为空。如果设置为目录名称,则会限制导入和导出操作仅适用于该目录中的文件。

因此,如果此设置为非空,您将需要将文件移动到配置的目录,以便MySQL能够读取它,或者您需要相应地更改它。

还要确保在代码中提供绝对文件路径,因为相对路径对服务器没有意义。

MySQL用户Privelages

请参阅MySQL手册部分6.2.1 Privileges Provided by MySQL,了解有关用户权限如何使用LOAD DATA INFILESELECT .. INTO OUTFILE,即连接到MySQL的用户需要{{1}能够使用这些语句的权限)。在这种情况下,这将是您的FILE

文件系统权限

最后,MySQL用户需要具有足够的文件系统权限才能从给定文件中读取,否则将无法完成操作。您可以使用self::$dbUsername启用全局读取权限来确保这不是问题。通常,您的chmod()应该已经涵盖了这一点,但最好首先进行验证,而不是假设它。

更好的错误处理

此外,由于您在此处使用umask / try,因此可能需要注意您可能希望将catch置于异常模式,因为它不会抛出异常如果您的MySQL服务器返回错误,例如在这种情况下。

您可以在构造函数调用PDO中执行此操作,如此...

PDO

有关详细信息,请参阅Errors and error handling上的手册。