2016-02-29 35 views
2

我有一個用戶名和displaynames店就這樣的文件替換文本文件中的字符串。我需要在列表中的兩個區域中替換它們(需要被替換兩次)PHP使用

我試圖創建一個表單,用戶可以更改它們的顯示名稱。我試圖從一個頁面複製我的代碼,在那裏它查找文件中的帳戶密碼,找到它並替換它,但它似乎不適用於此文件。

用於更改名稱的表單很簡單,它將它們輸入到它們的成員名稱中(所以我可以使用它來讓它在列表中找到它們的名稱),然後使用它們輸入的顯示名稱來更改它們的名稱在文件中顯示名稱。

窗體頁代碼:

<center>Change Display Name:<p> 
<form action="http://example.com/xxx/displaynamesave.php" class="form" method="post"> 
<input "membername" name="membername" /><p><input "displayname" name="displayname" /><p><input name="Submit" type="submit" /></form></p>/center> 

以下是處理

<? 
$fileurl = '/xxx/myfiles/sitename/xxx/memberfiletest'; 

$membername = $_POST['membername']; 
$displayname = $_POST['displayname']; 

$file = file($fileurl, FILE_IGNORE_NEW_LINES); // Get file as array of lines 

foreach ($file AS $n=>$line) 
if (substr($line, 0, 20) === '$membername') // Line starts with 'membername' 
    $file[$n] = '$membername = '.$displayname; // Replace displayname 

file_put_contents($fileurl, implode("\n", $file)); // Put file back together 
$success_page = 'http://example.com/thisplace/xxx/xxx/successredirector.html'; 
header('Location: '.$success_page); 
?> 

當我輸入的數據,並點擊提交我的PHP代碼,它進入我的成功頁面,但是它不」不要在正確的文件中做任何改變,我不確定如何知道我錯過了什麼。

回答

0

使用strpos

foreach ($file as $n => $line) { 
    if (strpos($line, $membername) === 0) { // Line starts with 'membername' 
     $file[$n] = $membername . ' = ' . $displayname; // Replace displayname 
    } 
} 
+0

美麗,我完全錯過了strpos,謝謝科迪! –

+0

注意,如果你有兩個類似的名字,比如'john'和'johns',你會得到不需要的效果('johns'可以被'john'覆蓋)。請參閱http://stackoverflow.com/a/35695745/487923以避免它。 – ksimka

+0

然後你可以:strpos($ line,$ membername。「=」)=== 0來避免這個問題。 – Kordi

0

您正在使用'中的變量。試試這個:

foreach ($file as $n => $line) { 
    list($name, $dname) = explode('=', trim($line)); 
    if ($name === $membername) { // Line starts with 'membername' 
     $file[$n] = $membername . ' = ' . $displayname; // Replace displayname 
    } 
} 
+0

完全錯過了,謝謝你ksimka,可悲的是做出這樣的轉變還是經歷,但不會對文件 –

+0

有任何改變,因爲有其他錯誤。請參閱http://stackoverflow.com/a/35695833/487923 – ksimka

+0

更新了答案。 – ksimka

3

首先,你的比較顯示在單引號'變量,這意味着PHP不會解析它實際上是在比較一切$成員名稱 ,而不是變量$membername的值。更改比較:

foreach ($file as $n => $line) { 
    if (substr($line, 0, 20) === $membername) { // Line starts with 'membername' 
     $file[$n] = $membername . ' = ' . $displayname; // Replace displayname 
    } 
} 

其次,在你的文件的內容,例如,「用戶名」部分相同的長度並不是所有的(「測試名」,「等」),但你的比較檢查對行的前20個字符。如果格式確實是username=displayname,那麼在=(當然有兩種方法可以做到這一點)和比較第一部分時,您可能會得到更好的結果。一個例子是這樣的:

foreach ($file as $n => $line) { 
    $parts = explode('=', $line); 
    if ($parts[0] == $membername) { 
     $file[$n] = $membername . ' = ' . $displayname; 
    } 
} 
+0

真棒,謝謝戴維斯我很欣賞這一點,因爲它更容易檢查一行中的前20個字符,當使用預先定義的詞,如「密碼」,你知道它有8個字符,能夠根據其成員名和用戶名使=更容易 –