Probleme mit Datenänderung per Formular in meiner mySql Datenbank

Trucker-Joe

Grünschnabel
Hallo zusammen,

Ich habe folgendes Problem:

Ich möchte gerne bestehende Daten per Formular in meiner Datenbank ändern.
In meinem Code scheint irgendwo noch der Wurm drin zu stecken.
Das Formular wird gefüllt und ich kann auch die Einträge ändern. Wenn ich aber auf Übernehmen klicke wird nichts in die DB geschrieben und die Seite bleibt leer.
Das in dem Code noch diverse Sicherheitslücken sind, weiß ich aber ich möchte erst mal eine Funktion haben.

Da ich blutiger Anfänger bin weiß ich echt nicht mehr weiter. Mir raucht der Kopf^^

Hier mein Code:
PHP:
<html>
<head>
<title>Update Formular</title>
</head>
<body>
<body text="#000000" bgcolor="#C0C0C0" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<form action="update.php" method="post">

<?php
$verbindung = mysql_connect("localhost", "***", "***")
or die ("Falscher Benutzer, Passwort oder Server!");
mysql_select_db("usr_web3_1")
or die ("Verbindung zur Datenbank war nicht m&ouml;glich!");

if(isset($_POST["submitted"])) {
    $_sql = "UPDATE fahrzeuge";
    $_sql .= " SET standort='".$_POST["standort"]."'";
    $_sql .= " SET telefon='".$_POST["telefon"]."'";
    $_sql .= " SET tour='".$_POST["tour"]."'";
    $_sql .= " SET marke='".$_POST["marke"]."'";
    $_sql .= " SET gattung='".$_POST["gattung"]."'";
    $_sql .= " SET firma='".$_POST["firma"]."'";
    $_sql .= " SET fahrer='".$_POST["fahrer"]."'";
    $_sql .= " SET kennzeichen='".$_POST["kennzeichen"]."'";
    mysql_query($_sql, $verbindung);
} else {
    $ergebnis = mysql_query( "SELECT * FROM fahrzeuge ORDER BY kennzeichen ASC" );

    while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {
      $kennzeichen = $datensatz["kennzeichen"];
      $standort = $datensatz["standort"];
      $telefon = $datensatz["telefon"];
      $tour = $datensatz["tour"];
      $marke = $datensatz["marke"];
      $gattung = $datensatz["gattung"];
      $firma = $datensatz["firma"];
      $fahrer = $datensatz["fahrer"];
?>
<table>
 <tr>
  <td valign="top"><input type="text" name="kennzeichen" size="20" value="<?php echo $kennzeichen; ?>"></td>
  <td valign="top"><input type="text" name="standort" size="20" value="<?php echo $standort; ?>"></td>
  <td valign="top"><input type="text" name="telefon" size="20" value="<?php echo $telefon; ?>"></td>
  <td valign="top"><input type="text" name="tour" size="20" value="<?php echo $tour; ?>"></td>
  <td valign="top"><input type="text" name="marke" size="20" value="<?php echo $marke; ?>"></td>
  <td valign="top"><input type="text" name="gattung" size="20" value="<?php echo $gattung; ?>"></td>
  <td valign="top"><input type="text" name="firma" size="20" value="<?php echo $firma; ?>"></td>
  <td valign="top"><input type="text" name="fahrer" size="20" value="<?php echo $fahrer; ?>"></td>
  <td><p></td>
 </tr>
</table>

<?php
    }
mysql_close($verbindung);
?>
<input type="submit" name="submitted" value="&Uuml;bernehmen">
</form>
<?php
}
?>
</body>
</html>

Gruss Markus
 
Code:
UPDATE `tabelle` SET `feld1` = 'wert', `feld2` = 'wert2'
1mal SET, Felder mit Kommas trennen.
Und evtl. noch eine WHERE Bedingung?! Sonst wird JEDER Datensatz verändert!

MfG
 
Ich hab ein meiner Datenbank keine eindeutige ID sondern die Spalte "Kennzeichen" ist als Unique" gekennzeichnet.
kann ich jetzt im Code das so ändern?

PHP:
if(isset($_POST["submitted"])) {
    $_sql = "UPDATE fahrzeuge" SET `standort` = 'standort', `telefon` = 'telefon', `tour` = 'tour', `marke` = 'marke', `gattung` = 'gattung', `firma` = 'firma', `fahrer` = 'fahrer', where kennzeichen='".$_post["kennzeichen"]."'";
mysql_query($_sql, $verbindung);

} 
else 
{
    $ergebnis = mysql_query( "SELECT * FROM fahrzeuge ORDER BY kennzeichen ASC" );

    while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {
      $kennzeichen = $datensatz["kennzeichen"];
      $standort = $datensatz["standort"];
      $telefon = $datensatz["telefon"];
      $tour = $datensatz["tour"];
      $marke = $datensatz["marke"];
      $gattung = $datensatz["gattung"];
      $firma = $datensatz["firma"];
      $fahrer = $datensatz["fahrer"];
?>

Sollte es so aussehen?
 
Der ELSE-Block wird nur dann ausgeführt wenn das Formular/die Seite nicht gesendet wurde, also beim ersten Aufruf.

Wurde das Formular aber gesendet wird auch nur der Code ausgeführt der im IF-Block steht. Somit werden dann zwar die Daten neu gespeichert, dafür dann aber nichts mehr angezeigt!
 
Da hat sich ein Anführungszeichen eingeschlichen, das da nicht sein darf:
PHP:
 $_sql = "UPDATE fahrzeuge" SET
 
PHP:
$_sql = "UPDATE `fahrzeuge` SET `standort` = {$_POST['standort']}, `telefon` = {$_POST['telefon']}, `tour` = {$_POST['tour']}, `marke` = {$_POST['marke']}, `gattung` = {$_POST['gattung']}, `firma` = {$_POST['firma']}, `fahrer` = {$_POST['fahrer']} WHERE kennzeichen = {$_POST['kennzeichen']}"; 
mysql_query($_sql, $verbindung);
 
Ich bin immer noch net weiter.
Ich bekomme ein Formular was auch ausgefüllt ist, kann auch was ändern aber es wird nicht gespeichert.

Der Code sieht nun so aus:

PHP:
<html>
<head>
<title>Update Formular</title>
</head>
<body>
<body text="#000000" bgcolor="#C0C0C0" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<form action="update.php" method="post">

<?php
$verbindung = mysql_connect("localhost", "web3", "100156074")
or die ("Falscher Benutzer, Passwort oder Server!");
mysql_select_db("usr_web3_1")
or die ("Verbindung zur Datenbank war nicht m&ouml;glich!");

if(isset($_POST["submitted"])) {
    $_sql = "UPDATE `fahrzeuge` SET `standort` = {$_POST['standort']}, `telefon` = {$_POST['telefon']}, `tour` = {$_POST['tour']}, `marke` = {$_POST['marke']}, `gattung` = {$_POST['gattung']}, `firma` = {$_POST['firma']}, `fahrer` = {$_POST['fahrer']} WHERE kennzeichen = {$_POST['kennzeichen']}";
mysql_query($_sql, $verbindung);
} else {
    $ergebnis = mysql_query( "SELECT * FROM fahrzeuge ORDER BY kennzeichen ASC" );

    while ( $datensatz = mysql_fetch_array( $ergebnis ) ) {
      $kennzeichen = $datensatz["kennzeichen"];
      $standort = $datensatz["standort"];
      $telefon = $datensatz["telefon"];
      $tour = $datensatz["tour"];
      $marke = $datensatz["marke"];
      $gattung = $datensatz["gattung"];
      $firma = $datensatz["firma"];
      $fahrer = $datensatz["fahrer"];
?>
<table>
 <tr>
  <td valign="top"><input type="text" name="kennzeichen" size="20" value="<?php echo $kennzeichen; ?>"></td>
  <td valign="top"><input type="text" name="standort" size="20" value="<?php echo $standort; ?>"></td>
  <td valign="top"><input type="text" name="telefon" size="20" value="<?php echo $telefon; ?>"></td>
  <td valign="top"><input type="text" name="tour" size="20" value="<?php echo $tour; ?>"></td>
  <td valign="top"><input type="text" name="marke" size="20" value="<?php echo $marke; ?>"></td>
  <td valign="top"><input type="text" name="gattung" size="20" value="<?php echo $gattung; ?>"></td>
  <td valign="top"><input type="text" name="firma" size="20" value="<?php echo $firma; ?>"></td>
  <td valign="top"><input type="text" name="fahrer" size="20" value="<?php echo $fahrer; ?>"></td>
  <td><p></td>
 </tr>
</table>

<?php
    }
mysql_close($verbindung);
?>
<input type="submit" name="submitted" value="&Uuml;bernehmen">
</form>
<?php
}
?>
</body>
</html>

könnte es sein das es vielleicht daran liegt?

PHP:
mysql_query($_sql, $verbindung);

vorher stand das was wie :
PHP:
mysql_query($_sql, $link2);

Da ich aber nicht über eine externe config connecte, hatte ich das geändert, oder war das falsch?
 
Wenn du über solche und ähnliche Fehler informiert werden möchtest solltest du das error-reporting einschalten.

PHP:
<?php
$verbindung = mysql_connect("localhost", "web3", "100156074")
or die ("Falscher Benutzer, Passwort oder Server!");

zu

PHP:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

$verbindung = mysql_connect("localhost", "web3", "100156074")
or die ("Falscher Benutzer, Passwort oder Server!");

Das sollte sowohl Syntaxfehler (FATAL ERROR, deswegen weiße Seite) wie auch nicht definierte Variablen/ungültige Funktionsaufrufe etc. melden. Ersteres kann manchmal auch trotz eingeschaltetem Reporting in einer weißen Seite münden, das wär dann aber ne Servereinstellung und müsste als Fehlermeldung in irgendeiner Logdatei resultieren.

Sobald du keine derartigen Fehlermeldungen mehr erhälst, kannst du dich an die Logik deines Scriptes machen.

Deine Vermutung
könnte es sein das es vielleicht daran liegt?

PHP:
mysql_query($_sql, $verbindung);

vorher stand das was wie :
PHP:
mysql_query($_sql, $link2);

Da ich aber nicht über eine externe config connecte, hatte ich das geändert, oder war das falsch?

trifft im Übrigen nicht zu. Du hast deine Verbindungsressource ja in der Variable $verbindung gespeichert.

PHP:
$verbindung = mysql_connect("localhost", "web3", "100156074")
$link2 hast du ja nirgendwo definiert. Das sollte also soweit hinhauen.

Um die Logik zu prüfen musst du etwas Debugging betreiben. Geh also mal deine Bedingungen durch; die erste ist die Frage, ob es $_POST['submitted'] gibt. Das könntest du ganz billig mit einem echo irgendwas prüfen:

PHP:
if(isset($_POST["submitted"])) {

zu

PHP:
if(isset($_POST["submitted"])) { 
  echo "Postdaten vorhanden.";

Wenn du das Formular jetzt absendest und diese Meldung NICHT erhälst, kannst du hier das erste Baustellenschild aufstellen. Ich mach aber einfach mal weiter:

Als nächstes solltest du prüfen, ob dein SQL-Query wirklich sauber ist. Grundlegendes dazu hier. Grundsätzlich kann ich dir schonmal sagen, dass du Strings - die in MySQL Datentypen wie char, varchar & text entsprechen - immer in Single Quotes setzen musst.

PHP:
 $_sql = "UPDATE `fahrzeuge` SET `standort` = {$_POST['standort']} --usw";

würde also, als Beispiel, wenn ich bei Standort Berlin eingab, folgendes bedeuten:

SQL:
UPDATE `fahrzeuge` SET `standort` = Berlin

Das ergibt zwangläufig einen SQL-Fehler (wie du dir die Fehler eines Queries ausgeben kannst steht in dem oben verlinkten Artikel). In echt rauskommen sollte
SQL:
UPDATE `fahrzeuge` SET `standort` = 'Berlin'

Also musst du alle Werte, die du Stringfeldern zuweisen willst, mit Singlequotes übergeben:

PHP:
 $_sql = "UPDATE `fahrzeuge` SET `standort` = '{$_POST['standort']}' --usw";

(die Geschichte mit den geschweiften Klammern ist mir zwar geläufig, aber da ich damit so gut wie nie arbeite schließ ich nicht aus, dass hier vielleicht irgendeine Eigenheit greift und am Ende nicht das herauskommt, was ich eigentlich angedacht hatte - im Ernstfall immer ein echo $_sql; setzen, um das komplette Query zu lesen.)

Schlussendlich wäre dann wieder die logische Prüfung nach Absenden des Queries nötig.

Ändere
PHP:
mysql_query($_sql, $verbindung);
zu
PHP:
mysql_query($_sql) or die(mysql_error());
echo mysql_affected_rows(). " betroffene Datensätze";

Wenn du dann sowas wie "0 betroffene Datensätze" erhälst, wurde dein Query zwar korrekt ausgeführt, aber es gab keine Datensätze, auf die deine WHERE-Bedingung zutraf.


Soviel erstmal dazu, ich geh pennen.
 
Zuletzt bearbeitet von einem Moderator:
item: Da die diese Art von Fragen sehr oft kommt, habe ich mal ein Tutorial geschrieben wie man am besten auf Fehlersuche geht.
PHP MySQL Debug Queries
Geh es doch mal durch und falls du die Lösung nicht findest, poste mal das ausgegebe SQL-Statement ins Forum.

item: Wenn du das ganze noch lesbar im PHP habe willst, dann empfehle ich die folgenden 2 Punkte
a) den SQL-Teil in PHP formatieren: Heredoc-Syntax
b) Die Complex (Curly) Syntax anwenden um die Strings zusammenzusetzen. Das reduziert das Chaos mit öffnenden und schliessenden Anführungszeichen und den Verbindungs-Punkten

item: Mit dem Formatieren siehst du sofort dass du ein " zuviel hast. Ebenso ein Komma zuviel am Schluss der Set-Auflistung

item: Du solltest unbedingt die Strings aus $_POST[] mittels mysql_escape_string() parsen um SQL-Injections zu verhindern. Ansonsten öffnest du Hackern Tür und Tor.

item: So sieht das ganze am Schluss etwa aus (ungetestet). So ist doch das SQL auch lesbar, oder nicht?
PHP:
//Alle Strings zur Sicherheit mit mysql_escape_string() parsen 
$sqlValues = array_map('mysql_escape_string', $_POST);
//SQL Zusammensetzen
$sql = <<<SQL
UPDATE fahrzeuge
SET 
    `standort`  = '{$sqlValues['standort']}', 
    `telefon`   = '{$sqlValues['telefon']}', 
    `tour`      = '{$sqlValues['tour']}', 
    `marke`     = '{$sqlValues['marke']}', 
    `gattung`   = '{$sqlValues['gattung']}', 
    `firma`     = '{$sqlValues['firma']}', 
    `fahrer`    = '{$sqlValues['fahrer']}'
WHERE 
    kennzeichen = '{$sqlValues['kennzeichen']}'
SQL;
//Update ausführen
mysql_query($sql);
 
Zurück