SQL插入使用PHPExcel从excel读取的数据

SQL插入使用PHPExcel从excel读取的数据,php,mysql,phpexcel,Php,Mysql,Phpexcel,我目前正在使用php阅读excel,并将这些记录存储在mysql中。我遇到了PHPExcel,这是一组非常好的插件类,可以很容易地帮助实现它。我试图搜索,但没有找到与我的用例类似的东西。另外,不太擅长面向对象PHP,我做这件事的时间很短 First Name Last Name Nationality Gender Date of Birth Time of Birth Date/Time PHP Coder Sanity %Age 上面是我的示例数据库列和ex

我目前正在使用php阅读excel,并将这些记录存储在mysql中。我遇到了PHPExcel,这是一组非常好的插件类,可以很容易地帮助实现它。我试图搜索,但没有找到与我的用例类似的东西。另外,不太擅长面向对象PHP,我做这件事的时间很短

    First Name  Last Name   Nationality Gender  Date of Birth   Time of Birth   Date/Time   PHP Coder   Sanity %Age
上面是我的示例数据库列和excel工作表的第一行。我想在将行插入数据库之前匹配它们的列名。 到目前为止,我的代码给了我一个二维数组,在其中我可以得到列名和值。我想在插入之前检查列名的原因是,我的excels可以是列名的任意顺序。 我在包中使用了exampleReader01和一些SO参考来实现这一点

  $headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true);
  $headingsArray = $headingsArray[1];
  $r = -1;
  $namedDataArray = array();
  for ($row = 2; $row <= $highestRow; ++$row) {
  $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true);
  if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) {
       ++$r;
  foreach($headingsArray as $columnKey => $columnHeading){
      $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey];
    }
  }
}
希望我明白了。

谢谢您的时间。

如果我可以假设您的Excel列标题名称从未更改,为什么不简单地使用映射数组呢

$dbMapping = array(
    'col1' => header1,
    'col2' => header2,
     ..
    'colN' => headerN
);
因此,当您准备插入到数据库时,您可以使用2D数组中已有的列标题名称遍历每一行,并将其传递到映射数组中,即$dbMapping['col1'],这将获得标题名称,您可以获取正确的行值

普苏埃多

 foreach ($rows as $row) {
     insert into col1, col2, ... colN
       values ($rows[$dbMapping['col1']], $rows[$dbMapping['col2']], ...
 }

当然,使用参数化值对您最有利。

如果我可以假设您的Excel列标题名称从未更改,为什么不简单地使用映射数组呢

$dbMapping = array(
    'col1' => header1,
    'col2' => header2,
     ..
    'colN' => headerN
);
因此,当您准备插入到数据库时,您可以使用2D数组中已有的列标题名称遍历每一行,并将其传递到映射数组中,即$dbMapping['col1'],这将获得标题名称,您可以获取正确的行值

普苏埃多

 foreach ($rows as $row) {
     insert into col1, col2, ... colN
       values ($rows[$dbMapping['col1']], $rows[$dbMapping['col2']], ...
 }

当然,使用参数化值符合您的最佳利益。

如果我没弄错的话,您的意思是我应该有一个静态数组,其中包含我的列名,并将其映射到数据库中的列号。例如:
First Name=>col1、Last Name=>col2
等等。请您详细说明一下逻辑,我如何检查映射,我已经添加了表结构和列名。感谢您的努力。很抱歉,我不得不切换$dbMapping值,但我已经用psuedo代码对其进行了一些更新,以显示像这样尝试的一般ideaI
foreach($namedDataArray as$key=>$value){$sql=“insert-into-tbl_-user(“.$fieldset.”)值(“.”“.”“$value['First-Name]”、“.”“,“$value['Last-Name]”、““.”“.”“,“$value['Last-Name]”、““.”“,““.”““$value['Nationality['national]”、“,”“.”“$value['Gender']。”、““.”、“$value['Date of Birth']。”、““.”、“$value['Time of Birth']。”、““.”、“$value['Date/Time']。”、“$value['PHP Coder']。”、“.”、“$value['Sanity%Age']。”);
但在列顺序不变的情况下(在excel中)这是好的$字段集保存列列表。但是我的excel可能以不同的列顺序出现,但名称应该是一致的。我认为它应该是
值($row[$dbMapping['col1']],$row[$dbMapping['col2']]]
而不是
值($rows[$dbMapping['col1']],$rows[$dbMapping['col2']]
Pls edit,我尝试过,但失败了。谢谢,我将尝试并将其标记为已接受。已投票通过。:)这正是$dbMapping数组的有用之处。INSERT语句的顺序永远不会更改。因此,如果您有$dbMapping[col1]=“First Name”,则$value[$dbMapping[col1]]将始终为您提供“col1”的正确值如果我没有弄错,您的意思是我应该有一个静态数组,其中包含我的列名,并将其与数据库中的列号进行映射。例如:
First Name=>col1,Last Name=>col2
等等。请您详细说明一下逻辑,我如何检查映射,我已经添加了表结构and列名称。感谢您的努力。很抱歉,我不得不切换$dbMapping值,但我用psuedo代码对其进行了一些更新,以显示一般的ideaI尝试如下
foreach($namedDataArray as$key=>$value){$sql=“insert-into-tbl_-user(“.$fieldset.”)值(“.”“.”“.”“$value['First-Name']”、“.”“.”“.”“$value['Last-Name']”、“.”“.”“.”“.”“.”“.”“.”“.”“.”““$value['Last-value”.”“、”、“、”、“$value['Gender']。”、“、”、“$value['Date']。”、“、”、“$value['Time of Birth']。”、“、”、“$value['Date/Time']。”、“$value['PHP Coder']。”、“、”、“$value['Sanity%Age']。”);
但当excel列顺序不变时,这是好的.$fieldset保存列列表。但是我的excel可能以不同的列顺序出现,但是名称应该是一致的。我认为它应该是
值($row[$dbMapping['col1']],$row[$dbMapping['col2']]]
而不是
值($rows[$dbMapping['col1']],$rows[$dbMapping['col2']]
请编辑,我尝试过,但失败了。谢谢,我将尝试并将其标记为已接受。已投票通过。:)这正是$dbMapping数组的有用之处。INSERT语句的顺序永远不会更改。因此,如果您有$dbMapping[col1]=“First Name”,那么$value[$dbMapping[col1]]将始终为您提供正确的“col1”值