Avatar billede DonDaase Novice
22. oktober 2015 - 00:01 Der er 5 kommentarer

Check kontonr ved udtræk fra CSV

Hej.

Jeg er ved at lave udtræk fra CSV og indsætte i MySQL. Lige inden indsættelsen laver jeg en række checks på hver post. Bla. kontrollerer jeg  om kontonummeret indtastet i CSV'en også findes i en MySQL tabel.
Dvs. for hver CSV post jeg gennemgår skal jeg gennemgå en MySQL tabel og sikre mig at kontonummeret fra CSV filen også findes i min MySQL tabel der indeholder konti.

I min CSV er der 4 poster hvoraf jeg har lagt fejl ind i række 2 og 4. Jeg har nedenstående kode. Men problemet er at når den først har meldt fejl så melder den fejl på alle resterende poster. Dvs. række 2, 3 og 4.

Er det helt skævt det jeg gør?


function displayCSV() {
    include 'include.php';
    $con = Con2DB();
    $result_konti = mysqli_query($con, "SELECT kkontonr, knavn FROM konti");

    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");
    $tlr = 0;
    while (($result = fgetcsv($handle,1000,";","'")) !== false) {
        $tlr++;
        $result['tlr'] = $tlr;
        $ar[] = $result;
       
        $ukendtkontonr = 0;
        if ($result_konti->num_rows > 0) {
            while($row = $result_konti->fetch_assoc()) {
            echo "Række " . $tlr . " - Excel konto " . $result[6] . " - MySQL konto " . $row["kkontonr"] . " ";
                if ($row["kkontonr"]==$result[6]) {
                    $ukendtkontonr=1;
                };
            };
            if ($ukendtkontonr!=1) {
                echo '<script type="text/javascript">alert("Række ' . $tlr . ' - ukendt kontonummer - ' . $result[6] . $row["kkontonr"] . '")</script>';
            };
        };
    };
       
    return $ar;
    fclose($file);
    $con->close();
}
Avatar billede arne_v Ekspert
22. oktober 2015 - 01:38 #1
Jeg tror at problemet er at du kun lober query resultatt igennem for den foerste linie.

Derefter returnerer $result_konti->fetch_assoc() bare false fordi du allerede har laest alle raekker.
Avatar billede arne_v Ekspert
22. oktober 2015 - 01:39 #2
Enten laeser du ind i memory struktur foerst og soeger i den.

Eller du udfoerer query for hver linie.

Det sidste lyder meget langsomt.
Avatar billede DonDaase Novice
22. oktober 2015 - 20:04 #3
Tak for svaret.

Jeg er nødt til lige at sige at jeg er jævnt grøn til det her.

Kan du give mig et lidt mere detaljeret indblik i hvad du mener med "memory struktur". Jeg har googlet lidt på det og kan ikke finde noget
Avatar billede arne_v Ekspert
23. oktober 2015 - 02:47 #4
I det her tilfaelde er et array med konto numre vel en passende data struktur.
Avatar billede olsensweb.dk Ekspert
23. oktober 2015 - 12:07 #5
kan sammen kontonummer forkomme flere gange i din CSV fil ?? (besvare også #2).
Som du har det nu kan det ikke.
Hvis det derimod kan skal du lave en query for hver linje

jeg ville nok ligge sql ud i en seperat function, (du har lavet den allerede, bare med flere data), og så er vi ude i diskutionen, hvor meget skal man retunere.
1) kun lige det skal bruges (mange functioner)
2) lidt mere end det der skal bruges alle steder, men størrer genbrug, og færrer functioner

din nuværende code omskrevet utested

<?php
// har du lavet i forvejen, andet sted, ligger nok i include.php
function konti_ReadAll(){
    // det er alvorligt hvis den mangler, derfor require, og man får problemer, hvis den bliver loadet flere gange, derfor _once
    require_once('include.php'); // Con2DB()
    $con = Con2DB();
    // $sql = "SELECT kkontonr, knavn FROM konti";
    $sql = "SELECT * FROM konti";
    $result = mysqli_query($con, $sql);
    // Fetch all   
    $rs = mysqli_fetch_all($result,MYSQLI_ASSOC);
    // Free result set
    mysqli_free_result($result); // vil også blive frigivet når functionen forlades
    mysqli_close($con); // lukkes automatisk når functionen forlades
    return $rs;   
}

function displayCSV(){   
    $result_konti=konti_ReadAll(); // evt over som parameter   
    $file = $_FILES[csv][tmp_name]; // ville jeg tage over som parameter, bryder mig ikke om at bruge (super)globale i functioner
    $handle = fopen($file,"r");
    $tlr = 0;
    while (($result = fgetcsv($handle,1000,";","'")) !== false) {
        $tlr++;
        $result['tlr'] = $tlr;
        $ar[] = $result;       
        $ukendtkontonr = 0;       
        for($i=0,$lng = count($result_konti); $i<$lng;$i++) {               
            $row = $result_konti[$i];
            echo "Række " . $tlr . " - Excel konto " . $result[6] . " - MySQL konto " . $row["kkontonr"] . " ";
            if ($row["kkontonr"]==$result[6]) {
                $ukendtkontonr=1;
            }
        }
        if ($ukendtkontonr!=1) {
            echo '<script type="text/javascript">alert("Række ' . $tlr . ' - ukendt kontonummer - ' . $result[6] . $row["kkontonr"] . '")</script>';
        }       
    }
    fclose($file);   
    return $ar;
}
?>


kan du ikke lægge et sql dump ud af tabellen konti (max 5 rækker) samt test csv filen (max 5 rækker).
kun dummy data, evt til download som en zip
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester