Radio-Button Auswahl überprüfen.

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

DerTrojaner

Mitglied
Hallo zusammen,

ich habe ein kleines Problem, und zwar habe ich eine Tabelle und möchte nun dank der Radio-Buttons einen Bestimmten Datensatz bearbeiten.
Das Problem ist aber Wenn ich den gewünschten Datensatz durch den Radio-Button anklicke, kriege ich die Fehlermeldung "Es wurde kein Datensatz ausgewählt."

Vielleicht könnt ihr mir sagen wo der Fehler liegt. Ich habe einmal zulauf.php und einmal bearbeiten.php

Code:
                <table>
                    <tr>
                        <th>Tag</th>
                        <th>Wochentag</th>
                        <th>Uhrzeit</th>
                        <th>Wert</th>
                        <th>Lufttemp. in °C</th>
                        <th>Abwassertemp. in °C</th>
                        <th>pH-Wert</th>
                        <th>Flotation</th>
                        <th>Zulauf</th>
                  </tr>

                    <?php
                        while ($dsatz = $result->fetch_assoc()) {
                    ?>
                        <tr>
                          <td><?php echo $dsatz['Tag']; ?></td>
                            <td><?php echo $dsatz['Wochentag']; ?></td>
                            <td><?php echo $dsatz['Uhrzeit']; ?></td>
                            <td><?php echo $dsatz['Wert']; ?></td>
                            <td><?php echo $dsatz['Lufttemperatur']; ?></td>
                            <td><?php echo $dsatz['Abwassertemperatur']; ?></td>
                            <td><?php echo $dsatz['pH_Wert']; ?></td>
                            <td><?php echo $dsatz['Flotation']; ?></td>
                            <td><?php echo $dsatz['Zulauf']; ?></td>
                            <td><input type='radio' name='auswahl' value='$Tag'></td>
                        </tr>
                    <?php
                    }
                    ?>
                </table>

Code:
  if( isset( $_POST["auswahl"]) )
 {
        $con = mysqli_connect($servername, $username, $password, $dbname);
    // 3. Datenbankabfrage starten
        $Tag = $_POST["Tag"];
        $abfrage = "SELECT * FROM zulauf WHERE Tag = $Tag";
        $result = mysqli_query($con, $abfrage);
 
Hallo Trojaner,
dein Fehler ist an dieser Stelle:
HTML:
<td><input type='radio' name='auswahl' value='$Tag'></td>

Du hast hier
1. den öffnenden PHP-Tag vergessen
2. dadurch auch das Echo vergessen
3. eine Variable genutzt, die nicht existiert (zumindest hier in dem Code Teil den du uns gepostet hast)
4. Beim Zusammensetzen des Queries nutzt ein Element aus dem Post, was nicht existiert (das Feld Tag), du übergibst aber kein Element außer "auswahl" mit in das Post

Du kannst den Fehler so beheben
HTML:
<td><input type='radio' name='auswahl' value='<?= $dsatz['Tag']; ?>'></td>

Du könntest das dir solche fehler weniger passieren weniger PHP und Html-Code mischen, das wäre z.B. mit printf bzw sprintf möglich.

z.b. so:

PHP:
$output = <<<EOL
        <table>
                    <tr>
                        <th>Tag</th>
                        <th>Wochentag</th>
                        <th>Uhrzeit</th>
                        <th>Wert</th>
                        <th>Lufttemp. in °C</th>
                        <th>Abwassertemp. in °C</th>
                        <th>pH-Wert</th>
                        <th>Flotation</th>
                        <th>Zulauf</th>
                  </tr>
EOL;

$buffer = <<< EOL
                        <tr>
                          <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td><input type='radio' name='auswahl' value='%s'></td>
                        </tr>
EOL;

$i = 0;
while ($i < 10) {
   $output .= sprintf($buffer, $dsatz['Tag'], $dsatz['Wochentag'], $dsatz['Uhrzeit'], 
                              $dsatz['Wert'], $dsatz['Lufttemperatur'], $dsatz['Abwassertemperatur'],
                              $dsatz['pH_Wert'], $dsatz['Flotation'], $dsatz['Zulauf'], $dsatz['Tag']);
   $i++;
}

$output .= <<<EOL
                </table>
            <input type="submit" />
        </form>
    </body>
</html>
EOL;

echo $output;

Um Allgemeine Fehler in PHP zu finden schau aktiviere mal Xdebug in deiner Entwicklungsumgebung.
Als Tipp hätte ich noch, das du niemals Werte direkt so in ein SQL-Statement übernehmen solltest.

Sonst könnte jemand den Value des Inputs z.B. auf "0; drop database meine_datenbank" und schon ist deine Datenbank futsch oder er kann sich dadurch auch Zugriff auf das System erschleichen.

Stichwort hierbei ist SQL-Injection. Dies kann durch Escapen der Values beim zusammen setzen des Queries entgegen gewirkt werden. Ein moderner Ansatz ist hierfür Prepared-Statements.
Gleich zeitig schau dir mal die Klassenschreibweise von Mysqli an, das macht den Quellcode etwas kürzer. ;)
Das mit Prepared-Statements würde das so aussehen:

PHP:
$tag = $_POST['auswahl'];
$stmt = mysql_prepare($con, "SELECT * FROM zulauf WHERE Tag = ?;");
// Ich habe hier angenommen, dass der Tag eine Zahl ist deshalb ist der Typ hier ein "i", falls es ein String ist müsste es ein "s" sein
mysqli_stmt_bind_param( $stmt, "i", $tag);
$result = mysqli_stmt_execute($stmt);
 
Hallo Trojaner,
dein Fehler ist an dieser Stelle:
HTML:
<td><input type='radio' name='auswahl' value='$Tag'></td>

Du hast hier
1. den öffnenden PHP-Tag vergessen
2. dadurch auch das Echo vergessen
3. eine Variable genutzt, die nicht existiert (zumindest hier in dem Code Teil den du uns gepostet hast)
4. Beim Zusammensetzen des Queries nutzt ein Element aus dem Post, was nicht existiert (das Feld Tag), du übergibst aber kein Element außer "auswahl" mit in das Post

Du kannst den Fehler so beheben
HTML:
<td><input type='radio' name='auswahl' value='<?= $dsatz['Tag']; ?>'></td>

Du könntest das dir solche fehler weniger passieren weniger PHP und Html-Code mischen, das wäre z.B. mit printf bzw sprintf möglich.

z.b. so:

PHP:
$output = <<<EOL
        <table>
                    <tr>
                        <th>Tag</th>
                        <th>Wochentag</th>
                        <th>Uhrzeit</th>
                        <th>Wert</th>
                        <th>Lufttemp. in °C</th>
                        <th>Abwassertemp. in °C</th>
                        <th>pH-Wert</th>
                        <th>Flotation</th>
                        <th>Zulauf</th>
                  </tr>
EOL;

$buffer = <<< EOL
                        <tr>
                          <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td>%s</td>
                            <td><input type='radio' name='auswahl' value='%s'></td>
                        </tr>
EOL;

$i = 0;
while ($i < 10) {
   $output .= sprintf($buffer, $dsatz['Tag'], $dsatz['Wochentag'], $dsatz['Uhrzeit'],
                              $dsatz['Wert'], $dsatz['Lufttemperatur'], $dsatz['Abwassertemperatur'],
                              $dsatz['pH_Wert'], $dsatz['Flotation'], $dsatz['Zulauf'], $dsatz['Tag']);
   $i++;
}

$output .= <<<EOL
                </table>
            <input type="submit" />
        </form>
    </body>
</html>
EOL;

echo $output;

Um Allgemeine Fehler in PHP zu finden schau aktiviere mal Xdebug in deiner Entwicklungsumgebung.
Als Tipp hätte ich noch, das du niemals Werte direkt so in ein SQL-Statement übernehmen solltest.

Sonst könnte jemand den Value des Inputs z.B. auf "0; drop database meine_datenbank" und schon ist deine Datenbank futsch oder er kann sich dadurch auch Zugriff auf das System erschleichen.

Stichwort hierbei ist SQL-Injection. Dies kann durch Escapen der Values beim zusammen setzen des Queries entgegen gewirkt werden. Ein moderner Ansatz ist hierfür Prepared-Statements.
Gleich zeitig schau dir mal die Klassenschreibweise von Mysqli an, das macht den Quellcode etwas kürzer. ;)
Das mit Prepared-Statements würde das so aussehen:

PHP:
$tag = $_POST['auswahl'];
$stmt = mysql_prepare($con, "SELECT * FROM zulauf WHERE Tag = ?;");
// Ich habe hier angenommen, dass der Tag eine Zahl ist deshalb ist der Typ hier ein "i", falls es ein String ist müsste es ein "s" sein
mysqli_stmt_bind_param( $stmt, "i", $tag);
$result = mysqli_stmt_execute($stmt);


Also ich habe das mal versucht und ich habe dadurch immer noch die Fehlermeldung "Es wurde kein Datensatz ausgewählt. "

hier mein bearbeiten.php
Code:
<title>Betriebstagebuch</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script type='text/javascript' src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="SlideButton.js"></script>
<?php
    require_once("index.php");


    if( isset( $_POST["auswahl"]) )
 {
        $con = mysqli_connect($servername, $username, $password, $dbname);
    // 3. Datenbankabfrage starten
        $Tag = $_POST["Tag"];
        $abfrage = "SELECT * FROM zulauf WHERE Tag = $Tag";
        $result = mysqli_query($con, $abfrage);

        // 4. Datensatz in Variablen speichern
        $dsatz = mysqli_fetch_assoc($result);
        $Tag = $dsatz["Tag"];
        $Wochentag = $dsatz["Wochentag"];
        $Uhrzeit = $dsatz["Uhrzeit"];
        $Wert = $dsatz["Wert"];
        $Lufttemperatur = $dsatz["Lufttemperatur"];
        $Abwassertemperatur = $dsatz["Abwassertemperatur"];
        $pH_Wert = $dsatz["pH_Wert"];
        $Flotation = $dsatz["Flotation"];
        $Zulauf = $dsatz["Zulauf"];

        // 5. Das Bearbeiten-Formular anzeigen
        echo "<form action='bearbeiten.php' method='post'>";
        echo "<input name='Tag' type='hidden' value='$Tag'>";
        echo "<p><input name='Wochentag' value='$Wochentag'> Wochentag</p>";
        echo "<p><input name='Uhrzeit' value='$Uhrzeit'> Uhrzeit</p>";
        echo "<p><input name='Wert' value='$Wert'> Wert</p>";
        echo "<p><input name='Lufttemperatur' value='$Lufttemperatur'> Lufttemperatur</p>";
        echo "<p><input name='Abwassertemperatur' value='$Abwassertemperatur'> Abwassertemperatur</p>";
        echo "<p><input name='pH_Wert' value='$pH_Wert'> pH_Wert</p>";
        echo "<p><input name='Flotation' value='$Flotation'> Flotation</p>";
        echo "<p><input name='Zulauf' value='$Zulauf'> Zulauf</p>";

        echo "<input name='bearbeitungAbschicken' value='Bearbeitung abschließen' type='submit'>";
        echo "</form>";

        echo "<a href='zulauf.php'>zurück zur Übersicht</a>";
    }

//6. Datensatz aktualisieren mit UPDATE
if(isset($_POST["bearbeitungAbschicken"])){
  $Tag = $_POST["Tag"];
  $Wochentag = $_POST["Wochentag"];
  $Uhrzeit = $_POST["Uhrzeit"];
  $Wert = $_POST["Wert"];
  $Lufttemperatur = $_POST["Lufttemperatur"];
  $Abwassertemperatur = $_POST["Abwassertemperatur"];
  $pH_Wert = $_POST["pH_Wert"];
  $Flotation = $_POST["Flotation"];
  $Zulauf = $_POST["Zulauf"];

//String für Update-Anweisung erstellen
  $update = "UPDATE zulauf SET
  Wochentag = '$Wochentag',
  Uhrzeit = '$Uhrzeit',
  Wert ='$Wert',
  Lufttemperatur='$Lufttemperatur',
  Abwassertemperatur='$Abwassertemperatur',
  pH_Wert='$pH_Wert',
  Flotation='$Flotation',
  Zulauf='$Zulauf
  WHERE Tag = $Tag";

//MySQL-Anweisung ausführen
    mysqli_query($con, $update);

    echo "Datensatz bearbeitet.<br>";
    echo "<a href='zulauf.php'>zurück zur Übersicht</a>";
}

//Wenn der Nutzer in buecher.php keine Auswahl getroffen hat:
if(!isset($_POST["auswahl"]) && !isset($_POST["bearbeitungAbschicken"])){
    echo "Es wurde kein Datensatz ausgewählt.<br>";
    echo "<a href='zulauf.php'>zurück zur Übersicht</a>";
}

?>
 
Die Meldung kommt ja nur, wenn weder auswahl noch bearbeitungAbschicken gesetzt ist, das sollte ja nur vorkommen wenn die Datei direkt aufgerufen wird ohne vorher über die andere Seite zu kommen.

Lass dir bitte mal ein var_dump von $_POST ausgeben.
 
Die Meldung kommt ja nur, wenn weder auswahl noch bearbeitungAbschicken gesetzt ist, das sollte ja nur vorkommen wenn die Datei direkt aufgerufen wird ohne vorher über die andere Seite zu kommen.

Lass dir bitte mal ein var_dump von $_POST ausgeben.

Okay habe jetzt nicht alles verstanden :D da ich mit PhP noch nicht ganz so vertraut bin. Könntest du mir einmal erklären was ich machen müsste. Und ich habe auf der einen seite einen Button implementiert <button id="button2_bearbeiten" onclick="location.reload();location.href='bearbeiten.php'" >Ausgewählten Datensatz bearbeiten</button> und damit möchte ich wenn ich den drücke zum bearbeiten formular weitergeleitet werden.
 
Ja gut hier sehe ich das Problem du hast bei dem Button den on-Click Handler gesetzt bei dem die Seite neugeladen wird und weitergeleitet wird.

Der reload ist zu 100% Sinnfrei an dieser Stelle und wenn du dem Button sagst er soll einfach nur die bearbeiten.php aufrufen, dann werden keine Daten weiter mit übermittelt, wie z.B. die Auswahl deiner Radios.

Im Prinzip brauchst du hier nicht einmal Javascript du musst nur ein Formular um die Tabelle mit der Auswahl machen und innerhalb des Formulars musst du den button mit dem type='submit' (wenn du den type weglässt nutzt html den Typ automatisch) oder du nutzt ein input mit dem type='submit'.

Deine erste Datei müsste so oder in dieser Richtung aussehen:
BTW: nicht wundern in bin ein Freund von inputs, deshalb nutze ich diesen für das absenden man kann aber wie gesagt auch ein button Element nutzen.
HTML:
<form method='post' action='bearbeiten.php'>
   // Code für die Tabelle mit der Auswahl
  <input type='submit' value='Ausgewählten Datensatz bearbeiten' name='button2_bearbeiten' />
</form>

Es wäre vielleicht günstig, wenn du dir mal ein paar Tutorials für PHP anschaust, auch mit Blick in Richtung der von mir angesprochenen Sicherheitsprobleme. Ich weiß ja nicht wie weit du dich mit HTML auskennst, aber scheinbar wäre ein Tutorial in der Richtung auch hilfreich.
 
Danke konnte nun was auswählen und habe dann das Formular bekommen. Nur leider wählt er immer den ersten Datensatz aus auch wenn ich den zweiten Datensatz wähle kannst du mir erklären warum ? Und jaa ich werde bezüglich der Sicherheit noch einmal gucken
 
PHP:
<!DOCTYPE html>
<html>
    <head>
        <title>Betriebstagebuch</title>
        <link rel="stylesheet" type="text/css" href="style.css">
        <script type='text/javascript' src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="SlideButton.js"></script>
    </head>
    <body>
        <!--- Sidebar / Sidenav ------------------------------------------>
        <nav class="sidenav" id="sidebar">
            <a href="#" id="hidebtn" onclick="hide()"> &laquo;</a>
                <ul>
                    <li><b><a href="zulauf.php">Zulauf</a></b></li>
                    <li><b><a href="#abb">ABB</a></b></li>
                    <li><b><a href="#becken2">Becken 2</a></b></li>
                    <li><b><a href="#becken3">Becken 3</a></b></li>
                    <li><b><a href="#teich">Teich</a></b></li>
                </ul>
        </nav>
            <a href="#" id="showbtn" onclick="show()"> &raquo;</a>
        <!---------------------------------------------------------------->
                <?php require_once("index.php");    ?>
        <!--- Button ---------------------------------------------------->
            <button id="button1_anlegen" onclick="location.reload();location.href='eintrag.php'" >Neuen Datensatz anlegen</button>

        <!---------------------------------------------------------------->
        <!--- Tabelle ---------------------------------------------------->
        <form method='post' action='bearbeiten.php'>
                <table>
                    <tr>
                        <th>Tag</th>
                        <th>Wochentag</th>
                        <th>Uhrzeit</th>
                        <th>Wert</th>
                        <th>Lufttemp. in °C</th>
                        <th>Abwassertemp. in °C</th>
                        <th>pH-Wert</th>
                        <th>Flotation</th>
                        <th>Zulauf</th>
                  </tr>

                    <?php
                        while ($dsatz = $result->fetch_assoc()) {
                    ?>
                        <tr>
                          <td><?php echo $dsatz['Tag']; ?></td>
                            <td><?php echo $dsatz['Wochentag']; ?></td>
                            <td><?php echo $dsatz['Uhrzeit']; ?></td>
                            <td><?php echo $dsatz['Wert']; ?></td>
                            <td><?php echo $dsatz['Lufttemperatur']; ?></td>
                            <td><?php echo $dsatz['Abwassertemperatur']; ?></td>
                            <td><?php echo $dsatz['pH_Wert']; ?></td>
                            <td><?php echo $dsatz['Flotation']; ?></td>
                            <td><?php echo $dsatz['Zulauf']; ?></td>
                            <td><input type='radio' name='auswahl' value='<?= $dsatz['Tag']; ?>'></td>
                        </tr>
                    <?php
                    }
                    ?>
                </table>
                <button id="button2_bearbeiten" type='submit' value='Ausgewählten Datensatz bearbeiten' name='button2_bearbeiten' />Auswahl bearbeiten</button>
            </form>
        <!------------------------------------------------------------------>
    </body>
</html
 
Kannst du mir mal dein aktuellen Quellcode der ersten Seite posten?
Wenn es insgesamt zuviel sein sollte, dann zumindest den Teil des Formulars.

irgendwie kommt nun dieser Fehler Warning: mysqli_query(): Couldn't fetch mysqli in C:\xampp\htdocs\Webseite\bearbeiten.php on line 72 .... Diese Fehler verstehe ich nie so ganz auch wenn ich danach google ab und zu schaffe ich die zu lösen aber dann nur durch testen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück