-1

下面的代码应该检查数据库中是否有一个人,数据库中有一行,其用户名是从 cookie 登录获得的用户名。如果有,它应该包含一个页面,如果没有人在具有此 user_id 的数据库中,它应该回显。这是我到目前为止的代码,请告诉我我将如何做到这一点。在有人告诉我像我这样的 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";
  }
}

?>
4

2 回答 2

1

在双引号字符串中,您的数组变量$row['user_id']被错误地解析,因为您引用了数组键而没有将整个内容包围在{}. 如果您不引用数组 key ,则允许{}在双引号字符串中省略,但这会增加可读性。{}

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从不认为是安全值。如果您继续使用旧mysql_*()API,则必须转义其值以防止 SQL 注入:

$username = mysql_real_escape_string($_COOKIE['maxgee_me_user']);
于 2012-10-25T01:55:26.167 回答
0

2 事情马上发生,就像 Waleed 说你对 SQL 注入持开放态度,这对你来说并不是一件好事。我会考虑阅读有关 MySQLi 和 PDO 的教程,从那里尝试深入研究更好的方法或运行查询。

您还选择使用 cookie 而不是会话来存储用户名?Cookie 可以在客户端进行修改,以说出任何使用 firebug 的聪明用户想要的内容。会话存储在服务器端,客户端(最终用户)只获得会话的 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($result); 在您的脚本有机会从数据库中获取用户 ID 之前。

总而言之,我真的会回去阅读更多教程。

于 2012-10-25T01:58:29.307 回答