PHP - 从txt文件中删除文本

时间:2013-11-10 21:48:47

标签: php email

我的网站上有订阅功能,其中包含一个简单的表单,用户可以在其中键入电子邮件并围绕以下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文件中删除?

4 个答案:

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