我希望将已经在我的服务器上的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 ║
╠════╬═════════╬════════╬════════╣
║ ║ ║ ║ ║
║ ║ ║ ║ ║
║ ║ ║ ║ ║
║ ║ ║ ║ ║
╚════╩═════════╩════════╩════════╝不幸的是,它不能工作,这意味着没有数据被插入到我的数据库中。我希望你能提供帮助:)
发布于 2015-11-23 11:48:01
终于成功了。原因实际上是没有服务器权限问题。这是数据库连接中的一个问题。
以下是工作代码:
$pdo = Database::connect();
$sql = "LOAD DATA LOCAL INFILE 'http://www.mypage.myfile.csv'
INTO TABLE test
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id,name,animal)";
$con=mysqli_connect("localhost","dbuser","dbpassword","dbname");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
};
$result = mysqli_query($con, $sql);
if (mysqli_affected_rows($con) == 1) {
$message = "The data was successfully added!";
} else {
$message = "The user update failed: ";
$message .= mysqli_error($con);
};
echo $message;
mysqli_close($con);发布于 2015-11-19 18:42:56
MySQL服务器端有一些因素会影响使用LOAD DATA INFILE的行为。
MySQL Config
MySQL对本地和服务器文件系统访问都有自己的限制。这样的系统设置之一是--secure_file_priv,您可以使用它进行阅读手册中的更多内容。。
--secure_file_priv此变量用于限制数据导入和导出操作的效果,例如由LOAD DATA和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。默认情况下,此变量为空。如果设置为目录的名称,则将导入和导出操作限制为仅处理该目录中的文件。
因此,如果此设置是非空的,则需要将文件移动到配置的目录中,以便MySQL能够读取它,或者您需要相应地更改它。
还确保在代码中提供绝对文件路径,因为相对路径对服务器没有意义。
MySQL用户特权
有关用户权限如何使用MySQL和SELECT .. INTO OUTFILE (即连接到MySQL的用户需要拥有FILE特权才能使用这些语句)的详细信息,请参阅6.2.1 MySQL提供的特权手册节。在这种情况下,这将是您的self::$dbUsername。
文件系统权限
最后,MySQL用户需要有足够的文件系统权限从给定的文件中读取,否则它将无法完成操作。通过使用chmod()打开world read权限,您可以确保这不是一个问题。通常情况下,您的umask应该已经涵盖了这一点,但是最好先验证,而不是假设它已经完成了。
更好的错误处理
此外,由于您在这里使用的是try/catch,可能需要注意的是,您可能希望将PDO置于异常模式,因为如果您的MySQL服务器返回错误,它将不会抛出异常,例如在本例中。
您可以在对PDO的构造函数调用中这样做。
new PDO($dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);有关详细信息,请参阅错误和错误处理手册。
https://stackoverflow.com/questions/33811565
复制相似问题