有一个名为example
的mysql数据库,它有一个名为products
的表,它有字段:products_model
和products_image
。模型字段是唯一的。
现在我有一个名为data.csv
的csv文件。它有两列product_model和products_image
。我使用以下代码。但它不会将数据导入数据库。我的代码出了什么问题?
$fp = fopen("data.csv","r");
$length = 4096; //have to be optional length
$fildDelineate = ',' ;//or "|" declare what you need
$dbhost="localhost";
$dbname="zencartone";
$dbuser="root";
$dbpass="";
$link = mysql_connect($dbhost,$dbuser,$dbpass);
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db($dbname);
$databasetable = 'products';
$counter = 1;//to omission first row if it is table headers
while($line = fgetcsv($fp,$length,$fildDelineate)){
foreach($line as $key=>$value){
//for example insert in 3 column
$importSQL = "insert into $databasetable (products_model, products_image) values('$line[0]','$line[1]')";
mysql_query($importSQL) or die(mysql_error());
}
$counter++;
}
fclose($fp);
data.csv:
有两栏:
products_model products_image
MG200MMS dress/201247561673.jpg
MG400-32MB dress/2012471141673.jpg
MSIMPRO dress/201247741673.jpg
DVD-RPMK dress/2012471831673.jpg
DVD-BLDRNDC dress/2012474221673.jpg
DVD-MATR dress/201112132056773.jpg
答案 0 :(得分:3)
问题在于循环:
while(!fopen($fp)){
if(!$line = fgetcsv($fp,$length,$fildDelineate,'')&& $counter){
continue;
}
foreach($line as $key=>$value){
不正确。您的文件已经打开(在第一行代码中)。在循环中,您需要阅读,而不是重新打开。你的循环应该是这样的:
while($line = fgetcsv($fp, 0, "\t")){
foreach($line as $key=>$value){
...
}
}
编辑:由于您的文件似乎是TSV(制表符分隔值),我更新了上面的代码,以便在读取数据时使用制表符char作为分隔符。
答案 1 :(得分:2)
编辑:
使用以下循环:
while($line = fgets($fp)) {
$lineArray = explode("\t", $line); // Use tab as delimiter.
$importSQL = "insert into $databasetable (products_model, products_image) values ('".$lineArray[0]."','".$lineArray[1]."')";
mysql_query($importSQL) or die(mysql_error());
$counter++;
}
<击> 撞击>
<击>SQL错误:
$importSQL = "insert into $databasetable values('$line[0]','$line[1]')";
您需要指定列名称:
$importSQL = "insert into $databasetable (col1, col2) values('$line[0]','$line[1]')";
修改:fgetcsv($fp,$length,$fildDelineate,'')
Enclosure param设置为空字符串。如果CSV中的值没有围栏,则可以删除它:
fgetcsv($fp,$length,$fildDelineate)
否则,请设置正确的机箱(双引号或单引号)。
击><击> 撞击>