Gå til innhold

Anbefalte innlegg

Tror jeg skjønner noe men hvis jeg fjerner parantesen så vil den ikke fungere i det hele tatt.

 

Men det jeg er litt usikker på er om den skal si motsatt av det. Nå står det:

echo 'Feil med innlesing av fil';

 

 

som skal erstattes med

 

Velykket

 

 

og evt hvor skal jeg fjerne krøllparantesen

Endret av corsa91
Lenke til kommentar
Videoannonse
Annonse

Har stykket opp koden og skal prøve å forklare hva hver enkelt del gjør. Hvis noen ser noe som er dårlig forklart eller kan forklares bedre så fyr løs ;)

 

Dette bør være ganske greit, setter verdier i forskjellige variabler.

 

$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';

 

 

Prøver å lese inn fila spesifisert i $source ved hjelp av funksjonen file():

Returns the file in an array. Each element of the array corresponds to a line in the file, with the newline still attached. Upon failure, file() returns FALSE.

Siden file returnerer en av to verdier, array eller false, bør vi sjekke for dette ved å legge den inn i en if, slik at koden kan avslutte på en pen måte hvis noe går galt.

 

 

$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

  // fila er lest, kode for videre behandling av innholdet i fila legges til her

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

 

Den annen måte å skrive denne if'en på som kanskje er litt mer forstålig

$file=file($source);
if ($file !== false) {
   // fila er lest, kode for viderebehandling
}
else {
 // klarte ikke lese fila
}

 

 

 

Når fila er lese inn og lagret i $fila, så kobler man til mysql og velger database.

 

$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

           // kode for videre behandling her

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

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

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

 

 

 

Hvis fila ha en overskriftsrad så vil man ikke ha med den inn i databasen, like greit å slette den med unset(). En array begynner å telle på 0 (så lengde den ikke er associative), da ligger den første linja i fila i $file[0]. Er det ingen overskriftsrad så må unset() slettes eller kommenteres ut.

 

$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

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

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

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

 

 

 

Nå skal hver linje fra fila behandles, siden $fila er en array så er foreach en fornuftig loop å ta i bruk. Den kjører en gang for hver forekomst i array'en.

$key vil inneholde linje nummeret, og $line teksten

 

$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

           foreach ($file as $key=>$line) { 

               // kode som skal behandle hver linje

           }

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

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

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

 

 

 

Siden fila er tabulator separert, så må vi få tak i hvert felt. explode() er godt egnet til dette. Du spesifiserer ett skille tegn, i dette tilfellet tabulator "\t" og tekst strengen, $line, og explode returerer en array med hvert felt.

Det er linjeskift på enden av tekst strengen, dette må bort, da er trim() en grei funksjon.

 

$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

           foreach ($file as $key=>$line) { 

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

           }

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

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

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

 

Kanskje litt mer lett lest kode som gjør akkurat det samme som over

$line=trim($line); // fjern linjeskift
$exploded=explode("\t",$line); // del opp tekst strengen, og lagre i en array

 

 

 

For å være sikre på at linja, og dermed $exploded array'en, har de 9 feltene vi forventer så kan man telle opp antall forekomster i $exploded med count()

 

$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

           foreach ($file as $key=>$line) { 

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

               if (count($exploded)==9) { // kontroller at alle 9 felt er med

                   // det er 9 felt på linja, videre behandling her

               }
               else {
                   // linja har ikke 9 felt. Siden array'en begynner å teller fra 0, må vi legge til 1 for å skrive ut riktig linje nr.
                   echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
               }

           } // slutt foreach

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

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

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

 

 

Nå må INSERT'en bygges opp, slik at data kan legges inn i databasen.

Skal du sette inn verdier i alle feltene i tabellen, så kan feltnavnene droppes, men må stå i samme rekkefølge som i tabellen. Men jeg syntes det er mer ryddig å alltid spesifisere dem, er lettere å lese hva som skjer.

sprintf() er en grei funksjon for å formatere/bygge opp tekst strenger. Den er ikke nødvendig å bruke, men gjør det litt mer lesbart ved at sql'en og variablene er separert.

 

Det er veldig viktig å vaske/sanitize input data, slik at man ikke får inn noe faen skap inn i databasen (les om bl.a. sql injection og cross site scripting attack). mysql_real_esacpe_string() hjelper mot dette (men tror ikke den tar alt).

 

Det er også greit å skrive ut sql'en, slik at du kan visuelt sjekke at den ser greit ut, og evt. kopiere og lime inn i f.eks. phpmyadmin for å kontrollere at den fungerer.

 

$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

           foreach ($file as $key=>$line) { 

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

               if (count($exploded)==9) { // kontroller at alle 9 felt er med

                   $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).'<br/>'; // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
                   // debugg slutt

               }
               else {
                   // linja har ikke 9 felt. Siden array'en begynner å teller fra 0, må vi legge til 1 for å skrive ut riktig linje nr.
                   echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
               }

           } // slutt foreach

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

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

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

 

Alternativ måte å bygge opp $query på

$query="INSERT INTO bruker (Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass)
VALUES (
'" . mysql_real_escape_string($exploded[0]) . "',
'" . mysql_real_escape_string($exploded[1]) . "',
'" . 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]) . "'
)";

 

 

 

 

Så gjenstår det bare å kjøre INSERT'en. mysql_query() returnerer TRUE eller FALSE når man kjører en insert, derfor er det greit å legge den i en if slik at man kan kjøre noe kode i forhold til om det går bra eller ikke. Hvis noe går galt er det greit å skrive ut feilmeldingen fra databasen med mysql_error(), men kun når man holder på med utvikling, ikke når systemet/siden går live. Det kan vise informasjon som kan missbrukes.

 

$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

           foreach ($file as $key=>$line) { 

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

               if (count($exploded)==9) { // kontroller at alle 9 felt er med

                   $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).'<br/>'; // kommenter ut denne for å skru av debugging. Skriver ut verdien av $query og gjør om newline til <br/>
                   // debugg slutt

                   // utfør spørring
                   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
                   }

               }
               else {
                   // linja har ikke 9 felt. Siden array'en begynner å teller fra 0, må vi legge til 1 for å skrive ut riktig linje nr.
                   echo 'Linje ' . ($key+1) . ' har ikke 9 felt, hopper over<br/>'. $line . '<br/>';
               }

           } // slutt foreach

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

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

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

 

Lenke til kommentar

Du har fremdeles ikke svart på hva feltene i bruker tabellen heter, hvis de ikke har nøyaktig samme navn som disse:

Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass

 

så vil det feile. Da må du rette opp dette i koden.

Lenke til kommentar

Alt av info blir lagt inn i databasen men jeg får opp melding om at det er feil med innlesing av fil.

 

Har også endret fra

Fornavn,Etternavn,Brukernavn,Epost,Tlf,Adresse,Postnr,Fodselsnr,Pass

til

Fornavn,Etternavn,Brukernavn,Epost,Telefonnr,Adresse,Postnr,Fodselsnr,Passord

 

Det er ikke det som er feilen tror jeg eller

Lenke til kommentar

Hvis ting leses inn i databasen, så er det ikke feil med lesing av fil. Da har du en annen feil hvor echo 'Feil med innlesing av fil'; blir kjørt når den ikke skal kjøres. Da må du se nærmere på kode flyten, kanskje det mangler en else.

Lenke til kommentar

Her ser du to bilder

 

På den øverste så har jeg dobbel

echo 'Feil med innlesing av fil';

 

 

på den andre har jeg bare en av echo 'Feil med innlesing av fil';

 

 

Legger ved koden :D

<?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 verdien
				    mysql_real_escape_string($exploded[1]), // sett inn felt 2, og verdien
				    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 verdien
			    );
			    // 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, kommentebr 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';
?>

Leter

post-185298-0-78967900-1366917897_thumb.png

Lenke til kommentar

Hvorfor har du dobbel? Da blir det som tidligere nevnt, den ene kjører alltid. Når man ikke bruker krøll parenteser så er det kun den første kommandoen som etter en if/else som tilhører if/else'en. Dette har også tidligere blitt prøvd forklart.

 

Den nederste fungerer jo som den skal ser det ut til.

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...