Funktion mit Referenz UND variabler Argumentanzahl
Olaf Schneider
- php
Hallo,
ich moechte gerne eine Funktion schreiben, die (aus einer Datenbank) Werte zurueckgibt. Die Werte sollen normale Variablen sein, also kein Array. Gleichzeitig ist die Anzahl der Werte unbekannt. Das ganze soll etwa so aussehen:
getValues($name,$vorname,$ort);
echo "$vorname $name $ort";
Leider nützt mir in diesem Fall weder Call by Reference noch func_get_args.
Weiss jemand, ob das mit PHP4 überhaupt zu lösen ist.
Gruss Olaf Schneider
Hallo Olaf,
probier doch mal folgendes nach dem query:
while($row=mysql_fetch_assoc($result)) { //$result ist Dein Query
while(list($elem,$value) = each($row)){
$$elem=$value;
}
}
Dann wird aus jedem Element eine Variable mit entsprechendem Wert aus der Datenbank.
Gruss
Lemmy
Hallo Olaf,
probier doch mal folgendes nach dem query:
while($row=mysql_fetch_assoc($result)) { //$result ist Dein Query
while(list($elem,$value) = each($row)){
$$elem=$value;
}
}
Hallo Lemmy,
genau so etwas moechte ich in einer Funktion haben. Mir ist bloss ein bisschen Bange, in die while-Schleife
global $$elem;
zu schreiben, da ich nicht weiss, ob das Standard ist.
Gruss Olaf
genau so etwas moechte ich in einer Funktion haben. Mir ist bloss ein bisschen Bange, in die while-Schleife
global $$elem;
zu schreiben, da ich nicht weiss, ob das Standard ist.
probier doch mal $GLOBALS[$elem]=$value;
das is dann glaube ich besser als ein global-statement...
Super,
<not ironic>Jetzt habe ich wieder soviel dazugelernt und neue Möglichkeiten, das Problem zu lösen, dass ich erst mal in Ruhe überlegen werde, wie ich es am besten mache.</not ironic>
Gruss Olaf
Hallo Olaf,
das Holen der Werte nach Svens Vorschlag war ja vernünftig, hat nur einen Nachteil, dass erst alle Werte aus dem Resultset in das Array übertragen werden müssen. Wenn das Query nicht auch angepasst war, dann bremst das die Performance
Du solltest also mit Deinen Überlegungen bereits VOR dem Query anfangen. Dann kannst Du anschließend alles automatisieren. Interpretersprachen sind dafür bestens geeignet.
Du übergibst einfach einen String mit Feldnamen, durch Semikolon getrennt, aus dem Du dann Query, Array und Rückgabe aufbaust.
Du könntest Dir auch ein Funktion getRecord(&$fieldList) aufbauen, der Du eine Feldliste übergibst. Die Feldliste sollte dann ein assoziatives Array sein. Die Keys sind gleichzeitig die Namen der Felder in der DB.
Diese Feldliste könnte dann z.B. in einer Include-Datei namens <table>.view gespeichert werden und sogar zusätzlich noch
Um diese View-Daeti zu erzeugen, könntest Du mit Hilfe von CSS und JavaScript einen Designer bauen.
Spätestes jetzt dürftest Du für die nächsten sechs Moante zu tun haben ;-))
Grüße aus http://www.braunschweig.de
Tom
genau so etwas moechte ich in einer Funktion haben. Mir ist bloss ein bisschen Bange, in die while-Schleife
global $$elem;
zu schreiben, da ich nicht weiss, ob das Standard ist.
@Gustav: Hat sich aber bisher in der Praxis bewährt :)
@Tom: Stimmt eigentlich ;)
Gruss
Lemmy
http://www.olison.com
while($row=mysql_fetch_assoc($result)) { //$result ist Dein Query
while(list($elem,$value) = each($row)){
$$elem=$value;
}
}
Dann wird aus jedem Element eine Variable mit entsprechendem Wert aus der Datenbank.
das geht dann auch mit extract() denke ich:
while ($rows=mysql_fetch_assoc($result)) {
foreach ($rows as $row ){
extract($row);
}
}
Link zur Funktionsreferenz:
http://www.php.net/manual/en/function.extract.php
Was soll die Funktion denn nun tun, einfach eine variable Anzahl von Variablen in der Reihenfolge wie sie übergeben werden als String mit Leerzeichen getrennt zurückgeben??? So sieht das nämlich aus...
Also dafür brauchst Du bestimmt kein call-by-reference und mit func_get_arg(int num) in einer for-Schleife ist das doch kinderleicht...
Also da musst Du imo schon bitte ein bisschen genauer sein, was deine Funktion tun soll ;)
Gruß
Tom
Hallo Tom,
sorry, dass ich mich nicht genau genug ausgedrueckt habe.
Ich möchte aus verschiedenen PHP-Scripts MySQL-Datenbanken aufrufen. Die Daten sollen in Variablen mit selbstsprechenden Namen abgespeichert werden. Um nicht immer wieder schreiben zu müssen:
$datensatz = mysql_fetch_row( ... );
$vorname = $datensatz[0];
$nachname = $datensatz[1];
$strasse = $datensatz[2];
möchte ich eine Funktion, die mir aus dem (nichtassoziativen) Array die Werte holt, also quasi
eingeneFunktion_getRow($vorname, $nachname, $strasse);
Nach diesem Aufruf, sollen die in _getRow angegebenen Variablen entsprechenen Inhalt haben.
Gruss Olaf
Moin!
Ich möchte aus verschiedenen PHP-Scripts MySQL-Datenbanken aufrufen. Die Daten sollen in Variablen mit selbstsprechenden Namen abgespeichert werden. Um nicht immer wieder schreiben zu müssen:
$datensatz = mysql_fetch_row( ... );
$vorname = $datensatz[0];
$nachname = $datensatz[1];
$strasse = $datensatz[2];
möchte ich eine Funktion, die mir aus dem (nichtassoziativen) Array die Werte holt, also quasi
eingeneFunktion_getRow($vorname, $nachname, $strasse);
Wenn du einfach ein assoziatives Array verwenden würdest, wäre deine Aufgabe schon geschafft - und würde ziemlich viel Aufwand sparen, IMO.
Statt
eigeneFunktion_getRow($vorname, $nachname, $strasse);
echo "$vorname $nachname $strasse";
machst du einfach folgendes:
mysql_fetch_array($werte);
echo "{$werte['vorname']} {$werte['nachname']} {$werte['strasse']}";
Funktioniert prima, spart einen Funktionsaufruf, bastelt nicht aus einer Funktion heraus an globalen Variablen herum (das ist immer böse) und enthält sprechende Namen. Bei Änderungen an der Datenbank (insbesondere bei Änderungen der Reihenfolge der Felder im Ergebnis) wird deine Ausgabe auch nicht durcheinandergeworfen, weil die erste Spalte plötzlich vom Vornamen zur Strasse geworden ist - allein der Spaltenname entscheidet. Und wenn es den nicht mehr gibt, kriegst du auch keine Ausgabe - du gibst also keine Informationen aus, die rein zufällig in der ersten Spalte stehen (wie z.B. ein Passwort). Kann ja auch immer mal sein, dass du aus irgendwelchen Gründen die falsche Tabelle befragst oder sonst irgendwas schiefläuft.
- Sven Rautenberg
Hallo Sven,
Bei Änderungen an der Datenbank (insbesondere bei Änderungen der Reihenfolge der Felder im Ergebnis) wird deine Ausgabe auch nicht durcheinandergeworfen, weil die erste Spalte plötzlich vom Vornamen zur Strasse geworden ist - allein der Spaltenname entscheidet. Und wenn es den nicht mehr gibt, kriegst du auch keine Ausgabe - du gibst also keine Informationen aus, die rein zufällig in der ersten Spalte stehen (wie z.B. ein Passwort). Kann ja auch immer mal sein, dass du aus irgendwelchen Gründen die falsche Tabelle befragst oder sonst irgendwas schiefläuft.
Das stimmt natürlich (und ich mache es so auch lieber, will hier aber mal einen alternativen Ansatz zeigen), aber wenn er unbedingt an seinem nicht-assoziativen Array festhalten will, dann kann er auch folgendes verwenden:
list($vorname, $nachname, $strasse) = mysql_fetch_row (...);
Grüße,
Christian