2012-02-08 59 views
0

我們有一個現有的會員網站設置在PHP/MySQL,並期待整合Facebook註冊和登錄。登錄和註冊表單已經被導入,並且被連接到php/MySQL代碼中,從而在數據庫中創建新的用戶。但是,爲了防止有多個登錄的單個用戶(例如,一個站點登錄,一個Facebook登錄),我們需要在向成員數據庫表添加新行之前檢查用戶的電子郵件地址。Facebook的regsitration插件 - 異步驗證(電子郵件)

我們可以通過php/MySQL代碼來做到這一點,但是如果您必須滿足所有跨站點/ FB成員身份的排列,並且我們不希望用戶連接到FB註冊應用程序而不成爲網站會員。更好的解決方案是防止用戶在數據庫中已經存在的電子郵件地址下注冊(而不是指示他們獲得新密碼,並更新連接他們的Facebook配置文件到現有的配置文件)。我們一直在尋找解決方案的周,並且已經諮詢了Facebook開發者異步驗證(http://developers.facebook.com/docs/plugins/registration/advanced/)以及stackexchange論壇,但還沒有能夠實施一種解決方案,該解決方案針對數據庫驗證電子郵件地址,並且相應地阻止/允許註冊。

我們到目前爲止的代碼是

<fb:registration redirect-uri="http://www.mysite.com/register.php" 
fields='[{"name":"name"},{"name":"email"} 
{"name":"username","description":"Username","type":"text"}]' 
onvalidate="validate_async"></fb:registration> 

<script src="https://code.jquery.com/jquery-1.4.4.min.js"></script> 
<script> 
function validate_async(form, cb) { 
$.getJSON('http://www.mysite.com/register_check.php/' + form.email + '?callback=?', 
function(response) { 
    if (response.error) { 
    // Username isn't taken, let the form submit 
    cb(); 
    } 
    cb({username: 'That email is taken'}); 
}); 
} 
</script> 

register_check.php

//connect to the database 
include 'mysql_connect.php' 

$email = $_GET('email'); 

$data = array(); 

$sqlCommand = "SELECT * FROM members WHERE email='$email'"; 
$query = mysql_query($sqlCommand) or die (mysql_error()); 
$num_rows = mysql_num_rows($query); 

     if($num_rows>0){ 
      $email_check = $row['email']; 
      $data['email'] = $email_check; 
     } else { 
      $data['error'] = "true"; 
     } 
echo json_encode($data); 

不幸的是,這個過程是不工作的。登記表只是無休止地掛起來,沒有驗證,也沒有將信息傳遞給數據庫。我們已經對如何正確編寫getJSON和服務器端PHP代碼做了相當多的研究,但是已經碰到了磚牆,所以非常感謝在這個問題上的任何幫助或建議。

回答

2

我希望這不是太晚,但面對同樣的問題後,我發現註冊插件不會發送與表單對象預設的細節(名稱,電子郵件,性別,出生日期) - 只發送任何自定義字段。很愚蠢的伊莫,但可能有一兩個優勢。

解決方案是重寫電子郵件的描述,以誘使它認爲它是自定義的(它會是) - 缺點是您的常規檢查不會被檢查(有效的電子郵件等),所以你會需要手動處理這些。

1

這可能會遲到,但:

更改您的JSON地址

http://www.mysite.com/register_check.php?email=' + form.email + 

你使用Facebook的檢查現有用戶。變化:

cb({username: 'That email is taken'}); 

到:

cb({email: 'That email is taken'}); 

你想的錯誤消息旁邊出現電子郵件字段。