【问题标题】:Couldn't find variable from multiple pages无法从多个页面中找到变量
【发布时间】:2014-01-31 01:25:20
【问题描述】:

我很困惑,是的,一切都会在数据库中。而且,确实有点深。有 4 页 PHP 涉及此问题。首先,我需要解释一下,您需要了解站点地图。站点地图应该是这样的 forum.php --> forum-topic --> discussion.php --> deleteTopic .php.

所以,我将如下图更清楚地解释。

Discussion.php。此页面用于转到新页面以删除主题。因此,我将像 topic_id 这样的变量传递给 deleteTopic.php,因为我必须从 discussion.php 中检索值。下面是这样的。

<a href=\"deleteTopic.php?topic_id=$topic_id\">DELETE</a>

删除Topic.php。此页面用于删除所选主题并从 discussion.php 中检索 topic_id

$topic_id = $_REQUEST['topic_id'];    
$sql = "DELETE FROM forum_topic WHERE topic_id = $topic_id ";
mysql_query($sql);
echo "Topic has been deleted!";
header ('Location:forum-topic.php');
exit();
?>

是的,它已成功删除所选主题,但它在 forum-topic.php 上显示一些错误,例如 unidentified thread_id 和 thread_name。我意识到我已经在 forum.php 中检索到了该值。因为在 deleteTopic.php 中,它有一个来自 forum.php 的值。所以代码应该是这样的。

论坛.php。这是所选线程转到 forum-topic.php 的地方。因此,我必须传递像 thread_id 和 thread_name 这样的变量。

<a href=\"forum-topic.php?thread_id=$thread_id&thread_name=$thread_name\">$thread_name</a>

那么,你能告诉我该怎么做吗?我不知道我应该在哪里检索变量并将其从 discussion.php 传递到 deleteTopic.php 并导航到 forum-topic.php已成功删除所选主题。不幸的是,forum-topic.php 有一些来自 forum.php 的值。

那么,你能告诉我应该从哪里开始吗?还有你能带我去吗?我非常感谢您的任何回答。干杯!

【问题讨论】:

  • 根据您之前解决的其他问题,您使用的是mysql_query($sql);,请注意mysql_ 而不是mysqli?因此,如果再次出现这种情况并且您使用与另一个相同的数据库连接(您应该这样做),您需要做mysqli_query($conn,$sql);
  • 是的,我正在尝试从 MySql 转换为 MySqli,因为我被排除在外太久了,所以我正在尝试扩展我的知识。
  • 现在对你有用吗?
  • 不,它还没有工作,我还在尝试这样做。并且会让你和其他人知道。
  • 看看这些关于 SO 的问答可能会有所帮助。有些是mysql_,但可以很容易地修改stackoverflow.com/q/13997358stackoverflow.com/q/21359041stackoverflow.com/q/21048004stackoverflow.com/q/20603973

标签: php mysql


【解决方案1】:

如果您想存储 thread_id 和 name 的值,请将其存储在 session 中,并随时检索它们。

因此,在 forum-topic.php 中,首先检查您是否有新的线程变量,并将它们添加到会话中,否则,如果您来自 deleteTopic.php,您可以使用会话中现有的线程变量。 一般的想法是这样的-

<?php
    session_start();
    if(isset($_GET['thread_id']) && isset($_GET['thread_name'])){
        //If the GET parameters are available. Store them.
        $_SESSION['thread_id'] = rawurldecode($_GET['thread_id']);
        $_SESSION['thread_name'] = rawurldecode($_GET['thread_name']);
    }else{
        if(!isset($_SESSION['thread_id']) && !isset($_SESSION['thread_name'])){
            //Error.
            die('error');   //Or you can redirect.
        }
    }
    /*
    The session variables have been initialised.
    */
    $t_id   = $_SESSION['thread_id'];
    $t_name = $_SESSION['thread_name'];
    /*
        From here on, instead of using $_GET['thread_id'] and $_GET['thread_name'], use $t_id and $t_name.
    */
    //Rest of your code.
?>

主要问题是在从表中删除并持久化线程变量后返回时对参数的处理。

【讨论】:

  • 我可以知道我应该在哪里编码吗?是在forum.php 中吗?还是在哪里?我应该在哪里开始会议?它在论坛主题中吗?还是在哪里?你能解释清楚一点吗?我明白你在说什么,但我只是不知道我应该把它们放在哪里。谢谢!
  • 代码用于forum-topic.php。这段代码应该在顶部,因为您正在确定是否应该显示页面(取决于线程变量)。您需要对需要保留线程变量的所有页面使用会话。
  • 在这种情况下,如果您只在论坛主题页面上使用 session_start() 应该没问题,因为您只在此处访问会话变量。
  • 我尝试使用此代码放入forum-topic.php,它根本不起作用。我需要将回声放在控制范围内吗? @是的
  • 你能试着在/* */里面举个例子吗?
【解决方案2】:

将逻辑添加到 forum-topic.php 以优雅地处理不接收任何参数,甚至接收到 thread_id 和 thread_name 的无效值。应该有一些默认定义为后备。

您还可以使用会话变量来处理页面之间的记忆值。如果您在 php.net 文档之前没有使用过它们,一开始可能会觉得有点吓人,但如果您搜索一些示例,它们的使用会非常简单。

然后阅读SQL Injection并取消用户将$topic_id更改为他们想要在URL中攻击您的数据库或删除任意主题的能力。

还强烈考虑将所有 mysql 函数更改为 mysqli 或 PDO,因为不推荐使用 mysql 函数。 (PDO 和 mysqli 还提供了更好的方法来使用参数化查询来防止 SQL 注入。)

很抱歉,我没有一个快速简单的答案给你,但所有这些都将大大有助于改进你的代码。

【讨论】:

    【解决方案3】:

    使用isset()函数查看变量是否有值:

    if (isset($thread_id) && isset($thread_name)){
    echo "<a href=\"forum-topic.php?thread_id=$thread_id&thread_name=$thread_name\">$thread_name</a>"; }
    

    【讨论】:

    • 顺便说一句,您的echo 缺少开始和结束引号,会引发解析错误。
    • 糟糕,我忘记放了。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多