Autor Zpráva
Joseph
Profil
Zdravím.
Mám taký problém, že mi nejdú zapísať data zo súboru CSV do databázy. Ide o to, že by som ten CSV súbor vložil do formulára a po odkliknutí by sa to uploadlo do databázy a zoradilo do tabuliek. Proste nechápem, lebo keď ten CSV súbor uploadnem tak sa mi nedá do zložy automat ani do databáze a zároveň to nie je ani v tabuľke. Prikladám kódy ktoré som si urobil. Upload súboru CSV sa uploaduje cez web nie cez PHPmyAdmin. Poprosím niekoho aby mi pomohol čo tam mám zle ;-). Ďakujem za každú radu :)
odoslanie_playerstat.php
<form action="upload_playerstat.php?confid=<?=(int)$_GET['confid']?>" method="POST" enctype="multipart/form-data">
    <label>Tu vlož playerstat (pozor CSV):</label><br/>
        <input name="fupload" type="file" /><br/>
    <button type="submit">Nahrať playerstat!</button>
</form>
upload_playerstat.php (tu je určite chyba!)
<?php
Define('FRM_FILE', 'fupload');
$confid=(int)@$_GET['confid'];

if (isset($_FILES[FRM_FILE]) && $confid>0) {
    $slozka = "automat"; // Tu si napíš svoju zložku kde sa budú súbory ukládať.
    $cil = $slozka . "/" .$_FILES[FRM_FILE]['fupload']['name']; // Toto je proměnná $cil, která obsahuje adresář, kde se má soubor uploadovat a taky název souboru.
    $nazev_souboru = $_FILES['fupload']['tmp_name']; // Zjistí dočastné umístění souboru
    $copy = move_uploaded_file($nazev_souboru, $cil) // A tady zkopíruje soubor z dočastného umístění do cílového souboru a složky
      or die ("Při uploadu souboru došlo k chybě :-("); // A pokud se nepovede, tak vypí‘e tuto hlá‘ku
    chmod ($cil, 0777); // Ještě na soubor vyhodíme funkci chmod, která změní jeho práva na maximum, pokud by soubor psal chybu změňte 0644 na 0777
    // do této chvíle se řešil upload souboru 

    if($copy == true) {    //pokud roběhl uspěšně zapisujeme do databáze    
        include_once "settings.php";
         
        $stats="playerstat_$confid";

        $handle = fopen($filename, "r");
               // i pro multi-byte (napr. UTF-8)
        $prevodni_tabulka = Array("'"=>"_");
        
        while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {   // cyklus který prochází jednotlivé řádky CSV souboru
            $rozdeleni_casu = explode(":",$data[3]);
            $time= ($rozdeleni_casu[0]*60 + $rozdeleni_casu[1]);

            $upraveny_text = strtr($data[0], $prevodni_tabulka);    //tady upravuju jméno aby bylo v mnou požadovaném tvaru

                // tu se dívám do databáze jeslti daný hráč už v databázi existuje.
                $exist_hrac = mysql_result(mysql_query("SELECT COUNT(*) FROM $stats  WHERE Name = '$upraveny_text' AND confid=$confid"), 0);
            //neexistuje -> potom ho vytvoříme pomocí insert
                if($exist_hrac==0) {
                    if ($upraveny_text != "Player Name" && $data[1] != "-"&& $data[2] != "-"&& $data[3] != "-"&&  $data[5] != "-"&& $data[6] != "-"&& $data[8] != "-"&& $data[9] != "-"&& $data[10] != "-")
                    {
                        $import2="INSERT INTO $stats (confid,teamid,Name,Team,Pos,P,G,A,GP,Time,PIMS,plusminus,PPG,SHG,Shoot,Hits,ID) VALUES ('$confid', '$teamid', '$upraveny_text', '$data[1]', '$data[2]', '$data[4]'+'$data[5]', '$data[4]', '$data[5]',1,'$time','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]','0')";
                        mysql_query($import2) or die(mysql_error());
                    }
                }
                //existuje -> potom ho aktualizujeme pomocí update
                else {
                    if ($upraveny_text != "Player Name" && $data[2] == "Player" && $data[1] != "-"&& $data[2] != "-"&& $data[3] != "-"&& $data[5] != "-"&& $data[6] != "-"&& $data[8] != "-"&& $data[9] != "-"&& $data[10] != "-")
                    {
                        $import="UPDATE $stats SET Time=Time+$time,P=P+$data[4]+$data[5], G=G+$data[4], A=A+$data[5], GP=GP+1, PIMS=PIMS+$data[6], plusminus=plusminus+$data[7], PPG=PPG+$data[8], SHG=SHG+$data[9], Shoot=Shoot+$data[10], Hits=Hits+$data[11] WHERE Name='$upraveny_text' AND confid=$confid";
                        mysql_query($import) or die(mysql_error());
                    }
                    else {
                        if ($upraveny_text != "Player Name" && $data[2] == "Goalie" && $data[1] != "-"&& $data[2] != "-"&& $data[3] != "-"&& $data[5] != "-"&& $data[6] != "-"&& $data[8] != "-" && $data[10] != "0"&& $data[9] != "-"&& $data[10] != "-")
                        {
                            $import="UPDATE $stats SET  Time=Time+$time,GP=GP+1, PPG=PPG+$data[8], Shoot=Shoot+$data[10] WHERE Name='$upraveny_text' AND confid=$confid";
                            mysql_query($import) or die(mysql_error());
                        }
                    }
                }
    
        }
        fclose($handle);

        echo "<div class=\"nahrano\">Statistiky přidány</div>";
     }
}
?>

stat_player.php (tu sa vlastne majú zobraziť CSV štatistiky.)
http://automatika.ic.cz/stat_player.php?confid=5
(Confid znamená číslo pre konferenciu ale to nie je potrebné)

V databázy MySQL som dal tieto polia : teamid, confid, Name, Team, Pos, P, G, A, GP, Time, Pims, Plusminus, PPG, SHG, Shoot, Hits, ID.
Riešim to najprv uložením na FTP a následne spracovaním do databázy. Atributy nastavené na 777.
peta
Profil
Joseph: Vis jak, chyba se tezko hleda, kdyz si to nemuzes zkusit.
data.csv ?
zpracuj.php ?
struktura_tabulky.sql ? (z phpmyadmina export)

Rozdel si to na jednotlive ukoly a ty obal funkci. Pak prijdes na to, ktera funkce, ktery kod nejede. Doprostred toho kodu pak zacnes psat ruzna echo pro promenne. Kazdou cast si otestuj zvlast na treba 10 radcich z toho csv.
<?php echo import_form(); ?>
<?php
import_uploadfile();
import_movefile();
$data = import_readcsv($filename);
echo '<pre>'; print_r($data);
import_writemysql($data);
?>
Ulozi se ti soubor?
* PHP pro http protokol ma omezeni na 2MB upload, pokud to nezmenis.
* Mas spravne nastavena prava slozky a pripadne prava pro soubor v php?
* Mas dostatek mista pro ulozeni?
Ulozi se ti soubor do tmp?
Presune se ti soubor z tmp do tveho.
Nebo mas vlastni adresar pro tmp? Mas ho spravne nastaveny? Jaka ma prava pro cteni a zapis pomoci php?
Na localhostu ti to funguje? Cili, problem je jen na hostingu? Nebo to nefunguje vubec?

Protoze, jestli to chapu spravne, neprobehne ti ani upload. Tim padem nazev tematu je, jak udelat upload souboru a ne import do mysql.
Pak bych navrhoval zkusil pouzit nektery z prikladu na http://cz.php.net/manual/en/function.move-uploaded-file.php .

<input type="file" name="soubor"><?php
$name1 = $_FILES["soubor"]["tmp_name"]; // jmeno v mezi-adresari tmp
$name2 = $_FILES["soubor"]["name"]; // jmeno v policku name=soubor
move_uploaded_file($name1, "muj_adresar/"+$name2);
// nebo, cili si to prejmenuji po svem
$name3 = 'import-' . 'datum' . '.csv';
move_uploaded_file($name1, "muj_adresar/"+$name3);?>
Upload funguje tak, ze uzivatel vyklika soubor do poliska prochazet, da odeslat formular. php soubor zkopiruje do tmp adresare. Z nej si to presunes, zkopirujes nebo pouzijes a smazes pomoci move_upload. A pak uz s tim pracuj, jak chces.
Tvuj kod se tvari tak, ze mas vlastni tmp adresar, ze ktereho to pak kopirujes jinam. Ale pak tam najdes takove chyby jako:
<?php
Define('FRM_FILE', 'fupload');
$cil = $slozka . "/" .$_FILES[FRM_FILE]['fupload']; // coz je totez jako...
$cil = $slozka . "/" .$_FILES['fupload']['fupload']; // a to uz je samo o sobe divne.?>
<?php
$nazev_souboru = $_FILES['fupload'] // $_FILES['fupload'] je pole, zkus si pred to dat radek
print_r($_FILES['fupload']);?>

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: