Knud Schröder: Problem mit Gültigkeit von Variablen

Hallo,

ich verwende zum ersten Mal Funktionen in PHP (Hab ich bisher ehrlich nicht wirklich gebraucht *schäm*).

Dabei handelt es sich auch noch ausgerechnet um eine Rekursive Funktion, mit denen stehe ich schon seit der Schulzeit auf Kriegsfuß.

Ich möchte dass eine Variable überall sichtbar und veränderbar ist und diese Veränderung natürlich auch überall sichtbar ist.

Ich dachte, dass ich das damit erledige, indem ich die Variable mit global definiere. Aber leider gefehlt.

Hier ist einmal die Funktion:

global $alle_kst;

function Hole_KSTs($parentID) {
  global $dbname,$verbindung;

$abfrage = "SELECT personalnummer,kst FROM telefon WHERE locate('$parentID',verantwortlich) > 0 AND sichtbar <> 'N'";

$result = mysql_db_query($dbname,$abfrage,$verbindung);
  if (mysql_num_rows($result) > 0){
   while($thread[$parentID] = mysql_fetch_array($result)){
    $pieces = explode (",", $thread[$parentID]["personalnummer"]);
    $size=count($pieces);
    for ($i=0; $i < $size; $i++) {
     $pos = strpos($alle_kst, $thread[$parentID]["kst"]);
     if ($pos < 0) {
      $alle_kst += $thread[$parentID]["kst"].",";
     }
     Hole_KSTs($pieces[$i]);
    }
   }
  }
 }

Und der Aufruf:

$alle_kst = "";
  Hole_KSTs($personalnummer);

Ich hab's auch schon mit return $alle_kst und beim Aufruf $alle_kst = Hole_KSTs ... probiert. Auch ohne Erfolg.

Bestimmt hat doch einer von Euch eine Tipp für mich?

Gruß,

Knud

P.S.: Die Funktion selber funktioniert soweit, wenn ich die Werte ausgeben lasse, ist alles in Ordnung.

  1. Du musst Die globale Variable als Parameter an die Funktion über geben:d.h. einfach in den function() schreiben --> function($alle_kst) und am ende der funktion wenn die variable ihren endgültigen wert hat machst ein return $alle_kst; dann müssts eigentlich gehen!

    Lg Smart_Andy

    1. Du musst Die globale Variable als Parameter an die Funktion über geben:d.h. einfach in den function() schreiben --> function($alle_kst) und am ende der funktion wenn die variable ihren endgültigen wert hat machst ein return $alle_kst; dann müssts eigentlich gehen!

      Funktioniert leider auch nicht. So sieht die Funktio jetzt aus:

      global $alle_kst;

      function Hole_KSTs($parentID,$alle_kst) {
        global $dbname,$verbindung;

      $abfrage = "SELECT personalnummer,kst FROM telefon WHERE locate('$parentID',verantwortlich) > 0 AND sichtbar <> 'N'";

      $result = mysql_db_query($dbname,$abfrage,$verbindung);
        if (mysql_num_rows($result) > 0){
         while($thread[$parentID] = mysql_fetch_array($result)){
          $pieces = explode (",", $thread[$parentID]["personalnummer"]);
          $size=count($pieces);
          for ($i=0; $i < $size; $i++) {
           $pos = strpos($alle_kst, $thread[$parentID]["kst"]);
           if ($pos < 0) {
            $alle_kst += $thread[$parentID]["kst"].",";
           }
           Hole_KSTs($pieces[$i],$alle_kst);
          }
         }
        }
        return $alle_kst;
       }

      Und der Aufruf dann eben auch so:
      $alle_kst = Hole_KSTs($personalnummer,$alle_kst);

      Noch eine Idee?

    2. Hello,

      Du musst Die globale Variable als Parameter an die Funktion über geben:d.h. einfach in den function() schreiben --> function($alle_kst) und am ende der funktion wenn die variable ihren endgültigen wert hat machst ein return $alle_kst; dann müssts eigentlich gehen!

      Das widerspricht sich schon von der Definition her.
      Wenn ich eine globale Variable habe, dann muss ich die außerhalb der Funktion nur ganz normal initialisieren, damit si vorhanden ist. _Innerhalb_ der Funktion definiere ich sie als global, damit sie nicht im eigenen Namensbereich der Funktion neu angelegt wird. Die Global-Definition geht also "von innen nach außen".

      Wenn ich eine Variable an die Funktion als Parameter übergebe, dann ist diese für alle innereren Zugriffe der Funktion erreichbar. Aber sie kann auf diese Weise keinen Rückgabewert liefern, da ja immer nur eine KOPIE der Variablen von Schicht zu Schicht _von_außen_nach_innen_ weitergegeben wird.

      Die dritte Möglichkeit ist nun, dass man die Referenz der Variablen an die Funktion übergibt

      $rein_raus = "der jetzige Wert";

      function rueckgabe(&$rein_raus)
        {
          $rein_raus = "anders als vorher";
        }

      Wenn man diese Funktion nun aufruft, hat die Variable $rein_raus hinterher einen anderen Wert als vorher. Der Vorteil gegenüber einer globalen V. ist, dass man z.B. in einer rekursiven Funktion noch von Schicht zu Schicht entscheiden kann, _welche_ Referenz man übergibt und nicht immer dieselbe verwenden muss.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  2. Huhu

    ich verwende zum ersten Mal Funktionen in PHP (Hab ich bisher ehrlich nicht wirklich gebraucht *schäm*).

    Dann schreibst Du wohl gern und viel ;-)

    $abfrage = "SELECT personalnummer,kst FROM telefon WHERE locate('$parentID',verantwortlich) > 0 AND sichtbar <> 'N'";

    Kann es sein, dass Du Dir hier noch eine kleine Schikane eingebaut hast?

    Ich rate mal das in der Spalte 'verantwortlich' mehrere nummerische Ids, per Delimiter-Zeichen getrennt, in Form eines Strings stehen.
    Also z.B. '2,4,5,10'.
    Per locate möchtest Du nun prüfen ob die $parentId vorhanden ist.

    Was aber wenn z.B.

    $parentId = 1;

    und in Spalter 'verantwortlich' '2,3,10' steht ?

    Dann bekommst Du falsche Ergebnisse ...

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hallo

      Was aber wenn z.B.
      $parentId = 1;
      und in Spalter 'verantwortlich' '2,3,10' steht ?
      Dann bekommst Du falsche Ergebnisse ...

      Das stimmt. Aber wie Du im der Funktion siehst, ist die parentID keine echte ID sondern eine Personalnummer. Und per definition sind alle Personalnummern immer vierstellig und können somit nicht verwechselt werden. Aber ich werde sicherlich daran denken müssen, sollte unsere Firma mal mehr als 8999 Mitarbeiter bekommen *lächel*

      Gruß,

      Knud