注意:未定义的索引[重复]

Posted

技术标签:

【中文标题】注意:未定义的索引[重复]【英文标题】:Notice: Undefined index [duplicate] 【发布时间】:2009-06-21 03:09:45 【问题描述】:
$thread_id = (isset($_GET['id']));
$thread_id = intval($_GET['id']);

$q = mysql_query("SELECT * FROM threads WHERE id = $thread_id");

你不能对一个变量使用两个函数吗?如您所见,我检查了它是否已设置,但它仍然给了我:

注意:未定义索引:第 7 行 C:\wamp\www\bfhq\thread.php 中的 id

【问题讨论】:

前段时间我向 PHP 提出了一个 setor() 语言结构来解决这个常见问题。可悲的是,它被变形为新的 ?: 语法,它不能解决 E_NOTICE 问题。哦,好吧... "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset" using PHP 的可能重复项 【参考方案1】:

试试这个:

$thread_id = isset($_GET['id']) ? intval($_GET['id']) : 0;

读作“如果设置了$_GET['id'],则将$thread_id设置为intval($_GET['id']),如果没有设置为0”

【讨论】:

【参考方案2】:

isset() 返回一个布尔值:TRUE / FALSE。如果要确定是否设置了 $_GET["id"],则需要在 IF 语句中或通过三元运算符进行。

if (isset($_GET["id"])) 
  $thread_id = $_GET["id"]; // Bad idea taking values in from $_GET directly
 else 
  die("Thread id not set");

【讨论】:

如果您希望变量是 ID,则对 $_GET 值调用 intval() 是完全合理的。 你是对的,保罗。很抱歉我的仓促声明 - 当我看到 $_GET 和关闭的查询时,我非常敏感;) 请记住,php 整数的最小值/最大值可能与 mysql 的数值不同。【参考方案3】:

此错误取决于 php.ini 中设置的错误/警告级别。使用它的好习惯...

array_key_exists('id', $_GET);

http://us2.php.net/manual/en/function.array-key-exists.php

另外:请确保在执行此操作之前对来自 $_GET 的输入进行清理。你让自己对 mysql 注入持开放态度。

【讨论】:

mysql 注入能否绕过 intval()?不允许 intval 只允许数字。干杯 啊,是的,我想是的。必须确保 intval 不会在错误时返回 false ,从而为您留下“WHERE =”。但是,如果您确实有 id 为 0 的记录,则它在错误时返回 0 的事实可能是一个问题。【参考方案4】:

您只需使用error_reporting(4); 即可消除所有通知。另一种可能是粗略但有效的抑制通知和清理变量的方法可能是:

$thread_id = (int)@$_GET["id"];

如果你做了很多这些事情,你可能想看看filter_var() 并将所有功能放入一个单独的函数中(例如 get_int("id"))。

【讨论】:

以上是关于注意:未定义的索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章

注意:未定义的索引:函数include()中的und [重复]

注意:未定义的索引[重复]

注意:if()中未定义的索引按结构排序[重复]

未定义索引+未选择数据库[重复]

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP