herdon Skrevet 9. april 2013 Del Skrevet 9. april 2013 (endret) Jeg har en funksjon som skal søke i en fil, og om tekststrengen som ble skrevet inn ikke eksisterer i filen, så skal tekststrengen legges til filen. Problemet er at den legger tekststrengen til filen selv om den eksisterer i filen fra før. Hva er problemet? Her er koden (Det er fint om dere sier i fra om det er noe annet i koden jeg også har feil på): <?php session_start(); ?> <html> <head> <title>Search/Add text-strings to the game</title> </head> <body> <h1>Text-strings:</h1> <?php $con=mysqli_connect("XXX","XXX","XXX","XXX"); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } else { $result = mysqli_query($con,"SELECT * FROM users WHERE id=" . $_SESSION['memberID']); $row = mysqli_fetch_array($result); mysqli_close($con); if($row['status'] == "admin" || $row['status'] == "translator") { $file = fopen("language/English.txt","r") or exit("Unable to open file"); $e=0; while(!feof($file)) { $text[$e] = str_replace("<newline>","\n",fgets($file)); $e++; } fclose($file); $textLength = count($text); $file = fopen("language/English.txt","a") or exit("Unable to open file"); for($i=0;$i<$_POST['number'];$i++) { $textStrings[$i] = trim($_POST['string' . $i]); if($textStrings[$i] != "") { $finishedStringCheck = 0; for($k=1;$k<($textLength + 1);$k++) { if($textStrings[$i] == $text[$k]) { echo "The string: '" . $textStrings[$i] . "' already exist with ID: " . $k . ".<br><br>"; break; } else { $finishedStringCheck++; } } if($finishedStringCheck == $textLength) { fwrite($file,str_replace("\n","<newline>",$textStrings[$i]) . "\n"); echo "The string: '" . $textStrings[$i] . "' have been added to the english-file with ID: " . $e . ".<br><br>"; $e++; } } } fclose($file); $con=mysqli_connect("XXX","XXX","XXX","XXX"); if (mysqli_connect_errno()) { echo "Failed to connect to the MySQL database: " . mysqli_connect_error(); } else { $result = mysqli_query($con,"SELECT * FROM users WHERE status='translator' OR status='admin'"); while($row = mysqli_fetch_array($result)) { mail($row['email'],"It has been added more text-strings to the game","It has been added more text-strings to the game, please translate thoose.",'From: [email protected]'); } echo "An email is sent to all translators and admins that tell them that it has been added more text-strings.<br><br>"; echo "<a href='http://admin.boxer.hostei.com'>Go back to admin's main menu</a>"; mysqli_close($con); } } else { echo "You are not allowed to be here."; } } ?> </body> </html> Endret 10. april 2013 av herdon Lenke til kommentar
BlueEAGLE Skrevet 9. april 2013 Del Skrevet 9. april 2013 Følgende funksjon tar to parameter. En tekststreng og et filnavn. Den leser inn tekststrengen til en matrise så sjekker den om tekst strengen finnes i matrisen hvis den ikke gjør det så legger den strengen til og skriver matrisen tilbake til filen og returnerer true ellers så returnerer den false. Legg merke til at du alltid bør feilsjekke om filen lar seg åpne og lese og om den lar seg skrive. For klarhet i koden så omgikk jeg det i eksemplet. Oddsen er at det finnes enklere måter å gjøre dette på, men som et eksempel så bør dette duge. Merk at jeg skrev koden fra hukommelsen så syntaksen kan være på tryne. function FindStringInFile($string, $filename) { $content = file($filename) if(!in_array($string, $content) { $content[] = $string; file_put_contents($filename, implode($content, "\r\n")); return true; } else return false; } Lenke til kommentar
herdon Skrevet 9. april 2013 Forfatter Del Skrevet 9. april 2013 Takk, det ser ganske bra ur, så det skal jeg prøve. Lenke til kommentar
BlueEAGLE Skrevet 9. april 2013 Del Skrevet 9. april 2013 Legg merke til at veldig store filer vil bruke veldig mye ressurser når de skal inn i en matrise. Hvis minnet blir et problem så må prosedyren gjøres om slik at en og en linje leses inn og sjekkes. Fordelen med en slik prosedyre er selvsagt at man slipper å lese inn hele filen hvis strengen eksisterer tidlig i filen. Da kan man bryte løkken når strengen blir funnet. Lenke til kommentar
Paull Skrevet 9. april 2013 Del Skrevet 9. april 2013 Brukernavn, passord og servernavn står i første post, anbefaler å bytte disse så fort som mulig før noen finner på noe tullball med de.. Med mindre de allerede er byttet ut med fiktive verdier da 1 Lenke til kommentar
BlueEAGLE Skrevet 9. april 2013 Del Skrevet 9. april 2013 … og når jeg ser på hva koden din egentlig gjør så ser det ut som at den finner opp file() på nytt bare at den hiver på <newline> på slutten av hver tekststreng i matrisen. Lenke til kommentar
hjahre Skrevet 10. april 2013 Del Skrevet 10. april 2013 Jeg har en funksjon som skal søke i en fil, og om tekststrengen som ble skrevet inn ikke eksisterer i filen, så skal tekststrengen legges til filen. Problemet er at den legger tekststrengen til filen selv om den eksisterer i filen fra før. Hva er problemet? Er det en grunn til at du må lagre fila med <newline> i stedet for \n? Sånn som du gjør det nå vil du lese hele fila på en gang, fordi fgets leser til første \n eller EOF (end of file). Når det ikke er noen \n vil den altså lese hele fila. Tror dette ville funke bedre /* * Example usage: $array = fileAsArray("myAwesomeFile", "<newline>"); */ function fileAsArray($filename, $delimiter) { return explode($delimiter, file_get_contents($filename)); } Lenke til kommentar
herdon Skrevet 10. april 2013 Forfatter Del Skrevet 10. april 2013 Er det en grunn til at du må lagre fila med <newline> i stedet for \n? Sånn som du gjør det nå vil du lese hele fila på en gang, fordi fgets leser til første \n eller EOF (end of file). Når det ikke er noen \n vil den altså lese hele fila. Tror dette ville funke bedre /* * Example usage: $array = fileAsArray("myAwesomeFile", "<newline>"); */ function fileAsArray($filename, $delimiter) { return explode($delimiter, file_get_contents($filename)); } Grunnen til at jeg ber den om å lagre alle forekomster av \n i strengen som <newline> er fordi disse skal kunne brukes som \n et annet sted (det som skal lagres til filen skal kunne ha \n i seg, men skal være på samme linje i filen, så man kan ta en og en linje). 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å