これは、FB API の使用中に遭遇した最も奇妙な問題です。たぶん、私は彼らの API に無頓着すぎるのかもしれませんが、ここに行きます。
サイトのログイン ボタンを使用しています。クリックすると、ユーザーには FB からのポップアップが表示され、アプリに関する基本情報 (基本的な詳細、アクティブなユーザーの数、要求している権限) が表示されます。
それはすべて元気でダンディです。ユーザーがアプリを受け入れると、ページがリロードされ、アプリから要求されているユーザーの情報が DB に挿入され、セッションが作成されます。
session_start();
require_once("model/functions.php");
require_once("controller.php");
require_once("model/facebook_api/src/facebook.php");
$facebook = new Facebook(array(
'appId' => '123456789',
'secret' => '123456789',
'cookie' => true
));
$access_token = $facebook->getAccessToken();
$facebook->setAccessToken($access_token);
if($access_token != "")
{
$user = $facebook->getUser();
if($user != 0)
{
$user_profile = $facebook->api("/".$user);
$fb_id = $user;
$fb_first_name = $user_profile['first_name'];
$fb_last_name = $user_profile['last_name'];
$fb_email = $user_profile['email'];
// The FB user_id and all of their other info is correct. Seriously!!
echo $fb_id."<br />";
print_r($user_profile);
// Query the DB to see if this person's info from FB is in there
$query = "SELECT *
FROM users
WHERE fb_id = :fb_id";
$stmt = $db->prepare($query);
$stmt->execute(array(':fb_id' => $fb_id));
$count = $stmt->rowCount();
if($count == 1)
{
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$_SESSION['id'] = $row['user_id'];
$_SESSION['fb_id'] = $row['fb_id'];
$_SESSION['first'] = $row['first_name'];
$_SESSION['last'] = $row['last_name'];
$_SESSION['email'] = $row['email'];
$_SESSION['photo'] = $row['photo'];
$_SESSION['accuracy'] = $row['accuracy_rate'];
}
} else
{
$img_data = file_get_contents('https://graph.facebook.com/'.$fb_id.'/picture?type=large');
$save_path = 'img/profile_pics/large/';
file_put_contents($save_path.''.$fb_id.'.jpg', $img_data);
$insert = "INSERT INTO
users
(first_name,
last_name,
email,
photo,
fb_id,
accuracy_rate,
date_joined,
date_joined_int)
VALUES
(:first_name,
:last_name,
:email,
:photo,
:fb_id,
:points,
:date_joined,
:date_int)";
$params = array(':first_name' => $fb_first_name,
':last_name' => $fb_last_name,
':email' => $fb_email,
':photo' => $fb_id.'.jpg',
':fb_id' => $fb_id,
':points' => '100',
':date_joined' => date("M j, Y"),
':date_int' => idate('z'));
$stmt = $db->prepare($insert);
$stmt->execute($params)or die('error');
print_r($params);
// Query the DB to see if this person's info from FB is in there
$query = "SELECT *
FROM users
WHERE fb_id = :fb_id";
$stmt = $db->prepare($query);
$stmt->execute(array(':fb_id' => $fb_id));
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$_SESSION['id'] = $row['user_id'];
$_SESSION['fb_id'] = $row['fb_id'];
$_SESSION['first'] = $row['first_name'];
$_SESSION['last'] = $row['last_name'];
$_SESSION['email'] = $row['email'];
$_SESSION['photo'] = $row['photo'];
$_SESSION['accuracy'] = $row['accuracy_rate'];
}
}
} else
{
}
} else
{
}
ページが更新されるたびに、DB に行が挿入されます。セッションは作成されません。さらに奇妙なのは、DB の fb_id 列に挿入された facebook ID が、承認のために送信されたオープン グラフ アクションをテストするために FB が使用するテスト アカウントに属するアカウントに属していることです。DB を詳しく調べたところ、FB オープン グラフ アクション テスターに属する行が DB にあることがわかりました。IDは「2147483647」です。これは明らかに、$user_profile 配列を出力したときに出力される ID ではありません。さらに、ページが初めてリロードされた後は、返された rowCount が 1 に設定されているため、挿入クエリは発生しません。挿入クエリは、ユーザーが初めてのユーザーである場合にのみ実行されるはずです。サンドボックス モードがオンになっていません。何か関係あるのかなと思いました。しかし、そうではありませんでした。
関係のない話ですが、FB の API にバグはありますか?
$facebook->api("/me");
それはうまくいかないようです。
$facebook->api("/".$user);
でもうまくいくようです。
実際の例はここにあります