2011-10-17 2 views
22

J'ai un fichier à importer dans une base de données. (Ma base de données est bonne, je peux me connecter et je peux ajouter). Maintenant, mon problème est que pour une raison quelconque, rien n'est inséré. J'ai un fichier schooldatabase.txt d'utilisateurs/mot de passe Je dois ajouter à une base de données. Le fichier a 200 lignes.Erreur lors de la lecture du fichier texte au format php

Voici un exemple:

test|098f6bcd4621d373cade4e832627b4f6 
test2|ad0234829205b9033196ba818f7a872b 

Maintenant, pour chacune de ces lignes (nom d'utilisateur et mot de passe étudiant) Je dois les insérer dans une base de données.

Voici mon code:

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

Pourquoi retourner « accepté » si cet utilisateur est pas dans le fichier?

+3

Qu'est-ce exactement que vous essayez d'utiliser le fichier 'schooldatabase.txt' pour? Aussi, je doute que vous voulez seulement lire 5 octets à la fois (voir ['fread()'] (http://php.net/manual/fr/function.fread.php)) – Phil

+5

stristr ne retournera jamais VRAI. En effet, stristr renvoie la sous-chaîne correspondante ou FALSE si l'aiguille n'est pas trouvée. –

+0

Quelle est la taille du fichier schooldatabase.txt? –

Répondre

25

Je pense que vous devriez repenser votre processus. Je suppose que vous "processUser" plus d'une fois donc vous allez ouvrir/lire/fermer le même fichier encore et encore sans altérer ce fichier. Parce que le fichier n'est pas énorme (et je suppose qu'il s'agit d'un script à usage unique), il suffit d'ouvrir le fichier en mémoire lorsque vous démarrez votre script, vous pouvez comparer toute la valeur que vous testez avec ce fichier. Vous pouvez utiliser la fonction file pour cela. Ensuite, vous pouvez vérifier si l'utilisateur existe en utilisant in_array.

est ici le script:

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

je devais changer de code et le FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES était la solution à mon nouveau code merci –

20

Je pense que vous êtes trop compliqué le if un peu - c'est vrai ou faux, donc pas besoin de vérifier que stristr deux fois! En outre, vous pourriez avoir votre vrai/faux mélangé.

Editer: Aussi, il devrait probablement être stripos, qui va retourner la position ou faux.

Essayez ...

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

... est-ce que le travail?

+0

Je viens de faire un changement (merci à @AurelioDeRosa) donc vous voudrez peut-être le mettre à jour! En outre, ce que @Phil dit devrait être vérifié, augmentez votre longueur de fread. – JoLoCo

Questions connexes