模拟科尔多瓦应用程序时PHP会话变量不可用

问题描述:

这让我难过。模拟科尔多瓦应用程序时PHP会话变量不可用

我正在使用apache cordova构建移动应用程序,其中jQuery AJAX和PHP正用于与服务器和数据库进行通信。当我遇到我的队友没有的错误时,我首先发现了这个问题,并且我们使用相同的代码。在我们的一些PHP代码中,我们使用$_SESSION变量来存储数据,但是在我的机器上运行应用程序时,它没有正确存储。下面是一个不正常的代码示例:

<?php 

header('Access-Control-Allow-Origin : *'); 
include 'connection.php'; 

$userId = $_SESSION["userId"]; 

$query = "SELECT * ". 
     "FROM `db`.`users` ". 
     "WHERE `userId` = $userId;"; 

$result = $conn->query($query); 
$result_array = array(); 
while($row = mysqli_fetch_assoc($result)) 
{ 
    $result_array[] = $row; 
} 
echo json_encode($result_array); 

在这之前运行的页面,不同的PHP文件被称为包含此行:

$_SESSION["userId"] = $userId;

include connection.php包含所有我们的用户/登录信息以及session_start();之前。解决方法是这样的:当我构建应用程序并在设备上测试时,不会发生此错误。在Chrome浏览器窗口中通过纹波模拟器调试应用程序时,它只发生在我的机器上。因为我不想经常创建一个新版本,所以我改变了我们的代码以便将数据存储在前端,使用sessionStorage,并且必须禁用仿真器上的跨域代理设置。

这是我认为错误的地方:除非我将跨域代理设置为“禁用”,否则我的AJAX调用都不会成功,但如果我这样做,PHP $_SESSION不再有效(我发现会话标识只是重置每个新的呼叫)。我的队友可以在模拟器上进行调试,他的Cross Domain Proxy被设置为“本地”。当我以这种方式尝试时,我的所有AJAX调用都会再次出错。

另外 - 最后要注意的一件事:当我只是在网络浏览器中运行应用程序,不使用涟漪模拟器或任何东西,一切都运行良好。这可以将问题缩小到与纹波模拟器相关的问题。

我对这个东西比较陌生 - CORS和AJAX请求,但是我在发布之前做了一些认真的研究 - 这是我最后的手段。我会经常监控这个问题,以防你需要我的其他东西来帮助我解决这个问题。谢谢!

编辑:下面是当我做了一些修改建议后,在命令行中运行ripple emulate我得到的错误,这是之前我得到了同样的错误:

C:\Users\Brian\Documents\HoH Docs\Source Code\gitDev\HoH\www>ripple emulate 
INFO: Server instance running on: http://localhost:4400 
INFO: CORS XHR proxy service on: http://localhost:4400/ripple/xhr_proxy 
INFO: JSONP XHR proxy service on: http://localhost:4400/ripple/jsonp_xhr_proxy 
INFO: Could not find cordova as a local module. Expecting to find it installed g 
lobally. 
INFO: Using Browser User Agent (String) 
INFO: Proxying cross origin XMLHttpRequest - http://www.server.com/php/ 
[email protected]&password=test 
_http_outgoing.js:347 
     throw new TypeError(
    ^

TypeError: Trailer name must be a valid HTTP Token ["access-control-allow-origin 
"] 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:347:13) 
    at ServerResponse.res.setHeader (C:\Users\Brian\AppData\Roaming\npm\node_mod 
ules\ripple-emulator\node_modules\express\node_modules\connect\lib\patch.js:59:2 
2) 
    at Request.pipeDest (C:\Users\Brian\AppData\Roaming\npm\node_modules\ripple- 
emulator\node_modules\request\main.js:723:12) 
    at C:\Users\Brian\AppData\Roaming\npm\node_modules\ripple-emulator\node_modu 
les\request\main.js:614:14 
    at Array.forEach (native) 
    at ClientRequest.<anonymous> (C:\Users\Brian\AppData\Roaming\npm\node_module 
s\ripple-emulator\node_modules\request\main.js:613:18) 
    at ClientRequest.g (events.js:260:16) 
    at emitOne (events.js:77:13) 
    at ClientRequest.emit (events.js:169:7) 
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:433:21 
) 

而且从得到这个当提出请求的提琴手Web调试:

The connection to 'localhost' failed. <br />Error: ConnectionRefused (0x274d). <br />System.Net.Sockets.SocketException No connection could be made because the target machine actively refused it 127.0.0.1:4400                                                                          
+0

$ _SESSION默认使用存储在浏览器上的会话ID。当浏览器调用脚本时,这个cookie标识每次在标题中发送。而且,当你进行CORS调用时,首部必须使用allow-all。所以我认为这将是一个很好的选择,去看看你的应用程序或服务器上使用的标题。 –

+0

如何查看标题? – brdeav39

+0

您可以在网络部分的chrome开发工具中访问它。 –

这是最有可能您的问题:

header('Access-Control-Allow-Origin : *'); 
include 'connection.php'; 

在将连接文件包含在开始会话的位置之前,您正在向浏览器发送标题。

在某些测试环境中,输出缓冲可能会打开,所以这会起作用。但是,在你的环境中,它似乎不是你的session_start()connection.php将会失败。

你不应该输出什么浏览器调用session_start()之前,所以在这种情况下,你应该header()呼叫转移到下面的包括:

include 'connection.php'; 
header('Access-Control-Allow-Origin : *'); 

你或许可以验证这是问题的服务器错误日志。

+0

我刚测试过这个,但仍然遇到同样的问题。 – brdeav39

+0

我在编辑中添加了一些我的错误。 – brdeav39

您可能需要设置header在您的Ajax请求

如果您正在使用jQuery的AJAX方法,然后添加下面的选项

xhrFields: { 
    withCredentials: true 
} 

或者,如果你使用XMLHttpRequest对象发送Ajax请求,那么它应该是像从不同的域CA belwo

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://example.com/', true); 
xhr.withCredentials = true; 
xhr.send(null); 

XmlHttpRequest的响应未设置cookie的 值为他们自己的域,除非在请求之前将Credentials设置为true ,而不考虑访问控制头 的值。

+0

刚刚测试过这个,但我仍然得到相同的结果。我刚刚添加了一个编辑错误,我得到 – brdeav39

+0

尝试crossDomain:true,在ajax –

+0

仍然有同样的问题...这是非常混乱。 – brdeav39