Problem mit Select-Feld nach absenden

mccoy

Grünschnabel
Hi,

ich habe ein Admin Bereich für eine Webseite, wo ich per Select Feld auswählen kann welche Seite bearbeitet werden kann.
HTML:
       <select name="seite" size="1" id="seite"> 
       <option value="1" selected>Home</option>   
       <option value="2">History</option>       
       <option value="3">Pics</option></select> 
       <input name="sub" type="submit" id="sub" value="los"></td>
Anschließend wird per Send-Button "los" die Variable $seite mit den entsprechenden Wert (1-3) gefüllt.
Nun wird per Select der Inhalt der entsprechenden Seite aus der DB geholt und $ausgabe in ein Textarea ausgegeben:
PHP:
if ($sub == "los")
 {  
// Connect.php laden  
   require_once('connect.php'); 
// Verbindung zur DB herstellen  
   mysql_select_db($database, $connect); 
//Sql Abfrage0  
   $sql = "SELECT * FROM inhalt WHERE ID = '$seite'";  
// Statt * hier inhalt verwenden
   $result = mysql_query($sql, $connect); 
   $number = mysql_num_rows($result);
   $b = mysql_fetch_row($result); 
   $ausgabe = $b[1]; 
 }
Die Ausgabe dann in einem Textarea:
HTML:
<textarea name="text" cols="80" rows="10"><?php echo "$ausgabe"; ?></textarea>
Nun kann ich das Textfeld bearbeiten und durch einen zweiten Submit Button und Update Befehle wieder an die DB zurücksenden. Die Formulare werden jeweils per "post" übergeben:
HTML:
<form name="form1" method="post" action="<?php echo $GLOBALS['PHP_SELF'] ?>

Nun das Problem:
Angenommen ich möchte die 2 Seite verändern, dann wähle ich im Select feld "history" aus und es wird an $seite die "2" übergeben. Es wird dann auch der richtige Inhalt im Textarea dargestellt. Möchte ich nun die Änderungen Speichern und drücke auf den zweiten Submit Button, schreibt er aber die Änderungen auf die 1. Seite, weil das Select-Feld automatisch, nach drücken des ersten Buttons "los" wieder auf den ersten Listeneintrag zurückspringt! Stelle ich es manuell um, bevor ich den zweiten Button zum "update der DB" drücke, funktioniert alles. Aber ich möchte das er automatisch im Select Feld die entsprechende Seite, die ich zu Begin ausgewählt habe auch beibehält!

Ich habe nun schon erfahren, dass man das mit "Sessions" lösen kann nur weiss ich leider nicht wie ich das umsetze.

Hier der komplette Code:
HTML:
<form name="form1" method="post" action="<?php echo $GLOBALS['PHP_SELF'] ?>">
<table width="713" border="0" cellspacing="1" cellpadding="0">
  <tr>
    <td colspan="2" class="optstufe2"><div align="center"><b>ADMIN-Center:</b></div></td>
  </tr>
  <tr>
    <td colspan="2" class="optstufe2">&nbsp; </td>
  </tr>
  <tr>
    <td class="optstufe4">&nbsp;</td>
    <td width="647" class="optstufe4">Welche Seite soll bearbeitet werden ? </td>
  </tr>
  <tr class="optstufe5">
    <td width="63">&nbsp;</td>
    <td><select name="seite" size="1" id="seite">
      <option value="1" selected>Home</option>
      <option value="2">History</option>
      <option value="3">Pics</option>
    </select>
      <input name="sub" type="submit" id="sub" value="los"></td>
  </tr>
  <tr class="optstufe5">
    <td width="63">&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr class="optstufe4">
    <td>&nbsp;</td>
    <td>        <div align="right"></div></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><div align="right"></div></td>
  </tr>
</table>

<?
if ($sub == "los") {
// Connect.php laden
require_once('connect.php');
// Verbindung zur DB herstellen
mysql_select_db($database, $connect);
//Sql Abfrage0
$sql = "SELECT * FROM inhalt WHERE ID = '$seite'";
$result = mysql_query($sql, $connect);
$number = mysql_num_rows($result);
$b = mysql_fetch_row($result);
$ausgabe = $b[1];
}
?>

<table width="713" border="0" cellspacing="1" cellpadding="0">
  <tr>
    <td width="647" colspan="2" class="optstufe2"><div align="center">
	
    </div></td>
  </tr>
  <tr class="optstufe5">
    <td width="647">Text:</td>
    <td><textarea name="text" cols="80" rows="10"><?php echo "$ausgabe"; ?></textarea></td>
  </tr>
  <tr class="optstufe4">
    <td>&nbsp;</td>
    <td>      <input type="submit" name="Submit" value="Senden">      <div align="right"></div></td></tr>
  <tr>
    <td>

<?php
if ($Submit == "Senden") {
	$sql = "UPDATE inhalt SET text = '$text' WHERE ID = '$seite'";
	echo $sql;
	$link= mysql_connect("", "" , "");
//später über connect.php
	mysql_select_db("net", $link);
	mysql_query($sql, $link);
	echo "Aktualisierung erfolgreich!";
}
?>

</td>
    <td><div align="right"><font size="-2"><a href="javascript: window.close()">Fenster schlie&szlig;en </a></font></div></td>
  </tr>
</table>
 
Zuletzt bearbeitet:
Ganz einfach!
Du überprüfst, ob die Variable $seite vorhanden ist. Wenn nicht, dann wird die 1. Seite vorselektiert.
Wenn ja, dann selektierst Du halt den entsprechenden Wert vor.
PHP:
<select name="seite" size="1" id="seite">
  <option value="1" <?php if(!isset($seite) or ($seite == "1")) echo "selected"; ?>>Home</option>
  <option value="2" <?php if($seite == "2") echo "selected"; ?>>History</option>       
  <option value="3" <?php if($seite == "3") echo "selected"; ?>>Pics</option> 
</select>

redlama

EDIT @sven, das ist mir im Nachhinein auch aufgefallen, ... :-(
 
Zuletzt bearbeitet:
das Problem mit dem selected kannst du so lösen

<option value="1" <?if(isset($seite) && $seite == 1) echo "selected"?>>Home</option>

dieses für jedes weite option.
 
@redlama: Das nenne ich alles andere als guten Code. Bei 50 Seiten platzt dir das Script vor lauter echos.

@mccoy: Da du die Seiten sicherlich nicht immer per Hand pflegen möchtest, ist es sinnvoll, den HTML-Code für das Select-Feld dynamisch zu generieren, sprich: Du liest alle vorhandenen Seiten aus der Datenbank aus und stellt mit Hilfe einer Schleife den HTML-Code des Select-Feldes zusammen. Dabei überprüfst du bei jedem Schleifendurchlauf, ob die übergebene Seite mit der aktuellen Seite des Schleifendurchlaufs übereinstimmt und fügst dem Option-Tag den Parameter "selected" hinzu. Somit bleibt der Code übersichtlich und du must bei 100 Seiten keine Hilfskraft engagieren, die alle echos überarbeitet.

PHP:
$sql = 'select id, name from seite';
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
  $html .= '<option value="'.$row['id'].'" '.(($row['id'] == $_REQUEST['seite']) ? 'selected' : '').'>'.$row['name'].'</option>';
}
 
@redlama
TAUSEND Dank! Das funktioniert einwandfrei! :-)

@Sven Petruschke
Das ist wohl die "saubere" Lösung! Ich verwende momentan nur 7 Seiten die mit dem Vorschlag von redlama auch noch pflegen kann. Es werden auch keine weiteren Seiten hinzukommen,(hoffe ich). Aber wenn ich mir eine neue Page baue mehreren Seiten, werde ich deine Lösung auf jeden Fall einsetzen!
Zu deiner Lösung nochmal...
Ich bin ja noch totaler Anfänger, daher muss ich mir das nochmal genauer ansehen:

PHP:
$sql = 'select id, name from seite'; 
// okay erklärt sich von selbst... bei mir heisst die Spalte "text"
$result = mysql_query($sql); 
// hier muss ich doch noch meinen $connect einfügen? 
//also so:
$result = mysql_query($sql, $connect); 

while ($row = mysql_fetch_assoc($result)) {
//hier holt man die ergebnisse und startet die Schleife
 
  $html .= '<option value="'.$row['id'].'" '.(($row['id'] == $_REQUEST['seite']) ? 'selected' : '').'>'.$row['name'].'</option>'; 

//du erstellst hier eine Var $html und übergibst dieser, (bzw. hängst ihr an ? ... wg $html.) aus der Splate ID die entsprechende Zahl, dann setzt du einen Vergleichswert, "tue solange durchlaufen bis ID gleich dem Request[text], dann versteh ichs nimmer ;-)
}
muss ich dann einfach echo "$html"; schreiben um das Select feld auszugeben?

[*schleim-an*]
p.s. und nochmal tausend dank an euch. Ihr seid spitze, super schnelle und kompetente Antworten! :-)
[*schleim-aus*]
 
In der Variable $html wird nur der HTML-Code der Option-Tags gespeichert. Du kannst die Variable via echo ausgeben, solltest allerdings noch den öffnenden Select-Tag davor und den schließenden Select-Tag danach ausgeben.

Das "Innenleben" der Schleife ist vielleicht etwas kompliziert dargestellt. Folgendes verrichtet dieselbe Aufgabe:
PHP:
while ($row = mysql_fetch_assoc($result)) {
  if ($row['id'] == $_REQUEST['seite']) {
    $selected = 'selected';
  } else {
     $selected = '';
  }
  $html .= '<option value="'.$row['id'].'" '.$selected.'>'.$row['name'].'</option>';
} 

// hier noch einmal die Ausgabe an den Browser:
echo '<select name="seite">'.$html.'</select>';
Der Eintrag wird nur dann selektiert, wenn die ID der Seite mit der übergebenen Seiten-ID übereinstimmt.

Vor dem Aufruf von [phpf]mysql_query[/phpf] muss noch die Verbindung zur Datenbank aufgebaut werden.
 
Zurück