2009-06-21 8 views
1
$thread_id = (isset($_GET['id'])); 
$thread_id = intval($_GET['id']); 

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

ne pouvez-vous utiliser deux fonctions sur une variable ?? Comme vous pouvez le voir, je vérifier si son jeu mais il me donne encore:Notice: Undefined index

Notice: Undefined index: id dans C: \ wamp \ www \ bfhq \ thread.php sur la ligne 7

+0

Il ya quelque temps, j'ai proposé une construction de langage setor() à PHP pour résoudre ce problème commun. Malheureusement, il a été transformé en la nouvelle syntaxe?: Qui ne résout pas le problème E_NOTICE. Eh bien ... – gahooa

Répondre

3

isset() retourne une valeur booléenne: TRUE/FALSE. Si vous voulez déterminer si $ _GET ["id"] est défini, vous devez le faire dans une IF-Statement, ou via un opérateur ternaire.

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

Appeler intval() sur une valeur $ _GET est parfaitement raisonnable si vous vous attendez à ce que la variable soit un ID. –

+0

Vous avez raison, Paolo. Désolé pour la déclaration hâtive en mon nom - je suis juste très sensible quand je vois $ _GET et une requête qui se ferme;) – Sampson

+0

Gardez à l'esprit qu'un entier PHP peut avoir des valeurs min/max différentes des valeurs numériques de mysql. – VolkerK

5

Essayez ceci:

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

qui se lit comme "si $_GET['id'] est réglé, $thread_id-intval($_GET['id']), sinon, réglé sur 0"

0

Cette erreur dépend en cas d'erreur/avertissement niveau défini dans php.ini. Sa bonne pratique à utiliser ...

array_key_exists('id', $_GET); 

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

aussi: assurez-vous désinfectez cette entrée de la _GET $ avant de le faire. Vous vous laissez ouvert à l'injection de mysql.

+1

peut injections mysql contournement intval()? doesnt intval ne permet que des nombres. acclame –

+0

ah, oui je suppose. a dû s'assurer qu'intval n'a pas retourné false sur une erreur, vous laissant avec "WHERE =". Cependant, le fait qu'il renvoie 0 en cas d'erreur pourrait poser problème si vous avez des enregistrements avec un identifiant de 0. – nategood

0

Vous pouvez vous débarrasser de tous les avis en utilisant simplement error_reporting(4);. Un autre, peut-être brut mais travailler, méthode pour supprimer l'avis et désinfectez la variable pourrait être:

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

Si vous faites beaucoup de ces choses, vous voulez peut-être jeter un oeil à filter_var() et de mettre toutes les fonctionnalités en une fonction séparée (par exemple, get_int ("id")).

Questions connexes