【问题标题】:Invalid arguments passed in implode()implode() 中传递的参数无效
【发布时间】:2014-07-30 06:30:47
【问题描述】:

所以我有一个 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";

?>

我不断收到一条错误消息,说 implode 接收到的参数不正确,但我发现的每一点文档都表明我是正确的。

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

【问题讨论】:

  • for($i=0;!feof($csvfopen);$i++){ 应该做什么?为什么不使用简单的while(!feof($csvfopen)){
  • 您要进行一次性导入?为什么不熟悉LOAD DATA LOCAL INFILE?这确实是最好的方法,因为在 PHP 中您需要考虑所有的引用、转义等。
  • @user3678068, ',' 是他将数组内爆的分隔符,以便为查询构建字符串。
  • @Brobin。哎呀,我混合了内爆和爆炸......
  • var_dump($array)。你可能得到一个布尔值 false,这意味着 fgetcsv 失败。

标签: php sql csv


【解决方案1】:

而不是这个:

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

我会这样写:

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

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

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

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

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

    您不能在最后一列之后放置逗号。改为这样写:

    。 . . degree6,earned6,school6) 价值观。 .

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

    $insert = implode("','", array_map('mysql_real_escape_string', $array));
    

最后,您应该考虑跳过 fgetcsv 并使用LOAD DATA INFILE。然后,您所有的 CSV 问题和转义问题都会消失。

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

【讨论】:

  • 谢谢。我尝试注释掉除 CREATE 和 LOAD DATA LINE 之外的所有内容。我检查了表格,id 列已填满,但其他所有内容均为 NULL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多