Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Øhhhh, er det mysql som skal lese denne fila da? Det er eier av php-prosessen som må ha tilgang ...

Når du bruker LOAD DATA INFILE så er det mysql som leser fila. Det er en veldig mye raskere måte å lese inn store filer på enn å be php lese og så sende INSERT kommandoer til basen.

Lenke til kommentar

Når du bruker LOAD DATA INFILE så er det mysql som leser fila. Det er en veldig mye raskere måte å lese inn store filer på enn å be php lese og så sende INSERT kommandoer til basen.

 

Ja, det er riktig, men her var det php-kode som leste fila, ihvertfall så langt jeg kunne se.

Lenke til kommentar

Jeg har to kode eksempler lengre opp, det ene bruker LOAD DATA INFILE og det andre leser inn via php. LOAD DATA INFILE mener jeg er mest hensiktsmessige å bruke her, men siden ts i utgangspunktet ville gjøre dette i php så lagde jeg ett slikt eksempel også (gjorde om på koden til ts).

Lenke til kommentar
Skjønner bare koden halvveis

Da bør du spørre om de tingene du ikke forstår, slik at vi kan prøve å forklare bedre slik at du kan lære. Det er også nyttig å slå opp de forskjellige funksjonene som er brukt for å se hva de gjør.

 

Edit:

Har lagt på en god del kommentarer, som forhåpentligvis gjør det enklere å forstå koden

 

 

 

$host = 'localhost'; //navnet på maskinen databasen din ligger på
$user = 'root'; //ditt brukernavn på mySQL-basen
$pass = ''; //ditt passord på mySQL-basen
$db = 'ulv'; //navnet på mySQL-basen
$source = 'user/student.txt';

if ($file=file($source)) { // les inn hele fila i en array 

   if ($conn = mysql_connect($host,$user,$pass)) { // koble til mysql server

       if (mysql_select_db($db,$conn)) { // velg database

           unset($file[0]); // fjern overskrifts rad/første linje, kommenter ut denne hvis det ikke er noen overskrifts rad

           /* 
           gå igjennom hver linje i fila/array'en. 
           $key inneholder linje nr
           $line inneholder verdien fra fila
           første linje er nr 0, men den er slettet med unset() ovenfor, derfor brukes $key+1 nedfor for å vise linje nr
           */
           foreach ($file as $key=>$line) { 

               $exploded=explode("\t",$line);    // putt hvert felt, separert med tab, inn i en array

               if (count($exploded)==9) { // det skal leses inn 9 felt, sjekk at array'en inneholder 9 felt, hvis ikke hopp over linja

                   /* 
                   sprintf() returerer en ferdig formatert tekst streng, ikke nødvendig, men noe ryddigere måte å bygge opp en sql.
                   %s = streng/tekst, blir erstattet av variablene. 
	    Første %s = første variabel osv
                   NB! kontroller at felt navnene stemmer med feltene i bruker tabellen. F.eks er det felt som heter Fornavn, Etternavn osv. Hvis ikke må det rettes
                    */
                   $query = sprintf("INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass)
                                     VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",            
                       mysql_real_escape_string($exploded[0]), // sett inn felt 1, og "sanitize" verdi
                       mysql_real_escape_string($exploded[1]), // sett inn felt 2, og "sanitize" verdi
                       mysql_real_escape_string($exploded[2]), // ...
                       mysql_real_escape_string($exploded[3]), // ...
                       mysql_real_escape_string($exploded[4]), // ... 
                       mysql_real_escape_string($exploded[5]), // ... 
                       mysql_real_escape_string($exploded[6]), // ... 
                       mysql_real_escape_string($exploded[7]), // ... 
                       mysql_real_escape_string($exploded[8]) // sett inn felt 9, og "sanitize" verdi
                   );

                   // debugg, skriv ut og sjekk at sql'en ser riktig ut
                       echo nl2br($query); // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
                       exit; // avslutt loop, kommenter ut for skru av debugging
                   // debugg slutt

                   // utfør spørring (hvis de to debugging linjene er kommentert ut over)
                   if (mysql_query($query,$conn)) 
                       echo 'Lagret ' . $line . '<br/>'; // vellykket lagring
                   else
                       echo 'Feil med lagring av line nr ' . ($key+1) . ': ' . $line . '<br/>'.mysql_error().'<br/>'; // noe gikk galt, skriv ut feilmelding

	} // linja har ikke 9 felt
               else
                   echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
           }

       } // vellykket tilkobling til mysql server, men databasen finnes ikke
       else
           echo 'Finner ikke databasen';

   } // tilkobling til mysql server feilet
   else
       echo 'Feil med tilkobling til databasen';

} // klarte ikke lese fila, sjekk at php har leserettigheter til den
else
   echo 'Feil med innlesing av fil';

 

 

Endret av Crowly
Lenke til kommentar

Nå får jeg svar tilbake:

INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass)

VALUES ('JensPetter','Pettersen','Petter','[email protected]','12345678','LarsbrÃ¥tveien10','1016','20.10.90','hemmelig\r\n')

 

 

Den viser bare en linje ut. Så jeg får ikke lagt inn flere linjer samtidig. Det er jo noe av grunnen til at gjør det sånn

 

Åltså den vil ikke legge inn i databasen.

 

<?php
$host = 'localhost'; //navnet på maskinen databasen din ligger på
$user = 'root'; //ditt brukernavn på mySQL-basen
$pass = ''; //ditt passord på mySQL-basen
$db = 'ulv'; //navnet på mySQL-basen
$tabell ='bruker'; //navnet på tabellen du skal fylle med data
$source = 'user/student.txt';
if ($file=file($source)) { // les inn hele fila i en array
   if ($conn = mysql_connect($host,$user,$pass)) { // koble til mysql server
    if (mysql_select_db($db,$conn)) { // velg database
	    unset($file[0]); // fjern overskrifts rad/første linje, kommenter ut denne hvis det ikke er noen overskrifts rad
	    /*
	    gå igjennom hver linje i fila/array'en.
	    $key inneholder linje nr
	    $line inneholder verdien fra fila
	    første linje er nr 0, men den er slettet med unset() ovenfor, derfor brukes $key+1 nedfor for å vise linje nr
	    */
	    foreach ($file as $key=>$line) {
		    $exploded=explode("\t",$line);    // putt hvert felt, separert med tab, inn i en array
		    if (count($exploded)==9) { // det skal leses inn 9 felt, sjekk at array'en inneholder 9 felt, hvis ikke hopp over linja
			    /*
			    sprintf() returerer en ferdig formatert tekst streng, ikke nødvendig, men noe ryddigere måte å bygge opp en sql.
			    %s = streng/tekst, blir erstattet av variablene.
			    Første %s = første variabel osv
			    NB! kontroller at felt navnene stemmer med feltene i bruker tabellen. F.eks er det felt som heter Fornavn, Etternavn osv. Hvis ikke må det rettes
				 */
			    $query = sprintf("INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass)
								  VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",		   
				    mysql_real_escape_string($exploded[0]), // sett inn felt 1, og "sanitize" verdi
				    mysql_real_escape_string($exploded[1]), // sett inn felt 2, og "sanitize" verdi
				    mysql_real_escape_string($exploded[2]), // ...
				    mysql_real_escape_string($exploded[3]), // ...
				    mysql_real_escape_string($exploded[4]), // ...
				    mysql_real_escape_string($exploded[5]), // ...
				    mysql_real_escape_string($exploded[6]), // ...
				    mysql_real_escape_string($exploded[7]), // ...
				    mysql_real_escape_string($exploded[8]) // sett inn felt 9, og "sanitize" verdi
			    );
			    // debugg, skriv ut og sjekk at sql'en ser riktig ut
				    echo nl2br($query); // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
				    exit; // avslutt loop, kommenter ut for skru av debugging
			    // debugg slutt
			    // utfør spørring (hvis de to debugging linjene er kommentert ut over)
			    if (mysql_query($query,$conn))
				    echo 'Lagret ' . $line . '<br/>'; // vellykket lagring
			    else
				    echo 'Feil med lagring av line nr ' . ($key+1) . ': ' . $line . '<br/>'.mysql_error().'<br/>'; // noe gikk galt, skriv ut feilmelding
		    } // linja har ikke 9 felt
		    else
			    echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
	    }
    } // vellykket tilkobling til mysql server, men databasen finnes ikke
    else
	    echo 'Finner ikke databasen';
   } // tilkobling til mysql server feilet
   else
    echo 'Feil med tilkobling til databasen';
} // klarte ikke lese fila, sjekk at php har leserettigheter til den
else
   echo 'Feil med innlesing av fil';
   echo 'Feil med innlesing av fil';
?>

Endret av corsa91
Lenke til kommentar

Nå får jeg svar tilbake:

INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass)

VALUES ('JensPetter','Pettersen','Petter','[email protected]','12345678','LarsbrÃ¥tveien10','1016','20.10.90','hemmelig\r\n')

 

 

Den viser bare en linje ut. Så jeg får ikke lagt inn flere linjer samtidig. Det er jo noe av grunnen til at gjør det sånn

 

Åltså den vil ikke legge inn i databasen.

Hva med at du begynner å lese det som står skrevet og ikke bare blindt kopierer koden? Hadde du gjort det hadde du sett at jeg har lagt til debuggings kode, slik at du kan kontrollere at sql'en er riktig. Hvis du ikke kommenterer ut debuggings koden så vil den stoppe etter første linje.

 

Og denne linja må endres ser jeg nå (debuggings koden kom til nytte :) )

// fra
$exploded=explode("\t",$line);	// putt hvert felt, separert med tab, inn i en array

// til
$exploded=explode("\t",trim($line));	// putt hvert felt, separert med tab, inn i en array, fjern linjeskift

Endret av Crowly
  • Liker 1
Lenke til kommentar

Det skjønner jeg men selvom jeg bytter ut så får jeg samme tilbake og den vil uansett ikke legge inn i databasen.

 

Her ser du koden


<?php
$host = 'localhost'; //navnet på maskinen databasen din ligger på
$user = 'root'; //ditt brukernavn på mySQL-basen
$pass = ''; //ditt passord på mySQL-basen
$db = 'ulv'; //navnet på mySQL-basen
$source = 'user/student.txt';
if ($file=file($source)) { // les inn hele fila i en array
   if ($conn = mysql_connect($host,$user,$pass)) { // koble til mysql server
    if (mysql_select_db($db,$conn)) { // velg database
	    unset($file[0]); // fjern overskrifts rad/første linje, kommenter ut denne hvis det ikke er noen overskrifts rad
	    /*
	    gå igjennom hver linje i fila/array'en.
	    $key inneholder linje nr
	    $line inneholder verdien fra fila
	    første linje er nr 0, men den er slettet med unset() ovenfor, derfor brukes $key+1 nedfor for å vise linje nr
	    */
	    foreach ($file as $key=>$line) {
		    $exploded=explode("\t",trim($line));    // putt hvert felt, separert med tab, inn i en array, fjern linjeskift

		    if (count($exploded)==9) { // det skal leses inn 9 felt, sjekk at array'en inneholder 9 felt, hvis ikke hopp over linja
			    /*
			    sprintf() returerer en ferdig formatert tekst streng, ikke nødvendig, men noe ryddigere måte å bygge opp en sql.
			    %s = streng/tekst, blir erstattet av variablene.
			    Første %s = første variabel osv
			    NB! kontroller at felt navnene stemmer med feltene i bruker tabellen. F.eks er det felt som heter Fornavn, Etternavn osv. Hvis ikke må det rettes
				 */
			    $query = sprintf("INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Telefonnr,Adresse,Postnr,Fodselsnr,Passord)
								  VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",		   
				    mysql_real_escape_string($exploded[0]), // sett inn felt 1, og "sanitize" verdi
				    mysql_real_escape_string($exploded[1]), // sett inn felt 2, og "sanitize" verdi
				    mysql_real_escape_string($exploded[2]), // ...
				    mysql_real_escape_string($exploded[3]), // ...
				    mysql_real_escape_string($exploded[4]), // ...
				    mysql_real_escape_string($exploded[5]), // ...
				    mysql_real_escape_string($exploded[6]), // ...
				    mysql_real_escape_string($exploded[7]), // ...
				    mysql_real_escape_string($exploded[8]) // sett inn felt 9, og "sanitize" verdi
			    );
			    // debugg, skriv ut og sjekk at sql'en ser riktig ut
				    echo nl2br($query); // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
				    exit; // avslutt loop, kommenter ut for skru av debugging
			    // debugg slutt
			    // utfør spørring (hvis de to debugging linjene er kommentert ut over)
			    if (mysql_query($query,$conn))
				    echo 'Lagret ' . $line . '<br/>'; // vellykket lagring
			    else
				    echo 'Feil med lagring av line nr ' . ($key+1) . ': ' . $line . '<br/>'.mysql_error().'<br/>'; // noe gikk galt, skriv ut feilmelding
		    } // linja har ikke 9 felt
		    else
			    echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
	    }
    } // vellykket tilkobling til mysql server, men databasen finnes ikke
    else
	    echo 'Finner ikke databasen';
   } // tilkobling til mysql server feilet
   else
    echo 'Feil med tilkobling til databasen';
} // klarte ikke lese fila, sjekk at php har leserettigheter til den
else
   echo 'Feil med innlesing av fil';
   echo 'Feil med innlesing av fil';
?>

Det jeg får ut er dette: Har lagt tre brukere i tekstfilen men den viser ut bare en

INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Telefonnr,Adresse,Postnr,Fodselsnr,Passord)

VALUES ('KimAndre','Pedersen','Kim','[email protected]','22320870','Oledeviksvei12','1012','20.10.91','ak457555')

Endret av corsa91
Lenke til kommentar

Det skjønner jeg men selvom jeg bytter ut så får jeg samme tilbake og den vil uansett ikke legge inn i databasen

Kommer du ned til

echo 'Lagret ' . $line . '<br/>'; // vellykket lagring

eller

echo 'Feil med lagring av line nr ' . ($key+1) . ': ' . $line . '<br/>'.mysql_error().'<br/>'; // noe gikk galt, skriv ut feilmelding

? Grunnen til at du ikke kommer dit er fordi, som MikkelRev skriver, at spørringa ikke blir kjørt. Det er på grunn av

exit

Tror du burde lære deg programmering bedre

Lenke til kommentar

Det skjønner jeg

Nei, det gjør du definitivt ikke. Igjen: Du kjører exit rett etter at sql-en er skrevet ut til skjerm og da blir ikke mysql_query kjørt. Du må nesten lese svarene du får for å få noe ut av dem ...

Endret av quantum
Lenke til kommentar

For at INSERT'en skal kjøres må du slette eller kommentere ut dette:

echo nl2br($query); // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
exit; // avslutt loop, kommenter ut for skru av debugging

som jeg har prøvd å formidle i kommentarene. En liten feil i kommentaren, exit avslutter hele skriptet ikke bare loopen (skulle ha vært break i stedet for).

 

Du må også sjekke at feltene i INSERT'en stemmer overens med hva de faktisk heter i tabellen. Hvordan ser bruker tabellen ut?

 

Hvis du holder på å lære å programmere, så tror jeg ikke dette er den beste oppgaven å begynne med. Her må du kunne noe om å programmere i PHP og databaser/SQL. Er nok bedre å få en grei forståelse for det ene først, og så lære det andre etterpå. Hvis ikke så er det fare for at man gaper over for mye på en gang.

 

Du sa også at du bare forstå ca halve scriptet, som tidligere nevnt hvis du skriver hva du ikke helt forstår så kan vi prøve å hjelpe deg med det.

Endret av Crowly
Lenke til kommentar

Det jeg ikke forstår er hvorfor jeg må skrive inn feil med innlesning av fil to ganger se under

} // klarte ikke lese fila, sjekk at php har leserettigheter til den
else
   echo 'Feil med innlesing av fil';
   echo 'Feil med innlesing av fil';

 

Har merket at hvis jeg fjerner en setning så viser den ikke feilmeldingen.

 

Nå får jeg lagt inn i databasen :D

Endret av corsa91
Lenke til kommentar

Der har du klart å kopiere noe dobbelt. Dessuten så vil ikke det ha noe betydning, den andre echo'en bare kjørt på slutten av scriptet uansett om fila er lest eller ikke. Ved feil får du dobbel beskjed, når noe er riktig enkel beskjed.

 

Når det kommer til bruk av krøll parenteser ved if o.l. så må du ha dem når du skal utføre to eller flere kommandoer. Er det kun en kommando så kan de utelates. Skal du være på den trygge siden så bruker du de alltid. Jeg har vanen at jeg kun bruker de når det er nødvendig.

if ($test==1)
echo 'woo hoo'; // en del av if'en
echo 'woo hoo'; // ikke en del av if'en, utføres uansett

if ($test==1) {
   echo 'woo hoo'; // del av if'en
   echo 'woo hoo'; // del av if'en
}

Endret av Crowly
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...