globale Variablen

T

ThaHammer

Aktives Mitglied
Thread Starter
Dabei seit
01.06.2004
Beiträge
3.303
Reaktionspunkte
13
Ich habe ein kleines Script gebastelt, das mir je nach Auswahl der Tabelle, die Spalten als Formular ausgibt. Das dient später dazu leicht die Einträge zu Ändern, zu Editieren zu können. Ist so recht praktisch, man muß keine Rücksicht auf irgend eine Tabelle nehmen, weil das ja schön dynamisch aufgebaut wird. Soweit funktioniert das Ganze schon einwandfrei, bis auf das auslesen der Formulardaten am Ende. Da ergab sich ein kleines Problem.

Ich baue die Tabelle mithilfe einer Funktion auf. In der Funktion werden die feldnamen in einer Schleife mit erzeugt. Das ergibt dann $name[$x], also ein Array mit den Feldnamen. Leider habe ich jetzt das Problem mit den globalen und lokalen Variablen. Das Array wird nicht zurück übergeben!
Sobald ich aus der Funktion raus bin, habe ich das Array nicht mehr. Kann halt auch nichts ausgeben oder Ändern.

Wie kriege ich das Array rüber in den Rest? Mit return $name geht es leider nicht, habe ich schon ausprobiert.
 
Hi,

also, mit "return $var" muss es gehen. Wenn Du das nicht benutzen willst/kannst, kannst Du mit Referenzen arbeiten:

PHP:
function tuWas(&$myArray) {
    $myArray[0] = "Hallo";
    $myArray[1] = "Welt";
}

$myArray = array();

tuWas($myArray);

for($i = 0; $i < count($myArray); $i++) {
    echo $myArray;
}

Morfio ...
 
Zuletzt bearbeitet:
PS: Du kannst natürlich auch mit globalen Variablen arbeiten, aber das ist bah!
 
So schaut meine Funktion derzeit aus.
Ich übergebe ihm je nach Fall den Start und Endwert der Schleife.
Endwert ist ganz einfach die Anzahl der Spalten in der ausgewählten Tabelle.

function schleife($start,$menge)
{
global $resultf, $x, $name;
for ($x=$start;$x<$menge;$x++)
{
$meta = mysql_fetch_field($resultf, $x);
$lang=$meta->max_length+2;
$typen=$meta->type; // Typ des Feldes ermitteln
if($lang>=30) // Wenn die Felder zu breit sind
{
$lang=30;
}
echo"<td><input type=$typen name=$name[$x] size=$lang></td>";
}
echo "</tr>";
return $name;
}

Mit name=$name[$x] versuche ich die Namen für die felder des Formulars zu vergeben, sollte doch so funktionieren?
Mit return will ich den zurück geben.

Da sehe ich selber gerade was überflüssiges! $x brauche ich ja gar nicht auf global setzten.
 
Zuletzt bearbeitet:
wenn eine variable am anfang der function mit dem schlüsselwort "global" markiert wird, hast du das was du willst ;)
 
Azathoth schrieb:
wenn eine variable am anfang der function mit dem schlüsselwort "global" markiert wird, hast du das was du willst ;)

Ja dachte ich auch! Schau oben in der Function ist bei global auch $name dabei. Oder muß ich das dann anders angeben?
 
Warum ist $name global und warum gibst Du $name zurück? Macht keinen Sinn. Und, wie schon erwähnt, solltest Du nicht mit globalen Variablen arbeiten, vor allem, da es hier nicht notwendig ist (s. mein Beispiel).
 
Morfio schrieb:
Warum ist $name global und warum gibst Du $name zurück? Macht keinen Sinn. Und, wie schon erwähnt, solltest Du nicht mit globalen Variablen arbeiten, vor allem, da es hier nicht notwendig ist (s. mein Beispiel).

Na gut bei Global könnte man es wahrscheinlich weglassen, aber zurück geben muß ich es doch, wenn ich hernach die Namen der Formularfelder brauche. Die stehen im $name Array. Oder hast Du ne besser Lösung?

ich mache PHP erst seit ein paar Wochen, habe bei den ein oder anderen Sachen noch kleinere schwierigeiten. Doof finde ich das es zwar viele Dokus und Bücher gibt, aber immer irgend etwas bei dennen fehlt was man gerade wieder benötigt! :)
 
Du machst in Deinem Beispiel gar nichts mit der Variablen, außer sie auszugeben. Deshalb ist es auch obsolet, sie zurückzugeben.

PHP:
function schleife($start,$menge) {
    global $resultf, $x, $name;

    for($x = $start; $x < $menge; $x++) {
        $meta = mysql_fetch_field($resultf, $x);
        $lang = $meta->max_length + 2;
        $typen = $meta->type; // Typ des Feldes ermitteln

        if($lang>=30) // Wenn die Felder zu breit sind
            $lang=30;

        echo"<td><input type=$typen name=$name[$x] size=$lang></td>";
    }
    
    echo "</tr>";
    return $name;
}

Die globale Variable $x ist unnötig und sogar schlecht, so zu benutzen. Auch mit $resultf machst Du nichts.

Also, da Du $name überhaupt nicht benutzt, kann es auch nichts zurückgeben.

So würde es einen Sinn ergeben:

PHP:
function tuWas($Name) {
    for($i = 0; $i < 10; $i++) {
        $Name[$i] = "Test " + ($i + 1);
    }

    return $Name;
}

So würde jetzt in $Name 10 mal Test 1 (bist Test 10) stehen und alle Elemente von 0 bis 9 würden, falls vorhanden, überschrieben.

Morfio ...
 
Zuletzt bearbeitet:
Du machst in Deinem Beispiel gar nichts mit der Variablen, außer sie auszugeben. Deshalb ist es auch obsolet, sie zurückzugeben.

PHP:
function schleife($start,$menge) {
    global $resultf, $x, $name;

    for($x = $start; $x < $menge; $x++) {
        $meta = mysql_fetch_field($resultf, $x);
        $lang = $meta->max_length + 2;
        $typen = $meta->type; // Typ des Feldes ermitteln

        if($lang>=30) // Wenn die Felder zu breit sind
            $lang=30;

        echo"<td><input type=$typen name=$name[$x] size=$lang></td>";
    }
    
    echo "</tr>";
    return $name;
}

Die globale Variable $x ist unnötig und sogar schlecht, so zu benutzen. Auch mit $resultf machst Du nichts.

Doch mit $resultf kriege ich die Länge des Feldes raus!

Also, da Du $name überhaupt nicht benutzt, kann es auch nichts zurückgeben.

Benutzte ich doch um den Formularfeldern einen Namen zu geben. Mir scheint nur das es so nicht geht. Vielleicht sollte ich die Namenszuweisung ausserhalb des HTML Tags machen?

So würde es einen Sinn ergeben:

PHP:
function tuWas($Name) {
    for($i = 0; $i < 10; $i++) {
        $Name[$i] = "Test " + ($i + 1);
    }

    return $Name;
}

So würde jetzt in $Name 10 mal Test 1 (bist Test 10) stehen und alle Elemente von 0 bis 9 würden, falls vorhanden, überschrieben.

Ja genau! ich glaub ich weiß schön angsam wo mein Problem ist! Es ist wahrscheinlich die Zeile:

echo"<td><input type=$typen name=$name[$x] size=$lang></td>";

Da bastle ich zwar die Namen für HTML zusammen, aber PHP kann damit nichts anfangen. Oder bin ich jetzt am Holzweg?
Ich schätze ich muß die zeile anders zusammen bauen, damit PHP auch was davon hat.

Danke für deine Hilfe! Meine PHP Profis sind zur zeit nicht erreichbar, kann die nicht fragen.
 
PHP muss damit ja auch nichts anfangen ... es muss es ja nur ausgeben, außer, du willst es in einem Array bsplw. für die spätere Verwendung zwischenspeichern.

PHP:
echo "<td><input type=$typen name=$name[$x] size=$lang></td>";

// Sollte eher so aussehen:

echo "<td><input type=\"".$typen."\" name=\"".$name[$x]."\" size=\"".$lang."\" /></td>";

Morfio ...

PS: sieh dir hier im Forum mal die Zitierweise und die Code-Eingabeweise an (die Buttons beim Editieren) ... dann wird das ganze für die Leser hier weitaus übersichtlicher.

Morfio ...
 
Morfio schrieb:
PHP muss damit ja auch nichts anfangen ... es muss es ja nur ausgeben, außer, du willst es in einem Array bsplw. für die spätere Verwendung zwischenspeichern.

PHP:
echo "<td><input type=$typen name=$name[$x] size=$lang></td>";

// Sollte eher so aussehen:

echo "<td><input type=\"".$typen."\" name=\"".$name[$x]."\" size=\"".$lang."\" /></td>";

Morfio ...

PS: sieh dir hier im Forum mal die Zitierweise und die Code-Eingabeweise an (die Buttons beim Editieren) ... dann wird das ganze für die Leser hier weitaus übersichtlicher.

Morfio ...

Ja genau zwischenspeichern soll PHP in dem array, die namen der Felder werden ja wieder benötigt wenn ich damit die MYSQl Anweisung basteln soll.! Ich werde es gleich mal ausprobieren. Danke!
Ich habe gemerkt das ich ein anderes Problem habe. Die Variablen die ich weiter oben benutzte (in meiner Seite), sind weiter unten auf einmal leer (0). Es gibt nur die eine FunKtion auf der Seite, diese wird zwischen durch angesprungen um das Formular aufzubauen.
Die Seite macht folgendes:

1. verbindet über ein Include zur Datenbank
2. liest die Tabellen darin aus und baut damit ein Klappmenü (SELECT + OPTION) auf.
3. Die Auswahl wird übergeben damit ich weiß welche Tabelle ausgewählt wurde.
4. Mithilfe das Tabellennamens wird das Formular erzeut.
5. Tabellesplatennamen auslesen, damit den Head erzeugen
6. in die Funktion springen um die Eingabefelder zu erzeugen
7. danach sollen in $name[] die Namen der Formularfelder stehen. Damit könnte ich später die MYSQL Anweisung zusammen basteln, und vorher überprüfen ob die Felder leer sind.

Ich habe mir das mal mit dem Zitieren angeschaut. Das war zuvor Absicht, war nur zu Faul überall dann die Zitate zu schliessen. ;)
 
Hmm, ich glaube, ich verstehe immer noch nicht so ganz, was du meinst. Ich probiere es mal zusammenzufassen:

Du hast eine Tabelle, in der Feldnamen stehen (wie auch immer). Die Tabelle liest Du aus und willst die Feldnamen in einem Array speichern mittels Deiner Funktion. Das wäre sehr einfach:

PHP:
function holeFelder() {
    $query = "SELECT Feld FROM Felder";
    // Query ausführen, wie auch immer du das machst (Pear, MySQL, eigenes)
    // Deshalb jetzt was abstrakter
    $i = 0;

    while(...Einzelne Datensätze durchgehen...) {
        $name[$i] = FeldAusDerTabelle;
        $i++;
    }

    return $name;
}

So ist das ohne weiteres möglich. Das bei dir unten in den Variablen nichts drin steht, könnte mit globalen Variablen zu tun haben, deshalb benutzt man diese nicht. Damit kann man sich "aus Versehen" Daten überschreiben. Und ehrlich: mir ist kein Fall bekannt, in dem man auf globale Variablen zurückgreifen muss.

Morfio ...
 
Morfio schrieb:
Hmm, ich glaube, ich verstehe immer noch nicht so ganz, was du meinst. Ich probiere es mal zusammenzufassen:

Du hast eine Tabelle, in der Feldnamen stehen (wie auch immer). Die Tabelle liest Du aus und willst die Feldnamen in einem Array speichern mittels Deiner Funktion. Das wäre sehr einfach:

PHP:
function holeFelder() {
    $query = "SELECT Feld FROM Felder";
    // Query ausführen, wie auch immer du das machst (Pear, MySQL, eigenes)
    // Deshalb jetzt was abstrakter
    $i = 0;

    while(...Einzelne Datensätze durchgehen...) {
        $name[$i] = FeldAusDerTabelle;
        $i++;
    }

    return $name;
}

So ist das ohne weiteres möglich. Das bei dir unten in den Variablen nichts drin steht, könnte mit globalen Variablen zu tun haben, deshalb benutzt man diese nicht. Damit kann man sich "aus Versehen" Daten überschreiben. Und ehrlich: mir ist kein Fall bekannt, in dem man auf globale Variablen zurückgreifen muss.

Morfio ...

Die Feldnamen speichere ich eigentlich nicht, warum auch? Falls ich die wieder brauchen sollte könnte ich Sie auch nochmal auslesen.

Nein ich brauche die Feldnamen aus der Tabelle erstmal nur um innerhalb des Formulares die Überschriften für die Felder anzuzeigen.
Mein Prolem ist das was ich mit dem restlichen Forumlar mache.
 
Zurück
Oben Unten