2011-10-17 13 views
22

Tengo un archivo que necesito importar a una base de datos. (Mi base de datos es buena, puedo conectarme y puedo agregar). Ahora mi problema es por alguna razón que nada se inserta.Error al leer el archivo de texto en php

Tengo un archivo schooldatabase.txt de usuarios/contraseña Necesito agregar a una base de datos. El archivo tiene 200 líneas.

He aquí una muestra:

test|098f6bcd4621d373cade4e832627b4f6 
test2|ad0234829205b9033196ba818f7a872b 

Ahora, para cada una de estas líneas (nombre de usuario y la contraseña del estudiante) que tengo para insertarlos en una base de datos.

Aquí está mi código:

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

Por qué se vuelven "aceptado" si ese usuario no está en el archivo?

+3

¿Qué es exactamente lo que intentando utilizar el archivo 'schooldatabase.txt' para? Además, dudo que solo desee leer 5 bytes a la vez (vea ['fread()'] (http://php.net/manual/en/function.fread.php)) – Phil

+5

stristr nunca devolverá TRUE. De hecho, stristr devuelve la subcadena coincidente o FALSE si no se encuentra la aguja. –

+0

¿Qué tan grande es el archivo schooldatabase.txt? –

Respuesta

25

Creo que aquí debe volver a pensar en su proceso. Supongo que "procesar usuario" más de una vez, por lo tanto, abrirá/leerá/cerrará el mismo archivo una y otra vez sin alterar ese archivo.

Como el archivo no es enorme (y supongo que es un script de un solo uso), abra el archivo en la memoria cuando inicie el script y luego compare todo el valor que está probando con ese archivo.

Puede usar la función file para hacerlo. Luego puede verificar si el usuario existe usando in_array.

Aquí está la secuencia de comandos:

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

tuve que cambiar el código y FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES fue la solución a mi nuevo código gracias –

20

Creo que está sobrecomplicando el if un poco - es verdadero o falso, ¡así que no hay necesidad de verificar que stristr dos veces! Además, podrías confundir tu verdadero/falso.

Editar: Además, probablemente debería ser stripos, que devolverá la posición o falsa.

Try ...

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

... funciona eso?

+0

Acabo de hacer un cambio (gracias a @AurelioDeRosa) por lo que es posible que desee actualizarlo! Además, lo que dice @Phil debe verificarse, aumente la longitud de su envío. – JoLoCo

Cuestiones relacionadas