【问题标题】:PHP $_GET stopped workingPHP $_GET 停止工作
【发布时间】:2014-11-08 00:57:31
【问题描述】:

所以我一直使用 $_GET 来访问文章,方法是通过 URL 传递文章 ID 并在下一页中读取此 ID,以便可以绘制与文章相关的所有值。

通过代码如下

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
            echo '<td><a href="Article.php?id=' . $row['ArticleID']. '"><img class="cover" src="' . $row['CoverImage']. '"></a></td>';

虽然有文章,但获取图片,制作图片链接,然后在点击图片时将“id=#”附加到 url 的末尾。

正如预期的那样,当点击链接时,我得到了这个。

www.r3gamers.com/Article.php?id=1

到目前为止一切似乎都很好,但使用此代码检索 id 并将其放入变量中

if ( (isset($_GET['id'])) && (is_numeric($_GET['id'])) ) {
        $articleid = $_GET['id'];
    } elseif ( (isset($_POST['id'])) && (is_numeric($_POST['id'])) ) {
        $articleid = $_POST['id'];
    } else {
        echo '<p class="error">This page has been accessed in error.</p>'; exit();
    }

总是以返回错误结束,即使它已成功附加到 URL,它也看不到该值,我不知道为什么。

值得一提的是,直到今天,这个确切的代码在实时网站上运行良好,我没有对代码进行任何更改(除了将标题移动到包含文件中,一个对这段代码没有影响的标题)而且似乎没有理由停止。 为了安全起见,我什至恢复了一个多星期前的代码(在错误开始发生之前),但这并没有修复错误。

编辑:作为对回复的回应,我使用 var_dump($_GET) 测试了返回“空”的脚本。

error_reporting(E_ALL); ini_set('display_errors', 1); 然而,这个建议根本没有给出任何反馈(我可以找到),大概意味着没有发现脚本错误?

EDIT3:由于没有发现错误,我创建了两个相当简单的文件来测试 getter 和 setter 是否正常工作。

testset.php

<a href="testget.php?id=1"><img class="cover" src="Pictures/TheLastOfUs/Cover.jpg"></a>

testget.php

<?php

var_dump($_GET);
?>

这会产生这个输出

array (size=1)
  'id' => string '1' (length=1)

为了确保它确实有效,我尝试了不同的值

array (size=1)
  'id' => string 'thisisatestid' (length=13)

这当然意味着“损坏”的不是我的项目,而最坏的情况是上面提到的一两个文件? (可能只是article.php)?

EDIT4:进一步测试(将初始链接从 article.php?id=".row ...." 更改为 testget.php?id=".row ...." 表明索引肯定仍在工作正如预期的那样,通过 var_dump 输出生成的 ID

那么,问题就出在 article.php 页面上。

EDIT5: VAR_DUMP($_GET); on "Article.php" 现在从 URL 中检索 id,但 GET 测试没有,所以它仍然无法正常工作(虽然我觉得终于取得了进展)

EDIT6:我已经设法让 id 传递在 localhost 上完美运行,但是在将新的工作副本上传到 godaddy 后,它仍然无法正常工作。 $_GET 值被 var_dump 检查传递,但 getter 没有成功(具有讽刺意味),因为它找不到 get 值……这绝对没有意义。

【问题讨论】:

  • 您是在本地主机上还是在您的域上进行测试?您是否将更新后的代码上传到服务器?
  • 做一个var_dump($_GET)并分享内容。
  • 是的,是的,我在 localhost 上进行测试,如果满意,我将其上传到服务器并在那里进行测试以确保它可以正常工作,在这种情况下,它没有。
  • 如果你真的不知道它是在 $_POST 还是 $_GET 中,你可以使用 $_REQUEST。但您应该始终知道它的来源。
  • 您在服务器上进行了重写?检查.htaccess

标签: php get


【解决方案1】:

括号太多;试试这个:

if(isset($_GET['id']) && is_numeric($_GET['id'])){
   $articleid = $_GET['id'];
}else{
   echo '<p class="error">This page has been accessed in error.</p>'; 
   exit();
}

此外,如果您确定您正在通过 GET 访问 id 变量,则没有理由尝试 POST,因此请摆脱那些额外的代码。

您提到了有关包含文件的内容?将此代码放在脚本的开头,它可能会给您一些需要查看的错误,以便您了解问题所在:

error_reporting(E_ALL);
ini_set('display_errors', 1);

如果有任何与服务器端 PHP 相关的错误,它会为您输出并让您知道发生了什么。

编辑: 在这一点上,我不得不想象您的托管服务更新了他们的服务器或对您在不使用更安全的东西的情况下无法访问 $_GET 请求变量的地方进行了一些修改。这一切都可能是增强的安全功能。试试这个:

$articleid = filter_input(INPUT_GET, 'id');

if(!$articleid || !is_numeric($articleid)){
   echo '<p class="error">This page has not been properly accessed.</p>';
   exit;
}

【讨论】:

  • 这并没有帮助,虽然我同意回头看它,最外面的括号根本不需要,POST可能需要也可能不需要,我还没有决定所以我认为它不需要拥有它不会有什么坏处。提到的 inc 文件实际上是一个黑条标题,与数据库完全无关,更不用说 getter、setter 和其他任何东西了。这只是链接。错误报告似乎根本没有提供任何信息。
  • 编辑也不起作用。我认为这与托管服务的安全性无关,因为它现在也无法在 localhost 上运行。
【解决方案2】:

试试这个

if ( isset($_GET['id']) && is_numeric($_GET['id']) ) {
    $articleid = $_GET['id'];
} else {
    echo '<p class="error">This page has been accessed in error.</p>';
    exit();
}

【讨论】:

  • 不幸的是,这并没有解决它(如果它解决了我会很生气)
  • @edrich 我真的不明白你为什么这么说。 elseif 是语言的一部分。
  • 我没有否决你的答案,但我个人认为你应该简单地将其作为评论而不是作为答案。
  • @iLot 您的问题与这里无关,但这里有一个链接解释了差异和对它的需求:php.net/manual/en/control-structures.elseif.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2010-12-12
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多