2013-02-08 3 views
0

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

Меня попросили создать сценарий, который отправит всем пользователям в базе данных текущее количество бюллетеней, которые они имеют в системе.

Моя текущая система регистрации/регистрации - это сильно отредактированная версия HTML-Form-Guies Simple PHP Registration System.

Я знаю псевдокод для того, что я хочу делать.

Шаг за шагом, необходимый метод подходит для этого.

Call on EmailUsersTotalEntries, заполняет массив всеми пользователями в базе данных, выбирает первую запись в массиве, пользователь 1, находит сумму всех строк в столбце itemsold с идентификатором пользователя 1. затем отправляйте пользователя один электронный адрес с результатами выборки (предметов) из бюллетеней, где userid = 1; пользователю 1. Затем цикл переходит к пользователю 2 и делает то же самое, пока он не отправит электронное письмо каждому пользователю в базе данных.

Вот несколько способов, которые я либо написал, либо которые находятся в системе входа, которые будут использоваться для этого. Моя единственная проблема заключается в том, что я не знаю, как создать цикл, чтобы он начинался с пользователя 1, а затем продолжал идти полным ходом для пользователя 2, и я не знаю, как запросить базу данных для user_id любого пользователя в базе данных/петле в настоящее время.

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

function EmailTotalEntries() 
{ 
    if(empty($_POST['email'])) 
    { 
     $this->HandleError("Email is empty!"); 
     return false; 
    } 
    $user_rec = array(); 
    if(false === $this->GetUsers($user_rec)) 
    { 
     return false; 
    } 
    **/* $TotalEntries = array(); */** 
    if(false === $this->GetTotalEntriesForEmail($user_rec, $TotalEntries) 
    { 
     return false; 
    } 

    //At this point, I have an array, user_rec, populated with all the data from my users table, and an array $TotalEntries that will have nothing since its trying to pull from user_rec, which usually is one user but right now is all of the users. 
    //This is where I know I should have already started the loop, so chosen the first element in user_rec, and applied the GetTotalEntriesForEmail method, then the SendUserEmail method, then gone to the top of the loop and gone to the second user_rec element and repeat. 

    if(false === $this->SendUsersEmail($user_rec, $TotalEntries)) 
    { 
     return false; 
    } 
    return true; 
} 

Это метод, который собирает пользователей

function GetUsers(&$user_rec) 
{ 
    if(!$this->DBLogin()) 
    { 
     $this->HandleError("Database login failed!"); 
     return false; 
    } 

    $result = mysql_query("Select * from $this->tablename",$this->connection); 

    $user_rec = mysql_fetch_assoc($result); 

    return true; 
} 

Вот метод, который я написал, чтобы получить TotalEntries для пользователя который вошел в систему (проверка его панели управления, чтобы увидеть, сколько записей он)

function GetTotalEntries() 
{ 
    if(!$this->CheckLogin()) 
    { 
     $this->HandleError("Not logged in!"); 
     return false; 
    } 

    $user_rec = array(); 
    if(!$this->GetUserFromEmail($this->UserEmail(),$user_rec)) 
    { 
     return false; 
    } 
    $qry = "SELECT SUM(itemsold) AS TotalEntries FROM entries WHERE user_id = '".$user_rec['id_user']."'"; 
    $result = mysql_query($qry,$this->connection); 
    while($row = mysql_fetch_array($result)) 
         {       
    echo $row['TotalEntries']; 
         } 



} 

А вот как я считаю, что должна быть адаптирована к работайте в электронной почте.

function GetTotalEntriesForEmail($user_rec, &$TotalEntries) 
{ 
    if(!$this->DBLogin()) 
    { 
     $this->HandleError("Database login failed!"); 
     return false; 
    } 


    $qry = "SELECT SUM(itemsold) FROM entries WHERE user_id = '".$user_rec['id_user']."'"; //$user_rec['id_user'] should the be id of the user the loop is currently on. 
    $result = mysql_query($qry,$this->connection); 
    $TotalEntries = mysql_fetch_assoc($result); 
      return true; 

} 

Heres фактический адрес электронной почты

function SendUsers($user_rec, $TotalBallots) 
{ 
    $email = $user_rec['email']; //should be the for the user the loop is currently on. 

    $mailer = new PHPMailer(); 

    $mailer->CharSet = 'utf-8'; 

    $mailer->AddAddress($email,$user_rec['name']); //user the loop is currently on. 

    $mailer->Subject = "Total Ballots to Date"; 

    $mailer->From = $this->GetFromAddress(); 

    $mailer->Body ="Hello ".$user_rec['name']."\r\n\r\n". //Same thing 
    "To date you have: "/* .$TotalBallots. */" ballots.\r\n" //Same thing 

    if(!$mailer->Send()) 
    { 
     return false; 
    } 
    return true; 
}  

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

Если я гавань было ясно, может дать пример на другом языке будет понятнее, поэтому Вот что я хочу сделать, но в Java

for(x = 0; x <= user_rec.length; x++) 
{ 
int ballots = getTotalEntriesForUser(x); 
sendEmailToUser(ballots) 
} 

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

Как я могу объединить приведенный выше код с циклом, который будет отправлять всем пользователям электронное письмо по одному, каждый адрес электронной почты, уникальный для пользователя, которому он отправлен?

ответ

1

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

Не зная своей структуры стола, я просто угадываю об этом.

$sql = mysql_query("SELECT u.*, 
          u.user_id AS user, 
          COALESCE(SUM(e.itemssold), 0) AS total_items 
        FROM users u 
        LEFT JOIN entries e ON e.user_id = u.user_id 
        GROUP BY u.user_id"); 

while($row = mysql_fetch_array($sql)) 
{ 
    $user = $row['user']; 
    $email = $row['user_email']; 
    $items = $row['total_items']; 

    yourEmailFunction($email, $items); 
} 

Это извлекает информацию из таблицы ваших пользователей и таблицу записей на основе соответствия идентификатора пользователя. Он устанавливает идентификатор пользователя из пользовательской таблицы в качестве пользователя, поэтому вам не нужно пытаться различать их позже. Чтобы узнать о функции COALESCE, read here. Функция while() будет циклически проходить через каждого пользователя, который он извлекает из этого оператора SQL.

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

Однако, если вы знаете, что ваши функции работают правильно, и вы хотите использовать цикл for, например тот, который вы предоставили на Java, вот как вы можете написать его на PHP.

for($x = 0; $x <= count($user_rec); $x++) 
{ 
    $ballots = getTotalEntriesForUser($x); 
    sendEmailToUser($ballots); 
} 
+0

Что такое u и e? Способ настройки моей базы данных, ее конкурс с двумя таблицами, пользователями и записями. (contest.users и contest.entries) –

+0

В моей базе данных пользователей требуются столбцы id_user и email, а в таблице записей user_id (должен совпадать с id_user от пользователей) и itemsold –

+0

Oh! Я понимаю. Получил запрос на работу, и я точно вижу, что он делает, с этим я могу работать, спасибо! –

Смежные вопросы