2010-03-23 3 views
-1

Je continue de recevoir cela comme un avertissement que je veux éviter d'avoir cet avertissement quand il est indéfini sans tourner les avertissements dephp Undefined variable: article_id

ici est le contexte

$url_items = array("foo"); 
    $article_id = db_escape($url_items[1]); 
    $article = get_article($article_id); 

    function get_article($article_id = NULL) {.....} 
+0

C'est étrange parce que '$ article_id = db_escape ($ url_items [1]); 'devrait assigner une certaine valeur à' $ article_id'. Je pense que l'avertissement ne devrait même pas se produire (ou il est ailleurs dans votre code). –

+0

hm votre droit ne mentionne pas du tout ... je ne suis pas familier avec db_escape() cela retourne-t-il quelque chose? ou mieux vaut-il toujours quelque chose ...hm ok juste testé une fonction retournera null si rien n'est retourné alors comment cette fonction peut-elle retourner RIEN du tout? – Nexum

+0

PHP fournit généralement le fichier et le numéro de ligne lors de l'émission des avertissements. Cela ne devrait-il pas suffire à trouver le problème? – lunohodov

Répondre

3

Je pense que la meilleure façon de le résoudre est comme ceci:

$url_items = array("foo"); 
$article = empty($url_items[1]) ? get_article() : get_article(db_escape($url_items[1])); 

function get_article($article_id = NULL) {.....} 

Cette doit fonctionner car vous attribuez à $article_id une valeur par défaut dans la fonction. Cependant, vous pouvez tout aussi bien changer la partie ternaire du milieu en null si vous ne voulez pas exécuter du tout s'il n'y a pas de $article_id.

Edit: Si vous avez un article_id 0, vous pouvez changer empty-!isset
Edit 2: modifié pour éviter l'avertissement de décalage non défini.

0

mettre avant votre code :

error_reporting(E_ALL^E_NOTICE); 

PHP Manual: error_reporting

+1

C'est faux du tout, mais surtout dans ce cas précis. Pourquoi pas E_ALL? –

+0

car E_ALL affichera toujours les erreurs? – Iraklis

+1

Ahaha, je pensais que tu allais aider à trouver l'erreur, pas à la cacher :) Cela ne m'est simplement pas venu à l'esprit. Quelle réponse ridicule d'un développeur. –

-1

Je pense que ce serait un plus belle façon peut-être il y a une meilleure façon, mais je pense que cacher l'avertissement est la mauvaise façon ...

$article_id = db_escape($url_items[1]); 
if(empty($article_id)){ 
    $article_id = null; 
} 

modifier corrigé le code

+3

L'argument pour vider ** doit ** être une variable, il ne fonctionne pas sur les expressions. – Powerlord

+0

cela me donne effectivement une erreur d'analyse – mcgrailm

+0

Powerlord a raison, comme il est dit dans les docs: * Note: empty() ne vérifie que les variables comme toute autre chose entraînera une erreur d'analyse. En d'autres termes, ce qui suit ne fonctionnera pas: vide (trim ($ name)). * –

-1

Je ne sais pas si cela est lié à la erreur, mais vous devez savoir que les tableaux d'indices PHP commençant par 0, donc la deuxième ligne devrait être

$article_id = db_escape($url_items[0]); 

en outre, il est probablement une faute de frappe, mais la première ligne doit être

var $url_items = array("foo"); 
+0

Je sais qu'ils commencent à zéro le point est que $ url_items [1]; n'a pas de valeur et je ne ont pas besoin var en face d'une variable et je ne suis pas sûr, mais je pense que cela pourrait être un problème si je l'ai mis là – mcgrailm

+0

le var provoque des erreurs – mcgrailm

1

Vous ne dites pas exactement quelle ligne provoque l'erreur, mais vous devez utiliser isset pour toutes les variables dont vous n'êtes pas sûr. Par exemple:

$url_items = array("foo"); 
if (isset($url_items[1])) 
{ 
    $article_id = db_escape($url_items[1]); 
    $article = get_article($article_id); 
} 

function get_article($article_id = NULL) {.....} 

Vous voulez également vérifier le contenu de la méthode db_escape, en cas qui fait aussi quelque chose avec une variable non définie.


Une autre façon de contourner le problème est de passer la variable à la fonction par référence à l'aide &:

function get_article(&$article_id) { 
    if ($article_id == null) { 
     // handle null case here 
    } 
    else { 
     // get the article 
    } 
} 
+0

ahh oui mais je encore besoin de faire l'appel à get_article même si $ article_id n'est pas défini – mcgrailm

+0

@mmcgrail: ouais j'ai essayé votre code mais je n'ai reçu aucun avertissement. J'ai reçu 'Notice: Undefined offset: 1' cependant. La seule fois où j'obtiens "Undefined variable", c'est si je supprime la ligne qui définit '$ article_id'. Etes-vous sûr que votre code est le même que celui que vous avez posté ci-dessus? Publier le contenu de 'db_escape()' aiderait aussi. – DisgruntledGoat

+0

oui votre droit je reçois celui-là aussi et je ne parviens toujours pas à voir comment db_escape a quelque chose à voir avec ça. mais cela me conduit à la réponse – mcgrailm

0

donc il était assez simple, après tout cela, et oui peut-être que je aurait pu formuler ma question mieux, mais il me dérange encore qu'il n'y a pas un moyen plus simple de le faire

if (isset($url_items[1])){ 
     $article_id = db_escape($url_items[1]); 
    }else{ 
     $article_id = null; 
    } 
    $article = get_article($article_id);