Php 内爆()中传递的参数无效

Php 内爆()中传递的参数无效,php,sql,csv,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),

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

?>
//使用已知值创建表
mysql\u查询(“创建表uri\u”
(
id INT非空自动增量,
主键(id),
id INT(15),
lname VARCHAR(50),
fname VARCHAR(50),
米瓦查尔(3),
Spc_标题VARCHAR(50),
标题VARCHAR(50),
工业贸易署署长(5),
瓦查尔部(50),
1度瓦查尔(10),
赚取1整数(4),
学校1 VARCHAR(75岁),
2度瓦查尔(10),
赚取2整数(4),
学校2瓦查尔(75岁),
3度瓦查尔(10),
赚取3整数(4),
学校3瓦查尔(75岁),
4度瓦查尔(10),
赚取4整数(4),
学校4瓦查尔(75岁),
5度瓦查尔(10),
赚取5整数(4),
学校5瓦查尔(75岁),
6度瓦查尔(10),
赚取6整数(4),
学校6瓦查尔(75)
)");
//获取CSV文件
$getfile='faculty_delim2.csv';
$csvfopen=fopen($getfile,“r”);
//循环使用数组填充csvget
对于($i=0;!feof($csvfopen);$i++){
$array=fgetcsv($csvfopen);
$insert=内爆(“,”,$array);
//排除前两行(文档标题)
如果($i>=1){
//将显示要插入SQL的值
//echo var_dump($array[$i])。“
”; $sqlval=$insert; //var_dump($sqlval); //while循环将不断地将值放入数据库,直到文件完成 mysql_查询(“插入uri_中(id、lname、fname、mi、Spc_标题、标题、部门、部门、, 学位1,收入1,学校1, 学位2,收入2,学校2, 学位3,收入3,学校3, 学位4,收入4,学校4, 学位5,收入5,学校5, 学位6,收入6,学校6,)值(“$sqlval”) "); } } fclose($csvfopen); 呼应“完成”; ?>
我不断收到一个错误,说内爆接收到的参数不正确,但我找到的每一份文档都说我是正确的

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

而不是:

for($i=0;!feof($csvfopen);$i++){
    $array = fgetcsv($csvfopen);
我将写下:

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

顺便提一下,还有两个问题:

  • 您很快会遇到另一个错误:

    . . . degree6,earned6,school6,) VALUES . . .
    
    不能在最后一列后面加逗号。写下以下内容:

    。学位、收入、学校价值观

  • 您对SQL注入问题非常开放。当其中一个CSV字段包含撇号时会发生什么情况?您应该学习如何将PDO与查询参数一起使用。否则,请使用转义:

    $insert = implode("','", array_map('mysql_real_escape_string', $array));
    
  • <>最后,您应该考虑跳过FGCSV并使用<代码>加载数据< < />代码>。然后所有CSV问题和转义问题都消失了

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

    ($i=0;!feof($csvfopen);$i++{应该做什么?为什么不在(!feof($csvfopen))时使用一个简单的
    {
    您正在尝试一次性导入?为什么不熟悉一下呢?这确实是最好的方法,因为在PHP中,您需要考虑所有的引用、转义等。@user3678068,
    ,“
    是他内爆数组的delimeter,以便为查询构建字符串。@Brobin.oops,我混合了内爆nd explode…
    var\u dump($array)
    。您可能得到一个布尔值false,这意味着fgetcsv失败。谢谢。我尝试注释除创建和加载数据行之外的所有内容。我检查了表,id列已填充,但其他内容均为空。