1

我有这个上传 CSV 并将数据插入数据库的 PHP 代码,一旦它在 while 循环中上传,它只会从 CSV 中选择一行:

//do upload
    if (is_uploaded_file($_FILES['dd_submission_form']['tmp_name']))
    {
        echo "<h3>" . "File ". $_FILES['dd_submission_form']['name'] ." uploaded successfully." . "</h3>";
        echo '<h3>Display file contents:</h3>';
        //readfile($_FILES['dd_submission_form']['tmp_name']);
    }

    //Import uploaded file to Database
    $handle = fopen($_FILES['dd_submission_form']['tmp_name'], "r");

    fgetcsv($handle, 1000, ",");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
    {
        $sql="SELECT * from customer where directdebit_reference = '".$data[0]."' ";
        echo $sql;
        $rs=mysql_query($sql,$conn) or die(mysql_error());
        $customer=mysql_fetch_array($rs);
        if(mysql_num_rows($rs) > 0)
        {
            $sql2="INSERT into dd_submissions (customer_seq, dd_reference, sortcode, account_number, account_name, amount, bacs_code, invoice_no, title, initial, forename, surname, salutation_1, salutation_2, address_1, address_2, area, town, postscode, phone, mobile, email, notes) values ('".$customer["sequence"]."', '$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]', '$data[7]', '$data[8]', '$data[9]', '$data[10]', '$data[11]', '$data[12]', '$data[13]', '$data[14]', '$data[15]', '$data[16]', '$data[17]', '$data[18]', '$data[19]', '$data[20]', '$data[21]', '$data[22]')";
            $rs2=mysql_query($sql2,$conn) or die(mysql_error());
        }
    }
    fclose($handle);
    print "<br><br><h3>Successfully Imported Clients</h3><br>";
4

6 回答 6

4

只需分别处理循环之前的第一行,不做任何事情来跳过它。

fgets($handle);然后你的循环

于 2013-08-02T14:57:26.257 回答
2

最简单的方法是continue在循环中使用关键字,while如下所示:

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  if ($i == 0) { $i++; continue; }
  ...
  $i++;

但是,为了安全起见,您必须确保第一行不包含所需的数据。

于 2013-08-02T14:56:11.647 回答
0

我建议您将所有这些代码替换为对 mySQLLOAD DATA INFILE查询的一次调用,该查询旨在将 CSV 文件直接加载到数据库中,而无需您正在执行的所有 PHP 循环。它的运行速度比在 PHP 循环中运行要快得多

您可以使用子查询作为主LOAD DATA INFILE查询的一部分轻松添加您的客户字段。

哦,为了回答最初的问题,它还能够作为标准语法的一部分跳过第一行(或多行)。

请参阅此处的 mySQL 手册页:http: //dev.mysql.com/doc/refman/5.1/en/load-data.html

[编辑]

您的查询大致如下所示:

LOAD DATA INFILE
INTO TABLE dd_submissions
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROW
(
@dd_reference,
sortcode,
account_number,
account_name,
amount,
bacs_code,
invoice_no,
title,
initial,
forename,
surname,
salutation_1,
salutation_2,
address_1,
address_2,
area,
town,
postscode,
phone,
mobile,
email,
notes
)
SET
    customer_seq = SELECT sequence from customer where directdebit_reference = @dd_reference,
    dd_reference = @dd_reference
;
于 2013-08-02T14:58:34.013 回答
0

从 csv 文件读取行中断的一个可能原因是 csv 文件中的数据可能包含单引号或双引号,这会破坏 sql 查询,因此可以使用mysql_real_escape_string函数解决此问题。所以你的新插入查询看起来像:

....
......

$sql2="INSERT into dd_submissions (customer_seq, dd_reference, sortcode, account_number, account_name, amount, bacs_code, invoice_no, title, initial, forename, surname, salutation_1, salutation_2, address_1, address_2, area, town, postscode, phone, mobile, email, notes) values ('".mysql_real_escape_string($customer["sequence"])."', '".mysql_real_escape_string($data[0])."', .......);

希望能帮助到你...

于 2013-10-08T07:57:49.427 回答
0

我怀疑您遇到的问题可能是因为“1000”,无论如何这是不必要的。跳过第一行的一种简单方法是执行以下操作:

fgetcsv($handle) //skips the first line
while($data = fgetcsv($handle)) { //will process second line to end of file
  ...
}

但是,这里有一个更大的问题。如果您的 csv 文件如下所示:

'; DROP TABLE customer #

然后 $sql 变成

SELECT * from customer where directdebit_reference = ''; DROP TABLE customer #'

现在你没有客户了。查看 SQL 注入以了解如何确保传递给 MySQL 的查询是安全的。

于 2013-08-02T15:14:04.953 回答
0

在之前声明一个变量while loop

 $row=1;

然后输入while loop这个条件:

 if($row==1){
   $row++; 
   continue;
 }
于 2017-01-02T07:19:08.783 回答