【问题标题】:Importing csv file into mysql database using php使用php将csv文件导入mysql数据库
【发布时间】:2018-06-30 14:22:16
【问题描述】:

我有一个 MS-excel 文件,其中有一列:地址

还有一个 MySQL 数据库表,其中包含以下列:Add1、Add2、Add3

是否可以将Excel文件的地址列中的数据分解为Add1,Add2,Add3(每列限制为40个字符)通过PHP上传MSExcel文件后!

我在 PHP 中上传文件的代码:

if(isset($_POST['submit'])) {
 if(isset($_FILES['uploadFile']['name']) && $_FILES['uploadFile']['name'] != "") {
    $allowedExtensions = array("xls","xlsx","csv");
    $ext = pathinfo($_FILES['uploadFile']['name'], PATHINFO_EXTENSION);
    if(in_array($ext, $allowedExtensions)) {
       $file_size = $_FILES['uploadFile']['size'] / 1024;
       if($file_size < 50) {
           $file = "../excelfile/".$_FILES['uploadFile']['name'];
           $isUploaded = copy($_FILES['uploadFile']['tmp_name'], $file);
           if($isUploaded) {

                include("../Classes/PHPExcel/IOFactory.php");
                try {
                    //Load the excel(.xls/.xlsx/.csv) file
                    $objPHPExcel = PHPExcel_IOFactory::load($file);
                } catch (Exception $e) {
                     die('Error loading file "' . pathinfo($file, PATHINFO_BASENAME). '": ' . $e->getMessage());
                }

                //An excel file may contains many sheets, so you have to specify which one you need to read or work with.
                $sheet = $objPHPExcel->getSheet(0);
                //It returns the highest number of rows
                $total_rows = $sheet->getHighestRow();
                //It returns the highest number of columns
                $total_columns = $sheet->getHighestColumn();
                $sheet_data = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);

而将地址插入表中的查询是:

$query = "insert into address_table (Add1, Add2, Add3)
    values(
    '".$_POST['address1']."',
    '".$_POST['address2']."',
    '".$_POST['address3']."')

【问题讨论】:

  • 去掉最后一个逗号。
  • 好的,现在怎么办?
  • 现在可以用了吗?
  • 我认为不止于此,我明确指出,在切换到下一列之前,我需要检查每个列是否有 40 个字符。我需要帮助为此编写一个单独的 php 脚本!

标签: php mysql csv


【解决方案1】:

我需要做一些估计,因为我没有你的 Excel 文件。

想象一下你的 $sheet_data 现在看起来像这样

Array
(
    [0] => Array
        (
            [0] => Street1
        )

    [1] => Array
        (
            [0] => Street2
        )

    [2] => Array
        (
            [0] => Street3 with a long name, more than 40 characters
        )

)

第 1 层中的每个 Array-Element 代表一行 - 第 2 层中的每个元素都包含相应的列。

foreach ($sheet_data as $line){
    //maybe you need to skip the first line because it could contain just some headers
    //in my estimation $line[0] contains the address
    $address = $line[0];

    //split address after 40 characters
    $split = str_split($address, 40);

    //$conn - mysqli connection
    $stmt = $conn->prepare("INSERT INTO address_table (Add1, Add2, Add3)
    VALUES (?, ?, ?)");

    $addr1=""; $addr2=""; $addr3="";
    if(isset($split[0]) $addr1 = $split[0];
    if(isset($split[1]) $addr2 = $split[1];
    if(isset($split[2]) $addr3 = $split[2];

    //fill query params params with values
    $stmt->bind_param("sss", $addr1, $addr2, $addr3);

    $stmt->execute();
}

对于第 3 行 - 表格条目将被填充

Add1 => Street3 with a long name, more than 40 c
Add2 => haracters   

您仍然需要检查一件事 - 如果地址的字符数超过 120 个,则其他字符会丢失。

请像我的示例一样使用准备好的语句 - 当您直接使用变量填充查询时,您很容易受到SQL-Injection的攻击

【讨论】:

  • 我使用 SQL 查询实现了我的结果。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 2017-01-21
  • 1970-01-01
  • 2013-09-25
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多