Datensatz bearbeiten & speichern
inspiron
- php
Hallo ich brauche eure Hilfe,
ich möchte einen vorhandenen Datensatz bearbeiten & speichern. Leider komme ich damit nicht klar.
Durch anklicken einer ID wird ein kompletter Datensatz aufgelistet. Soweit gehts.
In diesem Datensatz befinden sich noch einige leere Felder und sollen nun gefüllt werden.
Wie kann ich den "Update" Teil hier einfügen?
<?
//******************************************************************************
// View
//******************************************************************************
// Datenbankzugriff
include("admin/includes/config.php");
//Error-Reporting hoch, alle Fehlermeldungen werden angezeigt
error_reporting(E_ALL);ini_set('display_errors', 1);
$query = "SELECT * FROM bericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);
$result = mysql_query($query);
echo mysql_error();
$daten = mysql_fetch_array($result);
?>
<BODY onLoad="CheckStations()">
<div>
<d>Datensatz Nr.: <?=$daten['ID']?></d><p>
</div>
<div class='my_fieldset30_links'>
<h2>Datum</h2>
<input type="text" value="<?=$daten['DATUM']?>" readonly>
</div>
<div class='my_fieldset30_mitte'>
<h2>Uhrzeit</h2>
<input type="text" value="<?=$daten['UHRZEIT']?>" readonly>
</div>
<div class='my_fieldset30_rechts'>
<h2>Dauer in Min</h2>
<input type="text" value="<?=$daten['DAUER']?>" readonly>
</div>
<div class='my_fieldset30_links'>
<h2>Fehlerzuständigkeit</h2>
<input type="text" id="FEHLERZUSTAENDIGKEIT" value="<?=$daten['FEHLERZUSTAENDIGKEIT']?>">
</div>
<div class='my_fieldset30_mitte'>
<h2>Kategorie</h2>
<input type="text" id="KATEGORIE" value="<?=$daten['KATEGORIE']?>">
</div>
<div class='my_fieldset30_rechts'>
<h2>Fehlerpunkte</h2>
<input type="text" id="FEHLERPUNKTE" value="<?=$daten['FEHLERPUNKTE']?>">
</div>
<!--/-->
</div>
<!-- /INHALT -->
<!-- INHALT Links -->
<div id="colTwo">
<!---->
<div class="knopf">
<p><input class="submit" type="submit" name="eintragen" id="eintragen" value="Speichern"/></p>
</div>
<!--/-->
</div>
<div style="clear: both;"> </div>
</div>
<!-- /INHALT Links -->
</div>
</body>
</html>
<?php
//******************************************************************************
// Update
//******************************************************************************
// Datenbankzugriff
include("admin/includes/config.php");
if (isset($_POST['eintragen']))
{
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
$sql = "UPDATE `bericht` SET ID = ".$_POST["ID"].", FEHLERZUSTAENDIGKEIT = ".$_POST["FEHLERZUSTAENDIGKEIT"].", KATEGORIE = ".$_POST["KATEGORIE"].", FEHLERPUNKTE = ".$_POST["FEHLERPUNKTE"]." WHERE `ID`='".$_POST["ID"]."'";
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo "Der Datensatz wurde hinzugefügt!";
}
else
{
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
}
}
?>
Hi!
ich möchte einen vorhandenen Datensatz bearbeiten & speichern. Leider komme ich damit nicht klar.
Mit Hilfe der Affenformular-Technik lässt sich das effizient lösen. Du musst bedenken, dass du mehrere Requests an den Server hast, die du gezielt und teilweise anders bearbeiten musst. Da gibt es einen GET-Request: "zeig mir den Datensatz xy". Das Ergebnis ist ein Formular mit den Werten aus dem DBMS. Dieses Formular wird abgesendet und erzeugt einen POST-Request. Daran hast du vielleicht was auszusetzen, weil irgendwelche Werte nicht stimmen. In dem Fall ist die Antwort das Formular mit den vom Benutzer eingegebenen Werten. Das wiederholt sich, bis alles richtig ist, denn dann kannst du UPDATEen und wenn das fehlerfrei ablief am besten einen HTTP-Redirect senden, damit der Client per GET eine Ressource anfordert und so verhindert wird, dass beim Aktualisieren der Seite noch einmal das Formular abgesendet wird.
Und wenn dud das Ganze noch nach dem EVA-Prinzip aufbaust, also Eingabe, Verarbeitung und Ausgabe trennst, dann musst du auch das Formular nicht zweimal notieren.
Hier noch ein paar allgemeine Bemerkungen:
$query = "SELECT * FROM bericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);
Du hast hier eine Sicherheitslücke trotz mysql_real_escape_string(), weil du es falsch anwendest.
$result = mysql_query($query);
echo mysql_error();
$daten = mysql_fetch_array($result);
Ein Fehler ist nur dann aufgetreten, wenn dir das über den Rückgabewert von mysql_query() bekanntgegeben wurde. Werte diesen aus und reagiere entsprechend als einfach fortzufahren.
<input type="text" value="<?=$daten['DATUM']?>" readonly>
Input-Elemente können zwar auch einfach so im HTML-Text stehen, aber ohne ein Form-Element wirst du kein Formular absenden können. Und das war ja dein Ziel und nicht einfach nur die readonly-Anzeige.
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}
Wenn die Verbindung nicht funktioniert hat, darf auch der ganze Rest nicht ausgeführt werden, nicht nur nicht das Auswählen der Datenbank.
$sql = "UPDATE
bericht
SET ID = ".$_POST["ID"].", FEHLERZUSTAENDIGKEIT = ".$_POST["FEHLERZUSTAENDIGKEIT"].", KATEGORIE = ".$_POST["KATEGORIE"].", FEHLERPUNKTE = ".$_POST["FEHLERPUNKTE"]." WHEREID
='".$_POST["ID"]."'";
Wo ist hier deine kontextgerechte Behandlung der Werte und Absicherung gegen SQL-Injection?
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
Ob das Statement fehlerfrei bearbeitet werden konnte, sagt dir der Rückgabewert von mysql_query(). Den solltest du nie unausgewertet lassen. Wenn du anschließend noch wissen willst, ob ein Datensatz betroffen war, dann kannst du immer noch mysql_affected_rows() befragen.
echo "Der Datensatz wurde hinzugefügt!";
Wieso "hinzugefügt"? Du machst doch ein UPDATE, kein INSERT.
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
Die Aussage ist zwar richtig, weil du ja ein UPDATE und kein INSERT machst, aber eigentlich ist sie auch wieder falsch, denn du prüfst nur ob _ein_ Datensatz betroffen ist. Wenn zwei oder mehr betroffen wären, tätest du auch so, als ob keiner bearbeitet wurde (abgesehen davon, dass das bei einem Unique-Index auf die Update-Bedingung nicht der Fall sein kann).
Lo!
Hi!
ich möchte einen vorhandenen Datensatz bearbeiten & speichern. Leider komme ich damit nicht klar.
<input type="text" value="<?=$daten['DATUM']?>" readonly>
Input-Elemente können zwar auch einfach so im HTML-Text stehen, aber ohne ein Form-Element wirst du kein Formular absenden können. Und das war ja dein Ziel und nicht einfach nur die readonly-Anzeige.
....die readonly-Anzeige ist nur zum lesen, diese sollen ja auch nicht verändert und neu gespeichert werden!
Das ganze ist ein Hausinterner Fehlerbericht in dem am Tage Fehler eingetragen werden, was ja soweit läuft.
Folgende Funktion soll neu eingefügt werden:
Ein Service-MA soll am nächsten Tag den Datensatz auswerten (lesen) und diesen um "FEHLERZUSTAENDIGKEIT", "KATEGORIE", "FEHLERPUNKTE" ergänzen.
Muß ich das Formular jetzt komplett neu machen?
Gruß
Hi!
Muß ich das Formular jetzt komplett neu machen?
Du musst es auf alle Fälle so gestalten, dass am Ende die Funktionalität rauskommt, die du haben willst. Und wenn bei deinen Gedanken, die du dir um das Wechselspiel Browser, Request, Server, Response machst, rauskommt, dass das derzeitige Script nicht geeignet ist, dann musst du es wohl umschreiben.
Lo!