2010-11-05 5 views
13

D'accord, je semble avoir une idée fausse avec la portée variable avec PHP, pardonnez mon manque de sujet car je viens d'un Java, C# de fond. Penser que je pourrais rendre les variables accessibles aux fonctions ou si les déclarations simplement en le plaçant à l'extérieur. Ci-dessous un extrait de ce que je suis en train d'accomplir:Variable Problème de portée avec les instructions if (PHP)

foreach ($nm as $row=>$im) { 
    $itm_name = $im; 
    $lnk = $lnk_cty[$row]; 
    if($mode == 'addMenu') { 
     $m = $m_id; //id will be coming from fresh insert of menu_name 
    } else { 
     $m = $_POST['mnu_add'][$row]; 
     echo "MENU_ID: ".$m; 
    } 
    if($mode == 'addCat') { 
     $m = $c_id; //id will be coming from fresh insert of cat_name 
    } else { 
$m = $_POST['cat_add'][$row]; 
    } 
    //used for testing purposes 
    echo "item name: ".$itm_name ."<br />"; 
    echo "lnk: ".$lnk ."<br />"; 
    echo "m: ".$m ."<br />"; //$m is empty here, because its a new declaration as oppose to accessing $m value from if statement 
    $display_fields .= "<li>".$itm_name." ".$item."</li>"; 
    $sql_array[] = '("' . $itm_name . '", "' . $lnk . '", ' . $m . ')'; // Add a new entry to the queue 
} 

Maintenant ce que je suis en train de faire est de rendre les valeurs variables $m accessibles en dehors du cas des déclarations de son pour la variable $m utilisée dans l'instruction $sql_array[] . En C# je voudrais simplement déclarer une variable en dehors de la boucle foreach et être capable de l'utiliser. Après quelques lectures sur le sujet, j'ai trouvé que l'utilisation des mots clés globaux ou GLOBALS ne fonctionnerait que si ma variable de portée globale est assignée à la valeur avant la foreach, et déclarant global $m pour obtenir cette valeur dans la boucle. Mais avec mon code actuel $m est d'une portée locale dans les déclarations if et tout le monde déconseille de les utiliser. Maintenant, existe-t-il une meilleure méthode pour rendre $m accessible à l'instruction $sql_array[]?

+0

Qu'est-ce que cela signifie: 'id * sera * coming?' –

+0

La source de l'ID serait ... –

+0

@ Aurel300 merci mr. Traducteur. Pourriez-vous indiquer la valeur réelle de $ m_id dans le runtime? –

Répondre

54

If Les blocs d'instructions n'ont pas leur propre étendue. Les données que vous affectez à $m doivent être vides pour commencer. Essayez de déboguer des choses comme vos variables $_POST. De plus, où est défini $m_id? Peut-être que c'est vide aussi.

PHP est-ce que a une portée à l'intérieur des fonctions, des méthodes de classe et similaires. Mais les instructions if n'ont pas leur propre portée. Par exemple, le code suivant écho Hi there!:

$bool = true; 
if ($bool) { 
    $new_var = 'Hi there!'; 
} 
echo $new_var; 

avoir une lecture dans le manual.

+0

Ce qu'il essaie de dire lorsque vous mettez une déclaration var dans une instruction if, la variable ne sera plus disponible en dehors de cela. –

+2

Je sais ce qu'il dit, mais ce n'est pas vrai en PHP. – Stephen

+0

Ouais. Désolé un peu échoué: D –

-1

Il est vrai que si les instructions n'ont pas de portée, mais il semble qu'il y a un problème avec l'étendue (morceau de code entre accolades) .. dans l'extrait de code ci-dessous le résultat attendu est: $ z [0] = 0, $ z [1] = 1 mais la sortie réelle obtenue est $ z [0] = 100; et $ z [1] est indéfini. Le PHP utilisé provient de la distribution Apache Friends

<?php 

$x = 0; 
$y = 1; 
$z[0]=100; 

if($x!=0){ 
    $z[0]=1; 
    $z[1]=2; 
    $z[2]=3; 
    $z[3]=4; 
}else{ 
    if($y == 0){ 
     $a =1; 
    }else{ 
     global $z; 
     echo $z[0]; 
     echo $z[1]; 
    } 
} 

?> 
+0

J'ai modifié votre code et maintenant c'est correct. +1 –

1

ici la variable $ id_struct n'est pas définie, que dois-je faire?

if(!$struct_req) { 
       mysql_query("insert into structure values (null, 3,'".$_POST["structure"]."')") or die("insert structure : ". mysql_error()); 
       if(isset($id_struct)) echo "isset <br>"; 
       $id_struct = mysql_insert_id(); 
}else { 
       //global $id_struct; 
       $id_struct = mysql_fetch_array($struct_req)["id_structure"]; 

} 
echo $id_struct;