【发布时间】:2012-02-12 16:14:17
【问题描述】:
我需要将我的.txt 导入到MySQL `
只有一个字段
像这样我尝试了很多方法但失败了:(
你能帮帮我吗 如果有人对 php 有想法,那也是可以接受的。我为此花了两个不幸的是还没有成功:(
提前致谢
【问题讨论】:
标签: php mysql sql database phpmyadmin
我需要将我的.txt 导入到MySQL `
只有一个字段
像这样我尝试了很多方法但失败了:(
你能帮帮我吗 如果有人对 php 有想法,那也是可以接受的。我为此花了两个不幸的是还没有成功:(
提前致谢
【问题讨论】:
标签: php mysql sql database phpmyadmin
可以使用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 不再起作用了还是什么?
为什么不使用一些正则表达式基本上用新行来分割它,即。
$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/" ...我编辑了模式以使其更有用。
phpMyAdmin 支持CSV files 导入,更多详情请查看this article(之后的第一个结果:phpMyAdmin csv)
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
LOAD DATA
Mysql本身(客户端,查询)支持LOAD DATA INFILE命令,示例语法:
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
您将在 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);
【讨论】:
<?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);
?>
【讨论】:
<?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 模式需要分隔符!请参阅其他答案的最后一条评论。