PHP Почему импортированный CSV-файл вставляет только первую строку CSV в SQL

avatar
Cheang Wai Bin
8 апреля 2018 в 03:11
112
1
0

Допустим, у меня есть 3 строки в файле .csv с 3 столбцами. В этом случае мне нужно импортировать один и тот же файл 3 раза, чтобы все мои данные в файле .csv были полностью вставлены в мою базу данных SQL. Я подумал, что !feof($file) должен убедиться, что цикл проходит через конец файла?

if (isset($_POST['submitI'])){
$filename = $_FILES["file"]["tmp_name"];

if ($_FILES["file"]["size"] > 0){
    $file = fopen($filename, "r");

    while (!feof($file)){
        $getData = fgetcsv($file, '0');

        $sql = "SELECT * FROM murid WHERE No_Sek_Murid = '".$getData[0]."'";
        $result = mysqli_query($conn, $sql);

        if(empty($getData[0] || $getData[1] || $getData[2])){
            $errorForm = "Sila isikan semua medan dalam fail!";
            echo "<script type='text/javascript'>alert('$errorForm');</script>";
            echo "<script> location.href='../main.php'; </script>";
            exit();
        }

        if(mysqli_num_rows($result) === 0){
            $sqlMurid = "INSERT INTO murid (No_Sek_Murid, Nama_Murid, Kelas_Murid) VALUES ('".$getData[0]."', '".$getData[1]."', '".$getData[2]."')";
            $sqlKelab = "INSERT INTO kelab (Kod_Kelab, No_Sek_Murid, ID_Pengguna) VALUES ('{$_SESSION['kodKelab']}', '".$getData[0]."', '{$_SESSION['username']}')";
            mysqli_query($conn, $sqlMurid);
            mysqli_query($conn, $sqlKelab);

            $success = "Berjaya menambah rekod ke dalam pangkalan data!";
            echo "<script type='text/javascript'>alert('$success');</script>";
            echo "<script> location.href='../main.php'; </script>";
            exit();
        }

    } fclose($file);

} else {
    $errorfile = "Operasi import gagal!";
    echo "<script type='text/javascript'>alert('$errorfile');</script>";
    echo "<script> location.href='../main.php'; </script>";
    exit(); 
}

Источник
Karlo Kokkak
8 апреля 2018 в 03:20
3

Удалить выход(); из вашего 4-го оператора if..

spencer7593
8 апреля 2018 в 03:35
0

также кажется, что мы хотели бы выполнить предварительное чтение из файла перед циклом while и еще одно чтение в самом конце цикла, прежде чем мы вернемся к условному тесту (в while).

ArtisticPhoenix
8 апреля 2018 в 06:06
0

В вашем коде есть уязвимости SQLInjection. Вы можете подумать, что CSV безопасен, потому что это файл, но это не так. Если вы разрешите конечным пользователям загружать эти файлы, это не лучше, чем объединение $_REQUEST прямо в ваших запросах. Никогда не объединяйте данные в запрос, это того не стоит.

Ответы (1)

avatar
Cantrip Solutions Pvt Ltd
8 апреля 2018 в 03:55
0

Не используйте exit() без необходимости. Также вы передали несколько параметров функции empty(), что кажется неверным. Вы можете запустить свой код без функции выхода, как показано ниже:

if (isset($_POST['submitI'])){
$filename = $_FILES["file"]["tmp_name"];

if ($_FILES["file"]["size"] > 0){
    $file = fopen($filename, "r");

    while (!feof($file)){
        $getData = fgetcsv($file, '0');

        $sql = "SELECT * FROM murid WHERE No_Sek_Murid = '".$getData[0]."'";
        $result = mysqli_query($conn, $sql);

        if(empty($getData[0]) || empty($getData[1]) || empty($getData[2])){
            $errorForm = "Sila isikan semua medan dalam fail!";
            echo "<script type='text/javascript'>alert('$errorForm');</script>";
            echo "<script> location.href='../main.php'; </script>";
        } elseif(mysqli_num_rows($result) === 0){
            $sqlMurid = "INSERT INTO murid (No_Sek_Murid, Nama_Murid, Kelas_Murid) VALUES ('".$getData[0]."', '".$getData[1]."', '".$getData[2]."')";
            $sqlKelab = "INSERT INTO kelab (Kod_Kelab, No_Sek_Murid, ID_Pengguna) VALUES ('{$_SESSION['kodKelab']}', '".$getData[0]."', '{$_SESSION['username']}')";
            mysqli_query($conn, $sqlMurid);
            mysqli_query($conn, $sqlKelab);

            $success = "Berjaya menambah rekod ke dalam pangkalan data!";
            echo "<script type='text/javascript'>alert('$success');</script>";
            echo "<script> location.href='../main.php'; </script>";
        }

    } fclose($file);

} else {
    $errorfile = "Operasi import gagal!";
    echo "<script type='text/javascript'>alert('$errorfile');</script>";
    echo "<script> location.href='../main.php'; </script>";
}