在构建MySql插入中使用PHP变量

在构建MySql插入中使用PHP变量,php,mysql,csv,Php,Mysql,Csv,我正在努力替换一个简短的脚本,在这个脚本中,我使用LOAD DATA INFILE,使用PHP将CSV快速插入MySQL数据库 我完全被难住了,希望能得到一些帮助——我已经看了几个小时了,只是把自己弄糊涂了 问题是我不知道CSV中的列数,也不想定义它们,因为它们可能会更改 从CSV获取标题: // Get the first column of the file to create the column headers $fp = fopen($upload_folder . $tempName

我正在努力替换一个简短的脚本,在这个脚本中,我使用LOAD DATA INFILE,使用PHP将CSV快速插入MySQL数据库

我完全被难住了,希望能得到一些帮助——我已经看了几个小时了,只是把自己弄糊涂了

问题是我不知道CSV中的列数,也不想定义它们,因为它们可能会更改

从CSV获取标题:

// Get the first column of the file to create the column headers
$fp = fopen($upload_folder . $tempName . '.csv', 'r');
$frow = fgetcsv($fp, 100000, ',');

// Set import strings
$columns = '';
$data_string = '';

$col_count = 0;

foreach($frow as $column) {
  // Build import strings
  $columns .= "`$column` varchar(50)"; 
  $data_string .= "'$" . "data[" . $col_count . "]', ";

  // Now increment the column count
  $col_count++;
}
导入:(我已经回显了这个,因为我不想让它运行!)

问题: 虽然列名已正确构造,但未解析WHILE语句中调用的第二个$data[0],$data[1],因此我得到:

VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]' ... '$data[25]')
其中,我希望$data=fgetcsv($fp,100000,“,”)的输出

我知道这与PHP变量有关,但就我个人而言,我无法解决这个问题

CSV数据导入示例:(根据要求)


我认为您的问题在于
$data\u string.=“'$”。“数据[”$col_count.“],”。我可以建议您创建一个
$column
数组,并在循环结束后对其进行内爆,以防止结尾出现逗号

$column = array();
foreach($frow as $column) {

  // Build import strings
  $column[] = "`$column` varchar(50)"; 

  // Now increment the column count
  $col_count++;
}
$columns = implode(',',$column);
然后,在while循环中使用
$data
$col\u count
以与上面相同的方式生成插入值字符串

while (($data = fgetcsv($fp, 100000, ",")) !== FALSE) {

   //$insertColumn = array();
   //for($i=0;$i<=$col_count;$i++){
   //     $insertColumn[] = $data[$i];
   //}
   //$insertColumnString = implode("','",$insertColumn);
   $insertColumnString = implode("','",$data);

   echo "INSERT INTO nav_data_{$tempName} ($columns) VALUES ('$insertColumnString')";

}
while($data=fgetcsv($fp,100000,“,”)!==FALSE){
//$insertColumn=array();

//对于($i=0;$i您能从csv文件中发布一些数据吗,几行?我已经在原始post mandza中添加了一些数据-太长了,无法发表评论-感谢您查看!或者只添加
rtrim($data_string,“,”))
虽然您提供的解决方案是最好的…fgetcsv返回一个数组,因此您可以直接在其上内爆。@captainroxors当然可以。答案已更新。谢谢!
    Document Type   No_ Order Date  Shipment Date   Sell-to Customer No_    Sell-to Customer Name   Bill-to Customer No_    Bill-to Name    Ship-to Code    Order Status    Customer Disc_ Group    Salesperson Code    Entered by  Taken at    External Document No_   Taken By    Sample  Payment Method Code Currency Code   Payment Terms Code  Amount  O/S Amount Ex VAT (LCY) No_ Order Lines No_ Complete Order Lines    Delivery Date


    Order   SO006906    02/12/14    15/04/15    C001293 Amazon  C001293 Amazon  DEL Insufficient Credit     HS  SARAH   EMAIL           0   ACCOUNT     30D 2313    2313    15  11  


    Order   SO007198    13/01/15    01/04/15    C000871 Amazon  C000871 Amazon  DEL Awaiting Order Ack.     SUSP    SARAH   FF15    RESERVE SUSP    0   ACCOUNT     30DS2.5/30  688 688 4   0   


    Order   SO008292    01/05/15    19/10/15    C003075 Amazon  C003075 Amazon  DEL Proforma Ready To Ship      ZP  SARAH   REP         0   PROFORMA        PROFORMA    484.8   484.8   21  0   
$column = array();
foreach($frow as $column) {

  // Build import strings
  $column[] = "`$column` varchar(50)"; 

  // Now increment the column count
  $col_count++;
}
$columns = implode(',',$column);
while (($data = fgetcsv($fp, 100000, ",")) !== FALSE) {

   //$insertColumn = array();
   //for($i=0;$i<=$col_count;$i++){
   //     $insertColumn[] = $data[$i];
   //}
   //$insertColumnString = implode("','",$insertColumn);
   $insertColumnString = implode("','",$data);

   echo "INSERT INTO nav_data_{$tempName} ($columns) VALUES ('$insertColumnString')";

}