2011-10-17 19 views
22

Veritabanına içe aktarmam gereken bir dosyam var. (Veritabanım iyi, bağlantı kurabilir ve ekleyebilirim). Şimdi benim problemim bir sebepten dolayı hiçbir şey sokulmuyor.php dosyasında okuma dosyası hatası

Bir dosyam var schooldatabase.txt kullanıcı/parola Veritabanına eklemek gerekiyor. Dosyada 200 satır var. Bir veritabanında eklemek zorunda bu hat (öğrenci kullanıcı adı ve şifre) her biri için Şimdi

test|098f6bcd4621d373cade4e832627b4f6 
test2|ad0234829205b9033196ba818f7a872b 

:

İşte bir örnek verilmektedir. Bu kullanıcı dosyasında değilse

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

Neden dönüş "kabul":

İşte benim kod?

+3

? Ayrıca, bir seferde sadece 5 bayt okumak istediğinizden şüpheliyim (bkz. ['Fread()'] (http://php.net/manual/en/function.fread.php)) – Phil

+5

Stristr asla DOĞRU'ya dönmeyecektir. Infact, stristr eşleşen substring'i veya iğne bulunmazsa FALSE değerini döndürür. –

+0

Schooldatabase.txt dosyası ne kadar büyük? –

cevap

25

Burada, sürecinizi yeniden düşünmeniz gerektiğini düşünüyorum. Bir kereden fazla "processUser" aldığımı farz ediyorum, bu yüzden bu dosyayı değiştirmeden aynı dosyayı açıp/kapatacak/kapatacaksınız.

Dosya büyük olmadığından (ve bir kerelik bir komut dosyası olduğunu varsayalım), yalnızca komut dosyasını başlattığınızda belleğe dosyayı açın, ardından bu dosyayla test ettiğiniz tüm değerleri karşılaştırabilirsiniz.

Bunu yapmak için file işlevini kullanabilirsiniz. Daha sonra kullanıcının in_array kullanarak var olup olmadığını kontrol edebilirsiniz. İşte

senaryo:

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)); 
tam olarak ne için `schooldatabase.txt` dosyasını kullanmaya çalışıyorsunuz ne
+0

Kodu değiştirmek zorunda kaldım ve FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES yeni kodumun çözümü oldu –

20

Sanırım if bir bit'i fazlasıyla karıştırıyorsunuz - doğru ya da yanlış, bu yüzden stristr'u iki kez kontrol etmeniz gerekmiyor! Ayrıca, doğru/yanlış karışmış olabilirsiniz.

Düzenleme: Ayrıca, konumu veya yanlışı döndürecek olan şerit de olmalıdır.

deneyin ...

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

... bu işler?

+0

Sadece bir değişiklik yaptık (@AurelioDeRosa'ya teşekkürler), böylece güncellemek isteyebilirsiniz! Ayrıca, @Phil'in ne dediği kontrol edilmeli, yayılma uzunluğunu arttır. – JoLoCo