Вы будете лучше с помощью новой строки вместо запятых:
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 вне корневого каталога сайта.
Спамеры хотели бы скачать этот файл 'emails.txt' ... – HamZa
' Как настроить функцию отмены подписки? Ну, почти так же, как вы настроили функцию подписки. На каком этапе вы точно застряли? –
Замените строку на текстовый файл, заменив адрес электронной почты на '' ''. Также я хотел бы предложить перейти от текстового файла к БД или, по крайней мере, к CSV. – Vector