2013-04-04 72 views
1

我已经看到有关此在线的一些发帖,但没有任何建议对我的案例起作用。如何在SQL语句中正确引用PHP会话变量

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

我想要做的是将剩余的用户数据带入文本框,表格等等。不过,我已经介绍过这样做的唯一方法是引用会话变量。我到目前为止已经在下面,我已经尝试了很多变体,但似乎没有任何工作(即没有值,页面不加载等)。不过,我愿意接受其他选择。谢谢大家。

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

在运行查询var_dump($ _ SESSION ['user'])之前查看它是什么。你期望? – Keeleon 2013-04-04 16:56:56

+1

你可能不得不提供更多的细节。什么不起作用?用户表是空的吗?首先插入数据的代码是什么,它是*工作的? – 2013-04-04 16:57:14

+0

[如何防止PHP中的SQL注入?](http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php)会话变量仍然是变量。 – 2013-04-04 16:57:54

回答

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? 
} 
3

这是因为你由于嵌套,转义引号了语法的错误。尝试

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

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

而且从不传递任何外部数据到你的查询,而无需转义(我在示例中使用的escape()是元电话。根据您使用访问DB你要什么使用正确的方法来完成这项工作。它很容易找到,因为它包含方法名称中的escape(即mysqli_real_escape_string()

+0

我尝试了这两个都没有工作。下面是整段代码: mysql_connect($ host,$ username,$ password); @mysql_select_db($ database)或die(“无法选择数据库”); $ query = sprintf(“SELECT * FROM users WHERE username ='%s'”, escape({$ _ SESSION ['user']})); $ result = mysql_query($ query); – 2013-04-04 17:05:02

+0

当不在''''引用的字符串上下文中时,'{}'字符串表示法是多余的。 – 2013-04-04 17:14:55

+0

即使这样做也行不通,我不知道问题在这里。 – 2013-04-04 17:23:30