[PHP]Variable aus Schleife weiterverwenden

djjlx

---???---
ID: 62937
L
9 Mai 2006
599
21
Hy!

Langsam schnapp ich jeden Tag ein neues Problem :cry:

Kann es sein das ich Variablen die in einer Schleife festgelegt wurden ausserhalb der schleife nicht verwenden klann?

Bsp:
PHP:
//Ebene 1:

      $stat = mysql_query("SELECT * from user WHERE ref = '$nick'"); 
      while ($data = mysql_fetch_array($stat)) 
      { 
       $ref1 = $data["nick"];
      }

// Ebene 2:

      $stat = mysql_query("SELECT * from  user WHERE ref = '$ref1'"); 
      while ($data = mysql_fetch_array($stat)) 
      { 
       $ref2 = $data["nick"];
      }
usw.

Als Fehlermeldung kommt immer:

Notice: Undefined variable: ref1 in /var/www/virtual/index.inc.php on line 11

Woraus ich nun schließe das ich die variable nicht ausserhalb der Schleife verwenden kann.

LG
 
Vielleicht solltest du erstmal überprüfen, ob dein erster Query überhaupt Daten zurückgibt. Ansich ist der Zugriff auf solche Variablen ohne Probleme möglich.

ps: durchdachter Code sieht anders :ugly:
 
Ja erste abfrage gibts alles richtig aus aber ab der 2 fangen die fehler an!

LG
 
schreib über deine erste Abfrage einmal $ref1 = ""; und schon ist die Variable in der Schleife bekannt. Es ist im Normalfall nämlich so so, dass es innerhalb von Schleifen oder allgemein {} einen eigenen Namespace/Namensraum gibt. Neue Variablen die darin generiert werden sind nach Außen hin nicht bekannt, es sei denn sie sind global d.h. sind von einer höheren liegenden Ebene schon bekannt.

Wobei warum verwendest du nicht gleich ein Array $refs[] und lässt das ganze in einer Schleife durchlaufen
PHP:
$ref = array();
$ref[0] = $nick;
for($i=0; $i<$refebenen; $i++)
{
 $stat = mysql_query("SELECT * from user WHERE ref = '".$ref[$i]."'");
while ($data = mysql_fetch_array($stat))  
{  
 $ref[$i+1] = $data['nick']; 
 }
 }
 
Zuletzt bearbeitet:
Es ist im Normalfall nämlich so so das es innerhalb von Schleifen oder allgemein {} einen eigenen Namespace/Namesraum gibt. Neue Variablen die darin generiert werden sind nach außen hin nicht bekannt es sei denn sie sind global d.h. sind von einer höher liegenden Ebene schon bekannt.

Das verhalten gibts in C und Co, aber nicht in PHP. In PHP wird der Namespace nur durch Klassen und Funktionen beeinflusst. Sprich sowas

PHP:
{
   $meine_var = 'huhu';
}
echo $meine_var;

ist ohne Probleme möglich.

Ja erste abfrage gibts alles richtig aus aber ab der 2 fangen die fehler an!

LG

dann mach mal aus der ersten Schleife das:
PHP:
 { 
       $ref1 = $data["nick"];
       var_dump($ref1);
      }
 
Sorry, bin halt gelernter C/C++ Programmierer, wäre mir aber neu das das für PHP nicht gilt.
 
ja aber ich will ja in der nächsten schleife die vorherige schleife einbinden

Da ja das resultat der ersten schleife die ganzen Refs sind
nun möchte ich die refs der Refs auslesen und da streikt PHP

Denk ich mal!

Wobei warum verwendest du nicht gleich ein Array $refs[] und lässt das ganze in einer Schleife durchlaufen
PHP:
$ref = array();
$ref[0] = $nick;
for($i=0; $i<$refebenen; $i++)
{
 $stat = mysql_query("SELECT * from user WHERE ref = '".$ref[$i]."'");
while ($data = mysql_fetch_array($stat))  
{  
 $ref[$i+1] = $data['nick']; 
 }
 }
Weil dazu kenn ich mich zu wenig aus :-( leider!
 
Du willst/musst sowieso eher verschachteln?!

PHP:
//Ebene 1:
$stat = mysql_query("SELECT * from user WHERE ref = '$nick'");
while ($data = mysql_fetch_array($stat)) 
{
  $ref1 = $data["nick"];
  
  // Ebene 2:
  $stat = mysql_query("SELECT * from  user WHERE ref = '$ref1'");
  while ($data = mysql_fetch_array($stat)) 
  {
    $ref2 = $data["nick"];
  }
  
  
}

Ansonsten wie schon erwähnt einen ("Start"-)Wert für $ref1 vorgeben.
 
Wozu muss an dieser Stelle eh 'ne while-Schleife verwendet werden? Gibt's überhaupt doppelte Nicknames in der DB?
 
Ne doppelte nicks gibts nicht aber es werden nicht die refs gespeichert sondern nur der werber!

darum hätte ich eine while Schleife benutzt. hab auch probiert alles in einer Schleife abzufragen funktioniert aber leider auch nicht!

LG
 
Ach, sorry. Hatte nicht genau genug gelesen und übersehen, dass es um Refs geht. *patsch*

Mea culpa.
 
Probier doch mal sowas..
Code:
SELECT      t1.nick AS ref1
               ,t2.nick AS ref1
FROM         user AS t0
LEFT JOIN   user AS t1
ON            (t1.ref = t0.nick)

LEFT JOIN   user AS t2
ON            (t2.ref = t1.nick)

WHERE       t1.ref = 'user1'
                OR
                t2.ref = t1.nick
 
Sorry, bin halt gelernter C/C++ Programmierer, wäre mir aber neu das das für PHP nicht gilt.

In PHP ist das wie ZeroCCC geschrieben hat möglich. Zumindest in PHP4. Inwieweit sich da was in PHP5 geändert hat, weiß ich nicht. Da PHP5 und folgende vom Code aber immer mehr wie C/C++/C#... werden, könnte es gut sein, dass das schon geändert wurde oder noch geändert wird.

@djjlx: Du sagst es wird nur der Werber gespeichert. Gut so. Aber wieso heißt das Feld dann "ref" und nicht "werber"? Schon beim benennen der Felder einer Tabelle sollte man schauen, dass man korrekte Bezeichnungen führt.

Ohne zu testen aber, ich würds an deinem Beispiel so machen:
PHP:
      //Ebene 1:
      $stat1 = mysql_query("SELECT nick FROM user WHERE ref = '$nick'"); 
      while (list($ref1nick) = mysql_fetch_row($stat1))  
      {  
         echo $ref1nick.'<br>';
         // Ebene 2: 
         $stat2 = mysql_query("SELECT nick FROM user WHERE ref = '$ref1nick'");  
         while (list($ref2nick) = mysql_fetch_row($stat2))  
         {  
            echo '-> '.$ref2nick;
         }
      }

Sollte gehen. Ist aber ungetestet.
 
Danke! So funktionierts!

Hab jetzt ein bisschen herumgespielt aber leider wieder nicht geschaft!
Habs mal so umgeändert das er zwei spalten ausliest:
PHP:
$stat1 = mysql_query("SELECT nick,guthaben FROM cpoints_user WHERE ref = '$nick'"); 
      while (list($ref1nick) = mysql_fetch_row($stat1,'nick'))  
      {  
         echo $ref1nick.'<br>';

Jedoch kommt jetzt die Fehlermeldung Wrong parameter onLine 2

Ich wollte hinter den Nick noch den punktestand in Klammer anzeigen.
also admin (50 Punkte).

Wie kann ich hier den parameter richtig angeben?
LG
 
PHP:
$stat1 = mysql_query('SELECT nick,guthaben FROM cpoints_user WHERE ref = "'.$nick.'"');  
      while (list($ref1nick,$guthaben) = mysql_fetch_row($stat1))   
      {   
         echo $ref1nick.' ('.$guthaben.' Punkte)<br>';

Sollte gehen. ;)