2011-10-17 14 views
22

Mam plik, który muszę zaimportować do bazy danych. (Moja baza danych jest dobra, mogę się połączyć i mogę dodać). Teraz mój problem polega na tym, że z jakiegoś powodu nic nie zostaje wstawione.Błąd odczytu pliku tekstowego w php

Mam plik schooldatabase.txt użytkowników/hasło, które muszę dodać do bazy danych. Plik ma 200 linii.

Oto próbka:

test|098f6bcd4621d373cade4e832627b4f6 
test2|ad0234829205b9033196ba818f7a872b 

Teraz dla każdej z tych linii (nazwę użytkownika i hasło) uczeń mam wstawić je w bazie danych.

Oto mój kod:

function addUser($user,$pass) { 
// this code is good 
} 

function processUser($user,$pass) { 
    $pass=md5($pass); 
    $myFile = "schooldatabase.txt"; 
    $fh = fopen($myFile, 'r'); 
    $theData = fread($fh, 5); 
    $login = "$user|$pass"; 
    if(stristr($theData,$login) !== false){ 
     $result = "rejected"; 
    } 
    elseif(stristr($theData,$login) !== true){ 
     addUser($user,$pass); // this work I manuall tested 
     $result = "accepted"; 
    } 
    fclose($fh); 
    return $result; 
} 
var_dump(processUser('invaliduser','test2')); 

Dlaczego to return „akceptowane” jeśli użytkownik nie znajduje się w pliku?

+3

Co dokładnie pan próbuje użyć 'plik schooldatabase.txt' za? Ponadto, wątpię, że chcesz tylko czytać 5 bajtów na raz (zobacz ['fread()'] (http://php.net/manual/en/function.fread.php)) – Phil

+5

stristr nigdy nie zwróci PRAWDA. Infact, stristr zwraca dopasowany podciąg lub FALSE, jeśli igła nie zostanie znaleziona. –

+0

Jak duży jest plik schooldatabase.txt? –

Odpowiedz

25

Myślę, że tutaj powinieneś przemyśleć swój proces. Zakładam, że jesteś "processUser" więcej niż jeden raz, dlatego będziesz otwierać/czytać/zamykać ten sam plik w kółko bez zmiany tego pliku.

Ponieważ plik nie jest ogromny (i zakładam, że jest to jednorazowy skrypt), wystarczy otworzyć plik w pamięci po uruchomieniu skryptu, a następnie porównać wszystkie wartości testowane z tym plikiem.

Możesz użyć funkcji file, aby to zrobić. Następnie możesz sprawdzić, czy użytkownik istnieje, używając in_array.

Oto scenariusz:

function addUser($user,$pass) { 
// this code is good 
} 

$file = file("schooldatabase.txt", FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES); 

function processUser($user,$pass, array &$file) { 
    $pass = md5($pass); 
    if(in_array("$user|$pass", $file)) { 
    addUser($user,$pass); // do you check if the query is good? 
    return 'accepted'; 
    } 
    return "rejected"; 
} 

var_dump(processUser('invaliduser','test2', $file)); 
+0

Musiałem zmienić kod, a FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES było rozwiązaniem mojego nowego kodu dzięki –

20

Myślę, że zbytnio komplikujesz kod if - jest to prawda lub fałsz, więc nie musisz dwa razy sprawdzać tego stristr! Możesz także pomylić swoje prawdziwe/fałszywe.

Edycja: Powinien to być również stripos, który zwróci pozycję lub fałsz.

Spróbuj ...

if(stripos($theData,$login) === false){ 
    $result = "rejected"; 
} else { 
    addUser($user,$pass); // this work I manuall tested 
    $result = "accepted"; 
} 

... to działa?

+0

Właśnie dokonałem zmiany (dzięki @AurelioDeRosa), więc możesz ją zaktualizować! Również to, co @Phil mówi, powinno zostać sprawdzone, zwiększyć długość swojego freada. – JoLoCo

Powiązane problemy