2014-10-10 121 views
0

我有一个PHP文件(approvals.php)只能在AJAX调用中执行。它有一个postgresql查询,用于搜索表并使用设置为会话变量的客户ID。问题是,我似乎无法在此文件中访问此会话变量。我的查询是这样的:PHP会话变量不可用

$query = "SELECT merchant_id FROM ndovu_merchant_users WHERE customer_id={$_SESSION['customer_id']}"; 
$result = pg_query($query); 

我试图呼应会话变量$_SESSION['customer_id']但没有。但是,在将固定值传递给查询时,它会返回结果。

+1

你在哪里给会话赋值? – Naruto 2014-10-10 08:48:10

+2

您是否在您的approvals.php文件的顶部添加了'session_start();'?请向我们展示您的文件的更多代码。 – chresse 2014-10-10 08:49:25

+0

是的,我有,但仍然无法正常工作。会话变量被设置在另一个文件中。 – Denny 2014-10-10 08:54:51

回答

0

您需要将session_start();放置在您使用它的代码部分上方;页面的顶部通常是放置它的最佳位置。

另外,应该注意的是;通过传递未转义的数据,您在这里可能存在一个巨大的安全缺陷。

如果可能的话,你应该考虑使用预处理语句;或者至少逃避你的投入。

+0

为什么要逃生?我们知道'id'总是数字,* right *? 'ctype_digit()'或一个正则表达式匹配'^ [0-9] + $'。 – 2014-10-10 08:57:58

+0

这会很好地工作。在我看来,类型转换或检查类型是一种逃避的方式。但是,我仍然支持我所说的准备好的陈述;使用它们将是最好的。我相信MySQL(以及其他数据库最有可能)缓存准备好的语句比普通查询更好 – Bowersbros 2014-10-10 09:13:59

0

当脚本被ajax请求调用时,用户会话未被接受。 会议令牌许多PHP需要获取会话数据存储在会话cookie内的客户端(用户)。 您可以在这里阅读更多 https://stackoverflow.com/a/1535712/3922692

只需在ajax请求中通过GET或POST传递用户标识即可。

没有足够的代码呈现,但如果您真的需要从会话中获取id,则可以使用iframe(不推荐),处理获取数据服务器端并将其输出到iframe中。

1

在你的情况下,我会检查会话是否设置在第一位。

//this should be put at the header of the page 
session_start(); 

    if(isset($_SESSION['customer_id']) && !empty($_SESSION['customer_id'])){ 
     echo $_SESSION['customer_id']; 
    }else{ 
     echo 'session is not set'; 
    }