【问题标题】:csv file import to mysql database using php facing error to importcsv文件导入mysql数据库使用php面临错误导入
【发布时间】:2015-05-31 15:33:53
【问题描述】:

使用 php 脚本在 phpmyadmim 中导入 CVS 文件(Microsoft Office Excel 逗号分隔值文件 (.csv))。 当我导入 CSV 文件时,它没有正确导入数据库。 行以“,”结束 请建议我如何让它终止“自动”,我正在附加示例文件。

我只是通过此链接共享 CSV 文件 http://www.soniinfotech.com/product-data.csv

经过一些建议和更正后,我遇到了另一个问题。 实际的 cvs 文件大小为 106700 行,插入 81499 行。 我有多次插入文件,但它的总行数是 81499 插入。 请帮我解决这个问题,如何将所有行插入数据库。

<?php

set_time_limit(2400);

$mysqli = new mysqli("localhost" , "user" , "pass" , "db");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$table_name= "store";

$csv_file = "import.csv"; // Name of your CSV file
$csvfile = fopen($csv_file, 'r');
$field_csv = array();
$i = 0;
while (($csv_data = fgetcsv($csvfile, 0, ",")) !== FALSE) {     if($i==0) { $i++; continue; }  // to exclude first line in the csv file.

$field_csv['productId'] = $csv_data[0];  // 1
$field_csv['title'] = $csv_data[1]; // 2
$field_csv['description'] = $csv_data[2]; // 3
$field_csv['imageUrlStr'] = $csv_data[3];  // 4
$field_csv['mrp'] = $csv_data[4]; // 5
$field_csv['price'] = $csv_data[5]; // 6
$field_csv['productUrl'] = $csv_data[6];  // 7
$field_csv['categories'] = $csv_data[7]; // 8
$field_csv['productBrand'] = $csv_data[8]; // 9
$field_csv['deliveryTime'] = $csv_data[9];  // 10
$field_csv['inStock'] = $csv_data[10]; // 11
$field_csv['codAvailable'] = $csv_data[11]; // 12
$field_csv['emiAvailable'] = $csv_data[12];  // 13
$field_csv['offers'] = $csv_data[13]; // 14
$field_csv['discount'] = $csv_data[14]; // 15
$field_csv['cashBack'] = $csv_data[15];  // 16
$field_csv['size'] = $csv_data[16]; // 17
$field_csv['color'] = $csv_data[17]; // 18
$field_csv['sizeUnit'] = $csv_data[18];  // 19
$field_csv['sizeVariants'] = $csv_data[19]; // 20
$field_csv['colorVariants'] = $csv_data[20]; // 21
$field_csv['styleCode'] = $csv_data[21]; // 22

$query = "INSERT INTO $table_name SET productId = '".$field_csv['productId']."',title = '".$field_csv['title']."',description = '".$field_csv['description']."',imageUrlStr = '".$field_csv['imageUrlStr']."',mrp = '".$field_csv['mrp']."',price = '".$field_csv['price']."',productUrl = '".$field_csv['productUrl']."',categories = '".$field_csv['categories']."',productBrand = '".$field_csv['productBrand']."',deliveryTime = '".$field_csv['deliveryTime']."',inStock = '".$field_csv['inStock']."',codAvailable = '".$field_csv['codAvailable']."',emiAvailable = '".$field_csv['emiAvailable']."',offers = '".$field_csv['offers']."',discount = '".$field_csv['discount']."',cashBack = '".$field_csv['cashBack']."',size = '".$field_csv['size']."',color = '".$field_csv['color']."',sizeUnit = '".$field_csv['sizeUnit']."',sizeVariants = '".$field_csv['sizeVariants']."',colorVariants = '".$field_csv['colorVariants']."',styleCode = '".$field_csv['styleCode']."' ";
mysqli_query($mysqli,$query);
}
fclose($csvfile);

echo "CSV data successfully imported to table!!";

// close connection
$mysqli->close();
?>

【问题讨论】:

  • fgetcsv 将在换行符处自动终止(前提是它们不会在双引号中包含文本)。您的代码的问题在于您设置为一次读取 1024 个字节,而您的实际行数为 1500 或更多。尽量不要限制行大小:fgetcsv($csvfile, 0, ",")
  • 感谢您的建议。但目前我在导入此文件时面临另一个问题。总行数为 106727,但它只是添加了 81499 行。我如何插入所有行。请建议我
  • 尝试在 PHP 文件的开头添加 error_reporting(E_ALL)。也许你会在某些行上得到一个 MySQL 错误。
  • 只需添加error_reporting(E_ALL); php脚本开头的代码。我得到的结果相同,总共插入了 81499 行。
  • 你有它。您的文本中可能有未转义的引号会破坏 SQL 查询。使用 mysqli_real_escape_string() 转义每个字符串 before 插入数据库。为了不让这个进入聊天,我将把它总结在一个答案中。

标签: php csv mysqli sql-insert mysqlimport


【解决方案1】:

您提供的代码存在许多问题:

1。不指定最大线宽

仅当您知道这足以阅读整行时,才将长度参数(第二个参数)指定为fgetcsv()。否则只需使用 0(零)让 PHP 自动检测换行符。 (它甚至会智能地使用实际换行的新行,避免在 CSV 引用值中可能发生的换行)

fgetcsv($csvfile, 0, ",")

2。在插入数据库之前转义你的字符串

当您将字符串值插入 MySQL 时,您需要正确地转义它们。如果您不这样做,并且字符串包含引号,则可能会破坏您的 SQL 查询,从而导致插入失败。

使用非转义字符串也会带来SQL-injection attack 的风险。

要转义字符串,请使用mysqli_real_escape_string() 函数。

即:

$field_csv['productId'] = mysqli_real_escape_string( $mysqli, $csv_data[0] );  // 1
$field_csv['title'] = mysqli_real_escape_string( $mysqli, $csv_data[1] ); // 2
$field_csv['description'] = mysqli_real_escape_string( $mysqli, $csv_data[2] ); // 3
$field_csv['imageUrlStr'] = mysqli_real_escape_string( $mysqli, $csv_data[3] );  // 4
// ... etc.

3。使用 mysqli_error() 调试 SQL 查询可能出现的错误

如果您不检查 SQL 查询中的错误,那么您就是在瞎跑。如果发生错误,您甚至可能都没有注意到。

始终检查mysqli_query() 的返回值。 (它将在查询失败时返回布尔值FALSE)并使用mysqli_error()打印出错误

if ( ! mysqli_query( $mysqli,$query ) ) {
  printf( "Error: %s\n", mysqli_error( $mysqli ) );
}

【讨论】:

  • 谢谢。现在我没有收到任何错误,但所有行都两次插入到数据库中
  • 在这种情况下,您可能会调用两次mysqli_query。只留下一个。
  • 我是 php 新手,我只使用过一次,我需要在哪里进行修正? mysqli_query($查询);然后我收到错误 PHP 警告:mysqli_query() 需要至少 2 个参数,给定 1 个
  • mysqly_query() 需要两个参数:1)链接标识符(在您的情况下是 $mysqli 变量)和 2)SQL 查询($query)。如果你得到重复的插入,这意味着你调用了两次mysql_query(),因为函数被调用了两次。查看您的代码,无论您的 PHP 经验水平如何,我相信您都能找到它;)
  • 我只是删除了这段代码,现在脚本工作得很好。 if ( !mysqli_query($mysqli,$query) ) { printf("错误: %s\n", mysqli_error($mysqli)); }
【解决方案2】:
<?php

set_time_limit(2400);

$mysqli = new mysqli("host" , "user" , "pass" , "db");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$table_name= "store";

$csv_file = "import.csv"; // Name of your CSV file
$csvfile = fopen($csv_file, 'r');
$field_csv = array();
$i = 0;
while (($csv_data = fgetcsv($csvfile, 0, ",")) !== FALSE) {
    if($i==0) { $i++; continue; }  // to exclude first line in the csv file.

$field_csv['productId'] =mysqli_real_escape_string( $mysqli, $csv_data[0] );  // 1
$field_csv['title'] = mysqli_real_escape_string( $mysqli, $csv_data[1]     ); // 2
$field_csv['description'] = mysqli_real_escape_string( $mysqli, $csv_data[2] ); // 3
$field_csv['imageUrlStr'] = mysqli_real_escape_string( $mysqli, $csv_data[3] );  // 4
$field_csv['mrp'] = mysqli_real_escape_string( $mysqli, $csv_data[4] ); // 5
$field_csv['price'] = mysqli_real_escape_string( $mysqli, $csv_data[5] ); // 6
$field_csv['productUrl'] = mysqli_real_escape_string( $mysqli, $csv_data[6] );  // 7
$field_csv['categories'] = mysqli_real_escape_string( $mysqli, $csv_data[7] ); // 8
$field_csv['productBrand'] = mysqli_real_escape_string( $mysqli, $csv_data[8] ); // 9
$field_csv['deliveryTime'] = mysqli_real_escape_string( $mysqli, $csv_data[9] );  // 10
$field_csv['inStock'] = mysqli_real_escape_string( $mysqli, $csv_data[10] ); // 11
$field_csv['codAvailable'] = mysqli_real_escape_string( $mysqli, $csv_data[11] ); // 12
$field_csv['emiAvailable'] = mysqli_real_escape_string( $mysqli, $csv_data[12] );  // 13
$field_csv['offers'] = mysqli_real_escape_string( $mysqli, $csv_data[13] ); // 14
$field_csv['discount'] = mysqli_real_escape_string( $mysqli, $csv_data[14] ); // 15
$field_csv['cashBack'] = mysqli_real_escape_string( $mysqli, $csv_data[15] );  // 16
$field_csv['size'] = mysqli_real_escape_string( $mysqli, $csv_data[16] ); // 17
$field_csv['color'] = mysqli_real_escape_string( $mysqli, $csv_data[17] ); // 18
$field_csv['sizeUnit'] = mysqli_real_escape_string( $mysqli, $csv_data[18] );  // 19
$field_csv['sizeVariants'] = mysqli_real_escape_string( $mysqli, $csv_data[19] ); // 20
$field_csv['colorVariants'] = mysqli_real_escape_string( $mysqli, $csv_data[20] ); // 21
$field_csv['styleCode'] = mysqli_real_escape_string( $mysqli, $csv_data[21] ); // 22


$query = "INSERT INTO $table_name SET productId = '".$field_csv['productId']."',title = '".$field_csv['title']."',description = '".$field_csv['description']."',imageUrlStr = '".

$field_csv['imageUrlStr']."',mrp = '".$field_csv['mrp']."',price = '".$field_csv['price']."',productUrl = '".$field_csv['productUrl']."',categories = '".$field_csv['categories']."',productBrand = '".

$field_csv['productBrand']."',deliveryTime = '".$field_csv['deliveryTime']."',inStock = '".$field_csv['inStock']."',codAvailable = '".$field_csv['codAvailable']."',emiAvailable = '".$field_csv

['emiAvailable']."',offers = '".$field_csv['offers']."',discount = '".$field_csv['discount']."',cashBack = '".$field_csv['cashBack']."',size = '".$field_csv['size']."',color = '".$field_csv

['color']."',sizeUnit = '".$field_csv['sizeUnit']."',sizeVariants = '".$field_csv['sizeVariants']."',colorVariants = '".$field_csv['colorVariants']."',styleCode = '".$field_csv['styleCode']."' ";
mysqli_query($mysqli,$query);

}

fclose($csvfile);

echo "CSV data successfully imported to table!!";

// close connection
$mysqli->close();
?>

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多