implode()中传递的参数无效

时间:2014-06-09 16:53:23

标签: php sql csv

所以我有一个CSV文件,我试图将其制作成一个表格。

我在太多错误后放弃了导入GUI,并试图通过php文件完成导入。

//create table with KNOWN values
mysql_query("CREATE TABLE uri_faculty
    (
        id INT NOT NULL AUTO_INCREMENT,
        PRIMARY KEY(id),
        id INT(15),
        lname VARCHAR(50),
        fname VARCHAR(50),
        mi VARCHAR(3),
        Spc_Title VARCHAR(50),
        title VARCHAR(50),
        deptid INT(5),
        dept VARCHAR(50),
        degree1 VARCHAR(10),
        earned1 INT(4),
        school1 VARCHAR(75),
        degree2 VARCHAR(10),
        earned2 INT(4),
        school2 VARCHAR(75),
        degree3 VARCHAR(10),
        earned3 INT(4),
        school3 VARCHAR(75),
        degree4 VARCHAR(10),
        earned4 INT(4),
        school4 VARCHAR(75),
        degree5 VARCHAR(10),
        earned5 INT(4),
        school5 VARCHAR(75),
        degree6 VARCHAR(10),
        earned6 INT(4),
        school6 VARCHAR(75)
        )");

//Get CSV file
$getfile = 'faculty_delim2.csv';
$csvfopen = fopen($getfile, "r");

//loop to fill csvget with arrays
for($i=0;!feof($csvfopen);$i++){
    $array = fgetcsv($csvfopen);
    $insert = implode("','", $array);

    //to exclude the first 2 lines (titles of document)
    if($i>=1){
        //values to be inserted into SQL are displayed
        //echo var_dump($array[$i])." <br> ";

        $sqlval = $insert;
        // var_dump($sqlval);

        //the while loop will constantly place values into the database until the file is finished
        mysql_query("INSERT INTO uri_faculty (id,lname,fname,mi,Spc_Title,title,deptid,dept,
                    degree1,earned1,school1,
                    degree2,earned2,school2,
                    degree3,earned3,school3,
                    degree4,earned4,school4,
                    degree5,earned5,school5,
                    degree6,earned6,school6,) VALUES ('$sqlval')
        ");
    }
}
fclose($csvfopen);
echo "complete";

?>

我一直收到一个错误,说内爆正在接收错误的参数,但我发现的每一份文档都说我是正确的。

我更改了文件的权限,它位于正确的位置。

1 个答案:

答案 0 :(得分:0)

而不是:

for($i=0;!feof($csvfopen);$i++){
    $array = fgetcsv($csvfopen);

我会这样写:

while ($array = fgetcsv($csvfopen)) {

当没有更多行要读取时,循环将自动完成。您的错误可能是一个边缘情况,文件仍然认为它不在feof,但尽管如此,没有更多行,fgetcsv返回 false

顺便说一下,还有另外两个问题:

  1. 您很快就会遇到另一个错误:

    . . . degree6,earned6,school6,) VALUES . . .
    

    您不能在最后一列之后添加逗号。写下这个:

    。 。 。学位6,获得6,学校6)价值。 。

  2. 您对SQL注入问题持开放态度。当您的某个CSV字段包含撇号时会发生什么?您应该学习如何将PDO与查询参数一起使用。或者失败,使用转义:

    $insert = implode("','", array_map('mysql_real_escape_string', $array));
    
  3. 最后,您应该考虑跳过fgetcsv并使用LOAD DATA INFILE。然后,所有的CSV问题和逃避问题都会消失。

    mysql_query("LOAD DATA LOCAL INFILE 'faculty_delim2.csv' INTO TABLE uri_faculty IGNORE 2 LINES");
    
相关问题