MikkelRev Skrevet 17. april 2013 Del Skrevet 17. april 2013 Skjønner du egentlig koden din her som andre her har skrevet for deg? På forrige side viste jeg deg hvordan du kunne feilsøke spørringen din. Gjør det her også, og prøvekjør spørringen som blir generert, i f.eks. phpMyAdmin, 1 Lenke til kommentar
quantum Skrevet 18. april 2013 Del Skrevet 18. april 2013 if (count($exploded)==9) { // sjekk at alle felt er med ... skriv ut en feilmelding i tilfelle de ikke er med også, kanskje? Lenke til kommentar
Crowly Skrevet 18. april 2013 Del Skrevet 18. april 2013 Ø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
quantum Skrevet 18. april 2013 Del Skrevet 18. april 2013 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
Crowly Skrevet 18. april 2013 Del Skrevet 18. april 2013 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
corsa91 Skrevet 18. april 2013 Forfatter Del Skrevet 18. april 2013 Bruker en nesten felles kode så jeg vil ha de så lik som mulig ved evt endringer. Skjønner bare koden halvveis Lenke til kommentar
Crowly Skrevet 18. april 2013 Del Skrevet 18. april 2013 (endret) 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 18. april 2013 av Crowly Lenke til kommentar
corsa91 Skrevet 23. april 2013 Forfatter Del Skrevet 23. april 2013 (endret) 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 23. april 2013 av corsa91 Lenke til kommentar
quantum Skrevet 23. april 2013 Del Skrevet 23. april 2013 Du kjører jo exit rett etter at du har skrevet ut sql'en så det er ikke så rart? Lenke til kommentar
Crowly Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) 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 23. april 2013 av Crowly 1 Lenke til kommentar
corsa91 Skrevet 23. april 2013 Forfatter Del Skrevet 23. april 2013 (endret) 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 23. april 2013 av corsa91 Lenke til kommentar
MikkelRev Skrevet 23. april 2013 Del Skrevet 23. april 2013 Det skjønner jeg men hvorfor blir den ikke lagt til? Fordi spørringen aldri blir kjørt? Hva er det du skjønner egentlig? Lenke til kommentar
hjahre Skrevet 23. april 2013 Del Skrevet 23. april 2013 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
corsa91 Skrevet 23. april 2013 Forfatter Del Skrevet 23. april 2013 (endret) Hvis den ikke blir kjørt så hadde jeg fått noe feilmelding. Jeg holder på å lære PHP Endret 23. april 2013 av corsa91 Lenke til kommentar
quantum Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) 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 23. april 2013 av quantum Lenke til kommentar
quantum Skrevet 23. april 2013 Del Skrevet 23. april 2013 Hvis den ikke blir kjørt så hadde jeg fått noe feilmelding. Hvordan skal det bli noen feilmelding av at du *ikke* prøver å kjøre spørringen? Lenke til kommentar
Crowly Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) 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 23. april 2013 av Crowly Lenke til kommentar
corsa91 Skrevet 24. april 2013 Forfatter Del Skrevet 24. april 2013 (endret) 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 Endret 24. april 2013 av corsa91 Lenke til kommentar
nomore Skrevet 24. april 2013 Del Skrevet 24. april 2013 Vel, akkurat det må nesten du svare på selv, da det kun er du som har den linja to ganger i kildekoden. Lenke til kommentar
Crowly Skrevet 24. april 2013 Del Skrevet 24. april 2013 (endret) 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 24. april 2013 av Crowly Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå