注意:第5行的未定义索引

时间:2012-01-21 13:13:02

标签: php mysql html database

我在PHP&上遇到以下错误来自 Murach的PHP和MySQL 书的MySQL应用程序:

Notice: Undefined index: category_id in C:\xampp\htdocs\book_apps\ch04_product_viewer\index.php on line 5

我没有修改代码(但是),所以我认为它应该开箱即用。应用程序应该显示数据库中的产品,唯一的问题是我遇到了这个恼人的错误。

这是index.php文件的PHP代码:

<?php
require 'database.php';

// Get category ID
$category_id = $_GET['category_id'];
if (!isset($category_id)) {
    $category_id = 1;
}

// Get name for current category
$query = "SELECT * FROM categories
          WHERE categoryID = $category_id";
$category = $db->query($query);
$category = $category->fetch();
$category_name = $category['categoryName'];

// Get all categories
$query = 'SELECT * FROM categories
          ORDER BY categoryID';
$categories = $db->query($query);

// Get products for selected category
$query = "SELECT * FROM products
          WHERE categoryID = $category_id
          ORDER BY productID";
$products = $db->query($query);
?>

2 个答案:

答案 0 :(得分:3)

这是一个通知而不是错误,这意味着PHP告诉你它认为错误的东西,但代码是无阻碍地执行的。原因是如果您未在查询字符串中传递category_id,则GET数组中的相应元素不存在。

有很多遗留的PHP代码没有检查数组元素的存在 - 在这些情况下,通常不可避免地将错误报告级别更改为简单地将通知静音。还可以说,访问GET参数不应该触发这种通知。

但是,调整错误报告级别被视为不良做法,因为通知通常非常有用。因此,在编写新代码时,请添加必要的检查,以免发生这种情况。

在没有收到通知的情况下执行此操作的正确方法是

if (isset($_GET['category_id']))
 $category_id = $_GET['category_id'];

答案 1 :(得分:2)

首先检查isset()。如果在$category_id索引不存在时尝试将其分配给$_GET['category_id'],PHP将发出通知。

if (isset($_GET['category_id'])) {
    $category_id = intval($_GET['category_id']);
else {
    $category_id = 1;
}

另请注意,我已将$_GET['category_id']intval()打包在一起,以防止可用于SQL注入的无效输入。

使用三元运算符的速记版本:

$category_id = isset($_GET['category_id']) ? intval($_GET['category_id']) : 1;