PHP - 地址后面的问号是如何工作的?

6

我一直在想像http://example.com/filename.php?dosomethinghttp://somesite.net?logoff这样的链接有什么作用。

由于我对PHP不太了解,而且英语不是我的母语,我一直无法找到像这样的好信息。

我知道http://mysite.com/edit.php?editpasswordhttp://mysite.com/edit.php?editname可以提供完全不同的内容,但我该如何实现呢?

假设我想将这些代码实现到?editpassword中

Password
<input type="password" name="password">
<input type="submit">

并将这些代码行添加到?editname中

Type your name
<input type="text" name="name">
<input type="submit">

如何在可能包含

的文件中完成此操作?

<?php 
require "includes/head.php"; 
require "includes/nav.php";
if(!isset($_SESSION['login'])){
    header("Location: index.php");
}
?>



            <div class="row-fluid">
        <div class="span3">
          <div class="well sidebar-nav">
            <ul class="nav nav-list">
            <li class="nav-header">New</li>
              <li><a href="#">sss</a></li>

            </ul>
          </div><!--/.well -->
        </div><!--/span-->
        <div class="span9">
          <div class="row-fluid">
            <div class="span9">
              <h2>Some header</h2>
              <p>Some text</p>
            </div><!--/span-->
          </div><!--/row-->
          <div class="row-fluid">
            ?editname & ?editpassword should appear here.
      </div><!--/row-->

            <?php require "includes/footer.php"; ?>

something like that?

4个回答

6
如果只有?foo,则整个查询字符串可以通过$_SERVER['QUERY_STRING']获得,它的值是"foo"
使用method="GET"的HTML表单时,您会得到键值对,然后可以通过$_GET['key']访问它们。实际上,当使用POST时也会接收这些键值对,但是它们不会在URL中显示,您需要通过$_POST['key']来访问它们。
假设您想要代码非常简单,而且不使用一些高级路由框架,那么您的代码应该像这样:
switch($_SERVER['QUERY_STRING']) {
    case 'editname':
        // do stuff
        break;
    case 'editpassword':
        // do stuff
        break;
    default:
        // do stuff if none of the cases matched
}

但我强烈建议您使用适当的GET变量,而不仅仅是纯粹的查询字符串。只需将该片段的第一行替换为以下内容:

$action = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
switch($action) {

但我强烈建议您使用适当的GET变量,而不是简单的查询字符串。 - ThiefMaster

3

使用 ? 路径后传递的任何内容都被称为“查询字符串”,在 PHP 中可以通过 $_GET[] 超全局数组访问传递的变量。

假设在您的示例中,您分别传递了editnameeditpass。然后,您可以使用以下代码处理它们:

<?php
if(isset($_GET['editname']))
{
    // handle edit name code here (i.e. show form, etc.)
}
elseif(isset($_GET['editpass']))
{
    // handle edit pass code here
}
?>

如果以上方法都失败了,你还可以使用$_SERVER['QUERY_STRING']数组值,该值将返回?后面的任何内容。如果你需要处理许多不同的可能性查询字符串,最好使用switch()语句:

switch($_SERVER['QUERY_STRING'])
{
    case 'editname':
        break;

    case 'editpass':
        break;

    default:
        // i.e. no query string.
        break;
}

有时候,您可能需要在查询字符串中传递多个变量,此时变量由&分隔。您也可以使用通常的赋值运算符(=)为变量分配值。例如,考虑以下URL: view-user.php?id=1&action=view 然后我们可以在view-user.php中访问$_GET['id']$_GET['action'],并根据需要处理所有内容。

使用 $_SERVER['QUERY_STRING'] 不是教给初学者的最佳选择。最好使用 $_GET['']$_POST[''] - Jacco
$_SERVER['QUERY_STRING'] 包含完整的 URL 参数字符串。您的 switch 语句检查 URL 参数的完整组合和顺序是否等于列出的 switch 值之一。因此,如果 URL 参数以不同的顺序出现(这当然是完全正确的),则您的 swith 语句示例将不再起作用。这可能会令人困惑,并且很少是初学者所寻找的。 - Jacco
当您传入单个字符串时(如OP发布的那样),它是不相关的,有时也是最佳解决方案。当使用多个参数时,我提供了最佳实践。当然,您应该阅读整个问题,并使用最适合的解决方案。您评论说这不是最佳选项有点多余。 - BenM

0

问号后面的所有值都是http-get参数。您可以使用if(isset($_GET['login'])) {}检查它们是否设置。您还可以通过使用parameter=value来分配这些参数值。


-1

?标记是第一个URL参数。您可以使用&添加其他URL参数。

URL http://example.com/index.php?foo=1将导致

// index.php
echo $_GET['foo']; // outputs: 1

網址 http://example.com/page.php?foo=2&bar=baz

// page.php
echo $_GET['foo']; // outputs: 2
echo $_GET['bar']; // outputs: baz

请注意,在(X)HTML中,&正确地写作&amp;,因为它是一个保留字符。
因此,一个完整的示例index.php如下:
<html><head><title>Example</title></head><body>
<?php
    if (isset($_GET['foo'])) {
        echo 'link was clicked '.$_GET['foo'].'x<br>';
        if (isset($_GET['bar'])) {
            echo 'foo is '.$_GET['bar'].'<br>';
        }
        $url = 'index.php?bar=world&amp;foo='.($_GET['foo'] + 1);
    } else {
        $url = 'index.php?foo=1&amp;bar=hello';
    }
    echo '<a href="'.$url.'">click me!</a><br>';
?>
</body></html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接