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

san*_*kcm 2 facebook strtotime facebook-fql facebook-php-sdk

使用FQL信息和Facebook开发人员文档中的用户表,我提出了以下代码.

    //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);
Run Code Online (Sandbox Code Playgroud)

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

这是"工作",但是我们说今天是11月29日,我在11月有20个生日的朋友,并且$limit设置为10.在这种情况下,很有可能它返回的10个生日都将在11月之前第29位.

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

谢谢!

**编辑,请参阅Shawn和I之间的评论主题以寻找可能的替代解决方案.由于没有人直接解决原始代码/问题,因此尚未接受答案.

vah*_*idg 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
Run Code Online (Sandbox Code Playgroud)

然后,这将返回3月17日至4月17日之间生日的朋友.