2012-10-25 111 views
-1

下面的代碼應該檢查數據庫中是否有人在數據庫中有一行,並使用從cookie登錄中獲取的用戶名。如果有,它應該包含一個頁面,如果數據庫中沒有人使用這個user_id,它應該是echo.Here是我的代碼到目前爲止,請告訴我我將如何做到這一點。我也知道之前有人告訴我,我的mySQL語句有它正在成爲depreciated.Here是我的代碼:PHP如果語句與mySQL結果

<?php 
include("dbconnect.php"); 
mysql_select_db("maxgee_close2"); 
$username = $_COOKIE['maxgee_me_user']; 
$result = mysql_query("select user_id from users where username = '$username'"); 
$row = mysql_fetch_array($result);  
mysql_free_result($result); 
$check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row['user_id']'") or die(mysql_error()); 
if(1==1){ 
    if (mysql_num_rows($check)>0) 
{ 
include("example.php"); 
} 
    else 
    { 
    echo "example"; 
    } 
} 

?> 
+0

您已經開放SQL注入。 –

+1

請不要使用'mysql_ *'函數,它已被棄用(請參閱[*紅盒子*](http://php.net/manual/en/function.mysql-query.php)),並且容易受到sql注入。使用[* PDO *](http://php.net/manual/en/book.pdo.php)或[* MySQLi *](http://php.net/manual/en/book.mysqli.php) 。 – alfasin

+1

在雙引號SQL字符串中,您應該_not_引用數組鍵'user_id',或者更好地將'{}'中的所有內容包裝在'user_id ='{$ row ['user_id']}' ,您的變量解析將在數組鍵的第一個引號中斷,從而破壞您的SQL語句。 –

回答

1

在雙引號字符串,您的數組變量$row['user_id']因被錯誤地分析到的事實,你所引述的數組鍵沒有周圍整個事情。如果未引用數組密鑰,但{}增加了可讀性,則可以在雙引號字符串中省略{}

check = mysql_query("SELECT * FROM events_main WHERE user_id ='{$row['user_id']}'") or die(mysql_error()); 
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^ 

// Also acceptable, but not as tidy, and troublesome with multidimensional 
// or variable keys - unquoted array key 
check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row[user_id]'") or die(mysql_error()); 
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^ 

如上所述,$_COOKIE永遠不會被視爲安全值。

$username = mysql_real_escape_string($_COOKIE['maxgee_me_user']); 
+0

感謝您的幫助! – maxgee

0

2個弄好了蝙蝠,像瓦利德說你打開SQL注入,不是很好的事情已經發生:如果繼續使用舊的API mysql_*()你必須逃脫其對SQL注入值給你。我會考慮閱讀關於MySQLi和PDO的教程,從那裏嘗試並潛入更好的方式或運行查詢。

另外您還選擇使用Cookie而不是會話來存儲用戶名?客戶端可以修改Cookies,以表示任何有螢火蟲的聰明用戶希望他們成爲的人。會話存儲在服務器端,而客戶端(最終用戶)只有會話的ID。如果您將它作爲會話發送,它們不能修改用戶名。 (他們可以嘗試更改會話ID到另一個隨機一串數字,但多數民衆贊成像撒尿進風,原諒我的法語。

下面有一些pseduo代碼,將讓你的方式,我覺得

<?php 
include("dbconnect.php"); 

$database = "maxgee_close2"; //Set the database you want to connect to 

mysql_select_db($database); //Select database 

$username = $_SESSION['maxgee_me_user']; //Grab the username from a server-side stored session, not a cookie! 

$query = "SELECT user_id FROM `users` WHERE `username` = '" . mysql_real_escape_string($username) . "' LIMIT 1"; //Note the user of mysql_real_escape_string on the $username, we want to clean the variable of anything that could harm the database. 

$result = mysql_query($query); 

if ($row = mysql_fetch_array($result)) { 
    //Query was ran and returned a result, grab the ID 
    $userId = $row["user_id"]; 

    mysql_free_result($result); //We can free the result now after we have grabbed everything we need 

    $query_check = "SELECT * FROM `events_main` WHERE `user_id` = '" . mysql_real_escape_string($userId) . "'"; 

    $check = mysql_query($query_check); 
    if (mysql_num_rows($check)>0) { 
    include("example.php"); 
    } 
    else { 
    echo "example"; 
    } 
} 

?> 

該代碼可以/不可以工作,但真正的關鍵變化是事實,你正在運行 了mysql_free_result($結果); 腳本有機會從數據庫中獲取用戶ID之前

總而言之,我真的會回去閱讀一些教程。

+0

我會使用會話,如果我不明白他們......一旦我得到我的網站基礎設置它將工作的地方,我正在計劃與會話,而不是使用PDO,我現在只是暫時考慮我是如何gonnna使它工作,然後我得到它的工作後,我會使其工作最好沒有安全問題。 – maxgee