PHP Variable aus while Schleife
Tcz9
- php
Hallo!
Ich habe folgendes Problem!
Ich frage Daten aus einer mysql Datenbank ab und schreibe die in ein array:
$sql = "SELECT * FROM table WHERE field != ' ' ";
$result = mysql_query ( $sql );
Dann schreibe ich die Daten in ein DropDown Menü, so, dass alle Ergebnise, also alle Datensätze ordentlich im DropDown zu finden sind:
echo "<select name='selection'
onchange=\"pfc1.sendRequest('/join $row[0]');\">";
echo '<OPTION VALUE="" SELECTED>-- Menüpunkt waehlen--</OPTION>';
while ( $row = mysql_fetch_array ( $result ) )
{
echo "<option value='".$row[0]."'>$row[0].".$row[3]."</option>";
}
echo "</select>";
Das Problem: Ich kann den Join nicht ausführen weil die Variablen ja nur in der while Schleife verfügbar sind. Setze ich das GANZE in die while Schleife wiederholt sich das ganze DropDown Menü xmal.
Ich hoffe ihr versteht mich und könnt helfen?!
Grüße, Tom
Hi,
Das Problem: Ich kann den Join nicht ausführen weil
Welchen JOIN? Dass das eine bestimmte Art von Datenbankabfrage beschreibt, ist dir bewusst?
die Variablen ja nur in der while Schleife verfügbar sind.
Welche Variablen?
Ich hoffe ihr versteht mich und könnt helfen?!
Nein, ich verstehe dich nicht so wirklich - etwas strukturierter bitte.
Wenn du den Wert der selektierten Option onchange versenden willst, dann greife halt per JavaScript darauf zu.
MfG ChrisB
Hallo,
Ich frage Daten aus einer mysql Datenbank ab und schreibe die in ein array:
$sql = "SELECT * FROM table WHERE field != ' ' ";
$result = mysql_query ( $sql );
Das schreibst du doch nicht in ein Array, oder? Du bekommst doch ein Result-Set-Objekt zurück oder sowas, oder?
warum soll denn das select-Element eine onchange-Eigenschaft haben, die sich nur auf das erste Feld der ersten Abfrage bezieht. Das musst du wohl mit Javascript lösen.
Anonsten mach alternative Syntax das übersichtlicher:
~~~php
<?php while($irgendwas):?>
<p>html</p>
<?php endwhile?>
Gruß
jobo
Hi,
Ich frage Daten aus einer mysql Datenbank ab und schreibe die in ein array:
$sql = "SELECT * FROM table WHERE field != ' ' ";
$result = mysql_query ( $sql );
das gibt noch lange kein Array - du erhältst in $result eine mysql-Ressourcen-ID, mehr nicht. Oder false, wenn der SQL-Query nicht ausgeführt werden konnte.
> `echo "<select name='selection' onchange=\"pfc1.sendRequest('/join $row[0]');\">";`{:.language-php}
Hier hast du ein Problem: An dieser Stelle ist $row noch gar nicht definiert. Die Anweisung schmeißt also zumindest eine Notice.
Oder verwendest du dieselbe Variable vorher schon?
> ~~~php
echo '<OPTION VALUE="" SELECTED>-- Menüpunkt waehlen--</OPTION>';
> while ( $row = mysql_fetch_array ( $result ) )
> {
> echo "<option value='".$row[0]."'>$row[0].".$row[3]."</option>";
> }
> echo "</select>";
Dieses Stück mag wohl funktionieren.
Das Problem: Ich kann den Join nicht ausführen weil die Variablen ja nur in der while Schleife verfügbar sind. Setze ich das GANZE in die while Schleife wiederholt sich das ganze DropDown Menü xmal.
Beherzige das EVA-Prinzip: Eingabe, Verarbeitung, Ausgabe. Sammle erst alle Informationen, die du aus der Datenbank (und evtl. anderen Quellen) bekommst, bereite sie dann entsprechend auif, und gib erst zum Schluss den resultierenden HTML-Code aus.
Btw, warum schreibst du HTML-Tags und Attribute mal groß, mal klein? Entscheide dich doch für eine Variante und ziehe die konsequent durch. Empfohlen wird übrigens durchgehende Kleinschreibung; in XHTML ist sie sogr Pflicht.
So long,
Martin
Hi,
$sql = "SELECT * FROM table WHERE field != ' ' ";
gibt es einen speziellen Grund, dass Du "*" selektierst? Kennst Du die vorliegende Datenbankstruktur nicht?
Das Problem: Ich kann den Join nicht ausführen weil die Variablen ja nur in der while Schleife verfügbar sind.
Ich weiß nicht, warum das ein Problem sein soll. Offenbar benötigst Du den Wert erst Jahre später, wenn ein JavaScript-tauglicher Client agiert; und der kann ganz hervorragend auf alle Werte zugreifen, die Du da in die <option>-Elemente schreibst.
Warum Du beim ersten <option>-Element dermaßen aktiv XHTML-Inkompatibilität herstellst, ist mir übrigens auch nicht klar. Entstehen Dir hierdurch bestimmte Vorteile?
Cheatah
Hi!
Ich hoffe ihr versteht mich und könnt helfen?!
Prinzipiell treten solche Probleme gar nicht erst auf, wenn man nach EVA-Prinzip getrennt programmiert. Zuerst die Eingabedaten besorgen, dann Daten verarbeiten und zum Schluss die Ausgabe.
Die Daten aus der Datenbank wären demnach abzufragen und in einem Array zwischenzulagern. Aus diesem Array kann dann die Ausgabe erstellt werden. Dabei kann man sowohl durchlaufen als auch gezielt auf bestimmte Elemente zugreifen.
Lo!
Ich hoffe ihr versteht mich und könnt helfen?!
Grüße, Tom
Hi Tom,
nach all den selfhtml-typischen Antworten, die allesamt besser, richtiger und nachhaltiger sind, als meine, werd ich Dir dennoch meine Antwort geben und bin sicher, es ist die einzige, die Du umsetzen wirst ;-)
Benutz einfach vor deinem "Join" (der Ausdruck passt nu wirklich nicht!) einmal ein:
$row = mysql_fetch_row ( $result );
Danach gehst Du weiter vor, wie gehabt...
Grüße, Loddar
Hi!
nach all den selfhtml-typischen Antworten, die allesamt besser, richtiger und nachhaltiger sind, als meine, werd ich Dir dennoch meine Antwort geben und bin sicher, es ist die einzige, die Du umsetzen wirst ;-)
Glaub ich nicht.
Benutz einfach vor deinem "Join" (der Ausdruck passt nu wirklich nicht!) einmal ein:
$row = mysql_fetch_row ( $result );
Danach gehst Du weiter vor, wie gehabt...
Wenn er das täte, fehlte ihm die erste Option in seiner Auflistung. Da müsste er entweder noch vor dem while die Option extra hinzufügen und hätte dann beim Anpassen vom Code immer zwei Stellen zu beachten oder er nimmt do-while statt while, oder trennt es gleich sauber nach EVA.
Lo!
Wenn er das täte, fehlte ihm die erste Option in seiner Auflistung.
Warum sollte die fehlen?
Ein $row=... entfernt doch keine Elemente??
Grüße, Loddar
Hi!
Wenn er das täte, fehlte ihm die erste Option in seiner Auflistung.
Warum sollte die fehlen?
Ein $row=... entfernt doch keine Elemente??
Bis jetzt war dein Plan
$row = mysql_fetch_row ( $result );
// Verarbeitung für das Select
while ($row = mysql_fetch_array($result))
// <option ...
Dein eingefügtes mysql_fetch_row() holt ein Element aus der Ergebnismenge und setzt den internen Zeiger auf das nächste. Das mysql_fetch_array() in der while-Bedingung beginnt nun mit dem zweite Element.
Lo!
Bis jetzt war dein Plan
$row = mysql_fetch_row ( $result );
// Verarbeitung für das Selectwhile ($row = mysql_fetch_array($result))
// <option ...Dein eingefügtes mysql_fetch_row() holt ein Element aus der Ergebnismenge und setzt den internen Zeiger auf das nächste. Das mysql_fetch_array() in der while-Bedingung beginnt nun mit dem zweite Element.
Alles klar und Danke für die Erklärung, denn das wußte ich nicht.
Und jetzt der dann wohl richtigere Schmutzcode für den TO ;-)
$row = mysql_fetch_row ( $result );
// Verarbeitung für das Select
$result = mysql_query ( $sql );
while ($row = mysql_fetch_array($result))
// <option ...
Grüße, Loddar
Hi!
Und jetzt der dann wohl richtigere Schmutzcode für den TO ;-)
"Schmutzcode" würde ich nicht sagen, aber so was ähnliches :-)
$row = mysql_fetch_row ( $result );
// Verarbeitung für das Select$result = mysql_query ( $sql );
while ($row = mysql_fetch_array($result))
// <option ...
Denn besser (im Sinne von Stil und Performance) geworden ist es nun auch nicht. Jetzt befragst du das DBMS zweimal hintereinander mit der gleichen Frage. MySQL kann optimieren, da es die zweite Anfrage aus dem Query-Cache beantworten kann, doch der Datentransfer findet zweimal statt. Praktisch wird das keine großartig spürbaren Auswirkungen haben, aber schön ist was anderes.
Lo!
Hi,
Denn besser (im Sinne von Stil und Performance) geworden ist es nun auch nicht. Jetzt befragst du das DBMS zweimal hintereinander mit der gleichen Frage. MySQL kann optimieren,
Der PHP-Programmierer kann noch besser optimieren, indem er anstelle der zweiten DB-Abfrage einfach mysql_data_seek aufruft.
cu,
Andreas
Hi!
Denn besser (im Sinne von Stil und Performance) geworden ist es nun auch nicht. Jetzt befragst du das DBMS zweimal hintereinander mit der gleichen Frage. MySQL kann optimieren,
Der PHP-Programmierer kann noch besser optimieren, indem er anstelle der zweiten DB-Abfrage einfach mysql_data_seek aufruft.
Stimmt, das ist in dem Fall sogar in Bezug auf Speicherverbrauch besser, denn die MySQL-API führt unsichtbar bereits beim mysql_query() einen Fetch aller Daten durch und legt sie in einem nichtöffentlichen Puffer ab. Die Fetch-Funktionen greifen auf diesen Puffer zu, statt das Ergebnis direkt beim Server abzuholen. Deshalb sind auch solche Funktionen wie mysql_data_seek() und mysql_num_rows() verwendbar. Im Gegensatz dazu gibt es die Möglichkeit, ungepufferte Abfragen zu starten, muss dann aber auf die genannten Funktionen verzichten (beziehungsweise kann mysql_num_rows() erst nach vollständigem Fetchen sinnvoll verwenden.)
Lo!