2011-12-30 1 views
-1

Я запустил небольшой веб-сайт, и мои пользователи попросили настроить список рассылки. Я нашел простой бесплатный скрипт, который добавляет адреса электронной почты в защищенном текстовый файл, email.txt в формате CSV:PHP-скрипт для удаления адресов электронной почты из списка, разделенного запятой

[email protected],[email protected],blah,blah,blah 

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

Все, что я хочу, это простой PHP-скрипт, который отображает текстовое поле, чтобы пользователи могли вводить свои адреса электронной почты и нажимать кнопку «Отменить рассылку». Сценарий должен искать текстовый файл, находить заданный адрес электронной почты и удалять его и его конечную запятую.

Например, говорят, что содержимое email.txt являются

[email protected],[email protected],[email protected] 

Если я типа «[email protected]» в текстовое поле отображается моим желаемым сценарием, я хочу, чтобы файл выглядеть следующим образом:

[email protected],[email protected] 

UPDATE: Я попробовал этот код:

<?php 
     function showForm() { 
      echo ' 
      <form method="post" action=""> 
      Email Address: <input type="text" name="email"> <br /> 
      <input type="submit" value="Cancel Newsletter" name="submit"> 
      </form> 
      '; 
     } 

     $_POST['email'] 

     $to_delete = 'email'; 
     $file = array_flip(explode(",",file_get_contents("email.txt"))); 
     unset($file[$to_delete]); 
     file_put_contents("email.txt",implode(",",array_flip($file)); 

     if(!$file_put_contents) { 
      die('Error occured'); 
     } else { 
      echo 'Your subscription has been cancelled. You will not receive any further emails from us.'; 
     } 
    } 
} else { 
    showForm(); 
} 
?> 

Этот код даже не показывает форму.

UPDATE 2:

Другая попытка написания этого сценария:

<?php 
    $email = $_POST["email"]; 
    $text = file_get_contents("email.txt"); 
    $oldWord = "$email"; 
    $newWord = ""; 
    $text = str_replace($oldWord , $newWord , $text); 
    $fp = fopen('email.txt', 'w'); 
    fwrite($fp, $text); 
    fclose($file); 
?> 

Это работает, как далеко, как удаление электронной почты идет, но нет никакого объявления (эхо). Я хотел бы, чтобы он сказал либо «что письмо не подписано», либо «вы были удалены» на основе того, успешно ли сценарий находит $email в списке и удаляет его.

UPDATE 3 31 декабря 2011:

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

<html> 
    <body> 
     <form method="post" action=""> 
      <p>Email Address: <input type="text" name="email"></p> 
      <input type="submit" value="Cancel Newsletter" name="submit"> 
     </form> 

     <?php 
      $email = $_POST["email"]; 
      $basetext = file_get_contents("email.txt"); 
      $oldWord = "$email"; 
      $newWord = ""; 
      $text = str_replace($oldWord , $newWord , $basetext); 
      $str1 = $basetext; 
      // echo strlen($str1); 
      $str2 = $text; 
      // echo strlen($str2); 
      $fp = fopen('email.txt', 'w'); 
      fwrite($fp, $text); 
      if ($str1 > $str2) { // This part handles the success/fail message 
       echo ("Success!"); 
      } else { 
       echo ("Fail!"); 
      } 
      fclose($file); 
     ?> 
    </body> 
</html> 

Это работает отлично. Однако при загрузке страницы отображается сообщение об ошибке, а не при загрузке, после нажатия кнопки отправки.

Я хотел бы сохранить исходный код, если возможно, просто перестроен, чтобы он показывал только «Успех!». или "Fail!" как только он выполнил код.

Я бы хотел, чтобы эхо-сообщения были последним скриптом, выполненным на странице.

+0

[PHPlist] (http://www.phplist.com/) – hakre

+0

Похоже, что вы должны иметь синтаксическую ошибку с вашим '$ _POST ['email']' строка. –

+0

как бы вы предлагаете мне это сделать, чтобы удалить ошибки? спасибо mate –

ответ

2

Этот ответ был первоначально добавлен к телу вопроса в ОП.

Сначала я переместил форму на /cancel.html и использовал <form action="/cancel_submit.html">.

(Где я написал .html, это просто, чтобы продемонстрировать, как и мой сервер настроен использовать не страницу расширений, а также с тем, что PHP разбирается на .html страницах.)

Тогда я поставил PHP код в страница /cancel_submit.html и переехал

if ($str1 > $str2) { 
    echo ("You Have Successfully Unsubscribed From Our Newsletter....<br>You Will Not Receive Any More Emails From Us."); 
} else { 
    echo ("The Email Address You Specified Is Not In Our Mailing List."); 
} 

к другому набору PHP скобок.

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

Я также добавил две запятые к $oldword = "$email";, чтобы сделать это $oldword = ",$email,";, чтобы он нашел только текст, введенный в поле электронной почты, если он имеет запятую с обеих сторон. Это касается случая, когда кто-то подает половину адреса электронной почты.

Я также изменил $newWord = ""; на $newWord = ",";, так что если сценарий удаляет адрес электронной почты запятыми с каждой стороны, два адреса электронной почты, которые были рядом с ним, не будут разделены запятой.

Вот код, у меня есть для обеих страниц в настоящее время:

  1. cancel.html

    <p>To cancel our Newsletter please enter your email address below....</p> 
    <p> 
    <form method="post" action="/cancel_submit.html"> 
    <p>Email Address: <input type="text" name="email"></p> 
    <input type="submit" value="Cancel Newsletter" name="submit"> 
    </form> 
    
  2. cancel_submit.html

    <?php 
        $email = $_POST["email"]; 
        $basetext = file_get_contents("email.txt"); 
        $oldWord = ",$email,"; 
        $newWord = ","; 
        $text = str_replace($oldWord , $newWord , $basetext); 
        $str1 = $basetext; 
        // echo strlen($str1); 
        $str2 = $text; 
        // echo strlen($str2); 
        $fp = fopen('email.txt', 'w'); 
        fwrite($fp, $text); 
        fclose($file); 
    ?> 
    <?php 
        if ($str1 > $str2) { 
         echo ("You Have Successfully Unsubscribed From Our Newsletter....<br>You Will Not Receive Any More Emails From Us."); 
        } else { 
         echo ("The Email Address You Specified Is Not In Our Mailing List."); 
        } 
    ?> 
    <p> 
        <p>Please wait to be re-directed or <a href="http://the-flying-shuttle.com/"><u>CLICK HERE.</u></a> 
        </p> 
    

EDIT:

Я сделал несколько улучшений. Я добавил:

$email = strtolower($email); 

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

Это перепутался команда сообщения подтверждения, поэтому я изменил его

if (str_replace($oldWord , $newWord , $basetext)) { 
    echo ("You Have Successfully Unsubscribed From Our Newsletter....<br>You Will Not Receive Any More Emails From Us."); 
} else { 
    echo ("The Email Address You Specified Is Not In Our Mailing List."); 
} 
3

Есть ли причина, по которой вы не используете базу данных?

CREATE TABLE `emails` (`address` VARCHAR(255) NOT NULL, PRIMARY KEY (`address`)) ENGINE=InnoDB 
INSERT INTO `emails` VALUES ('[email protected]') 
SELECT * FROM `emails` 
DELETE FROM `emails` WHERE `address`='[email protected]' 

Это просто гораздо проще и эффективнее, чем текстовый файл ...

Но если вы хотите использовать текстовый файл ...

$to_delete = '[email protected]'; 
$file = array_flip(explode(",",file_get_contents("email.txt"))); 
unset($file[$to_delete]); 
file_put_contents("email.txt",implode(",",array_flip($file)); 

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

Вы можете использовать подобный метод для добавления адресов электронной почты, просто изменив строку unset на $file['[email protected]'] = -1; (чтобы гарантировать, что число не конфликтует ни с чем, так как это может помешать переходу массива).

+0

На втором примере не работает 'str_replace ($ email, '', $ emailtxt), возможно,' str_replace (',,', ',', $ emailtxt) 'для очистки?(Или я предполагаю, что это регулярное выражение, так что все это на одной строке ...) –

+0

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

+0

Да, это было бы, но мой способ всегда копирует дубликаты. –

0

Предложенное исследование:

http://us.php.net/manual/en/function.explode.php
http://us3.php.net/manual/en/function.file-put-contents.php
отредактирован добавить: http://us3.php.net/manual/en/function.file-get-contents.php

Если вы в конечном итоге с сервисом 3 партии, не платят Aweber. Перейдите для MailChimp. У них есть бесплатный план, если ваш список рассылки не такой уж большой.

0

В вашем примере вы ссылаетесь на переменную $_POST['email'] без назначения или тестирования значения. Кроме того, вы можете очистить эту переменную.

Еще одна проблема, которую я видел, это то, что $to_delete = 'email';, вы ищете только адреса электронной почты.

Ваш $file_put_contents не назначен.

} else { showForm(); } не было сопряжено с утверждением if.

<?php 
function showForm() { 
    echo '<form method="post" action="">' . PHP_EOL 
     . 'Email Address: <input type="text" name="email"> <br />' . PHP_EOL 
     . '<input type="submit" value="Cancel Newsletter" name="submit">' . PHP_EOL 
     . '</form>'; 
} 

if($_POST['email']) { 

    $to_delete = $_POST['email']; 
    $file = array_flip(explode(",",file_get_contents("email.txt"))); 
    unset($file[$to_delete]); 
    $file_put_contents = file_put_contents("email.txt",implode(",",array_flip($file)); 

    if(!$file_put_contents) { 
     die('Error occured'); 
    } else { 
     echo 'Your subscription has been cancelled. You will not receive any further emails from us.'; 
    } 
} else { 
    showForm(); 
} 
+0

привет mate ive повезло, но все еще застрял, ive отредактировал оригинальный вопрос –

0

Если я правильно понимаю ваш вопрос, это то, чего вы пытаетесь достичь.

  • Проверьте, был ли пользователь отправлен из формы.
    • Получить электронное письмо. (Вы должны убедиться, что это значение на этом шаге).
    • Извлечь данные элемента.
    • Проверьте, не находится ли пользователь в списке.
      • Удалите пользователя и сохраните данные, если применимо.
    • Вывести результат функции.
  • Показать сообщение с формой для отправки на себя.

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

Я бы подошел к этой задаче таким образом.

class MailingList { 

    const EMAIL_OK = 1; 
    const ERR_EMAIL_EXISTS = -1; 
    const ERR_EMAIL_INVALID = -2; 
    const ERR_EMAIL_NOTFOUND = -3; 

    protected $_db_src; 
    protected $_db_opt; 
    protected $members = array(); // An array intended to hold members. 

    public function email_exists($email) { 
     return array_key_exists($this->members, $email); 
    } 

    public function remove_email($email) { 
     $this->_sanitize_email($email); 

     if ($email) { 
      if (array_key_exists($this->members, $email)) { 
       unset($this->members[$email]); 
       $this->_update_members(); 
       return self::EMAIL_OK; 
      } else { 
       return self::ERR_EMAIL_NOTFOUND; 
      } 
     } else { 
      return self::ERR_EMAIL_INVALID; 
     } 
    } 

    public function add_email($email) { 
     $this->_sanitize_email($email); 

     if ($email) { 
      if (array_key_exists($this->members) { 
       return self::ERR_EMAIL_EXISTS; 
      } else { 
       $this->members[$email] = -1; 
       $this->_save_members(); 
       $this->_load_members(); 
       return self::EMAIL_OK; 
      } 
     } else { 
      return self::ERR_EMAIL_INVALID; 
     } 
    } 

    // We expect a data source and options for the 
    //  data source upon instantiation. 
    // This is to prepare this class for abstraction and allow it to be 
    //  extended to databases. 

    public function __construct($data_source = "flatfile", $data_options = "email.txt") { 
     $this->_db_src = $data_source; 
     $this->_db_opt = $data_options; 

     $this->_load_members(); 
    } 

    protected function _load_members() { 
     // Create the function name to ensure it exists. 
     $data_function = "handle_" . $this->_db_src; 
     if (!method_exists(&$this, $this->_db_src)) { 
      throw new Exception('Invalid data source'); 
     } 

     // Build our array of parameters to be sent to our handler function. 
     $parameters = array_merge(array('load'), (array) $this->_db_opt); 

     // This calls our data function with a load action parameter. 
     // This is written to expect the data function to populate $this->members. 
     return call_user_func_array(array(&$this, $data_function), $parameters); 
    } 

    // Most of this is similar to the constructor as far as data handling goes. 
    protected function _save_members() { 
     // Create the function name to ensure it exists. 
     $data_function = "handle_" . $this->_db_src; 
     if (!method_exists(&$this, $this->_db_src)) { 
      throw new Exception('Invalid data source'); 
     } 

     // Set up our data options with a save action. 
     $parameters = array_merge(array('save'), (array) $this->_db_opt); 

     return call_user_func_array(array(&$this, $data_function), $parameters); 
    } 

    // The heart of the storage engine, designed for CSV data. 
    protected function handle_flatfile($action, $filename) { 
     switch ($action) { 
      case "load": 
       // Make sure we can load members. 
       if (!is_readable($filename)) { 
        throw new Exception("File: $filename, is not readable"); 
       } 
       // Open our data file and load the information. 
       // Populate $this->members as an array just the way we expect it. 
       $this->members = array_flip(explode(',', file_get_contents($filename))); 
       break; 
      case "save": 
       // Make sure we can write to the file before we move forward. 
       if (!is_writeable($filename)) { 
        throw new Exception("File $filename, is now writable"); 
       } 
       // Convert our array back to a CSV string and write it to the file. 
       $status = file_put_contents($filename, implode(',', array_flip($this->members))); 
       // If we failed to write to the file make sure something is done before we continue. 
       if (!$status) { 
        throw new Exception("Writing to file failed!"); 
       } 
       break; 
      default: 
       throw new Exception("Unknown action called on data handler."); 
     } 
    } 

    // converts email addresses to lowercase to avoid duplication. 
    // should add a regex filter here to ensure that we have a valid address 
    protected function _sanitize_email(&$email) { 
     $email = strtolower($email); 
    } 

} 

function show_form() { 
    echo '<form method="post" action="">' . PHP_EOL 
     . 'Email Address: <input type="text" name="email"> <br />' . PHP_EOL 
     . '<input type="submit" value="Cancel Newsletter" name="submit">' . PHP_EOL 
     . '</form>'; 
} 

if (isset($_POST) && isset($_POST['email'])) { 
    $list = new MailingList(); 
    $status = $list->remove_email($_POST['email']); 

    switch ($status) { 
     case MalingList::EMAIL_OK: 
      echo "<p class='success'>Your email was successfully removed.<p>"; 
      break; 
     case MailingList::ERR_EMAIL_INVALID: 
      echo "<p class='error'>The email address provided was invalid.</p>"; 
     case MailingList::ERR_EMAIL_NOTFOUND: 
      echo "<p class='error'>The email address provided was not registered.</p>"; 
     default: 
      show_form(); 
    } 
} else { 
    show_form(); 
} 
+0

Я немного выходил за рамки вопроса, но у меня были мысли, которые я чувствовал обязан сообщить вам, и не знал, как выражать их, кроме как в коде. –

+0

как вы научились печатать, как этот lol, его гений: D # –

+0

http://www.php.net/manual/en/language.oop5.basic.php Это довольно простой класс, кроме конструкции, допускающей расширение создав новый обработчик. Мой идеал состоит в том, чтобы абстрагировать все детали, о которых вы не хотите беспокоиться. Делая это, мы отделили слой данных и сосредоточили внимание на желаемой функциональности. Затем мы вернулись и добавили необходимые функции, чтобы заставить его работать, добавив простой слой данных с плоскими файлами. –