2011-10-17 33 views
22

Tôi có tệp cần nhập vào cơ sở dữ liệu. (Cơ sở dữ liệu của tôi là tốt, tôi có thể kết nối và tôi có thể thêm). Bây giờ vấn đề của tôi là vì lý do nào đó không có gì được chèn vào.Lỗi khi đọc tệp văn bản trong php

Tôi có tệp schooldatabase.txt người dùng/mật khẩu tôi cần thêm vào cơ sở dữ liệu. Tệp có 200 dòng.

Dưới đây là một ví dụ:

test|098f6bcd4621d373cade4e832627b4f6 
test2|ad0234829205b9033196ba818f7a872b 

Bây giờ cho mỗi người trong các dòng (tên người dùng và mật khẩu sinh viên) tôi phải chèn chúng trong một cơ sở dữ liệu.

Dưới đây là mã của tôi:

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

Tại sao nó trở về "chấp nhận" nếu người dùng mà không phải là trong file?

+3

biết chính xác là bạn cố gắng sử dụng các file 'schooldatabase.txt' cho? Ngoài ra, tôi nghi ngờ bạn chỉ muốn đọc 5 byte tại một thời điểm (xem ['fread()'] (http://php.net/manual/en/function.fread.php)) – Phil

+5

stristr sẽ không bao giờ trả về TRUE. Infact, stristr trả về chuỗi con phù hợp hoặc FALSE nếu không tìm thấy kim. –

+0

Tệp schooldatabase.txt lớn như thế nào? –

Trả lời

25

Tôi nghĩ ở đây bạn nên suy nghĩ lại về quy trình của mình. Tôi giả sử bạn "processUser" nhiều hơn một lần do đó bạn sẽ mở/đọc/đóng cùng một tập tin hơn và hơn mà không thay đổi tập tin đó.

Vì tệp không lớn (và tôi cho rằng đó là tập lệnh một lần), chỉ cần mở tệp trong bộ nhớ khi bạn bắt đầu tập lệnh, sau đó bạn có thể so sánh tất cả giá trị bạn đang thử nghiệm với tệp đó.

Bạn có thể sử dụng hàm file để làm như vậy. Sau đó, bạn có thể kiểm tra xem người dùng có tồn tại không bằng cách sử dụng in_array.

Đây là kịch bản:

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

tôi đã phải thay đổi mã và FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES là giải pháp cho mã mới của tôi cảm ơn –

20

Tôi nghĩ rằng bạn đang quá phức tạp các if một chút - đó là đúng hoặc sai, vì vậy không cần phải kiểm tra xem stristr hai lần! Ngoài ra, bạn có thể có đúng/sai lẫn lộn.

Chỉnh sửa: Ngoài ra, nó có thể là stripos, sẽ trả về vị trí hoặc sai.

Hãy thử ...

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

... mà làm việc?

+0

Chỉ cần thực hiện thay đổi (nhờ @AurelioDeRosa) để bạn có thể muốn cập nhật nó! Ngoài ra, những gì @Phil nói nên được kiểm tra, tăng chiều dài fread của bạn. – JoLoCo

Các vấn đề liên quan