【问题标题】:Php pages dependent on query string but what if there's no parameter?php 页面依赖于查询字符串,但是如果没有参数怎么办?
【发布时间】:2012-07-10 13:02:25
【问题描述】:

我正在创建依赖于 url 中的查询的页面(例如 europe.php?country=france)。我知道使用 htaccess 将论文重写为 europe.php/france 以进行 SEO 等会很有用,但是如果在没有查询字符串的情况下访问该页面怎么办?

我正在使用 php 来 $_GET 查询,所以如果我在没有查询的情况下访问页面,我会得到 'var=;'即,它是空的(并检索错误)。我正在尝试使用 if 语句来检查 $_GET 是否没有检索到任何内容,但不确定这是否是正确的做法。

那么:如何检查未检索到的 var 以便设置默认值? 或者:我是不是走错了路?

【问题讨论】:

  • 你肯定是走错了路。作为开始,您肯定希望摆脱以这种方式格式化的 URL,以防万一该网站并不总是基于 php。此外,您需要包含一些源代码,以便人们更容易地帮助您。
  • 谢谢,乔丹。我将尝试模仿基于查询的 url 的使用,但需要保留一些。我已经开始使用 html5 sessionStorage 功能,但肯定有一些变量需要保留在服务器端。代码方面,从现在开始,我将努力在我的问题中使用示例。 gavin,任何关于动态页面构建的建议都非常感谢。
  • 我会使用 mod_rewrite 或其他一些函数来为您更改您的网址。所以你有europe/france,而不是europe.php?country=france
  • 是的,这是我的意图(尽管我不确定我的 apache 服务器是否必须启用它)。你知道这个重写对于 SE 索引是否是必要的,或者带有查询字符串的 url 可以被索引吗?
  • 可以对带有查询字符串的 URL 进行索引。但是现在这项技术很容易获得,除了搜索表单的结果之外,没有理由使用查询字符串。否则,最好使用普通 URL 以保持 URL 永久不变。

标签: php apache .htaccess get


【解决方案1】:

如果您知道$_GET 的索引,请使用isset()

$country = 'default';
if( isset( $_GET['country'])) {
    $country = $_GET['country'];
}

这只会测试country 参数是否被传递,但它可以被设置为一个空字符串。如果这是无效输入,您可以使用empty() 组合检查:

$country = 'default';
if( isset( $_GET['country']) && !empty( $_GET['country'])) {
    $country = $_GET['country'];
}

您可以将其压缩为一行,然后使用ternary operator 将结果保存到变量$country,如下所示:

$country = (isset( $_GET['country']) && !empty( $_GET['country'])) ? $_GET['country'] : 'default';

最后,您可以通过在$_GET 上调用count() 来检查您是否绝对没有$_GET 参数:

if( count( $_GET) == 0) {
    die( "No parameters - Invalid input!");
}

【讨论】:

  • if( count( $_GET) == 0)if (!$_GET) 具有相同的结果 - 不同之处在于具有实际计算数组中元素数量的开销。所以只能用count()来识别数组中的项数,千万不要用它来测试数组是否为空。
  • @rodneyrehm - 不完全是,在内部,PHP 始终对数组中的元素数进行计数。因此,这是一个O(1) 查找时间,性能差异可以忽略不计。更不用说if( count( $_GET) == 0)if (!$_GET) 更具可读性。
  • 对于$foo == "0"isset($foo) && !empty($foo) 也为假
  • @rodneyrehm 你知道哪个国家叫"0"?对我来说似乎是适当的功能。
  • 显然没有国家叫“0”。我的观点是,这是一个常见的陷阱,应该注意。
【解决方案2】:

因为 isset() 确实测试“NOT NULL”,你应该使用empty() 来测试是否给出了一个空字符串:

if (empty($_GET['country'])) {
  $_GET['country'] = "default";
}

也就是说,除非您希望 0 是一个有效的输入,在这种情况下,您必须检查 isset 并确保字符串至少包含一个字符:

if (!isset($_GET['country']) || !strlen($_GET['country'])) {
    $_GET['country'] = "default";
}

可以优化成

if (!isset($_GET['country']) || !isset($_GET['country'][0])) {
    $_GET['country'] = "default";
}

【讨论】:

  • 同时使用两者不是最好的解决方案吗?
  • isset() 是 empty() 的子集。所以运行 isset() 和 empty() 会无缘无故地做两次相同的工作。
  • 谢谢,我正在尝试,会尽快回复您
  • 在这种情况下,我使用 $long = $_GET[long]; (这是一个数字变量)。所以在你的代码中“if (empty($_GET[long])) { $_GET[long] = 100;”请问我在哪里设置var $long? }
【解决方案3】:

尝试使用类似的东西:

$var = ( isset($_GET['var']) ? $_GET['var'] : 'default value' )

【讨论】:

    【解决方案4】:

    试试这个

    if(isset($_GET['your_variable'])) { 
        $variable = $_GET['your_variable']; 
    } else { 
        $variable = "not set"; 
    }
    

    如果在您的 URL 中设置了变量,它将设置该变量 - 如果未在 URL 中设置,它可以将您的变量设置为其他值

    【讨论】:

      【解决方案5】:

      在页面开头运行检查以查看是否设置了 var 是可以的。如果它是空的,你可以使用类似的重定向:

      header("HTTP/1.0 404 Not Found"); 
      header('Location:YOUR PAGE NOT FOUND PAGE');
          exit();
      

      附带说明,如果您使用来自 $_GET 的数据,则需要确保此数据经过验证和清理,以防止各种安全入侵,例如 XSS,如果您使用数据库, MYSQL注入。在页面开头运行测试以检查它是否为空可能只是开始 - 您还可以确保数据是您所期望的(例如,检查它是字母数字)。之后,使用 $_GET 数据,任何人都可以用他们喜欢的任何内容填充 URL 栏,并可能损坏您的网站。

      希望这有帮助!

      【讨论】:

      • 谢谢,我将从安全角度对此进行调查。很高兴听到反馈。如果它为空,我最好设置 var,而不是重定向。
      • 那么你会推荐依赖查询的页面吗?我担心 SE 索引,因此担心 htaccess 点,但它们似乎是易碎的。有没有其他方法可以创建动态页面?
      • 如果数据经过清理,它希望不会被破坏。即不打印任何 $_GET 页面,而是将此数据保存为变量,然后对其进行清理。或者,您可以在 $_POST 和 $_SESSION 中传递导航,但这可能会变得笨拙。据我所知(可能更多)的另一种方法是拥有几十个小文件,您可以在其中物理定义您的变量(例如,$country = 'france'),这些文件放置在 website.com/france/ 所在的文件夹中使用权。然后你可以只包含()一个从数据库动态填充页面的模板。希望对您有所帮助!
      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多