2016-02-28 34 views
3

我目前正在處理用戶配置文件系統...我被困在用戶更新其信息的階段。我正在檢查用戶新選擇的電子郵件地址是否已經存在於數據庫中。目前,我將他們當前的電子郵件地址轉換爲表單中的輸入值。更新當前用戶信息的問題PHP PDO

收到的驗證錯誤阻止用戶更新他們的其他信息,如果他們的電子郵件保持與它已經在數據庫中....相同的任何指導將不勝感激。謝謝

$signedin = $_SESSION['username']; 

function userExists($db, $email) 
{ 
    $userQuery = "SELECT * FROM members WHERE email = '$email' and email != '$signedin'"; 
    $stmt = $db->prepare($userQuery); 
    $stmt->execute(array(':email' => $email)); 
    return !!$stmt->fetch(PDO::FETCH_ASSOC); 
} 



$email = $_POST['email']; 
$exists = userExists($db, $email); 
if($exists) 
{ 
    header("Location: memberAccount.php?action=email_In_Use"); 
} 
else 
{ 
    //submit form data 
+0

好吧,如果用戶沒有更改他當前的電子郵件地址(在輸入字段中向他回覆)並更新表單中的其他信息並點擊提交失敗(因爲電子郵件已存在)是問題所在? – Vincent

+0

是的,這是正確的。 –

回答

1

我從哪裏開始?

  1. 你把變量對進入查詢
  2. 你不使用標記
  3. 雖然2,你正在試圖將值綁定到一個標記

您好像不瞭解PDO的全部內容。當您返回

$userQuery = "SELECT * FROM members WHERE email = :email and email != :signedin"; 
$stmt = $db->prepare($userQuery); 
$stmt->execute(array(':email' => $email, ':signedin' => $signedin)); 

,爲什麼你正在使用!!這也令我困惑不解:

return !!$stmt->fetch(PDO::FETCH_ASSOC); 

應該只是

return $stmt->fetch(PDO::FETCH_ASSOC); 

適合您的代碼將是這個

我也在閱讀建議How Prepared Statements Work

1

好吧,所以你的userExists()函數中有些邏輯是正確的,但是你已經聲明瞭$ signin變量超出了函數的範圍,並且它不能訪問它。此外,該PDO PARAMS設置不正確,

修改代碼,這樣,

$signedin = $_SESSION['username']; 

function userExists($db, $email) 
{ 
    global $signedin; 
    $userQuery = "SELECT * FROM members WHERE email = :email and email != :signed_in"; 
    $stmt = $db->prepare($userQuery); 
    $stmt->execute(array(':email' => $email, ':signed_in' => $signedin)); 
    return $stmt->fetch(PDO::FETCH_ASSOC); 
} 

閱讀更多有關變量的作用域在這裏:http://php.net/manual/en/language.variables.scope.php

希望這有助於你。

+0

不幸的是沒有解決這個問題,我會繼續嘗試......感謝您的鏈接,我會盡快閱讀。再次感謝。 –