php 从url的查询字符串中的值声明变量,如果缺少则回退到默认值

5n0oy7gb  于 2023-05-12  发布在  PHP
关注(0)|答案(6)|浏览(286)

我有一个变量**$id**,它标识要在页面上显示的产品类别类型。我首先需要检查id变量是否已设置,如果没有,则将变量默认为类别0。
代码如下:

setdefault($id, 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

因此,对于地址www.website.com/browse.php,我希望它默认为$id = 0
对于地址www.website.com/browse.php?id=3,我希望它设置$id = 3并显示相关产品。
但是,尽管设置了$id,它仍然默认为0。我的代码有什么明显不正确的地方吗?

vwkv1x7d

vwkv1x7d1#

您可能希望PHP使用$_POST和$_GET作为全局变量。PHP过去常常是这样设置的,但较新的版本要求您显式引用这些变量。
你可以试试这个:

setdefault($_GET['id'], 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

或者更简单地(使用三元运算符):

$id = array_key_exists('id', $_GET) ? $_GET['id'] : 0;
q9yhzks0

q9yhzks02#

首先,如果这是PHP 5.X,我强烈建议你不要使用&通过引用传递变量。话虽如此isset函数调用在函数内将始终为真。但是您将在setdefault($id,0)上收到一个未定义的变量警告;
试试这个。

$id = isset($id) ? $id : 0;
o8x7eapl

o8x7eapl3#

如果没有设置$id,调用setdefault($id,0)将生成一个警告。像setdefault这样的函数在PHP中不起作用。用这个代替。

if (!isset($id)) $id = 0;

如果你是为数组变量,比如$_GET和$_POST,你可以这样做:

function getuservar($A, $index, $default = '') {
    if (!isset($A[$index])) return $default;
    if (get_magic_quote_gpc()) return stripslashes($A[$index]);
    return $A[$index];
}

$clean_id = getuservar($_GET, 'id', 0);

这种返回形式更好,因为您可以立即停止使用$_GET数组,而只使用在其余代码中清理的变量。你只需要清理一次外部变量,就再也不会在代码中使用外部变量了。$A可以是$_GET、$_POST、$_REQUEST或$_COOKIE。
它还为您处理令人讨厌的magic_quote内容,以便您知道变量中的数据是用户发送的文本。只要记住在将它发送回用户或数据库时再次清理它。

4zcjmb1e

4zcjmb1e4#

$id是如何设置的?如果register_globals是关闭的(在PHP 4.2及更新版本中默认是关闭的),则需要查看$_GET['id']$_POST['id'](或$_REQUEST['id'],但有理由避免这样做)。

sh7euo9m

sh7euo9m5#

还需要包括将$id设置为查询字符串(browse.php?id=3)中的某个时间的代码。您可能会想到PHP的register_globals设置,当查询字符串中包含变量时,该设置将自动创建变量。不要重新启用该功能,几年来,这已经被证明是一个非常糟糕的主意。
从查询字符串中提取的任何变量都需要在使用之前检查其类型/安全性。例如,你可以从$_GET超级全局变量中提取变量,检查它是否是数字,如果不是,则设置默认值:

if (!is_numeric($_GET['id']) {
  setdefault($_GET['id'], 0);
}
7gcisfzg

7gcisfzg6#

你不需要为此编写一个helper函数。
如果要从$_GET['id']声明$id并回退到零,请使用以下命令:

$id = $_GET['id'] ?? 0;

当然,这并不能验证$id包含来自用户的整数值。下一步需要验证该值。

相关问题