【问题标题】:How do i use GET correctly in php?如何在 php 中正确使用 GET?
【发布时间】:2020-08-06 10:47:07
【问题描述】:

我尝试了 2 个小时来解决我的问题,但我不知道为什么我的代码不起作用。

我有一个如下所示的 sql 输出:

function output(){
    while($row = $this->statement->fetch()) {
        $id = $row["id"];
        echo '
            <tr>
                <td>'.$row["comname"].'</td>
                <td>'.$row["district"].'</td>
                <td>'.$row["industry"].'</td>
                <td>"<a href="?details=' . $id . '">Details</a>"</td>
            </tr> 
            <br>
            ';
    }
                

如果有人单击“详细信息”链接,我想提供有关该特定公司的更多信息。因此,我将 id 保存在 url 中以识别点击了哪个公司。 为了检查是否点击了详细信息链接,我写了这个:

编辑:刚刚在提示后添加了“$id = $_GET['details']”,现在看起来像这样:

    if (isset($_GET['details'])){
        $id = $_GET['details'];
        echo $id;
    }
}

当我单击“详细信息”链接时,它会正确更改 URL,但不会打印 ID。 (我不仅想打印 id,我只是为了检查功能。)为什么我的代码不起作用?我必须使用第二个“$GET”吗?真不知道怎么回事。

编辑:php 代码到此结束,之后我什么也不做。

Edit2:我试过 print_r($_GET),看起来ID 甚至不在$GET-Array 中。 if (isset($_GET['details'])) 语句也不会执行。

谢谢!

【问题讨论】:

  • 尝试使用print_r($_GET); 来检查 GET 数组中放置的内容
  • error reporting 添加到文件顶部测试时,例如,在您打开PHP 标记之后。即使您在配置为 LIVE 的服务器上进行开发,您现在也会看到任何错误。 &lt;?php error_reporting(E_ALL); ini_set('display_errors', 1);
  • 要在实时环境中从 PHP 中获取错误,请将这 4 行添加到要调试 ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 的任何基于 MYSQLI_ 的脚本的顶部。这将强制任何MYSQLI_ 错误生成一个您可以在浏览器上看到的异常以及正常的 PHP 错误。
  • 您更改了代码,但没有任何 cmets。首先你有echo $id; 没有$id = $_GET['details'];,这是有道理的,它不起作用。现在您添加了$id = $_GET['details'];,没有任何 解释或评论。如果我们不知道您的实际代码是什么以及它的结果是什么,那么我们究竟应该如何提供帮助?你试过了吗?成功了吗?
  • 在您展示的代码之后,还要向我们展示脚本中还有哪些其他代码。这可能会对您看不到任何输出的原因产生一些影响

标签: php html sql


【解决方案1】:

你应该打印$_GET['details']:

if (isset($_GET['details'])){
    echo $_GET['details'];
}

或者把它放在一个变量中:

if (isset($_GET['details'])){
    $id = $_GET['details'];
    echo $id;
}

【讨论】:

  • 感谢您的回答!我试过了,但它不起作用。没有错误或什么,只是没有任何反应。
【解决方案2】:

$_GET[] 只是 URL 中所有 GET 参数的数组。例如,您可以在 https://www.google.com?q=stack+overflow 上看到它们,其中参数 q 设置为 stack+overflow。因此,如果您在该 URL 上回显$_GET["q"],您将得到stack+overflow。您可以将其存储在 $id 之类的变量中并回显,但您需要先设置它,例如 $id = $_GET["details"];

编辑:我刚刚意识到您现在拥有的代码容易受到称为XSS 或 HTML 注入的攻击。由于我们可以指定 $_GET["details"]$id 来回显,攻击者可以在其中放置 HTML 代码或 &lt;script&gt; 标记,以对访问该 URL 的每个人执行危险的 JavaScript 代码。

幸运的是,有一个简单的解决方法:只需将函数 htmlspecialchars() 放在任何用户输入的 echo 周围。您在此处的 echo 将变为 echo htmlspecialchars($id);

【讨论】:

  • 感谢您的回答。我试过了(现在也只是将它添加到问题中的代码中)但它仍​​然不起作用。没有错误消息,只是什么都没有发生。
  • 您提供的代码对我来说可以正常工作,您确定 1. URL 看起来像 site.com/page.php?details=42 和 2. 没有打印 id?尝试查看源代码(Ctrl + U)并搜索(Ctrl + F)您指定的数字
  • 我也刚刚意识到您的代码容易受到 XSS 攻击。看看我的回答中的编辑
  • 我检查了一下,希望打印只是隐藏在某个地方,但什么也没有。该 URL 有效,看起来与您编写的完全一样...但似乎 $GET 数组没有收到 id...如果有必要告诉我,但在 php 代码之上我写了一个 html 表单,并且 $GET 数组仅包含此表单中的值,但不包含 php 代码中的 id。
  • 让我们找出问题所在。你能不能试着打印一些固定为echo "42" 而不是$id 的东西。如果这可行,我们知道它与未设置 $id 变量有关
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2020-07-01
  • 2021-12-11
  • 1970-01-01
  • 2013-10-13
  • 2015-12-14
相关资源
最近更新 更多