1

我对 PHP 还很陌生,正在为我的公司创建一个网站。我正在使用一些我已经获得但似乎无法使其正常工作的现有代码 - 任何帮助将不胜感激!

我有一个变量$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。我的代码有什么明显不正确的地方吗?

4

5 回答 5

4

您可能期望 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;
于 2009-03-02T18:40:51.510 回答
1

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

试试这个。

$id = isset($id) ? $id : 0;
于 2009-03-02T18:45:46.383 回答
1

如果未设置 $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 内容,因此您知道变量中的数据是用户发送的文本。只需记住在将其发送回用户或数据库时再次对其进行清理。

于 2009-03-02T18:50:12.487 回答
0

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

于 2009-03-02T18:41:37.797 回答
0

还需要包含从查询字符串 ( )中设置$id为某个时间的代码。browse.php?id=3您可能会想到register_globalsPHP 的设置,当包含在查询字符串中时会自动创建变量。不要重新启用该功能,几年来这已被证明是一个非常糟糕的主意。

从查询字符串中提取的任何变量都需要在使用之前检查类型/安全性。因此,例如,您可以从$_GET超级全局中提取变量,检查它是否为数字,如果不是,则设置默认值:

if (!is_numeric($_GET['id']) {
  setdefault($_GET['id'], 0);
}
于 2009-03-02T18:47:14.117 回答