Intereting Posts
Как читать выборку (PDO :: FETCH_ASSOC); Функция curl_init () не работает Существует ли транспортная реализация IPC для Thrift? или решения с низкой задержкой SOA Цена форматирования как запятая Получать папки и файлы рекурсивно из папки в алфавитном порядке в PHP? Разработка пакета Laravel 5: с чего начать? Как отсортировать многомерный массив по значению? .htaccess исправить довольно постоянную ссылку в PHP? Каков предел в размере переменной Php при сохранении строки? Разница между интерполяцией (с использованием {} squiggly brackets) и конкатенации (., Или точки) при построении оператора SQL Stop Warning: date () : from localhost Активная запись Codeigniter 2 – Как создать временную таблицу для применения второго порядка сортировки? Не получать события с PAMI Отображение изображений, прикрепленных к странице, содержит медиа-галерею (и не все вложения) Как установить php-cgi в качестве плагина в Mac OS (OS X 10.10)?

PHP-скрипт для удаления адресов электронной почты из списка, разделенного запятыми

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

 email1@yahoo.com,email2@yahoo.com,blah,blah,blah 

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

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

Например, скажем, содержимое email.txt

 john@yahoo.com,peter@yahoo.com,steve@yahoo.com 

Если я наберу «peter@yahoo.com» в текстовое поле, отображаемое моим желаемым скриптом, я хочу, чтобы файл выглядел следующим образом:

 john@yahoo.com,steve@yahoo.com 

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(); } ?> с <?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(); } ?> 

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

ОБНОВЛЕНИЕ 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 e-mail в списке и удаляет его.

ОБНОВЛЕНИЕ 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!" как только он выполнил код.

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

Этот ответ был первоначально приложен к органу вопроса ОР.

Сначала я переместил форму в /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."); } 

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

 CREATE TABLE `emails` (`address` VARCHAR(255) NOT NULL, PRIMARY KEY (`address`)) ENGINE=InnoDB INSERT INTO `emails` VALUES ('user1@example.com') SELECT * FROM `emails` DELETE FROM `emails` WHERE `address`='user1@example.com' 

Это просто бесконечно проще и эффективнее текстового файла …

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

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

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

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

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

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

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

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

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

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

} else { showForm(); } } 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(); } с <?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(); } 

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

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

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

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

 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(); } не 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(); }