• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ändern von DB-Einträgen

chr_sch

Neues Mitglied
Hi,

ich versuche auf einer PHP-Seite die Möglichkeit zu implementieren, Datenbankeinträge zu ändern.
Ich habe die beiden MySQL-Tabellen:

Code:
CREATE TABLE autor (
id                    INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)     NOT NULL,
fk_bild                INTEGER        REFERENCES images(id)
);

CREATE TABLE IF NOT EXISTS images( 
    id     INTEGER     PRIMARY KEY AUTO_INCREMENT,
    name     VARCHAR(100)     NOT NULL, 
     type     VARCHAR(100)     NOT NULL,    
    image    LONGBLOB     NOT NULL
);

Dabei ist jedem Autor genau ein Bild zugeordnet.
Nun will es ermöglich, den Namen eines Autoren und zusätzlich sein Bild zu ändern.
Das entsprechende Formular:

PHP:
<form action="aendern_autor.php?autor_id=<? echo "$autor_id";?>" method="post" enctype="multipart/form-data" name="upload">
            <input type="hidden" name="MAX_FILE_SIZE" value="50000">
            Name:</br>
            <input type="text" name="name" value="">
            </br></br>
            Bild: </br> 
            <input type="file" size="30" name="datei" >
            </br></br>
            <input type="submit" name="submit" value="hinzu">
    </form>

Nun soll man getrennt den Namen und das Bild eingeben können. Das heißt, wenn ich nur den Namen eintrage, wird auch nur der Name eingetragen und wenn ich nur eine Bilddatei auswähle, soll auch nur das Bild geändert werden. Das mit dem Namen klappt auch wunderbar. Jedoch habe ich Schwierigkeiten beim Bild.

Hier mein Code der aendern_autor.php:
PHP:
<!DOCTYPE html>  
<html>

<head>
    <meta    charset = "UTF-8">
    <link type="text/css" rel="stylesheet" href="style.css" />
    <title>Autor eintragen</title>
</head>

<body>

    <div id= "header">
        <h2>WebForum</h2>
    </div>
    <div id="standard">
            <br>
        <? include 'db_anmelde.php';
        
        $autor_id = $_REQUEST['autor_id'];
        
        
        $name = $_FILES['datei']['name'];
        $size = $_FILES['datei']['size'];
        $mime = $_FILES['datei']['type'];
        $file_name = $_FILES['datei']['tmp_name'];
        
        if ($name !=''){
            $sql = "INSERT INTO images (name, type, image ) VALUES(?,?,?);";
            
            $file = fopen($_FILES['datei']['tmp_name'], "rb" );
            $q = $dbh->prepare($sql);
            if( $q ) {
                $q->bindParam(1, $name);
                $q->bindParam(2, $mime);
                $q->bindParam(3, $file, PDO::PARAM_LOB);
                $q->execute();
            }
        }
        if ( $_POST[name] != ''){
            $sql= "UPDATE autor SET name = '$_POST[name]' WHERE id = '$autor_id';";
            $autor_neu = $dbh->exec($sql);
        }
        
        if(is_uploaded_file($_FILES['datei']['tmp_name'])){

        
            $stmt = $dbh->query('SELECT MAX(id) FROM images;');
                if($stmt) {
                    while( $row = $stmt->fetch(PDO::FETCH_OBJ)) {
                        $last_id = $row->MAX(id);
                        echo $last_id;
                    }
                }
     
            $stmt = $dbh->query("DELETE FROM images WHERE id = '$autor_id';");
            $stmt = $dbh->query("UPDATE images SET id = '$autor_id' WHERE id = '$last_id';");
            
        }
        
        
        ?>
        <br><br><br>
        <a href="index.php">Startseite</a><br>
    </div>
</body>

</html>

Dabei wird erst ein neuer Datenbanksatz eingefügt und anschließend geprüft welcher Eintrag der letzte ist (mit MAX(id)). Diese Abfrage scheint irgendwie nicht ganz hinzuhauen. Die letzte ID wird dann in der Variablen $last_id gespeichert.
Anschließend wird erst die "zu ändernde" Zeile gelöscht und die letzte kriegt die ID der "zu ändernden" Zeile.
Ist ein bißchen kompliziert, sollte aber hinhauen von der Logik. Jedoch hapert es daran, dass ich die $last_id nicht richtig ausgelesen kriege.

Wer kennt die richtige Methode???

Gruss
 
Den unteren Teil des Scripts brauchst Du doch gar nicht. Du kannst die ID des Autors bereits im INSERT-Statement einfügen.
 
Hab es ausprobiert. Geht nicht. Wenn ich:

Code:
[COLOR=#000000][COLOR=#006600] [/COLOR][COLOR=#0000CC]$sql [/COLOR][COLOR=#006600]= [/COLOR][COLOR=#CC0000]"INSERT INTO images (name, type, image ) VALUES(?,?,?);"[/COLOR][COLOR=#006600];
[/COLOR][/COLOR]
zu
Code:
    $sql = "INSERT INTO images (id ,name, type, image ) VALUES('$autor_id',?,?,?);";
ändere, dann wird der Code nicht mehr ausgeführt. Vermute, dass das Insert einer ID sich mit dem AUTO_INCREMENT beißt, oder?
 
Wenn Du die Spalte ID als Verknüpfung zu der Autoren-Tabelle ansiehst, dann darf sie nicht auto_increment sein. Und ja, das wäre dann der Fehler.

Zweite mögliche Fehlerquelle: Du hast die Variable direkt in das Statement geschrieben. Alle anderen Variablen werden aber über $q->bindParam(1, $name); etc. gesetzt. Das solltest Du mit der Variable hier vermutlich (!) auch tun.
 
Zurück
Oben