【问题标题】:Linking dynamically generated links to php, by passing session id for each link通过为每个链接传递会话 ID,将动态生成的链接链接到 php
【发布时间】:2016-02-24 14:48:36
【问题描述】:

我在 item.php 中有这段代码:

while ($row = mysqli_fetch_array($res)) {
$link .= '<br><a href="item.php?id='.$row['item_id'].'">'.$row['item_name'].'</a><br>';
}

echo $link;

所以这会根据有多少结果(在数据库中)生成链接,所以假设用户有 4 个项目,它会将项目名称显示为超链接,但我不确定如何将其链接到我的 itemdetail .php。所以每个项目都将链接到 itemdetail.php,但它们将具有将从 mysql 数据库中获取的唯一信息。

目前我只想让 itemdetail.php 回显项目名称,但我现在想要的是,我想根据 item_id 为每个链接生成一个唯一的会话 id,所以当我按下它时会话 id 被传递给 itemdetail.php,从那里我可以将会话 id 作为字符串传递并从 mysql 中提取数据(这很简单,所以不需要帮助)。

我知道如何在页面之间传递会话 ID,但这仅适用于固定链接(已存在的按钮),但我不知道如何为生成的按钮/链接执行此操作。

仅供参考,我的网址确实显示 /item.php?id=12345, 12345 是我的 item_id,如果有帮助的话。这是当我单击生成的链接时(所以从 /item.php 到 /item.php?id=12345 或每个链接的 item_id 是什么),但当然除了更改 url 之外,链接什么也不做。

tl;dr 为每个生成的链接创建一个唯一 id(最简单的方法可能是获取 item_id 并使用它),将唯一 id 作为会话传递,然后在另一个 php 中回显会话。

提前感谢您提供任何有用的见解。

itemdetail.php

<?php
session_start();
include('connection.php'); 
echo $_SESSION['advert'];
$aName = $_SESSION['advert'];
?>

atm 没有任何反应,因为 item.php 中的按钮没有连接到这个。如果我尝试:

while ($row = mysqli_fetch_array($res)) {
$link .= '<br><a href="item.php?id='.$row['item_id'].'">'.$row['item_name'].'</a><br>';
if($link == true) {
 header("Location:item.php");
}

我收到“已发送的标头”错误

【问题讨论】:

    标签: php html mysql session


    【解决方案1】:

    如果您像现在一样传递它,要访问项目 ID,请使用 $_REQUEST['id'] 之类的东西。

    如果您实际上是在询问会话 ID(与问题中显示的应用程序级项目 ID 不同):

    会话 ID 通常通过 cookie 传递。

    PHP 将在本机为您执行此操作,而无需大量应用程序代码。您只需调用session_start(),用户的会话数据将在$_SESSION 全局中可用。

    在幕后,这是通过让服务器通过 set-cookie 标头将会话 ID 传递给客户端,客户端的浏览器将把它交还给所有未来对同一服务器的请求。在服务器端,会话 ID 连接到数据存储(本地文件系统上的文件,默认情况下,但可以是数据库或其他取决于您的 PHP 配置)。

    【讨论】:

      【解决方案2】:

      我不完全确定你想要实现什么。

      如果您希望页面item.php 在未指定id 的情况下显示项目列表,则只需使用if ($_REQUEST['id']) 来分隔这两种情况。 (处理输入时要小心!)

      如果项目 id 不足以唯一标识一个项目(它应该),那么也将其他信息添加到 url:

      $link .= '<br><a href="item.php?id='.$row['item_id'].'&sid='.session_id().'">'.$row['item_name'].'</a><br>';
      

      如果直接使用session_id()有问题,可以做两件事:

      1. 在发送标头之前调用 session_id() 并将 id 存储在变量中。
        $SID = session_id() 或类似的东西。
      2. 缓冲输出直到最后。见ob_start()

      但是,如果您希望显示列表中的项目具有相同的标识符,但根据查看它们的用户而有所不同,则必须提供更多详细信息。

      您在item.php?id=N 中的逻辑可以调整为考虑$SID 并将接收到的ID N 转换为数据库中使用的项目的unique id。完全取决于您的特定应用程序...

      您还可以使用 php 方便地为您维护的 $_SESSION 数组。当您生成链接时,将所需的信息(例如unique item id)存储在那里。然后下次加载item.php?id=1 时可以访问$_SESSION['item_links'][$n]

      再说一次,我不太明白你在问什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 2020-06-19
        • 2017-05-27
        相关资源
        最近更新 更多