2013-01-14 48 views
2

我正在使用mysql(是的,我知道它已棄用)在PHP中使用登錄腳本,但是我遇到從我的數據庫中檢索信息的問題。我有另一個輸入信息的腳本,並且工作得非常好,但是當涉及到檢索時,它似乎不起作用。PHP/mysql未按預期檢索

當我說它不工作時,我的意思是我用來從數據庫中獲取信息的檢索函數似乎沒有正確傳遞信息,或者我沒有使用它的功能正確傳遞。無論哪種方式,問題是,它應該檢索一個包含電子郵件,密碼,名字和姓氏的User類型的對象。

下面是PHP文件的簡化版本,它可以完成所有的工作,以及可能/不可能是問題的檢索功能。當我運行這個時,我得到的只是一個頁面,上面寫着「名字是」,而不是顯示存儲的名字。

至於故障排除:

  • 我已經證實,get_firstname()函數的工作原理,但它 不會在下面的情況下返回任何東西。
  • 我也證實了我的其他getter函數也是如此。
  • 我已確認檢索函數返回「某物」。 I 通過使其返回一個字符串而不是一個用戶進行測試,並且 按預期返回,並且PHP文件能夠使用它。
  • 我已確認數據庫確實有我要求的信息 已存儲。
  • 我已經運行了一個查詢,直接在檢索函數 中詢問完全相同的事情,並讓它返回我想要的。

下面是代碼:

<?php 
include_once '/home/Databases/User.php'; 
include_once '/home/Databases/dbUser.php'; 
include_once '/home/Databases/dbInfo.php'; 
connect(); 

$email = mysql_real_escape_string($_GET['email']); 
$password = mysql_real_escape_string($_GET['password']); 
$rememberme = mysql_real_escape_string($_GET['remember']); 

// does this user exist? 
$confirm = retrieve_dbUserByEmail($email); 
$name = $confirm->get_firstname(); 

// if they do exist 
if($confirm != false) { 
    echo "First name is ".$name; 
} 

// if user doesn't exist 
else { 
    header('Location: index.php?login=nonexistant'); 
    exit(); 
} 
?> 

而這裏的retrieve_dbUserByEmail功能:

function retrieve_dbUserByEmail($email){ 
    connect(); 
    $email = mysql_real_escape_string($email); 
    $query = "SELECT * FROM dbUser WHERE email = '".$email."' LIMIT 1"; 
    $result = mysql_query($query); 
    if ($result==null) { 
     mysql_close(); 
     return false; 
    } 
    $result_row = mysql_fetch_assoc($result); 
    $user = new User($result_row['id'], $result_row['email'], $result_row['password'], $result_row['firstname'],$result_row['lastname']); 
    mysql_close(); 
    return $user; 
} 

要回答這個問題已經被問了一些問題,檢索功能不返回假,逃避只有一次的字符串沒有擺脫錯誤,並且看到的「connect()」函數成功連接到SQL服務器(已驗證)。另外,如果它很有用(儘管我無法想象爲什麼),我在下面擺出我的User對象類。

<?php 
class User { 
    private $id;   // Unique User ID 
    private $email;   // User Email 
    private $password;  // Password 
    private $firstname;  // First Name 
    private $lastname;  // Last Name 

    //Constructor Function 
    function __construct($id, $email, $password, $firstname, $lastname) { 
     $this->id = $id; 
     $this->email = $email; 
     $this->password = $password; 
     $this->firstname = $firstname; 
     $this->lastname = $lastname; 
    } 

    //Getter Functions 
    function get_id() { 
     return $this->id; 
    } 
    function get_email() { 
     return $this->email; 
    } 
    function get_password() { 
     return $this->password; 
    } 
    function get_firstname() { 
     return $this->firstname; 
    } 
    function get_lastname() { 
     return $this->lastname; 
    } 
?> 
+1

您正在轉義電子郵件字段兩次。你可能不想這樣做。應該在組裝SQL的地方進行轉義,而不是在清理輸入數據的地方進行轉義。 – staticsan

+0

@staticsan感謝您的建議,我想知道這件事!所以你說我應該只有在CRUD函數中才有逃避,不一定在獲取數據時? –

+0

*將用戶輸入密碼與存儲在數據庫中的密碼進行比較時,這是否正確? –

回答

1

我會放一個print_r($result_row)只是new User(...)前確認,你認爲你在說什麼是什麼,你實際上得到被調試此。

我可能還會在retrieve_dbUserByEmail()再次返回後使用print_r($confirm)以確認您認爲自己得到的是您實際獲得的內容。

+0

print_r($ confirm)給了我用戶對象([id:User:private] => [email:User:private] => [password:User:private] => [firstname:User:private] => [lastname用戶:私人])。所以雖然它知道它獲得了一個User對象,但該對象似乎是空白/空/空......即使它不應該是。 –

+1

在那個筆記上,print_r($ result_row)似乎也是空白的,因爲print_r不會打印任何東西。如此迷茫。 –

0

編輯:

我想出了我遇到的問題的原因;錯誤以我的形式出現。我仍然沒有弄清楚它爲什麼不起作用,但由於某種原因,表單在提交時似乎沒有正確地發佈變量。感謝所有看過我的代碼的人!