2012-01-21 9 views
1

に未定義のインデックス、私はMurachのPHPとMySQL帳からPHP & MySQLのアプリケーションに次のエラーを取得しています:私は(まだ)何のコードを変更しなかったお知らせ:ライン5

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); 
?> 

答えて

3

これは、PHPを意味することは、あなたにそれが間違っていると考えて何かを伝え、予告なく、誤りですが、コードが妨害されずに実行されます。その理由は、クエリ文字列にcategory_idを渡さないと、GET配列の対応する要素が存在しないためです。

配列要素の存在をチェックしない多くのレガシーPHPコードがあります。この場合、エラー報告レベルを変更して通知を単にミュートすることは避けられません。また、GETパラメータへのアクセスがこの種の通知をまったく引き起こしてはならないと主張することもできます。

ただし、エラー報告レベルを調整することは悪い習慣とみなされます。通知はしばしば非常に有用なことがあります。だから、新しいコードを書くときには、これが起こらないように必要なチェックを追加してください。

INTVALため

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

ただ、最初isset()をご確認ください。 $_GET['category_id']インデックスが存在しない場合に$category_idに割り当てようとすると、PHPは通知を発行します。

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

注意してくださいまた、私はSQLインジェクションのために使用することができ、無効な入力に対して保護するためにintval()$_GET['category_id']に包まれていること。三項演算子を使用して

短縮形バージョンは:

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

+1だろう通知を取得せずにこれを行うための適切な方法、良いキャッチ –

+0

あなたがPHP 7で '' ??演算子を使用することができます '' '$ CATEGORY_ID = INTVAL ($ _GET ['category_id'] ?? 0); '' ' –

関連する問題