我想将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 ║
╠════╬═════════╬════════╬════════╣
║ ║ ║ ║ ║
║ ║ ║ ║ ║
║ ║ ║ ║ ║
║ ║ ║ ║ ║
╚════╩═════════╩════════╩════════╝
不幸的是它不起作用,这意味着没有数据插入到我的数据库中。我希望你能帮忙:)。
答案 0 :(得分:1)
MySQL服务器端有一些因素会影响使用LOAD DATA INFILE
的行为。
MySQL对本地和服务器文件系统访问都有自己的限制。一个这样的系统设置是--secure_file_priv
,您可以read more about in the manual。
此变量用于限制数据导入和导出操作的效果,例如
LOAD DATA
和SELECT ... INTO OUTFILE
语句以及LOAD_FILE()
函数执行的操作。默认情况下,此变量为空。如果设置为目录名称,则会限制导入和导出操作仅适用于该目录中的文件。
因此,如果此设置为非空,您将需要将文件移动到配置的目录,以便MySQL能够读取它,或者您需要相应地更改它。
还要确保在代码中提供绝对文件路径,因为相对路径对服务器没有意义。
请参阅MySQL手册部分6.2.1 Privileges Provided by MySQL,了解有关用户权限如何使用LOAD DATA INFILE
和SELECT .. INTO OUTFILE
(,即连接到MySQL的用户需要{{1}能够使用这些语句的权限)。在这种情况下,这将是您的FILE
。
最后,MySQL用户需要具有足够的文件系统权限才能从给定文件中读取,否则将无法完成操作。您可以使用self::$dbUsername
启用全局读取权限来确保这不是问题。通常,您的chmod()
应该已经涵盖了这一点,但最好首先进行验证,而不是假设它。
此外,由于您在此处使用umask
/ try
,因此可能需要注意您可能希望将catch
置于异常模式,因为它不会抛出异常如果您的MySQL服务器返回错误,例如在这种情况下。
您可以在构造函数调用PDO中执行此操作,如此...
PDO
有关详细信息,请参阅Errors and error handling上的手册。