找到即将到来的生日周

时间:2012-02-16 14:36:31

标签: php zend-framework

  

可能重复:
  How would I get the birthdays of friends who are celebrating their birthday this week, this month and next month using MYSQL and PHP?

我有一个用户的mysql表,其字段为UserId,Username,Birthdate(格式为YYYY-MM-DD)。我想在我的主页上显示一些内容:

即将到来的生日: 弗雷德史密斯8月24日 比尔琼斯8月27日 Sarah Connor 9月1日 大卫卡西迪9月5日

你明白了 - 它会生成一个简短的列表,列出接下来的生日,忽略年份,仅基于日期和月份。我只是不知道如何进行查询 - 任何帮助都将不胜感激!

5 个答案:

答案 0 :(得分:2)

您可以使用mysql DATE_FORMAT()功能。这应该给你当天和现在7天之间的所有生日:

SELECT username, DATE_FORMAT(Birthdate,'%M %d') as 'birthday' FROM table WHERE DATE_FORMAT(Birthdate,'%m-%d') BETWEEN DATE_FORMAT(CURDATE(),'%m-%d') AND DATE_FORMAT(ADDDATE(NOW(), INTERVAL 7 DAY), '%m-%d') ORDER BY DATE_FORMAT(Birthdate,'%m-%d');

答案 1 :(得分:1)

首先,您需要检索用户列表,如下所示:

$adapter = Zend_Db_Table::getDefaultAdapter()
$table = $adapter->getDbTable() 
$select  = $table->select();
$select->where('active = ?', true); // if needed
$user = $table->fetchAll($select);

你的getDbTable与Zend Quickstart中的那个非常相似:

public function setDbTable($dbTable)
{
    if (is_string($dbTable)) {
        $dbTable = new $dbTable();
    }
    if (! $dbTable instanceof Zend_Db_Table_Abstract) {
        throw new Exception('Invalid table provided');
    }
    $this->_dbTable = $dbTable;
    return $this;
}

public function getDbTable()
{
    if (null === $this->_dbTable) {
        $this->setDbTable('My_Users_DbTable_User');
    }
    return $this->_dbTable;
}

在My / Users / DbTable / User中包含以下内容的simpla类:

class My_Users_DbTable_User extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
}

最后,当您从数据库中检索数据时,您可以使用current()toArray()方法迭代您提取的每一行。有关详细信息,请参阅Zend_Db_Table_Row documentation

为了仅显示生日的日期和月份,您可以使用非常有用的Zend_Date

$date = "1970-12-10";
$d = new Zend_Date($date);
echo $d->toString(Zend_Date::DAY) . " " . $d->toString(Zend_Date::MONTH_NAME_SHORT);
// output: 10 Dec

答案 2 :(得分:1)

另一个选择是创建一个函数,它将位于一个帮助器类中,或者可能进入你的用户类: -

/**
 * Fetches a list of birthdays coming up in the following week
 * @return array an array user's birthdays
 */
public function getBirthdays()
{
    $date = new DateTime();
    $date->setTime(0, 0, 1);
    $today = $date->getTimestamp();
    $week = new DateInterval('P7D');
    $date->add($week);
    $date->setTime(23, 59, 59);
    $nextWeek = $date->getTimestamp();
    $select = new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter());
    $select ->from('users', array('user_name', 'user_dob'))
            ->where('user_dob > ?', $today)
            ->where('user_dob < ?', $nextWeek);
    return $select->query()->fetchAll();
}

然后你就做了: -

$birthdays = $classYouMade->getBirthdays();
$html = '';
foreach($birthdays as $bday){
     $html .= "Happy Birthday to {$bday['user_name']} on ";
     $html .= date('jS F', $bday['user_dob']) . '<br/>';
}
echo $html;

这很长,但是自我记录(我认为),你可以在一年的时间内回来看看,确切地看到发生了什么。

我当然对如何存储日期等做了一些假设(我总是使用unix时间戳),但是如果你想使用它,我相信你可以根据你的用例进行调整。

答案 3 :(得分:0)

您可以使用以下内容进行查询:

SELECT username, birthdate FROM table WHERE birthdate >= beginning_of_week AND birthdate <= end_of_week

您可能需要在您查询的任何脚本中计算所需的周范围。

答案 4 :(得分:0)

您应该能够使用简单的SQL查询获取列表:

select UserId, Username, Birthdate from Users where Birthdate >= CURDATE() and Birthdate <= DATE_ADD(CURDATE(), INTERVAL + 2 WEEK) order by Birthdate ASC

然后,您可以使用PHP中的DateTime :: format()格式化文本。

while ($row = mysql_fetch_assoc($res))
{
    $birthday = new DateTime($row['Birthdate']);
    print $row['Username']." ".$birthday->format('d M')."\n";
}