1

これは、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); 

でもうまくいくようです。

実際の例はここにあります

4

1 に答える 1

0

Facebookuser_idは、サポートされている整数の長さを超える可能性があります。iPhone SDK長いIDでこれを発見しました。' 10000328862128237'. まったく同じ番号 ' 2147483647' を得たので、それもあなたの問題だと思います。

于 2013-04-26T05:01:43.617 に答える