letzte Auswahl im Selector "merken"

phpneuling_

Grünschnabel
Hallo ihr lieben,

ich hätte da mal ein kleines Problem,

Ich krieg es nicht hin, das die letzte Auswahl die ich ausgewählt habe im Selecetor stehen bleibt. der springt immer wieder auf den ersten Eintrag zurück.

was mach ich da falsch?
Kann es vielleicht daran liegen, dass ich die Werte in _POST und element auswahl vorher auf Gleichheit prüfen muss?

thx und grüße

PHP:
<!DOCTYPE HTML>
<html lang="de">
<head>
    <meta charset="utf-8">
        <title>test</title>
<?php
try {
        $pdo = new PDO ( 'mysql:dbname=nation;charset=utf8', 'root', '' );
        //$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        //$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch ( PDOException $e ) {
        die ( $e->getMessage () );
}


?>
</head>


<body>
<form method="post">
  <fieldset>

<?php
    $sql = "SELECT name, region_id FROM regions ORDER BY name";
    $stmt = $pdo -> prepare($sql);
    $stmt -> execute();
    //print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    echo "<select name ='auswahl' id = 'auswahl'>";

?>

<?php
    foreach ($stmt->fetchAll(PDO::FETCH_COLUMN,0) as $daten)
    echo "<option value = '$daten'>$daten </option> ";

     //echo "<option value = '.$daten->$daten.'"' .($_POST['auswahl'] == $daten->id ? ' selected='selected'' : '') . '>'.$daten->name.'</option>'";
     echo "</select>";
     $auswahl = $_POST['auswahl'] ?? 'standard';
    if(isset($_POST['auswahl'])){
       $region = $_POST['auswahl'];




        $auswahl = 'SELECT countries.name as "name2", countries.area, avg(country_stats.gdp), avg(country_stats.population), continents.name FROM
                    countries, country_stats, regions INNER JOIN continents ON regions.continent_id = continents.continent_id
                    WHERE regions.region_id = countries.region_id AND countries.country_id = country_stats.country_id AND regions.name = "'. $region .'" GROUP BY countries.country_id';


        $stmt = $pdo -> prepare($auswahl);
        $stmt->execute();
        echo "<table id=\"Länder\">\n\t";
        echo "<thead>
                <tr>
                <th><h3>Land</h3></th>
                <th><h3>Fläche</h3></th>
                <th><h3>AVG BIP</h3></th>
                <th><h3>AVG Bevölkerung</h3></th>
                <th><h3>Kontinent</h3></th>
                </tr>
                </thead>\n";
        echo "<tbody>\n\t";
        $ausgabe[] = $stmt->fetch(PDO::FETCH_ASSOC);

        while ( $zeile = $stmt->fetch ( PDO::FETCH_ASSOC ) ) {
          echo  "<tr>\t<td>".$zeile['name2']."</td>
                      <td>".$zeile['area']."</td>
                      <td>".$zeile['avg(country_stats.gdp)']."</td>
                      <td>".$zeile['avg(country_stats.population)']."</td>
                      <td>".$zeile['name']."</td></tr>\n\t";
          }

}


?>
<br>
<input type = "submit" value ="anzeigen">
</form>


        </body>
</html>
 
Lösung
Das hier kommt mir auch sehr seltsam vor:
PHP:
$auswahl = isset($_POST['auswahl']) ? isset($_POST['auswahl']) : "";
isset gibt doch boolean zurück
Hätte sowas erwartet (damit $auswahl dann auch den Wert der Auswahl bekommt, und nicht True)
PHP:
$auswahl = isset($_POST['auswahl']) ? $_POST['auswahl'] : "";
Weil dann sollte das hier funktionieren
PHP:
$selected = $auswahl==$daten ? "selected" : "";

EDIT: Wobei das hier ja eigentlich auch Quatsch ist
PHP:
$auswahl = isset($_POST['auswahl']) ? $_POST['auswahl'] : "";
einfach direkt
PHP:
$auswahl = $_POST['auswahl'];
Wenn nix ausgewählt ist, gibt $_POST['auswahl'] eh nen leeren String zurück
Oder verstehe ich das falsch?
Und da fällt dir nichts auf?
Nur mal überflogen (und von html habe ich keine Ahnung, davon aber jede Menge):
a) das erste BR Tag steht in einfachen Gänsefüsschen
b) die option "selected" ist ein boolean, du weist aber einen text zu, und zwar bei jedem einzelnen Eintrag, also auch beim letzten. Vermutung: html ignoriert alles was nach "selected" kommt (also ='selected') und interpretiert es als "wahr", ergo ist letzter Eintrag selected

EDIT: Müsste mMn so aussehen:
das letzte <BR> ist auch falsch. Fehlt Schrägstrich und an falscher Position
und "selected" kommt jetzt nur bei der Option rein, welche zuletzt gewählt wurde.
In meinem Beispiel "North America"
HTML:
Region <select name ='auswahl' id = 'auswahl'>
<br>
<option value = 'Antarctica'>Antarctica</option>
<option value = 'Australia and New Zealand'>Australia and New Zealand</option>
<option value = 'Baltic Countries'>Baltic Countries</option>
<option value = 'British Islands'>British Islands</option>
<option value = 'Caribbean'>Caribbean</option>
<option value = 'Central Africa'>Central Africa</option>
<option value = 'Central America'>Central America</option>
<option value = 'Eastern Africa'>Eastern Africa</option>
<option value = 'Eastern Asia'>Eastern Asia</option>
<option value = 'Eastern Europe'>Eastern Europe</option>
<option value = 'Melanesia'>Melanesia</option>
<option value = 'Micronesia'>Micronesia</option>
<option value = 'Micronesia/Caribbean'>Micronesia/Caribbean</option>
<option value = 'Middle East'>Middle East</option>
<option value = 'Nordic Countries'>Nordic Countries</option>
<option value = 'North America' selected>North America</option>
<option value = 'Northern Africa'>Northern Africa</option>
<option value = 'Polynesia'>Polynesia</option>
<option value = 'South America'>South America</option>
<option value = 'Southeast Asia'>Southeast Asia</option>
<option value = 'Southern Africa'>Southern Africa</option>
<option value = 'Southern and Central Asia'>Southern and Central Asia</option>
<option value = 'Southern Europe'>Southern Europe</option>
<option value = 'Western Africa'>Western Africa</option>
<option value = 'Western Europe'>Western Europe</option>
</select>   
<br>
 
Zuletzt bearbeitet:
Leider hat Zvoni dir jetzt alles vorgekaut, allerdings reden wir hier von Grundlagen, die man sich mit Hilfe von w3schools sich durchaus selber aneignen kann, wenn man denn wollte. Siehe z.B. HTML option selected Attribute

Und da du überall selected stehen hast, kann der Fehler ja nur hier liegen:
PHP:
$selected = $auswahl==$daten ? "selected='selected'" : "";

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Leider hat Zvoni dir jetzt alles vorgekaut, allerdings reden wir hier von Grundlagen, die man sich mit Hilfe von w3schools sich durchaus selber aneignen kann, wenn man denn wollte. Siehe z.B. HTML option selected Attribute

Und da du überall selected stehen hast, kann der Fehler ja nur hier liegen:
PHP:
$selected = $auswahl==$daten ? "selected='selected'" : "";
scatello
ich übertreibe nicht, wenn ich sage, dass ich von html oder php keine Ahnung habe.
Ist wirklich so,
aber nach Eingabe in Google von "html option selected" bin ich genau auf deinem Link zu W3Schools gelandet, und da reichte ein Blick auf das Beispiel
 
aber nach Eingabe in Google von "html option selected" bin ich genau auf deinem Link zu W3Schools gelandet, und da reichte ein Blick auf das Beispiel
Richtig, und warum kann das @phpnewguest nicht? Ich bin kein Freund davon, immer gleich fertige Lösungen zu liefern, wenn es sich um so simple Gundlagen handelt. Im Endeffekt wird dann per Copy/Paste alles übernommen, ohne überhaupt zu verstehen, warum das so ist und was der Quellcode macht.
 
Das hier kommt mir auch sehr seltsam vor:
PHP:
$auswahl = isset($_POST['auswahl']) ? isset($_POST['auswahl']) : "";
isset gibt doch boolean zurück
Hätte sowas erwartet (damit $auswahl dann auch den Wert der Auswahl bekommt, und nicht True)
PHP:
$auswahl = isset($_POST['auswahl']) ? $_POST['auswahl'] : "";
Weil dann sollte das hier funktionieren
PHP:
$selected = $auswahl==$daten ? "selected" : "";

EDIT: Wobei das hier ja eigentlich auch Quatsch ist
PHP:
$auswahl = isset($_POST['auswahl']) ? $_POST['auswahl'] : "";
einfach direkt
PHP:
$auswahl = $_POST['auswahl'];
Wenn nix ausgewählt ist, gibt $_POST['auswahl'] eh nen leeren String zurück
Oder verstehe ich das falsch?
 
Zuletzt bearbeitet:
Lösung
Wenn nix ausgewählt ist, gibt $_POST['auswahl'] eh nen leeren String zurück
Oder verstehe ich das falsch?
Jein, aber wenn die Seite über den Browser das erste Mal aufgerufen wird, ist $_POST nicht gesetzt und mit
PHP:
$auswahl = $_POST['auswahl'];
würdest du trotzdem darauf zugreifen. PHP wird dann meckern, aber das würde man auch nur sehen, wenn das Error-Reporting hochgedreht ist. Daher sollte man das schon mit isset prüfen.
 
Zurück