2016-02-29 2 views
2

У меня есть файл с именами пользователей и displaynames магазина в нем так:PHP Заменить строку в текстовом файле с помощью

testname=displayname<br> 
testname2=displayname2<br> 
etc=etc<br> 

Этот список делается дважды в тот же файл, одни и те же имена пользователей и те же displaynames. Мне нужно заменить их в обеих областях в списках (необходимо заменить дважды)

Я пытаюсь создать форму, в которой использование может изменить отображаемое имя. Я пытался скопировать код со страницы, где он искал пароли для своих учетных записей в файле, нашел его и заменил, однако он, похоже, не работает для этого файла.

Форма для изменения их имен проста, она включает в себя имя своего члена (чтобы я мог использовать это, чтобы найти его имя в списке), а затем использует то, что они ввели для отображаемого имени, чтобы изменить их имена отображаемое имя в файле.

Форма Страница Код:

<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> 

и ниже мой PHP код для обработки

<? 
$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); 
?> 

Когда входные данные и нажмите отправить, он идет на мою страницу успеха, однако это Безразлично» t внесите какие-либо изменения в соответствующий файл, и я не уверен, как сообщить, что мне не хватает.

ответ

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

Обратите внимание, что если у вас есть 2 похожих имени, таких как '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$ , а не значение переменной $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 символов, имея возможность разбить его на основе их имени и имени пользователя с = делает это еще проще –

Смежные вопросы