2012-09-19 14 views
6

मैंने कोशिश की और समाधान की तलाश की, लेकिन कोई निश्चित नहीं मिला।PHP टेक्स्ट फ़ाइल में एक पंक्ति को संशोधित करें

असल में, मेरे पास एक txt फ़ाइल है जो उपयोगकर्ता नाम और पासवर्ड सूचीबद्ध करती है। मैं एक निश्चित उपयोगकर्ता के पासवर्ड को बदलने में सक्षम होना चाहता हूँ।

users.txt फ़ाइल की सामग्री:

user1,pass1 
user2,pass2 
user3,pass3 

मैं निम्नलिखित php कोड की कोशिश की है:

  // $username = look for this user (no help required) 
      // $userpwd = new password to be set 

    $myFile = "./users.txt"; 
    $fh = fopen($myFile,'r+'); 

    while(!feof($fh)) { 
     $users = explode(',',fgets($fh)); 
     if ($users[0] == $username) { 
      $users[1]=$userpwd; 
      fwrite($fh,"$users[0],$users[1]"); 
     } 
    }  

    fclose($fh);  
+1

आपके समाधान के साथ समस्या यह है कि आप एक बाइनरी फ़ाइल के रूप में एक पाठ (अनुक्रमिक) फ़ाइल को संभालने वाले हैं। आप जिस फ़्राइट का उपयोग कर रहे हैं वह यहां काम नहीं करेगा। –

+8

आपकी समस्या एक उदाहरण है कि आपको एक फ्लैट टेक्स्ट फ़ाइलों का उपयोग क्यों नहीं करना चाहिए, लेकिन डेटा बेस –

+0

भी, सिंक्रनाइज़ेशन की समस्या है। तो, आपको ['flock'] (http://php.net/manual/en/function.flock.php) का उपयोग करने का प्रयास करना चाहिए। या, यह आसानी से कुछ उपयोगकर्ताओं को पागल ड्राइव कर सकता है। – Prasanth

उत्तर

8

यह काम करना चाहिए! :)

$file = "./users.txt"; 
$fh = fopen($file,'r+'); 

// string to put username and passwords 
$users = ''; 

while(!feof($fh)) { 

    $user = explode(',',fgets($fh)); 

    // take-off old "\r\n" 
    $username = trim($user[0]); 
    $password = trim($user[1]); 

    // check for empty indexes 
    if (!empty($username) AND !empty($password)) { 
     if ($username == 'mahdi') { 
      $password = 'okay'; 
     } 

     $users .= $username . ',' . $password; 
     $users .= "\r\n"; 
    } 
} 

// using file_put_contents() instead of fwrite() 
file_put_contents('./users.txt', $users); 

fclose($fh); 
+0

कोड का सुंदर टुकड़ा! – antikbd

2

मुझे लगता है कि जब आप विशेष के लिए है कि उपयोग preg_replace के बाद उस फ़ाइल उपयोग file_get_contents मिल उपयोगकर्ता का नाम

मैंने पिछले कुछ चीजों में ऐसा किया है जैसे

   $str = ""; 

     $reorder_file = FILE_PATH; 
     $filecheck = isFileExists($reorder_file); 

     if($filecheck != "") 
     { 
      $reorder_file = $filecheck; 
     } 
     else 
     { 
      errorLog("$reorder_file :".FILE_NOT_FOUND); 
      $error = true; 
      $reorder_file = ""; 
     } 
     if($reorder_file!= "") 
     { 
      $wishlistbuttonhtml="YOUR PASSWORD WHICH YOU WANT TO REPLACE" 
      $somecontent = $wishlistbuttonhtml; 
      $Handle = fopen($reorder_file, 'c+'); 
      $bodytag = file_get_contents($reorder_file); 
      $str=$bodytag; 
      $pattern = '/(YOUR_REGEX_WILL_GO_HERE_FOR_REPLACING_PWD)/i'; 
      $replacement = $somecontent; 
      $content = preg_replace($pattern, $replacement, $str,-1, $count); 
      fwrite($Handle, $content); 
      fclose($Handle); 
     } 

उम्मीद है कि यह मदद करता है ....

1

ऐसा करने का उचित तरीका इसके बजाय डेटाबेस का उपयोग करना है। डेटाबेस आसानी से यादृच्छिक पहुंच कर सकते हैं, इसे टेक्स्ट फ़ाइलों के साथ कम कर सकते हैं।

यदि आप किसी भी कारण से किसी डेटाबेस पर स्विच नहीं कर सकते हैं, और आपके सिस्टम के लिए लगभग एक हजार से अधिक उपयोगकर्ता होने की उम्मीद नहीं है, तो यह पूरी फ़ाइल को केवल कनवर्ट करने के लिए बहुत आसान होगा यह एक PHP डेटा संरचना के लिए, आपको जो परिवर्तन करने की आवश्यकता है, उसे वापस टेक्स्ट में परिवर्तित करें और मूल फ़ाइल को ओवरराइट करें।

इस मामले में, इसका अर्थ यह होगा कि फ़ाइल को एक सरणी में टेक्स्ट फ़ाइल लोड करने के लिए प्रत्येक तत्व के साथ उपयोगकर्ता नाम और पासवर्ड होना चाहिए, उपयोगकर्ता नाम और पासवर्ड को अलग से प्राप्त करने के लिए अल्पविराम पर सरणी के सभी तत्वों को विस्फोट करें , परिवर्तन करने के लिए आपको आवश्यक परिवर्तन करें, फिर संशोधित डेटा डिस्क पर लिखें।

आपको डेटा पढ़ने के लिए fgetcsv() उपयोगी भी मिल सकता है। यदि आप SplFileObject और PHP का हालिया संस्करण रखते हैं तो fputcsv() डेटा को वापस लिखने के लिए भी उपलब्ध हो सकता है।

हालांकि, केवल डेटाबेस का उपयोग करना एक बेहतर समाधान है। नौकरी के लिए सही उपकरण।

0

यदि आप * निक्स सिस्टम पर हैं तो आप sed का उपयोग कर सकते हैं; मैं यह फ़ाइल के साथ खेल से neater खोजने के हैंडल आदि:

exec("sed -i '/^$username,.\+\$/$username,$userpwd/g' ./users.txt 2>&1", $output, $return); 

यदि नहीं मैं GordonM साथ सहमत हैं और एक PHP डेटा संरचना में फ़ाइल को पार्स, यह हेरफेर, फिर इसे वापस डाल चाहते हैं:

$data = file_get_contents('./users.txt'); 

$users = array_map(function($line) { 
    return explode(',', $line); 
}, explode("\n", $data)); 

foreach ($users as $i => $user) { 
    if ($user[0] == $username) { 
    $user[1] = $userpwd; 
    $users[$i] = $user; 
    } 
} 

file_put_contents('./users.txt', implode("\n", array_map(function($line) { 
    return implode(',', $line); 
}, $users))); 

निश्चित रूप से, ऐसा करने के तरीकों की एक अनंत संख्या है!

संबंधित मुद्दे