2013-04-28 143 views
0

當用戶登錄時,我如何獲取他們所有的mysql信息?我有一個註冊系統和登錄系統。當他們登錄時,他們輸入他們的用戶名和密碼,這些是我可以使用的唯一兩個變量,因爲他們輸入了。我如何獲得所有其他變量,而不是用戶輸入的那個變量? 他們的用戶名是唯一的。我如何獲得其他變量在整個我的php文件中使用?使用php和mysql登錄系統

我的login文件:

<? 
/*Use of Sessions*/ 
if(!session_id()) 
session_start(); 

header("Cache-control: private"); //avoid an IE6 bug (keep this line on top of the page) 

$login='NO data sent'; 

/*simple checking of the data*/ 
if(isset($_POST['login']) && isset($_POST['pass'])) 
{ 

/*Connection to database logindb using your login name and password*/ 
$db=mysql_connect('localhost','teachert_users','dogs1324') or die(mysql_error()); 
mysql_select_db('teachert_users'); 

/*additional data checking and striping*/ 
$_POST['login']=mysql_real_escape_string(strip_tags(trim($_POST['login']))); 
$_POST['pass']=mysql_real_escape_string(strip_tags(trim($_POST['pass']))); 
$_POST['pass']=md5($_POST['pass']); 
$_POST['pass']=strrev($_POST['pass']); 
$_POST['pass']=md5($_POST['pass']); 
$_POST['pass'].=$_POST['pass']; 
$_POST['pass']=md5($_POST['pass']); 


$q=mysql_query("SELECT * FROM profiles WHERE username='{$_POST['login']}' AND  password='{$_POST['pass']}'",$db) or die(mysql_error()); 

/*If there is a matching row*/ 
if(mysql_num_rows($q) > 0) 
{ 
    $_SESSION['login'] = $_POST['login']; 
    $login='Welcome back, '.$_SESSION['login']; 
    $login.='</br> we are redirecting you.'; 
echo $login; 
echo '<META HTTP-EQUIV="Refresh" Content="2; URL=/php/learn/selectone.php">';  
    exit;  

} 
else 
{ 
    $login= 'Wrong login or password'; 
} 

mysql_close($db); 

} 

//you may echo the data anywhere in the file 
echo $login; 

?> 

我可以在所有其他文件中使用他們的登錄名和密碼與$ _SESSION [ '變種']; 我如何獲得其餘的?像他們的年齡?或他們的名字?或者存儲在我的mysql文件中的任何變量。 是的,我知道MD5不是最好的,讓我們不要把它變成一個討論。

------------------------編輯--------------------- ---------- 我想我會換一種說法:

我用這個:

$q=mysql_query("SELECT * FROM profiles WHERE username='{$_POST['login']}' AND password='{$_POST['pass']}'",$db) or die(mysql_error()); 

我要如何從特定的用戶/配置文件變量。像他們的其他變量一樣,比如他們的名字,在我的mysql中是fname。

-------------------------編輯-------------------- ------- 我已經更新到:

$mysqli = new mysqli('localhost', 'teachert_users', 'dogs1324', 'teachert_users'); 
if($mysqli->connect_errno) { 
    echo "Error connecting to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 
$user = $_SESSION['login']; 
$get_user_info_query = $mysqli->query("SELECT * FROM profiles WHERE username = '$user'"); 
if($get_user_info_query->num_rows) { 
    while($get_user_info_row = $get_user_info_query->fetch_assoc()){ 
    if ($get_user_info_row['math']) { 
     print_r($get_user_info_row['math']); 
     }   
    } 
} else { 
    echo 'User not found'; 
} 

但仍print_r的打印所有用戶的信息。不只是數學信息。爲什麼?

+2

對於體面安全的登錄系統,請將每個登錄會話保存在數據庫中。對於每個頁面請求,將會話ID和IP與會話表進行比較,然後您可以同時從用戶表中加載其他用戶數據。並且不要使用不推薦的mysql_ *函數 – jtheman 2013-04-28 20:56:07

+0

對於一個體面安全的登錄系統,不要自己動手。建立一個圖書館,爲您提供幫助,並證明這一點可靠。 – lc2817 2013-04-28 21:00:44

+0

@jtheman請回答這個問題? – James 2013-04-28 21:01:20

回答

0

請嘗試使用mysqlipdomysql_*功能oficially棄用

$mysqli = new mysqli($dbserver, $dbmanager, $dbpass, $dbname); 
if($mysqli->connect_errno) { 
    echo "Error connecting to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli- >connect_error; 
} 
$user = $_SESSION['login']; 
$get_user_info_query = $mysqli->query("SELECT * FROM profiles WHERE username = '$user'"); 
if($get_user_info_query->num_rows) { 
    while($get_user_info_row = $get_user_info_query->fetch_assoc()){ 
     print_r($get_user_info_row); 
    } 
} else { 
    echo 'User not found'; 
} 

這將打印由MySQL返回所以要使用一個特定領域使用$get_user_info_row['username']while語句中的整行信息。

+0

非常感謝。穆喬格拉西亞斯。有一件事,你忘了「。 – James 2013-04-28 21:45:58

+0

嘗試'if(isset($ _ SESSION ['login'])&&!empty($ _ SESSION ['login'])){$ user = $ _SESSION ['login']; //在這裏移動mysql查詢} else {echo'User not found';} – Memolition 2013-04-28 22:00:58

+0

我確實添加了$ get_user_info_row ['username'],並且它實際上仍然放置了所有這些文件 – James 2013-04-28 22:20:02

0

這是代碼來獲取數據信息使用mysql_方法:

$row = mysql_fetch_assoc($q); 

變量$一行將與由SQL語句返回的字段數組。檢查是否存在行後使用此行。

嘗試運行

print_r($row)

,你會看到它的內容。

0

首先,custom encryption routines are not considered secure,特別是如果您在此發佈您的代碼(或其變體)。其次,你的日常事務對普通的MD5沒有額外的安全性(這被認爲是非常不安全的)。假設你的例程比計劃MD5長3倍。重要的是,你可以做a billion MD5s per second,所以在嘗試使用10億最常用的密碼時,充其量只需要幾秒鐘就能讓攻擊者破解。

你不應該嘗試推出自己的密碼例程。事實上,你不應該滾動自己的用戶登錄和會話代碼。使用像CakePHP這樣的框架。 (你可能需要一個User Auth的插件,確保它使用bcrypt()。)

當你使用一個框架時,你將會從很多預先存在的例子和「最佳實踐」中受益。你將在更高的層次上進行編程。實際上,框架通常提供針對您不知道的攻擊的保護,例如SQL注入,XSS等。