Formulareintrag mit Datenbank vergleichen, bei Änderung Update

JackRabbit156

Grünschnabel
Hallo zusammen,

ich will einen Eintrag aus einer Datenbank auslesen und dann in einer Textbox in einem Formular ausgeben.
Wenn der User eine Änderung gemacht hat und das Formular abschickt, soll diese in die Datenbank geschrieben werden und unter vorgaenge gesichert werden, wo eine Änderung gemacht wurde.
Leider funktioniert mein Vergleich nicht richtig, da auch ohne Änderung ein Datenbankeintrag gemacht wird. Einfach nur Formular laden und wieder abschicken.
PHP:
<?php
...
if ($_GET['id']){
    $id = $_GET['id'];
    $result = mysql_query("SELECT * FROM dvds WHERE id=".$id."");
...
    for($x=0; $x < mysql_affected_rows(); $x++){
      $beschreibung = mysql_result($result, $x, 'beschreibung');
    };
}
elseif ($_POST){
...
        $result = mysql_query("SELECT * FROM dvds WHERE id = ".$_POST["aktid"]);
...
        $aenderung = "";
        if (mysql_result($result, 0, 'beschreibung') != $_POST["Beschreibung"]) {
            $aenderung .= "Beschreibung";  
        }
...
        if ($aenderung != "") {
            $result = mysql_query("UPDATE `dvds` SET `beschreibung` = '".$_POST["Beschreibung"]."' WHERE `id` = ".$_POST["aktid"]." LIMIT 1 ;");
...
            $result2 = mysql_query("INSERT INTO `vorgaenge` ( `ID` , `ID_Film` , `art`, `von`, `Aenderung`) VALUES ('', '".$_POST["aktid"]."', '3', '".time()."', '".$aenderung."');");
...
        }
...
        header("Location: ".$config['url'].$config['dir']."/change.php?id=".$_POST["id"]);
...
?>
...
<td align="left" valign="top"><textarea name="Beschreibung" rows="25" cols="120"><? echo $beschreibung ?></textarea></td>
...
Ich hab den Code stark gekürzt, da dazwischen viele Codezeilen sind, die nichts mit dem Problem zu tun haben.

Kann mir jemand sagen, ob ich da irgendwo einen Denkfehler begangen hab?
Ich hab mir schon überlegt, ob ich anstatt einem if-Vergleich eine Datanbankabfrage einbaue, im Sinne von:
PHP:
"SELECT * FROM dvds WHERE`beschreibung` = '".$_POST["Beschreibung"]
und dann überprüfe, ob es Ergebnisse gab, aber ich weiß nicht, ob mir das wirklich weiterhilft. Vor allem, da ich für jedes Formularfeld wieder eine Datenbankabfrage mehr bräuchte...

edit:
Könnte das ganze am Zeichensatz liegen?
Die Ausgabe-Datei verwendet den charset ISO-8859-1, in der Datenbank ist die Kollation latin1_german2_ci
 
Zuletzt bearbeitet:
Lass dir doch mal die Inhalte von mysql_result($result, 0, 'beschreibung') und $_POST["Beschreibung"] ausgeben und schau ob du da einen Unterschied siehst.

Könnte eventuell an vorhandenen Zeilenumbrüchen liegen die in die Textarea eingegeben wurden.
 
Hallo tombe,

danke.
Hab beide mitnl2br und htmlspecialchars ausgeben lassen.
Bei der $_POST waren die Hochkommas mit Backslashes maskiert.
Bei der direkten Datenbankauslese (auch über phpMyAdmin) nicht.

Hätte ich auch selber drauf kommen können, das mal unter die Lupe zu nehmen, ich hab den Fehler immer im Code gesucht.

So funktionierts jetzt:
PHP:
if (mysql_result($result, 0, 'beschreibung') != stripslashes($_POST["Beschreibung"]))

Jetzt frag ich mich bloß wo die herkommen, da ich kein addslashes verwendet hab, und, wie man oben im Code sieht, das POST direkt in die Datenbank schreibe.
 
Jetzt frag ich mich bloß wo die herkommen, da ich kein addslashes verwendet hab, und, wie man oben im Code sieht, das POST direkt in die Datenbank schreibe.

Ich würde mal auf magic_quotes_gpc tippen.
Bin mir aber nicht ganz sicher ob es das schon gewesen ist.

Desweiteren ist mir aufgefallen das man ganz leicht eine SQL-Injection bei dir starten kann.
PHP:
<?php
...
if ($_GET['id']){
    $id = $_GET['id'];
    $result = mysql_query("SELECT * FROM dvds WHERE id=".$id."");
 
Zuletzt bearbeitet:
Ich würde mal auf magic_quotes_gpc tippen.
Bin mir aber nicht ganz sicher ob es das schon gewesen ist.
Auszug aus meiner php.ini:
Code:
PHP Version 5.2.17
Directive           Local Value	     Master Value
magic_quotes_gpc	     On	             On
scheint so zu sein, danke für den Hinweis.


Desweiteren ist mir aufgefallen das man ganz leicht eine SQL-Injection bei dir starten kann.
Das ist mir klar, aber kein Problem, da nur ich selber die Seite aufrufe und sie nicht öffentlich genutzt wird. Deswegen hab ich mich nicht darum gekümmert, dass die Eingaben maskiert werden.
 
Zurück