1

我在网上看到了一些关于这个的帖子,但没有一个建议对我有用。

我的情况很简单..用户登录到一个php表单,使用后端mysql表进行身份验证,启动会话,将它们带到下一页。

我想要做的是将其余的用户数据带入文本框、表格等。但是,我被介绍这样做的唯一方法是引用会话变量。到目前为止我所拥有的如下,我已经尝试了它的许多变体,但似乎没有任何效果(即没有值,页面不加载等)。不过,我对其他选择持开放态度。谢谢大家。

$query = "SELECT * FROM users WHERE username = '{$_SESSION['user']}'"
4

2 回答 2

3

这是因为嵌套的未转义引号导致您在那里遇到语法错误。尝试

$query = "SELECT * FROM users WHERE username = '" 
           . escape({$_SESSION['user']}) . "'";

或者

$query = sprintf("SELECT * FROM users WHERE username = '%s'", 
           escape({$_SESSION['user']}));

并且永远不要在不转义的情况下将任何外部数据传递给您的查询(escape()我在示例中使用的是元调用。根据您用于访问数据库的内容,您应该使用正确的方法来完成这项工作。它很容易找到,因为它包含escape在方法名称中(即mysqli_real_escape_string()

于 2013-04-04T16:57:15.750 回答
0

用户登录 php 表单,使用后端 mysql 表进行身份验证,启动会话,将它们带到下一页。

您需要在使用它之前启动会话。所以session_start();在脚本的开头调用。

该查询也是不安全的,因为会话 inst 中的值已转义。如果您使用PDOMysqli,您可以使用准备好的语句来帮助您:

session_start();

if(isset($_SESSION['username'])) {

  $db = new PDO($dsn, $user, $pass);

  // the ? is a placeholder and will be replaced with the value supplied to
  // PDOStatement::execute
  $sql = 'SELECT * FROM users WHERE username = ? LIMIT 1';
  $stmt->prepare($sql);

  // Supply the value for the place holder and execute the query
  $stmt->execute(array($_SESSION['username']));

  // get the first and only row of data and close the statement cursor
  $userData = $stmt->fetch(PDO::FETCH_ASSOC);
  $stmt->closeCursor();

  if(!$userData) {
     // no user data handle appropriately
  }

} else {
    // redirect to login page?
}
于 2013-04-04T16:57:04.130 回答