PHP注意:未定义的偏移量:第23行的/my/path/*.phpFile中的39

时间:2018-09-27 18:21:22

标签: php

我是PHP的新手,正在尝试按照在线教程制作Android音乐播放器。该PHP将连接到我的数据库,扫描目录中的* .mp3文件,并将其添加到数据库中。无论如何,我被困在最后一部分,我连接,扫描文件,在屏幕上看到输出,然后在尝试填充数据库时出现此错误。我已经读到很多有关导致错误的数组问题的信息,但我不知道如何进一步解决。仅供参考,DB列ID是主键,设置为auto inc。感谢您的帮助!这是代码:     建立与DB /

的连接
$con = mysqli_connect('localhost', "xxxxxx", "xxxxxx", "MusicApp2");

/*Test connection*/
if(mysqli_connect_errno()){
    printf("connection failed: %s\n", mysqli_connect_error());
    exit();
}

/*Scan directory for files*/
$files = glob('*.mp3');

usort ($files, function ($a, $b) {
    return filemtime ($a) <filemtime ($b);
});


/*Insert list of files to DB IF they don't exist*/
$i = 0;

while ($files[$i]) {
    $trackname = basename($files[$i]);
    echo $trackname."**";
    $addquery = "INSERT INTO music (Id, trackname, numlikes, numplays) VALUES (default, '$trackname', '0', '0')";
    mysqli_query($con, $addquery);
    $i++;
}

?>

我得到了最终导入数据库的代码。这是结果代码。

foreach ($files as $file) {
    $trackname = basename($file);
    echo $trackname."**";
    $addquery = "INSERT INTO Music (trackname, numlikes, numplays) VALUES ('$trackname', '0', '0')";
    mysqli_query($con, $addquery);

    $result = mysqli_query($con, $addquery);
    If ($result) 
    {
    echo "Success";
    }
    else
    {
    echo "Error: " . "<br>" . mysqli_error($con);
    }
}
    mysqli_close($con);
?>

2 个答案:

答案 0 :(得分:1)

您的文件夹中没有39个以上的文件。 您可以将while替换为foreach

foreach ($files as $file) {
    $trackname = basename($file);
    echo $trackname."**";
    $addquery = "INSERT INTO music (trackname, numlikes, numplays) VALUES ('$trackname', '0', '0')";
    mysqli_query($con, $addquery);
}

这样,您将仅迭代拥有的文件,而不会抛出拥有的通知。

如果您仍然想使用while,请确保有一个停止点:

while ($files[$i]) {
    if(!isset$files[$i]) {
        break;
    }
    ....

如果ID为自动递增列,则无需在插入内容中指定ID列:

INSERT INTO music (trackname, numlikes, numplays) VALUES ('$trackname', '0', '0')

答案 1 :(得分:0)

此行:

while ($files[$i]) {
当您越过$files数组的末尾时,

将显示此警告。如果有39个文件,则$files[39]不存在,因此尝试访问该文件将报告索引未定义。然后测试将失败,并且循环将按预期停止。

您应该测试元素是否存在,而不是测试值本身:

while (isset($files[$i])) {

或者您可以使用更普通的foreach循环,如Felippe Duarte的答案。