0

私は Web サイト用のコンテスト システムを構築しました。ユーザーがログインし、実際のイベント (特定のオブジェクトの販売) に基づいて投票を送信し、月末にランダム投票が行われる仕組みです。選ばれ、その投票の所有者が勝者です。

データベース内のすべてのユーザーに、システム内の現在の投票数を電子メールで送信するスクリプトを作成するように依頼されました。

私の現在のログイン/登録システムは、 HTML-Form-Guies Simple PHP Registration Systemを大幅に編集したバージョンです。

やりたいことの擬似コードを知っています。

段階的に、必要な方法は次のようになります。

EmailUsersTotalEntries を呼び出し、データベース内のすべてのユーザーを配列に入力し、配列内の最初のエントリであるユーザー 1 を選択し、itemsold 列のすべての行の合計をユーザー ID 1 で見つけます。次に、ユーザー 1 に電子メールを送信します。 userid = 1 の投票から sum(itemsold) を選択した結果。次にループはユーザー 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;

}

実際のメールはこちら

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 があまり得意ではなく、このすべてが私にとって学習経験であるため、助けていただければ幸いです。

私が明確でない場合は、別の言語で例を挙げた方が明確になるかもしれません。

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

十分に明確でない場合はお知らせください。できる限り明確にするよう努めます。

上記のコードを、送信先のユーザーに固有の各メールを 1 つずつ、すべてのユーザーに送信するループと組み合わせるにはどうすればよいですか?

4

1 に答える 1

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);
}

これにより、一致するユーザーIDに基づいて、ユーザーテーブルとエントリテーブルから情報が取得されます。ユーザーテーブルのユーザーIDをユーザーとして設定するため、後で2つを区別する必要はありません。COALESCE関数については、こちらをお読みください。while()関数は、そのSQLステートメントから取得するすべてのユーザーをループします。

これはまったくテストされていませんが、基本的にはそれが必要です。ユーザーの電子メールと合計アイテムを渡すだけで、その情報をその電子メールアドレスに送信するための電子メール関数を記述します。

ただし、関数が正しく機能することがわかっていて、Javaで提供したようなforループを使用したい場合は、次のようにPHPで記述します。

for($x = 0; $x <= count($user_rec); $x++)
{
    $ballots = getTotalEntriesForUser($x);
    sendEmailToUser($ballots);
}
于 2013-02-08T15:58:24.147 に答える