我的网站上有订阅功能,其中包含一个简单的表单,用户可以在其中键入电子邮件并围绕以下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文件中删除?
答案 0 :(得分:1)
使用像MySQL这样的数据库会更容易。
您的解决方案依赖于'emails.txt'文件,它有几个不利条件:
flock
功能。答案 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);
答案 2 :(得分:0)
您可以将其全部读入数组,然后只将行写回不匹配的文件。
$find = 'joe@bloggs.com';
$emails = file('emails.txt');
foreach ($emails as $email) {
if ( !strstr($email, $find) ) {
$result .= $email;
}
}
file_put_contents('emails.txt', $result);
实际上,您应该使用MySQL数据库来实现这样的目标。它使搜索和操作记录变得微不足道,更不用说下载文本文件的人所面临的安全风险 - 这对订阅您服务的人来说是非常不负责任的。
答案 3 :(得分: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();
}
}
它没有经过测试,但应该可行。确保还保护站点根目录之外的 emails.sqlite 。