Ein Array ferngesteuert auslesen
RobRobson
- php
Hallo und sorry für den komischen Titel,
ich wusste nicht wie es besser zusammzufassen ist was ich gern hätte.
$row = mysql_fetch_assoc() gibt mir ja ein Array zurück.
dieses hab ich in ein Funktion gepackt um darin optionen für ein Select-feld zu generieren.
function printOptions($query,$value,$outString)
{
$l=mysql_query($query);
while($row = mysql_fetch_assoc($l))
{
$out = '<option value="'.$row[$value].'">'.$outString;
}
}
Nun würde ich gern über die Variable $outString die Ausgabe aus dem $row Array etwas formatieren, zum Beispiel:
$outString = "$row[Name] - $row[Nachname] ($row[Tel])";
Was natürlich nicht funktioniert, da der string ein string ist und eben kein Array steuert.
Ich will aber das Array steuern. Weiß jemand wie man das irgendwie lösen kann?
Würde mich über Tipps freuen. :)
Danke und Viele Grüße,
Rob
Ich will aber das Array steuern.
Was heißt "steuern" - man kann kein Array "steuern" - ein Array ist ein statischer Datentyp der selbst nichts kann.
Ich will aber das Array steuern.
Was heißt "steuern" - man kann kein Array "steuern" - ein Array ist ein statischer Datentyp der selbst nichts kann.
Ein Array kann man nicht steuern, das ist klar. Evtl. triffts "gesteuert auslesen" etwas besser?
Der Funktion soll von aussen gesagt werden welche Teile vom Array zu verwenden sind und wie diese Teile in der Ausgabe arrangiert sein sollen.
Viele Grüße,
Rob
Ein Array kann man nicht steuern, das ist klar. Evtl. triffts "gesteuert auslesen" etwas besser?
Und was willst du "gesteuert auslesen" - den Teil verstehe ich nicht.
Der Funktion soll von aussen gesagt werden welche Teile vom Array zu verwenden sind und wie diese Teile in der Ausgabe arrangiert sein sollen.
Wie würdest du es von "innen" machen?
Hi,
Der Funktion soll von aussen gesagt werden welche Teile vom Array zu verwenden sind und wie diese Teile in der Ausgabe arrangiert sein sollen.
sprintf.
Dabei müsstest du dann *alle* Array-Elemente als Parameter angeben, egal ob sie jedes Mal genutzt werden oder nicht, und die Syntax mit nummerierten Platzhaltern nutzen.
Oder vsprintf - dabei kannst du gleich ein Array als Werte-Parameter übergeben, musst nicht alle einzeln rüberschaufeln. Nummerierte Platzhalter müssten dabei genauso funktionieren, wie bei sprintf.
Natürlich muss man sich dann beim Aufruf jeweils absolut im Klaren darüber sein, welche Werte das Array enthalten wird, und in welcher Reihenfolge.
Und ggf. erforderliche kontextgerechte Behandlung ist da auch noch nicht mit drin.
MfG ChrisB
Hi und Danke..
Natürlich muss man sich dann beim Aufruf jeweils absolut im Klaren darüber sein, welche Werte das Array enthalten wird, und in welcher Reihenfolge.
Genau das istes ja leider nicht.
Im Idealfall soll die Funktion ein "options-" Generator sein.. man gibt nur den SQLQuery der Datensätze ausliest rein und bekommt die richtig formatierten Optionen (für ein HTML-Optionsfeld) wieder heraus.
Und ggf. erforderliche kontextgerechte Behandlung ist da auch noch nicht mit drin.
Da liegt das Problem, man muss im voraus alle Fälle abfangen. Was aber unmöglich ist bei einer Funktion die die Tabelleninhalte vorher noch nicht kennt. Ob man über Indexe gehen kann wie Du es sagst muss ich durch mal durchdenken.
Man müsste bei PHP so ein Funktion wie bei Javascript eval() haben die einfach mal Inhalte aus einem String in echte Funktionen/Variablen um-interpretiert.
dann könnte man sowas schreiben:
$outstring = '$row[blubb] - ($row[bumm])';
echo "<option value='$row[id]'>".eval($outstring));
und er würde die $row aus dem String als die echten Variablen interpretieren. *träum* :)
Viele Grüße,
Rob
Hi,
Natürlich muss man sich dann beim Aufruf jeweils absolut im Klaren darüber sein, welche Werte das Array enthalten wird, und in welcher Reihenfolge.
Genau das istes ja leider nicht.
Genau diese Information enthielt deine unvollständige Fragestellung leider nicht.
Im Idealfall soll die Funktion ein "options-" Generator sein.. man gibt nur den SQLQuery der Datensätze ausliest rein und bekommt die richtig formatierten Optionen (für ein HTML-Optionsfeld) wieder heraus.
Na dafür kommen also eigentlich nur zwei ausgelesene Spalten in Frage, einmal für's value und einmal für den Textinhalt der Option.
Musst also nur deine Queries auch entsprechend schreiben, dann funktioniert's doch.
Und ggf. erforderliche kontextgerechte Behandlung ist da auch noch nicht mit drin.
Da liegt das Problem, man muss im voraus alle Fälle abfangen. Was aber unmöglich ist bei einer Funktion die die Tabelleninhalte vorher noch nicht kennt.
Was hat kontextgerechte Behandlung damit zu tun, den *Inhalt* zu kennen?
Ob man über Indexe gehen kann wie Du es sagst muss ich durch mal durchdenken.
Klar kann man - wenn man denn die Queries entsprechend formuliert.
Wenn du nicht über den Spaltenindex, sondern über den Bezeichner gehen willst - dann musst du halt die Bezeichner noch zusätzlich mit an deine Funktion übergeben, auch kein größeres Problem.
Man müsste bei PHP so ein Funktion wie bei Javascript eval() haben die einfach mal Inhalte aus einem String in echte Funktionen/Variablen um-interpretiert.
Erstens hat man die ja - heißt auch genauso - und zweitens wär's natürlich idiotisch, die zu benutzen.
MfG ChrisB
Moin und vielen Dank schonmal! :D
Hi,
Genau diese Information enthielt deine unvollständige Fragestellung leider nicht.
Sorry!
Na dafür kommen also eigentlich nur zwei ausgelesene Spalten in Frage, einmal für's value und einmal für den Textinhalt der Option. Musst also nur deine Queries auch entsprechend schreiben, dann funktioniert's doch.
Nope! Die Krux liegt darin das der, der die Funktion nachher nutzen möchte(*) selber bestimmen kann was aus der Antwort des Querys (wie auch immer formatiert) verwendet werden soll. Wenn der Query 3 Spalten abfragt, oder 1 oder 2 und diese Auf eine bestimmte Art und Weise ausgeben möchte. Zb, das Feld 'name', 'nachname', 'geburtstag' und diese in der Foramtierung "$r[nachname],$r[name] ($r[geburtstag])" im Optionsfeld erscheinen soll, reicht es nicht einfach Index und ein weiteres Feld aus zulesen. (ersteres war auch am Anfang schon kein Problem, daher hatte ich am Einganspost die Codezeile "$out = '<option value="'.$row[$value].'"> [..]" eingefügt. Die ja zeigt, dass man mit der Funktion-übergebenen-Werten einzelne bestimmte Felder aus Arrays "gesteuert" auslesen kann.) Aber wenns etwas kompliziertere Formatierung wie im Nach/Name/Geburtstags-Beispiel verlangt versagt das Konzept.
Naja, is nicht schlimm, muss sich auch keiner mehr den Kopf drüber zerbrechen!
(*) Das bin nur ich :)
Man müsste bei PHP so ein Funktion wie bei Javascript eval() haben die einfach mal Inhalte aus einem String in echte Funktionen/Variablen um-interpretiert.
Erstens hat man die ja - heißt auch genauso - und zweitens wär's natürlich idiotisch, die zu benutzen.
Nope!^2 Damit hab ich mir auf jeden Fall den Goldenen Facepalm der Woche eingefangen! Tut mir echt Leid.
Ich dachte nicht das es die Funktion gibt. Und sie löst das Problem auch genau wie gedacht.
Hier mal am Beispiel um es zu zeigen. Plus Alternativbeispiel das die freie Verwendungsmöglichkeit zeigt.
echo "Feld: Person <select>";
echo getOptions("SELECT name,nname,geb FROM pers",'$out .= "<option> $row[nname],$row[name] ($row[geb]);"')
echo " </select>
Feld: Auto <select>";
echo getOptions("SELECT id,ps,farbe,modell FROM auto",'$out .= "<option value=$row[id]> $row[modell] - $row[Farbe] ($row[farbe]);"')
echo "</select>";
function getOptions($query,$outstring)
{
$l=mysql_query($query);
while($row = mysql_fetch_assoc($l)) eval($outstring);
return $out;
}
MfG ChrisB
Vielen Dank!
Viele Grüße,
Rob
$out .= "<option value=$row[id]> $row[modell] - $row[Farbe] ($row[farbe]);"
Zudem solltst du deine dein HTML-Ergebnis ansehen, wenn in modell, farbe oder id irgendwelche HTML-spezifischen Zeichen vorkommen, ist dein HTML potentiell ungültig.
Hi!
$out .= "<option value=$row[id]> $row[modell] - $row[Farbe] ($row[farbe]);"
Why is $foo[bar] wrong?
Diese Syntax ist aber richtig. Es handelt sich hier um den Sonderfall der Notation im ""-String. Siehe verlinkte Dokuseite, vierter Kasten mit den Beispielen.
Lo!
Hi,
Nope! Die Krux liegt darin das der, der die Funktion nachher nutzen möchte(*) selber bestimmen kann was aus der Antwort des Querys (wie auch immer formatiert) verwendet werden soll. Wenn der Query 3 Spalten abfragt, oder 1 oder 2 und diese Auf eine bestimmte Art und Weise ausgeben möchte. Zb, das Feld 'name', 'nachname', 'geburtstag' und diese in der Foramtierung "$r[nachname],$r[name] ($r[geburtstag])" im Optionsfeld erscheinen soll, reicht es nicht einfach Index und ein weiteres Feld aus zulesen.
Ist letztendlich auch egal, wie viele Werte du ausliest.
Aber wenns etwas kompliziertere Formatierung wie im Nach/Name/Geburtstags-Beispiel verlangt versagt das Konzept.
Ergebnis: Robson,Robert (17.02.1990)
(Da hier alle ausgelesenen Werte in einen HTML-Kontext überführt werden sollen, kann htmlspecialchars noch per array_map auf das Datensatz-Aray angewandt werden, bevor dieser an vsprintf übergeben wird.)
Man müsste bei PHP so ein Funktion wie bei Javascript eval() haben die einfach mal Inhalte aus einem String in echte Funktionen/Variablen um-interpretiert.
Erstens hat man die ja - heißt auch genauso - und zweitens wär's natürlich idiotisch, die zu benutzen.
Nope!^2 Damit hab ich mir auf jeden Fall den Goldenen Facepalm der Woche eingefangen!
Nope³, diese Auszeichnung gebührt der folgenden Aussage:
Ich dachte nicht das es die Funktion gibt. Und sie löst das Problem auch genau wie gedacht.
Und sie schafft neue Probleme, an die du nicht gedacht hast.
der, der die Funktion nachher nutzen möchte(*)
(*) Das bin nur ich :)
... der kann dann auch unlink('irgendeinedatei') o.ä. im „Format-String“ unterbringen; egal ob bewusst oder unbewusst, damit lässt sich jede Menge Schaden anrichten.
Hier mal am Beispiel um es zu zeigen. Plus Alternativbeispiel das die freie Verwendungsmöglichkeit zeigt.
Beispiel für *sinnvolle* Umsetzung - siehe oben.
MfG ChrisB
Guten Abend mittlerweile,
Hi,
- SELECT name,nname,geb FROM ...
- $datensatz = mysql_fetch_array($result, MYSQL_NUM) // also bspw. entsprechend array('Robert', 'Robson', '17.02.1990')
- vsprintf('%2$s,%1$s (%3$s)', $datensatz)
Ergebnis: Robson,Robert (17.02.1990)
Beispiel für *sinnvolle* Umsetzung - siehe oben.
Cool, vielen Dank! Ich hab ausser in C noch nicht mir printf oder vsprintf gearbeitet.
Aber entweder bin ich total blöd oder es trifft immer noch nicht den Kern des Problmes, nämlich das man der Funktion von aussen mitteilen kann wie man den Ausgabe String formatiert haben will. Der variiert ja von Verwendung zu Verwendung der Funktion. Und Dein vsprintf() befindet sich ja innerhalb der Funktion. Soll mal ein DB-Wert in Klammern stehen, mal einer durch Punkte getrennt oder sonstirgendwie ausgegeben werden müsste man ja doch wieder in der Funktion selber Abzeige schaffen. Das soll ja verhindert werden, in dem man schon beim Programmaufruf die gewünschte Ausgabeformatierung mitgegeben wird. (Sorry falsch ich grad derb auf dem Schlauch stehe und es partou nicht erkennen kenn :D)
Aber Du hast recht, mit eval() bekommt man wirklich mehr Probleme.
Im Moment schaut meine Lösung ja noch wie oben gepostet aus. Aaaaaaber das funktioniert irgendwie nicht wenn der $outstring der Funktion übergeben wird. Warum auch immer.
Bsp1 -> funktionert!
$outstring = '$row[name] - $row[blubb]';
while($row=mysql_fetch_assoc()) {$out .= "<option >"; eval($outstring); }
Bsp2 -> funktionert nicht!
printOptions('SELECT...','$row[name] - $row[blubb]');
function printOptions($query,$outstring)
{
while($row=mysql_fetch_assoc()) {$out .= "<option >"; eval($outstring); }
}
---> erzeugt den Fehler das nicht evaluieren kann!
Verstehe ich absolut nicht, warum der überladene String nicht erkannt wird.
Viele Grüße,
Rob
Tach.
Aber entweder bin ich total blöd oder es trifft immer noch nicht den Kern des Problmes, nämlich das man der Funktion von aussen mitteilen kann wie man den Ausgabe String formatiert haben will. Der variiert ja von Verwendung zu Verwendung der Funktion. Und Dein vsprintf() befindet sich ja innerhalb der Funktion.
Du brauchst von außen ja auch nur den Format-String zu übergeben. Also im Prinzip so ähnlich wie Deine eval-Variante. Nur ohne eval.
Hi,
- vsprintf('%2$s,%1$s (%3$s)', $datensatz)
Aber entweder bin ich total blöd oder es trifft immer noch nicht den Kern des Problmes, nämlich das man der Funktion von aussen mitteilen kann wie man den Ausgabe String formatiert haben will. Der variiert ja von Verwendung zu Verwendung der Funktion. Und Dein vsprintf() befindet sich ja innerhalb der Funktion.
Und das, was da derzeit als Textliteral direkt notiert den ersten Parameter darstellt, glaubst nicht, dass man das vielleicht auch „von aussen“ übergeben könnte ...?
Soll mal ein DB-Wert in Klammern stehen, mal einer durch Punkte getrennt oder sonstirgendwie ausgegeben werden müsste man ja doch wieder in der Funktion selber Abzeige schaffen.
„Wert in Klammern“ war doch jetzt beim Beispiel schon drin.
Und bspw. Zahlenformatierungen lassen sich auch mit den printf-Funktionen erledigen - wenn du doch nur endlich mal ins Handbuch schauen würdest ... *seufz*
Das soll ja verhindert werden, in dem man schon beim Programmaufruf die gewünschte Ausgabeformatierung mitgegeben wird. (Sorry falsch ich grad derb auf dem Schlauch stehe und es partou nicht erkennen kenn :D)
Na ja, bisschen mehr Ahnung von Grundlagen würde helfen ...
MfG ChrisB
Hi,
- vsprintf('%2$s,%1$s (%3$s)', $datensatz)
Und das, was da derzeit als Textliteral direkt notiert den ersten Parameter darstellt, glaubst nicht, dass man das vielleicht auch „von aussen“ übergeben könnte ...?
Jap! Jap! Jetzt hat er's. :)
Wir hatten gestern besuch von unseren Partner aus Berlin. Ich musste also permanent neben bei noch Leute beschäftigen. Ich dachte mir schon das ich aufm Schlauch steh.
Also jetzt entgültig mal Danke.
»»endlich mal ins Handbuch schauen würdest ... *seufz*
Das hätte nichts gebracht. Die übergabe des Strings 'Funktion' -> 'vsprintf' steht da auch nicht drin.
Na ja, bisschen mehr Ahnung von Grundlagen würde helfen ...
Der is Fies! Ich habe mal vor über 15Jahren mit Assambler, Basic und TurboPascal angefangen (zu DDR Zeiten auch noch auf nem KC87 aber nur im Schulkontext). Ich behaupte die "Grundlagen" verstanden zu haben. Auch wenn Du weißt wie Dein Auto fährt, das Straßen durch eine Stadt führen und wie ein Stadplan funktioniert findest Du doch auch nicht immer jedes Ziel! ;-P
MfG ChrisB
Viele Grüße Dir auch,
Rob
Hallo,
endlich mal ins Handbuch schauen würdest ... *seufz*
Die übergabe des Strings 'Funktion' -> 'vsprintf' steht da auch nicht drin.
was will mir dieser Satz sagen? .oO(?)
Die Handbuchseite zu vsprintf() ist zwar knapp, sie erklärt eigentlich nur, dass vsprintf() wie sprintf() funktioniert, außer dass die Argumente als Array übergeben werden. Aber sie linkt ja auch gleich zu sprintf() weiter, wo die Details, insbesondere die möglichen Angaben im Formatstring, genau erklärt werden.
Was fehlte dir da noch?
Na ja, bisschen mehr Ahnung von Grundlagen würde helfen ...
Der is Fies! Ich habe mal vor über 15Jahren mit Assambler, Basic und TurboPascal angefangen
Das ist gut - dann sind dir wohl die Grundlagen der Programmierung im Allgemeinen bekannt. Etwas Grundwissen in C könnte dir noch weiterhelfen, da sich einige Sprachen (beispielsweise PHP und Javascript) zumindest syntaktisch, teils aber auch von der Logik her eng an C anlehnen.
So long,
Martin
Hi,
Hallo,
Was fehlte dir da noch?
Fehlt nix. Es gibn nur um den kleinen Schritt den ich noch im Kopfe hätte machen müssen um zu erkennen das vsprintf() die Lösung meines Problems ist. Dank Blaubart und ChrisB hats dann heute morgen klick gemacht.
Etwas Grundwissen in C könnte dir noch weiterhelfen,
Klar, kann mna nie genug haben. Aber man kann auch nicht jede Funktion von C oder PHP kennen. In den 6 Jahren oder so die ich jetzt PHP mache, und das wird jetzt bestimmt alle schockieren, :D ..hab ich noch nie printf und seine Derivate verwendet. Bis heute. Und jetzt, wo ich seh wir praktisch sie ist, wundere ich mich das es solange ohne ging.
So long,
Martin
Viele Grüße,
Rob
Hi,
endlich mal ins Handbuch schauen würdest ... *seufz*
Das hätte nichts gebracht.
Das liegt dann aber an deinem Umgang damit.
Die übergabe des Strings 'Funktion' -> 'vsprintf' steht da auch nicht drin.
Das war an der Stelle in erster Linie auf deine (auch wieder erst später nachgereichte - noch mal *seufz*) Zusatzanforderung, auch bestimmte Zahlenformatierungen umzusetzen, bezogen. Die Beschreibungen zu vprintf/vsprintf verweisen, was den format-Parameter angeht, deutlich auf sprinft - und dort ist dieser ausführlich beschrieben.
Na ja, bisschen mehr Ahnung von Grundlagen würde helfen ...
Der is Fies!
Na komm, auch auf die Idee, dass bei der Funktions-Beschreibung
string vsprintf ( string $format , array $args )
eben dieser erste Parameter nicht nur als Textliteral an Ort und Stelle notiert, sondern auch als Variable übergeben werden kann, müsstest du mit mehrjähriger Programmiererfahrung aber selber kommen können. Ich meine, immerhin steht sogar schon $format da ...
Ich behaupte die "Grundlagen" verstanden zu haben. Auch wenn Du weißt wie Dein Auto fährt, das Straßen durch eine Stadt führen und wie ein Stadplan funktioniert findest Du doch auch nicht immer jedes Ziel! ;-P
Gerade beim Lesen des Stadtplans (Manual) offenbarst du hier aber ziemliche Schwächen.
MfG ChrisB
Hi,
Der is Fies!
Na komm, auch auf die Idee, dass bei der Funktions-Beschreibung
string vsprintf ( string $format , array $args )
eben dieser erste Parameter nicht nur als Textliteral an Ort und Stelle notiert, sondern auch als Variable übergeben werden kann, müsstest du mit mehrjähriger Programmiererfahrung aber selber kommen können.
Doch genau das war es. Genau daran ist das Verständniss gestern gescheitert. Heute früh war es völlig klar. Aber gestern -> war Kopf kaputt und wie Flasche leer! (Ich bat mehrmals um Entschuldigung).
Ich schiebs einfachmal mal auf die Kollegendelegation und die Flasche Rotwein am Mittagstisch beim Italiener. :D
Viele Grüße,
Rob