注意:未定义的索引[重复]
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 [重复]