2011-05-29 64 views
1

我有一個表單需要在將表單數據輸入到數據庫之前進行驗證。php和mysql_num_rows沒有檢測到數據庫中沒有東西

它通過用戶mysql_num_rows函數檢查用戶名是否已經存在。但我似乎無法得到它的工作。測試時,不會添加新的用戶名。

這裏是正在使用的全碼:

<?php 
session_start(); 

include("databaseConnect.php"); 
// Insert a row of information into the table "example" 


// check if username is already in database 
if(mysql_num_rows(mysql_query("SELECT userName FROM registeredUsers WHERE userName =  '$_POST[userName]'"))){ 
echo "Username: ". $_POST[userName]." already exists in the Database<br><br>"; 
    echo "You will be redirect back to the form in 5 seconds"; 
$ref = $_SERVER['HTTP_REFERER']; 
header('refresh: 5; url='.$ref); 

//check if hemis is already in database 
}elseif(mysql_num_rows(mysql_query("SELECT hemis FROM registeredUsers WHERE hemis = '$_POST[hemis]'"))){ 
echo "Student [Hemis] Number: ". $_POST[hemis]." already exists in the Database<br><br>"; 
echo "You will be redirect back to the form in 5 seconds"; 
$ref = $_SERVER['HTTP_REFERER']; 
header('refresh: 5; url='.$ref); 


// if all the conditions above are fine, it will insert the data to MySQL 
}else{ 
    mysql_query("INSERT INTO registeredUsers 
(firstName, lastName, hemis, userName, MAC) VALUES('$_POST[firstName]', '$_POST[lastName]', '$_POST[hemis]', '$_POST[userName]', '$_POST[mac]') ") 
or die(mysql_error()); 

echo "Data Inserted! <br><br>"; 
} 

感謝很多:)

+5

[Bobby Tables](http://xkcd.com/327/)警報! – awm 2011-05-29 10:48:54

+0

哈哈多數民衆贊成在良好的 - 但沒有太多的幫助大聲笑 - 這是一個系統的發展,所以不應該在表格中有任何學生記錄,直到他們註冊此在線表單 - 但沒有認識到,與此代碼,如果用戶名不存在... – 2011-05-29 11:03:35

+0

這不是一個獨立的代碼片段;你在某處放錯了'}'。檢查這不是問題。 – Piskvor 2011-05-29 11:13:35

回答

1

我會完全重寫此。它受SQL注入的影響,效率低下並且有點過於簡單。此外,您通常更適合使用PHP mysqli extension

另外,請確保將$ _POST變量名稱括在引號中。你把它們寫成常量,而不是字符串。 (除非你在表示字符串值代碼的其他地方定義的常量,這是一個錯誤。打開PHP警告當你正在開發)。

$safe_username = mysqli_real_escape_string($_POST['userName']); 
$sql = "SELECT userName FROM registeredUsers WHERE userName='$safe_username' LIMIT 1"; 
$result = mysqli_query($database_connection, $sql); 
if (mysqli_num_rows($result)) 
{ 
    // username already found code 
    mysqli_free_result($result); 
} 
else 
{ 
    $safe_hemis = mysqli_real_escape_string($_POST['hemis']); 
    $sql = "SELECT hemis FROM registeredUsers WHERE hemis='$safe_hemis' LIMIT 1"; 
    // Side note, LIMIT 1 tells the database engine to stop looking after it's found one hit. More efficient as you're only looking for a Boolean value anyway. 
    $result = mysqli_query($database_connection, $sql); 
    if (mysqli_num_rows($result)) 
    { 
     // hemis found code 
     mysqli_free_result($result); 
    } 
} 

你也許可以從該弄清楚的休息。

請驗證並退出所有輸入。驗證包括檢查是否完整 - 數據範圍內的數據(字符串長度,數值範圍等)等。所有輸入都是邪惡的!

你真的不想依賴於HTTP_REFERER。用戶代理不總是傳遞引用者。

另外,我知道這不是什麼大不了的事,但是使用CSS而不是<br>。如果您使用的是XHTML文檔類型,則必須正確關閉所有標籤,因此<br>將變爲<br />。無論如何,這是個好主意。

+0

+1我也會進行一些徹底的重構,如果不是從頭開始。 :) – GolezTrol 2011-05-29 11:55:34

1

最好也檢查mysql_query的結果。它可能會返回一個可以獲取行數的結果集,但查詢失敗時可能會返回false。在這種情況下,你不會有結果集,並且mysql_count_rows將失敗。這個失敗你解釋爲0行。

除了Matty給你的所有建議外,我還會做一些額外的檢查和嚴格的檢查。

if ($result = mysql_query('....') === false) 
{ 
    die('Your query failed in the first place. Error: ' . mysql_error()); 
} 

有許多改進,你可以(像在查詢和使用等計數),但我想你應該至少有這類檢查。它會幫助你理解實際發生的問題,而不是猜測。它會爲您的初學者或有經驗的程序員節省大量的調試時間。

+0

這是我忘了寫在我的答案中的一件事。 '$ result'可能爲NULL,而不是「strict」false,這應該進行測試。最好的方法是測試評估爲true的值,並將'die()'放入'else'子句中。 – Matty 2011-05-29 12:00:18

+0

如果你發現mysql_query返回NULL,你可能發現了一個bug。它應該爲返回數據的語句(比如select)返回一個false的資源,並且它應該返回true或false,而不是像更新那樣的stamenets。它在文檔中沒有說NULL是有效的結果。 – GolezTrol 2011-05-30 06:40:54

+0

不,你說得對 - 再次檢查文件! – Matty 2011-05-30 12:15:12