2012-05-25 41 views
1

我正在使用Netbeans在PHP中註冊/登錄表單。爲了實現這一點,我在一個scripts.php文件中有我的登錄,註冊和數據庫連接功能,該文件通過一個包含調用進行加載。什麼是導致一個PHP函數打印錯誤文本blurb,但不是另一個?

好了,我的登錄功能使用此

$username = mysql_real_escape_string($_POST['username']); 
$password = sha1(mysql_real_escape_string($_POST['password'])); 
$query = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password); 

$link = connectDB(); 

$results = mysqli_query($link, $query); 

連接到數據庫,並獲得滿意的結果。驗證稍後進行。

對於我的註冊邏輯,我用幾乎同樣的事情:

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

//check if user name and password match conditions 
$link = connectDB(); 
$query = "SELECT * FROM users WHERE username = '" . $username . "'"; 
$results = mysqli_query($link, $query); 

的註冊頁面加載罰款,但在登錄頁有錯誤文本打印說是有一個未定義的索引「用戶名」中登錄功能。這發生在頁面加載時,並且沒有函數被調用。

但是,在註冊函數中幾乎相同的佈局,我沒有得到錯誤。

這是爲什麼發生?

編輯

我發現這個問題。

我打開數據庫連接使用mysqli_connect,但使用mysql-real_escape_string函數。這兩個是不兼容的,並增加了所有不同的i

+1

這意味着'$ _POST'沒有鍵''username''的元素... –

+0

您需要首先檢查'isset($ _ POST ['username'])'',因爲表單尚未發佈。這很常見,答案几乎總是一樣的。 http://stackoverflow.com/search?q=%5Bphp%5D+undefined+index –

+0

聽起來就像你檢查$ _POST ['用戶名']不管表單是否發佈。當它未被髮布時,'username'是$ _POST數組中的未定義索引。 – drew010

回答

2

幾個點,這可能會或可能不會與你的問題,但我根本無法忽視:

  1. SQL轉義字符串永遠最後件事兒。不要SQL轉義字符串,然後sha1它。請參閱The Great Escapism以瞭解轉義是什麼。
  2. 使用mysql_real_escape_string時,需要在調用此函數之前先連接到數據庫,因爲它需要建立數據庫連接才能完成工作。
  3. 你在混合mysql和mysqli擴展。使用一個或另一個,而不是兩者的功能。
  4. 如果您使用mysqli(並且您應該!),請使用prepared statements而不是手動SQL轉義字符串和sprintf

換句話說,目前你這樣做完全錯了。先解決這些問題,你的問題可能會隨之消失。

+0

檢查我的編輯,#3是現貨。我錯過了將我追加到mysql_real_escape_string。你的其他觀點是有效的,我會記住它們。 – Jason

+2

不要只記住它們,停止使用'sprintf'和'* _real_escape_string'並改用參數化/準備語句。 – deceze

相關問題