주에

2012-02-16 2 views
1

가능한 중복을 upcomming 생일을 찾을 :
How would I get the birthdays of friends who are celebrating their birthday this week, this month and next month using MYSQL and PHP?주에

내가 필드 사용자 ID, 사용자 이름, 생년월일 (형식 YYYY-MM-DD)을 사용자의 MySQL의 테이블이 있습니다. 그것은을 생성 - 프레드 스미스 8월 24일 빌 존스 8월 27일이 가 사라 코너가 9월 1일 데이비드 캐시디 9월 5일이

당신은 아이디어를 얻을 :

다가오는 생일 :이처럼 내 홈페이지에 뭔가를 표시하려면 다음 생일이 얼마인지를 보여주는 짧은 목록. 일과 월을 기준으로 연도를 무시합니다. 난 그냥 어떻게 쿼리를 할 생각이 없어 - 어떤 도움을 주시면 감사하겠습니다! 당신은 아마 당신이에서 쿼리하든 스크립트에서 원하는 주 범위를 계산해야 할 것

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

:

답변

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; 

꽤 길지만 자체적으로 문서화되고 있습니다 (나는 생각합니다). 1 년 내에 다시 돌아와서 무슨 일이 일어나고 있는지 정확히 볼 수 있습니다.

나는 날짜를 저장하는 방법에 대해 몇 가지 가정을했으나 (나는 항상 유닉스 타임 스탬프를 사용한다), 사용하고자한다면 유스 케이스에 맞출 수있을 것이라고 확신한다.

0

당신은 같은과이를 조회 할 수 있습니다.

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

그리고 내/사용자의/DbTable/User 다음을 포함하는 simplea 클래스 :

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

마지막으로 retr 데이터를 데이터베이스에서 가져온 경우 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 
+0

Zend_Db_Table을 얻는 방법은 매우 교묘합니다. '$ table = new Zend_Db_Table (array ('name'=> '사용자', 'primary'=> 'user_id'))'이 작업을 수행합니다. – vascowhite

+0

귀하의 오른쪽 vascowhite, 나는 사람들이 그것에 익숙해 있기 때문에 빠른 시작 예제를 가져 왔습니다. – Liyali

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

+0

현재 날짜가 12 월 31 일이면이 방법이 작동하지 않는다고 생각합니다. –

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"; 
} 
관련 문제