【问题标题】:PHP - Need Help With LogicPHP - 需要逻辑帮助
【发布时间】:2009-09-01 06:03:37
【问题描述】:

我目前正在编写一个 PHP/MySQL 脚本,该脚本按以下顺序执行以下操作:

1) 检查数据库是否有任何需要转换的视频 2) 一旦确定一个视频需要转换,就开始转换 *3) 通知视频的“创建者”它已创建。 *4) 通知作为视频“接收者”的所有用户,他们有一个新视频。

请注意,我正在就上面加星号的数字寻求帮助。

这是我的基本数据库/表结构(有些部分故意省略,因为我不想输入它们:

video_data:
  id
  creator_id
  needs_process  

video_info
  id
  video_id (relational to 'id' in table above).
  receiver_id

tblusers
  usrID
  usrFirst
  usrLast
  usrEmail

这是我目前在我的脚本中的内容:

<?php
   require("connection.php");
   $rs = mysql_db_query($DBname,$sql,$link); 
   $data = mysql_query("SELECT * FROM video_data WHERE needs_process=1 LIMIT 1") or die(mysql_error());

 while($row = mysql_fetch_array( $data ))
   { 
$id = $row['id'];
$sender = $row['sender_id'];


        //Convert The Video Here (I've already written this code).


        //Maybe Create a Thumbnail Too (I've already written this code).

    }

我的问题是:在上面的代码中,我将如何向“创建者”(总是 1 人)和接收者(有时是多个接收者)发送电子邮件。此外,这些可能是“单独的”或“不同的”电子邮件。例如,创建者会收到一封电子邮件,内容是“感谢上传!”,而接收者会收到一封电子邮件,内容是“您有一个新视频。”

对此的任何帮助都会很棒!

【问题讨论】:

  • 只是一个提示:“或死(mysql_error());”除了良好的错误处理之外就是一切

标签: php email logic


【解决方案1】:

是这样的:

<?php
   require("connection.php");
   $rs = mysql_db_query($DBname,$sql,$link); 
   $data = mysql_query("SELECT * FROM video_data WHERE needs_process=1 LIMIT 1") or die(mysql_error());

 while($row = mysql_fetch_array( $data ))
   { 
$id = $row['id'];
$sender = $row['sender_id'];
        //Convert The Video Here (I've already written this code).
        //Maybe Create a Thumbnail Too (I've already written this code).

        //mail the creator

        $data2 = mysql_query("SELECT * FROM tblusers WHERE usrID=$row[creator_id] LIMIT 1") or die(mysql_error());

        $creatordata = mysql_fetch_array( $data2 );

        mailtocreator($creatordata['userEmail'], $creatordata['usrFirst'].' '.$creatordata['usrLast']);
        //mail the receiver
        $data3 = mysql_query("SELECT * FROM tblusers t, video_info vi WHERE vi.video_id = $row[id] AND vi.receiver_id = t.usrID") or die(mysql_error());
        while($row2 = mysql_fetch_array($data3))
        {
                mailtocreator($row2['userEmail'], $row2['usrFirst'].' '.$row2['usrLast'], $creatordata['usrFirst'].' '.$creatordata['usrLast']);
          }

    }


function mailtocreator($toemail, $toname)
{
    //do send mail routine
    $subject = 'video processed';
    $message = 'hello '.$toname.',

Thank you for uploading video.';
    $headers = 'From: webmaster@example.com' . "\r\n" .
         'Reply-To: webmaster@example.com' . "\r\n" .
         'X-Mailer: PHP/' . phpversion();
    mail($toemail, $subject, $message, $headers);
}

function mailtoreceiver($toemail, $toname, $fromname)
{
    //do send mail routine
    $subject = 'new video received';
    $message = 'hello '.$toname.',

You just got new video from '.$fromname.'.';
    $headers = 'From: webmaster@example.com' . "\r\n" .
         'Reply-To: webmaster@example.com' . "\r\n" .
         'X-Mailer: PHP/' . phpversion();
    mail($toemail, $subject, $message, $headers);
}

基本上就是围绕这个查询:

$data2 = mysql_query("SELECT * FROM tblusers WHERE usrID=$row[creator_id] LIMIT 1") or die(mysql_error());

检索当前上传者的详细信息(取自$row[creator_id])和

$data3 = mysql_query("SELECT * FROM tblusers t, video_info vi WHERE vi.video_id = $row[id] AND vi.receiver_id = t.usrID") or die(mysql_error());

通过查询表 tblusers 和 video_info 来检索所有接收者,然后将这些信息分别发送到 mailtocreator 和 mailtoreceiver。

【讨论】:

  • 这里也一样,to die() 不是很好,因为它很难调试。而且“select * from”也不是很好。你不需要所有的行,那么为什么要把这些数据从磁盘复制到 PHP 中呢?
  • 此外,“SELECT * FROM tblusers WHERE usrID=$row[creator_id] LIMIT 1”没有用。更好地编写使用单引号和字符串连接: 'SELECT * FROM tblusers WHERE usrID=' 。 $row[creator_id] 。 'LIMIT 1' 但我不明白为什么要附加 LIMIT 1。每个用户 ID 是否有多个用户?糟糕的风格...
  • @tuergeist:是的,风格很糟糕。我只想展示算法。至于 LIMIT 1,@Dodinas 上面指出上传者/创建者将始终为 ONE。现在,谁投反对票?那他/她为什么不写出正确的答案呢?
  • 嗯,这就是我要找的东西,我给了你 +1 和正确的答案。这对我帮助很大。感谢您的宝贵时间。