2012-06-11 49 views
1

我有一個網站,用戶可以登錄並將項目添加到列表中。添加用戶ID到用戶列表的MySQL表中的不穩定問題

在用戶登錄和會話存儲他們的電子郵件,我用它來識別它們在用戶表。

然後,他們可以輸入一個列表項,並添加到包含他們的ID和他們的列表項的列表表。

有時會添加ID並且有時會出現空(但是,總是添加列表項文本)。這似乎是不穩定的,因爲大部分時間都包含了ID。

任何想法?表類型是MyISAM。順便說一句,我是編程新手。

這裏是我的代碼示例:

<?php 
session_start(); 
$item = $_REQUEST['item']; 
$email = $_SESSION['email']; 

if ($item) 
{ 

mysql_connect("localhost","root","") or die("We couldn't connect!"); 

mysql_select_db("table"); 

$query = mysql_query("SELECT ID FROM users WHERE email='".$_SESSION['email']."'"); 
$result = mysql_result($query,0); 
$user_id = $result; 

mysql_query("INSERT INTO items (user_ID,item_name) VALUES('$user_id','$item')"); 

所以每次我登錄到我的網站我自己都沒有問題,測試的時間。但越來越多,我有用戶嘗試添加項目,並創建一個記錄,其中item_name正確顯示,但user_ID設置爲0(默認)。

+0

也許他們的會話超時?會話開始會創建一個新的減去電子郵件。 –

+0

爲什麼不將user_id存儲在會話中?這樣,每次插入項目時都不必查詢它。另外,你的代碼對SQL注入攻擊是開放的。你真的應該做'$ item = mysql_real_escape_string($ _ REQUEST ['item']);'因爲有人可以在請求中注入SQL代碼,並且你很想保護它。更好的是,學習如何使用[PDO](http://php.net/manual/en/book.pdo.php)及其對[準備好的語句]的支持(http://www.php.net/manual/en /pdo.prepared-statements.php)與您的數據庫進行交互。 mysql_ *函數已被棄用。 –

回答

0

首先,請閱讀我所說的關於SQL注入攻擊的問題。

這將是存儲在$_SESSIONuser_id,所以你不會有基於電子郵件每次查詢是個好主意......但如果你堅持只是有在$_SESSION的電子郵件,然後你實際上只需要一個查詢。調整代碼:

<?php 
session_start(); 
$item = mysql_real_escape_string($_REQUEST['item']); 

if (!empty($item) && isset($_SESSION['email'])) 
{ 
    mysql_connect("localhost","root","") or die("We couldn't connect!"); 
    mysql_select_db("table"); 

    mysql_query("INSERT INTO items (user_ID, item_name) VALUES ((SELECT ID FROM users WHERE email='{$_SESSION['email']}'), '$item')"); 
} 

像傑夫·沃特金斯說,會議可能超時,所以這將是一個好主意,如果它使用isset()設置爲先檢查。

否則,如果您將用戶標識存儲在會話中,則可以直接將其作爲$_SESSION['user_id']來引用,而不是在插入中執行子查詢。

相關問題