2013-11-10 3 views
0

Я имею подписаться функцией на моем сайте, который состоит из просто формы, в которой пользователь вводит свой адрес электронной почты и вокруг следующего PHP:PHP - удалить текст из текстового файла

$database = "emails.txt"; 
$file = fopen($database, "a+"); 
$size = filesize($database); 
$email = $_POST['email']; 
if($_POST['submit']) fwrite($file, "$email,"); 
if($_POST['submit']) echo "<p style='color:white; margin-top:25px;'>*Check your inbox*</p>"; 
?> 

Как я могу настроить когда пользователь вводит свою электронную почту в форму и затем удаляется из файла .txt?

+2

Спамеры хотели бы скачать этот файл 'emails.txt' ... – HamZa

+2

' Как настроить функцию отмены подписки? Ну, почти так же, как вы настроили функцию подписки. На каком этапе вы точно застряли? –

+0

Замените строку на текстовый файл, заменив адрес электронной почты на '' ''. Также я хотел бы предложить перейти от текстового файла к БД или, по крайней мере, к CSV. – Vector

ответ

1

Было бы намного проще с базой данных, такой как MySQL.

Ваше решение опирается на файл «emails.txt» и имеет несколько disadavantages:

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

Вы можете прочитать все это в массиве, а затем написать строки обратно в файл, который не соответствует.

$find = '[email protected]'; 
$emails = file('emails.txt'); 

foreach ($emails as $email) { 
    if (!strstr($email, $find)) { 
     $result .= $email; 
    } 
} 

file_put_contents('emails.txt', $result); 

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

+0

Этот подход можно использовать, если файл emails.txt невелик. В другом случае сценарий выходит из строя по ограничению памяти. –

+1

Хорошая точка. Это был скорее теоретический ответ, а истинный ответ: «Не делайте этого, используйте фактическую базу данных». –

1

Это, как я хотел бы сделать это

$email = $_GET['email']; 

$deletedFormat = ""; 

//read the entire string 
$str=file_get_contents('emails.txt'); 

//replace something in the file string - this is a VERY simple example 
$str=str_replace("$email", "$deletedFormat",$str); 

file_put_contents('emails', $str); 
+0

'$ deletedFormat' пуст :). В конечном итоге вы получите такой файл: '[email protected] ,,,,, another @ email.com ,,' потому что вы не удаляете никакой запятой. –

+0

Вы можете легко исправить эту проблему '$ email = $ _GET ['email'].", ";'. Моим примером была логика. Я уверен, что для этого потребуются некоторые условия для кондиционирования и отделки. Я не собираюсь писать полный скрипт :) – Vector

+0

Хорошо. Извините за nitpicking. –

0

Вы будете лучше с помощью новой строки вместо запятых:

if ($_POST['subscribe'])) { 
    touch('emails.txt'); 
    $emails = file('emails.txt', FILE_IGNORE_NEW_LINES); 

    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) 
      && !in_array($_POST['email'], $emails)) { 
     $emails[] = $_POST['email']; 
     file_put_contents('emails.txt', explode("\n", $emails)); 
    } 
} elseif ($_POST['unsubscribe']) { 
    touch('emails.txt'); 
    $emails = file('emails.txt', FILE_IGNORE_NEW_LINES); 

    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) 
      && ($index = array_search($_POST['email'], $emails)) !== false) { 
     unset($emails[$index]); 
     file_put_contents('emails.txt', explode("\n", $emails)); 
    } 
} 

Убедитесь, чтобы защитить ваш emails.txt файл вне корня сайта каталог.

Вы могли бы хотеть использовать SQLite базу данных для этого:

$db = new PDO('sqlite:emails.sqlite'); 
$db->exec('CREATE TABLE IF NOT EXISTS subscriptions (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    email VARCHAR(64) NOT NULL UNIQUE 
)'); 

if ($_POST['subscribe']) { 
    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
     $stmt = $db->prepare('INSERT ON CONFLICT IGNORE subscriptions (email) VALUES (:email)'); 
     $stmt->bindValue(':email', $_POST['email']); 
     $stmt->execute(); 
    } 
} elseif ($_POST['unsubscribe']) { 
    if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
     $stmt = $db->prepare('DELETE FROM subscriptions WHERE email = :email'); 
     $stmt->bindValue(':email', $_POST['email']); 
     $stmt->execute(); 
    } 
} 

Это не тестировался, но должен работать. Обязательно также защитите свой email.sqlite вне корневого каталога сайта.

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