Update Bild in DB

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Update Bild in DB

    Hallo Community,

    ich habe mich nun doch entschieden das Skript (war Bestandteil einer anderen Frage) für meine Zwecke weiter zu entwickeln.

    Ich habe nun Probleme mit dem Update von Bilddateien:

    Hier das aendern.php mit dem Änderungsformular:

    PHP-Code:
    [LEFT]<form action = "../event/aendern.php" method = "post">

    <?php
    $server 
    'localhost';
    $benutzer 'root';
    $passwort '';
    $datenbank 'treffpunkt';

    $verbindung = @mysqli_connect($server$benutzer$passwort);

    if (
    $verbindung){
    mysqli_select_db($verbindung$datenbank);

    if(
    mysqli_error($verbindung)){
    echo 
    'Fehler: ' mysqli_error($verbindung);


    }else{
    $sql "SELECT * from event";
    $abfrage mysqli_query($verbindung$sql);

    //echo $sql;

    echo "<table border='1', width='952 px'>";
    echo 
    "<tr> <td>Auswahl</td> <td>Ort</td>";
    echo 
    "<td>Name</td> <td>Datum</td>";
    echo 
    "<td>Beschreibung</td> <td>Bild</td></tr>"

    while(
    $event mysqli_fetch_assoc($abfrage)){
    $htmlCode '<img src="img_get.php?id=' $event['ID'] . '" width="50" height="50" alt="" />';

    echo 
    "<tr> <td><input type='radio' name='auswahl'";
    echo 
    " value={$event['ID']}></td> <td>" $event['ort'] . "</td> <td>" $event['name'] . "</td>"
    echo 
    "<td>" $event['datum'] . "</td> <td>" $event['beschreibung'] . "</td> <td>$htmlCode</td> </tr>"

    }
    }
    }

    echo 
    "</table>";

    mysqli_close($verbindung);

    ?> 
    <p>
    <input type="submit" value="Datensatz anzeigen" />
    </form>
    </div>
    <div class="erfassen">
    <div class="starttext_event">Event Ã¤ndern:</div>
    <div class="eingabe">
    <div class="script">

    <form action = "../event/best_aendern.php" method = "post" enctype="multipart/form-data"> 
    <?php

    $server 
    'localhost';
    $benutzer 'root';
    $passwort '';
    $datenbank 'treffpunkt';

    $verbindung = @mysqli_connect($server$benutzer$passwort);

    if (
    $verbindung){
    mysqli_select_db($verbindung$datenbank);

    if(
    mysqli_error($verbindung)){
    echo 
    'Fehler: ' mysqli_error($verbindung);


    }else{

    $auswahlintval($_POST['auswahl']);
    $sql "SELECT * FROM event WHERE ID = ".$auswahl

    //echo $sql;

    $auswahl mysqli_query($verbindung$sql);


    while(
    $event mysqli_fetch_assoc($auswahl)){

    $id $event["ID"]; 
    $ort $event["ort"]; 
    $name $event["name"]; 
    $datum $event["datum"]; 
    $beschreibung $event["beschreibung"];
    $bname $event["imgname"]; 

    }

    }

    mysqli_close($verbindung);

    ?> 

    <br>
    <input type="text" name="id" size="24" value="<?php echo $id?>">
    <br>
    <input type="text" name="ort" size="24" value="<?php echo $ort?>">
    <br>
    <input type="text" name="name" size="24" value="<?php echo $name?>">
    <br>
    <input type="text" name="datum" size="24" value="<?php echo $datum?>">
    <br>
    <textarea cols="40" rows="5" name="beschreibung"><?php echo $beschreibung?></textarea>
    <br>
    <input type="text" name="imgname" size="24" value="<?php echo $bname?>">
    <br>
    <input type="file" name="img" size="24" >
    <br>
    <input type="submit" value="ändern" >
    <input type="hidden" name="ID" value="<?php echo $id?>" />[/LEFT]
    </form>
    Hier nochmal eine kleine Zwischenfrage zum alten Thema "[COLOR=#04558c]Bild(name) aus DB[/COLOR]".

    Ist es richtig, dass man in einem "type="file" kein value anzeigen lassen kann? (habe dieses mal irgendwo gelesen.

    Hier das bes_aendern.php

    PHP-Code:
    [LEFT]<?php
    /** 
    * Debugging 
    */ 
    error_reporting(E_ALL); #zeig alle Fehler 
    ini_set('display_errors''1'); #sorgt dafür, dass überhaupt Fehler angezeigt werden 

    $server 'localhost';
    $benutzer 'root';
    $passwort '';
    $datenbank 'treffpunkt';

    $verbindung mysqli_connect($server$benutzer$passwort);

    if (
    $verbindung){
    mysqli_select_db ($verbindung$datenbank);

    if(
    mysqli_error($verbindung)){
    echo 
    'Fehler: Keine Verbindung zur Datenbank' mysqli_error($verbindung);

    }else{

    if (isset(
    $_POST['id'])) {

    if (
    array_key_exists('img',$_FILES)) {


    $tmpname $_FILES['img']['tmp_name'];
    $type $_FILES['img']['type'];
    $bname $_FILES['img']['name'];
    $hndFile fopen($tmpname"r");
    $data addslashes(fread($hndFilefilesize($tmpname)));} 

    $sql "
    UPDATE
    event
    SET
    ort='
    {$_POST['ort']}',
    name='
    {$_POST['name']}',
    datum='
    {$_POST['datum']}',
    beschreibung='
    {$_POST['beschreibung']}',
    imgdata='
    {$_POST['imgdata']}',
    imgtype='
    {$_POST['imgtype']}',
    imgname='
    {$_POST['imgname']}'

    WHERE
    ID='
    {$_POST['id']}
    "
    ;
    mysqli_query($verbindung$sql);
    echo 
    'Die Daten wurden erfolgreich geändert';

    }else{
    echo 
    'Die Daten wurden nicht geändert' mysqli_error($verbindung$sql) . '<br/>';
    }
    }

    $sql 'SELECT * from event ORDER BY ID';
    $abfrage mysqli_query($verbindung$sql);

    echo 
    '<h1>Sie haben ' mysqli_num_rows($abfrage) . ' Einträge</h1>';
    echo 
    '<ul>';
    while (
    $event mysqli_fetch_assoc($abfrage)){
    echo 
    "<li>[{$event['ID']}{$event['ort']} {$event['name']} {$event['datum']} {$event['beschreibung']}</li>";

    echo 
    '</ul>';
    mysqli_free_result($abfrage);
    }
    mysqli_close($verbindung);


    echo 
    '<br/><a href="../event/manager.php">Auswahl</a>.'
    [/
    LEFT]
    ?>
    Fehlermeldung:

    Warning: fopen() [[COLOR=#0066cc]function.fopen[/COLOR]]: Filename cannot be empty in C:\xampp\htdocs\event\best_aendern.php on line 31

    Warning: fread() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\event\best_aendern.php on line 32

    Nur wenn ich das file Feld leer lasse und nur Text ändere.

    Und wenn ich ein File update, dann:

    Notice: Undefined index: imgdata in C:\xampp\htdocs\event\best_aendern.php on line 42

    Notice: Undefined index: imgtype in C:\xampp\htdocs\event\best_aendern.php on line 43
    Die Daten wurden erfolgreich geändert

    Der Index imgdata und imgtype erstellen sich aus dem Script durch:

    PHP-Code:
    [LEFT]if (array_key_exists('img',$_FILES)) {


    $tmpname $_FILES['img']['tmp_name'];
    $type $_FILES['img']['type'];
    $bname $_FILES['img']['name'];
    $hndFile fopen($tmpname"r");
    $data addslashes(fread($hndFilefilesize($tmpname)));} [/LEFT
    Liegt hier der Fehler, dass das Script nicht zwei Operationen in einem Zug druchführen kann, bzw. ich den Verlauf des Scriptes anders abstimmen muss?

    Daraus resultiert wahrscheinlich auch der fehlende Eintrag des Dateinamens in die DB, oder? Er zeigt mir desbezüglich keinen Fehler an, schreibt den Bildnamen aber auch nicht in die DB.

    Wie bekomme ich das geregelt?

    Gruß

  • #2
    Zitat von Hauser Beitrag anzeigen
    Ist es richtig, dass man in einem "type="file" kein value anzeigen lassen kann?
    Ja - aus Sicherheitsgründen.

    Wenn du ein Upload-Feld mit "C:\meineDaten\meinePasswoerter.txt" vorbelegst, dann auch noch irgendwie versteckst - dann sende ich als Nutzer womöglich Daten an deinen Server, von denen ich das nicht im geringsten beabsichtigt hatte.

    Warning: fopen() [[COLOR=#0066cc]function.fopen[/COLOR]]: Filename cannot be empty in C:\xampp\htdocs\event\best_aendern.php on line 31
    [...]
    Nur wenn ich das file Feld leer lasse und nur Text ändere.
    Na dass du diesen Fall abfangen solltest, ist doch wohl klar?

    Und wenn ich ein File update, dann:

    Notice: Undefined index: imgdata in C:\xampp\htdocs\event\best_aendern.php on line 42
    Natürlich, per file-Inputfeld geschickte Daten landen nicht in $_POST, sondern in $_FILES.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Klar, danke das leuchtet mir ein.

      Die Frage die ich mir gerade stelle ist die, ob dieses File Script überhaupt in eine Update-Anweisung passt, oder ob ich es nicht einfach wie beim Erfassen den Daten mache, indem ich einfach eine neue Bilddatei einlese, als ob nie was drin gewesen ist.

      Ich würde dann dem Update Script einfach ein INSERT Script folgen lassen.

      Ich habe beim Udate einiges Ausprobiert, doch am "Undefined index:" komme ich irgendwie nicht vorbei. Die DB bekommt keine Bilddaten.

      Gruß

      Kommentar


      • #4
        Zitat von Hauser Beitrag anzeigen
        Die Frage die ich mir gerade stelle ist die, ob dieses File Script überhaupt in eine Update-Anweisung passt, oder ob ich es nicht einfach wie beim Erfassen den Daten mache, indem ich einfach eine neue Bilddatei einlese, als ob nie was drin gewesen ist.

        Gruß
        Was ein dummer gedanke !!! Bitte nicht ! . Danke.

        Habe nun das versucht:

        PHP-Code:
        UPDATE
              event
             SET
              ort
        ='{$_POST['ort']}',
              
        name='{$_POST['name']}',
              
        datum='{$_POST['datum']}',
              
        beschreibung='{$_POST['beschreibung']}',
              
        imgdata='{$_FILES['imgdata']}',
              
        imgtype='{$_FILES['imgtype']}',
              
        imgname='{$_POST['imgname']}'
                    
             
        WHERE
              ID
        ='{$_POST['id']}' 
        Er kann diese nicht zuordnen:

        PHP-Code:
        $_FILES['imgdata'
        $_FILES['imgtype' 

        Kommentar


        • #5
          Zitat von Hauser Beitrag anzeigen
          Er kann diese nicht zuordnen:

          PHP-Code:
          $_FILES['imgdata'
          $_FILES['imgtype' 
          Na wo sollen diese Einträge denn auch herkommen?

          Du hast kein file-Inputfeld mit dem Namen 'imgdata' oder 'imgtype'.

          Schau dir den Inhalt von $_FILES erst mal mittels print_r oder var_dump an (vorher <pre> ausgeben, erhöht die Ubersichtlichkeit) - dann verstehst du vielleicht auch, welche Daten dir in welcher Struktur vorliegen.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            OK, hab ein Ergebnis:

            HTML-Code:
            Array
            (
                [img] => Array
                    (
                        [name] => bier_wurst.bmp
                        [type] => image/bmp
                        [tmp_name] => C:\xampp\tmp\php80A2.tmp
                        [error] => 0
                        [size] => 344790
                    )
            
            )
            1
            Das heißt ja schon mal, dass die Daten vorhanden sind.

            Doch irgendwie happert es an der Zuordnung:

            Hier mal mein Versuch:

            PHP-Code:
            UPDATE
                  event
                 SET
                  ort
            ='{$_POST['ort']}',
                  
            name='{$_POST['name']}',
                  
            datum='{$_POST['datum']}',
                  
            beschreibung='{$_POST['beschreibung']}',
                  
            imgdata='{$_FILES['img']}',
                  
            imgtype='{$_FILES['type']}',
                  
            imgname='{$_POST['name']}'
                        
                 
            WHERE
                  ID
            ='{$_POST['id']}' 

            Kommentar


            • #7
              Zitat von Hauser Beitrag anzeigen
              Doch irgendwie happert es an der Zuordnung:
              Es hapert an deinem Verständnis von etwas so grundlegendem wie dem Umgang mit Arrays.

              PHP-Code:
              UPDATE
                    event
                   SET
              ...
                    
              imgdata='{$_FILES['img']}',
                    
              imgtype='{$_FILES['type']}',
                    
              imgname='{$_POST['name']}' 
              Es gibt in $_FILES keinen Eintrag unter dem Schlüssel 'type'.

              Es gibt einen Eintrag unter dem Schlüssel 'img' - und dieser wiederum ist seinerseits ein Array, und das enthält Einträge unter Schlüsseln wie bspw. 'type' und 'name'.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Zitat von wahsaga Beitrag anzeigen
                Es hapert an deinem Verständnis von etwas so grundlegendem wie dem Umgang mit Arrays.


                Das es Arrays gibt war mir schon klar.

                PHP-Code:
                require_once '../inc/connect.inc.php';
                $ort $_POST['ort'];
                 
                $name $_POST['name'];
                 
                $datum $_POST['datum'];
                 
                $beschreibung $_POST['beschreibung'];
                if (
                array_key_exists('img',$_FILES)) {
                $tmpname $_FILES['img']['tmp_name'];
                $type $_FILES['img']['type'];
                $bname $_FILES['img']['name'];
                $hndFile fopen($tmpname"r");
                $data addslashes(fread($hndFilefilesize($tmpname)));
                $strQuery "INSERT INTO event
                (ort,name,datum,beschreibung,imgdata,imgtype,imgname) VALUES
                ('
                $ort','$name','$datum','$beschreibung','$data','$type','$bname')" 
                Schließlich generiert das Script ja aus einer Bilddatei die Informationen für die DB.

                Da ich ja noch neu in diesem Thema bin, und mir mal jemand geschrieben hat, das es sich beim Update wie bei INSERT verhält, versuche ich ja nun den Weg bei Erfassen auf das Ändern anzuwenden.

                Aber wat soll ich sagen, du hast recht, ich muss da etwas genauer einsteigen, so einfach wie ich dachte ist es dann doch nicht.

                Kommentar


                • #9
                  So, habe mich mal etwas im Netz rumgetrieben und das Script ausfindig gemacht:

                  Parameters:
                  Table: Name of table to update
                  Data: array of $field->$value with new values
                  Id Field: Name of field to use as ID field
                  Id Value: Value of ID field


                  PHP-Code:
                  function mysql_update_array($table$data$id_field$id_value) {
                      foreach (
                  $data as $field=>$value) {
                          
                  $fields[] = sprintf("`%s` = '%s'"$fieldmysql_real_escape_string($value));
                      }
                      
                  $field_list join(','$fields);
                      
                      
                  $query sprintf("UPDATE `%s` SET %s WHERE `%s` = %s"$table$field_list$id_fieldintval($id_value));
                      
                      return 
                  $query;

                  Leider finde ich im PHP Handbuch keine Funktion mysql_update_array. Ist das eine veralterte Anweisung oder passt die Funktion nicht zu meinem Projekt?

                  Wäre nett, wenn mir jemand mal mit der richtigen Anweisung auf die Sprünge helfen kann, den Rest versuche ich dann alleine Umzusetzen.

                  Danke.

                  Kommentar


                  • #10
                    Zitat von Hauser Beitrag anzeigen
                    Leider finde ich im PHP Handbuch keine Funktion mysql_update_array.
                    Du hast sie doch gerade gefunden - schliesslich hast du den Code, aus dem sie besteht, zitiert.

                    Entweder war da eine Beschreibung, was die Funktion macht und was die Parameter bedeuten - oder du machst es dir selber klar.

                    Und anschliessend entscheidest du dann, ob du die Funktion für irgendwas brauchen kannst, oder nicht.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Ok, habe es jetzt gelöst, was lange wert....

                      PHP-Code:
                      [LEFT]require_once '../inc/login.inc.php';

                      $verbindung mysqli_connect($server$benutzer$passwort);

                      if (
                      $verbindung){

                      mysqli_select_db ($verbindung$datenbank);

                      if(
                      mysqli_error($verbindung)){
                      echo 
                      'Fehler: Keine Verbindung zur Datenbank' mysqli_error($verbindung);

                      }else{
                      echo 
                      print_r ($_POST);

                      if (isset(
                      $_POST['ID'])) {

                      if (
                      array_key_exists('img',$_FILES)) {

                      $tmpname $_FILES['img']['tmp_name'];
                      $type $_FILES['img']['type'];
                      $bname $_FILES['img']['name'];

                      if (
                      strlen($tmpname)>0) {

                      $hndFile fopen($tmpname"r");
                      $data addslashes(fread($hndFilefilesize($tmpname)));

                      }else { (
                      $data ""); }


                      $sql "
                      UPDATE
                      event
                      SET
                      ort='
                      {$_POST['ort']}',
                      name='
                      {$_POST['name']}',
                      datum='
                      {$_POST['datum']}',
                      beschreibung='
                      {$_POST['beschreibung']}'";

                      if (
                      strlen($data)>0) {

                      $sql .= ",imgdata='$data',
                      imgtype='
                      {$_FILES['img']['type']}',
                      imgname='
                      {$_FILES['img']['name']}'";
                      }
                      $sql .= "
                      WHERE
                      ID='
                      {$_POST['ID']}'";



                      mysqli_query($verbindung$sql);
                      echo 
                      'Die Daten wurden erfolgreich geändert';

                      }else{
                      echo 
                      'Die Daten wurden nicht geändert' mysqli_error($verbindung) . '<br/>'; }
                      }
                      }[/
                      LEFT]
                      }
                      ?> 
                      Vielen Dank nochmal für die Unterstützung.

                      Gruß
                      Hauser

                      Kommentar


                      • #12
                        Dein Script ist anfällig für SQL-Injections, wodurch beliebige Datenbankzugriffe (lesen, schreiben, löschen) vom Benutzer erfolgen können.

                        Kommentar


                        • #13
                          Dein Script ist anfällig für [COLOR=#04558c]SQL-Injections[/COLOR], wodurch beliebige Datenbankzugriffe (lesen, schreiben, löschen) vom Benutzer erfolgen können.
                          Frohes neues erstmal !

                          Ja, da gebe ich dir natürlich recht und möchte mich auch gleich an die Arbeit machen.

                          Ich habe nun folgende Zeile abgeändert:

                          PHP-Code:
                          [LEFT]WHERE[/LEFT]
                          ID='".mysql_real_escape_string($_POST['ID'])."'"; 
                          und erhalte folgende Meldung,

                          HTML-Code:
                          Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\event\best_aendern.php on line 58
                          
                          Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\event\best_aendern.php on line 58
                          Die Daten wurden erfolgreich geändert
                          die ich nicht richtig verstehe. Findet er ([COLOR=#660000][COLOR=#660000]$_POST[/COLOR][/COLOR][[COLOR=#008200][COLOR=#008200]'ID'[/COLOR][/COLOR]]) nicht mehr ?

                          Könnte mir dazu jemand etwas Erklärung liefern.

                          Danke.

                          Gruß
                          Hauser

                          Kommentar


                          • #14
                            Wenn er $_POST[id] nicht kennen würdest du eine fehlermeldung bekommen, die genau das besagt. Error_reporting ist doch entsprechend eingestellt?

                            Hast du schon eine Verbindung zu DB aufgebaut. Das sieht mir nämlich nicht so aus. Bzw. der Versuch schlägt fehl.

                            Kommentar


                            • #15
                              Hallo und Danke für die Unterstützung.

                              Hier mal die Gesamtmeldung:

                              HTML-Code:
                              Array(    [img] => Array        (            [name] =>             [type] =>             [tmp_name] =>             [error] => 4            [size] => 0        ))1Array ( [ort] => al-Dente [name] => Frühstücksbufett [datum] => 12.12.2009 [beschreibung] => Frühstück für die ganze Familie [ID] => 15 ) 1
                              Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\event\best_aendern.php on line 58
                              
                              Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\event\best_aendern.php on line 58
                              Die Daten wurden erfolgreich geändert 
                              [B]Sie haben 2 Einträge[/B]
                              
                              [14] Medleys Silvester XXL 31.12.2009 Wir feiern das Jahr 2010 !!! [15] al-Dente Frühstücksbufett 12.12.2009 Frühstück für die ganze Familie !!!
                              Also die Datenbank wird angesprochen und liefert auch Ergebnisse.

                              Ich verstehe schon bei der ersten Meldung nicht, warum er Passwort:NO ausgiebt, obgleich ich eines gesetzt habe.

                              Die Reportings sind alle Aktiv.

                              Kommentar

                              Lädt...
                              X