使用FQL仅从Facebook API检索即将到来的生日

时间:2011-11-04 02:43:21

标签: facebook facebook-fql facebook-php-sdk strtotime

使用Facebook开发人员文档中的information on FQLthe user table,我提出了以下代码。

    //build fql string
    $fql = "SELECT name, birthday_date FROM user 
              WHERE uid IN
                (SELECT uid2 FROM friend WHERE uid1 = me())
              AND strlen(birthday_date) != 0 AND substr(birthday_date,0,3) 
            IN ('{$currentMonth}/', '{$nextMonth}/')";
    $fql.=$orderBy;
    $fql.=" LIMIT " . $limit;

    //query facebook
    $params  =   array(
                 'method'    => 'fql.query',       
                 'query'     => $fql,
                 'callback'  => ''     
                  );
    $birthdays  =  $this->facebook_obj->api($params);

$currentMonth$nextMonth分别设置为当前月份和下个月的字符串表示形式,格式为mm。 (例如“09”,“10”等)

这是“工作”,但是我们说今天是11月29日,我有11个朋友在11月生日,$limit设置为10.在这种情况下,10很有可能它返回的生日将全部在11月29日之前。

我真正想做的是从今天开始,即本月和下一个即将到来的生日。我怎么能修改这个查询来实现呢?

谢谢!

* * 编辑,请参阅Shawn和I之间的评论帖子,了解可能的替代解决方案。没有接受答案,因为没有答案直接解决原始代码/问题。

3 个答案:

答案 0 :(得分:9)

这已经晚了几个月,但也许可以帮助其他人面临同样的问题。基本上,FQL IN运算符不检查值是否在给定范围内,而是检查给定值是否与提供的任何不同值匹配。在您的示例中,如果值为“09”和“10”,则返回9月和10月的所有生日,因为这些生日月份与提供的月份数相匹配。

您可以做的是使用PHP或您正在使用的任何其他语言计算以下值,并在您的FQL中使用它们(今天是3月17日,并说我们希望4月17日是结束日期):

  • 当月(17),
  • 今年的某个月(03)
  • 月末日期(17)
  • 年终日期(04)

确保分别使用dd和MM格式化日期和月份(在单个数字的情况下填充为零)。然后你的FQL看起来像这样:

      SELECT name, birthday_date
      FROM user 
      WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
      AND strlen(birthday_date) != 0
      AND ((substr(birthday_date, 0, 2) = '03'
      AND substr(birthday_date, 3, 5) >= '17')
      OR (substr(birthday_date, 0, 2) = '04'
      AND substr(birthday_date, 3, 5) < '17'))
      ORDER BY birthday_date

这将返回3月17日至4月17日之间生日的朋友。

答案 1 :(得分:1)

AND created_time > strtotime('now') AND created_time < $endofnext

参考样本@ http://www.php.net/manual/en/function.strtotime.php#97025

使用“now”会返回当前的白天。


无论月份是什么月份,此功能都将返回下个月的最后一天。

<?php 
/* $now can be set to any strtotime(), yesterday, last month, last year etc; */
$now = "now"; 
function EndOfNext($now){
    function lastDayOfMonth($month = '', $year = '') 
    { 
       if (empty($month)) { 
          $month = date('m'); 
       } 
       if (empty($year)) { 
          $year = date('Y'); 
       } 
       $result = strtotime("{$year}-{$month}-01"); 
       $result = strtotime('-1 second', strtotime('+1 month', $result)); 
       return date('m/d/y', $result); 
    } 
    function addRealMonth($timeStamp) 
    { 
        $tempMonth = date('m', $timeStamp); 
        $tempYear  = date('Y', $timeStamp); 
        if($tempMonth == "12") 
        { 
            $tempMonth = 1; 
            $tempYear++; 
        } 
        else 
            $tempMonth++; 

        $newDate = lastDayOfMonth($tempMonth, $tempYear); 
        return strtotime($newDate); 
    }
    $newChargeDate = strtotime($now); 
    $newChargeDate = addRealMonth($newChargeDate); 
    return date("m/d/y", $newChargeDate); 
}
$endofnext = EndOfNext($now);
echo $endofnext;
?>

答案 2 :(得分:0)

你也可以让FQL为你做一些工作,如下所示:

SELECT uid, name, birthday_date, strtotime(substr(birthday_date, 0, 5)) > now()
FROM user
WHERE uid in (SELECT uid2 FROM #freunde)
AND birthday_date <> ''
AND strpos(birthday_date,'06') = 0
ORDER BY substr(birthday_date, 0, 5)

返回一个布尔类型“anon”字段,告诉您是否必须将此结果包含在显示列表中(true),或者此用户的生日是否已经过去(false)。 不幸的是,我无法将这个命题作为一个WHERE子句 - 不断得到错误,但是我想知道是否有人比我幸运。

  "error": {
    "message": "Call to a member function on a non-object", 
    "type": "BadMethodCallException"
  }