【问题标题】:$_SESSION with Ajax$_SESSION 与 Ajax
【发布时间】:2014-03-18 20:14:09
【问题描述】:

我有两个 php 文件。

addbasket.php

<?php    
session_start();   
$link = $_SESSION['link'];  
if (isset($_SESSION['userid'])) {......}
?>

index.php

<?php 
session_start();   
$_SESSION['link'] = mysqli_connect("localhost","test","test","dbname");  
$link = $_SESSION['link'];
.... 
?>

文件 addbasket.php 被 Ajax 调用并给出文章(编号)和金额(编号)的参数

但是 mysqli_query 不起作用。 $_SESSION['link'] 似乎在 addbasket.php 中不存在。 不可能是Session,因为$_SESSION['userid']在那里,对,可以回显。

这可能是什么问题?

【问题讨论】:

  • $_SESSION['link'] = mysqli_connect("localhost","test","test","dbname"); 应该做什么?
  • 它适用于所有页面,除了 Ajax 调用。
  • 它用于设置所有页面的 mysqli_connect,所以如果主机发生变化,我不必更改所有 php 文件(大约 50 个)上的文本,我可以在 index.php 中更改它跨度>
  • 是的,但您不能在会话中存储像数据库连接这样的资源
  • 哦不.. :( 所以当我在本地主机上完成时,我必须在所有页面上更改它?

标签: php ajax session


【解决方案1】:

$_SESSION只能存储可序列化的数据。

mysqli_connect 返回一个资源。资源不可可序列化。

您必须在每个请求中实例化该数据库连接。

编辑: 好的,现在我了解您的实际问题了。 你需要的是某种形式:

db.php

$link = mysqli_connect("localhost","test","test","dbname");

index.php

require 'db.php';
$r = mysqli_query($link, 'SOME QUERY...');
....

addbasket.php

require 'db.php';
$r = mysqli_query($link, 'SOME OTHER QUERY...');
....

【讨论】:

  • 您需要了解您的网络服务器是如何工作的。当您 includerequire index.php 中的文件时,该代码在同一进程中运行,但是当您发出 AJAX 请求时,网络服务器会启动一个新进程,该进程不与正在运行的 index.php 共享任何内容。
  • 是的..但是索引是:&lt;?php session_start(); $_SESSION['link'] = mysqli_connect("localhost","test","test","dbname"); $link = $_SESSION['link']; mysqli_set_charset($link, 'utf8'); if (isset($_SESSION['userid'])) { $userid = $_SESSION['userid']; $user=mysqli_query($link,"SELECT * FROM user WHERE ID = '$userid'"); } ?&gt; 并且它有效...
  • 当然可以。 $_SESSION 只是一个数组。当您调用session_start 时,在您的所有代码运行和反序列化之后,它会神奇地 序列化(并保存在某处)。在这两个步骤之间,正如我所说的,它只是一个普通的 Array。
  • 哦,好吧......你知道我的问题的解决方案,我只想在一页上拥有数据库连接吗?而不是全部 50 个?
  • 没有。您必须在每个请求中打开与数据库的连接。您显然可以在整个请求的整个生命周期内全局重用它。这就是为什么您的代码在 index.php 中有效$_SESSION 是全局的。
【解决方案2】:

你不能序列化一个资源对象,这就是你不能在会话中持有它的原因

【讨论】:

  • 但它适用于不被 ajax 调用的普通 php
  • 我认为默认情况下它使用当前打开的数据库链接,这就是它在某些情况下工作的原因 - 当您在当前脚本执行期间打开连接时
  • 没有办法将链接存储在加载时添加到脚本中的“文本”中吗?就像脚本运行前的回声?...
  • 没有。您可以使用持久连接,但我不建议您这样做。每次调用 PHP 脚本时,您只需打开一个新链接
  • 哦……那意味着当地址改变时,所有50页的链接都要改变?
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2021-04-20
  • 2018-07-27
  • 2016-02-08
  • 1970-01-01
  • 2013-07-06
  • 2016-08-18
  • 2015-05-14
相关资源
最近更新 更多