PHP如果使用mySQL结果的语句

时间:2012-10-25 01:27:38

标签: php mysql if-statement

下面的代码应该检查数据库中是否有人在数据库中有一行,其中包含从登录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";
  }
}

?>

2 个答案:

答案 0 :(得分: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永远不会被视为安全值。如果继续使用旧的mysql_*() API,则必须从SQL注入中转义其值:

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

答案 1 :(得分: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($结果); 在您的脚本有机会从数据库中获取用户ID之前。

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