Bilddatei wird falsch in DB eingetragen - warum?

buzzom

Mitglied
Hallo,

Ich habe zwei Möglichkeiten geschrieben Bilddateien in meine Datenbank zu schreiben.

Feld--------Typ--------Kollation--------Attribute--------Null--------Standard--------Extra
lfd_nr------int(14)----------------------UNSIGNED-----Nein-------------------------auto_increment Primärschlüssel
ID-------varchar(50) -utf8_bin-----------------------------Ja-----------NULL
dateityp--char(50)---utf8_bin------------------------------Ja-----------NULL
datei-----longblob------------------------BINARY----------Ja----------NULL

Die erste Abfrage prüft, ob ein Bild bereits in DB vorhanden ist, anhand von ID_check

PHP:
//Pruefen ob Profilbild schon in DB
	$sql="SELECT ID FROM profile_pictures ";
    $sql.=" WHERE ID='".$_SESSION['IDuser']."'";
    $db = new db();
    $result=$db->execute($sql);

    if($db->num_rows() == 1)
     { 
      $ID_check = $result[1]['ID'];
	 
     }

	//wenn schon ein Profilbild in DB mit UserID, dann updaten
	if($ID_check && is_uploaded_file($_FILES['profilbild']['tmp_name']))
	 {
	  if($_FILES['profilbild']['size']>100000) {$fehler.="<br>Die Datei ist zu gross!";}

      if(!($_FILES['profilbild']['type'] == 'image/jpeg' OR $_FILES['profilbild']['type'] == 'image/gif'))
        {$fehler.="<br>Der Dateityp ist nicht zulaessig!<br>";}

      if(!$fehler)
       {
        $datei=fopen($_FILES['profilbild']['tmp_name'],'rb');
        $data=addslashes(fread( $datei, $_FILES['profilbild']['size']));
	  
	    $db = new db();
	    $dateityp = $_FILES['profilbild']['type'];
	    $sql="UPDATE profile_pictures SET dateityp='$db->prepare$dateityp', datei='$db->prepare$data' WHERE ID='$ID'";
	     $result=$db->execute($sql);
	   }
        if($fehler){ echo "<font color=\"red\">".$fehler."</font>";}
	 }

Die zweite Abfrage prüft, wenn noch kein Bild in DB, anhand von ID_check, vorhanden ist dann neues Bild eintragen in DB

PHP:
//wenn noch kein Profilbild in DB mit UserID, dann neu hinzufuegen
  if(!$ID_check && is_uploaded_file($_FILES['profilbild']['tmp_name']))
  {
	if($_FILES['profilbild']['size']>100000) {$fehler.="<br>Die Datei ist zu gross!";}

    if(!($_FILES['profilbild']['type'] == 'image/jpeg' OR $_FILES['profilbild']['type'] == 'image/gif'))
      {$fehler.="<br>Der Dateityp ist nicht zulaessig!<br>";}

    if(!$fehler)
     {
       $datei=fopen($_FILES['profilbild']['tmp_name'],'rb');
       $data=addslashes(fread( $datei, $_FILES['profilbild']['size']));
       
	   $db = new db();
	   $dateityp = $_FILES['profilbild']['type'];
	   $sql="INSERT INTO profile_pictures (ID, dateityp, datei) VALUES ('".$db->prepare($ID)."','".$db->prepare($_dateityp)."','".$db->prepare($data)."')";
       $result=$db->execute($sql);
     }
       if($fehler){ echo "<font color=\"red\">".$fehler."</font>";}
	}

Nun klappt das eintragen auch, ABER: Wenn noch kein Bild in DB ist und ich ein neues hinzufüge, steht in der DB unter datei [BLOB - 20 KiB]. Dabei wird das Bild dann nicht dargstellt.

Update ich das Bild, also schreibe das gleiche Bild über das alte in der DB steht unter datei datei [BLOB - 19,6 KiB] und das Bild wird wie gewünscht dargstellt?

Frage nun: Wieso ist das Bild erst größer und wird dementsprechen nicht dargestellt und wieso ist es beim updaten dann original gross und wird dargstellt?
Ich versteh das wirklich nicht.

Kannst Du mir helfen? :)
 
Tu dir selbst den gefallen und speichere den Dateinamen und/oder Pfad in der Datenbank und nicht das ganze Bild.

//edit: Lesestoff.
 
Zuletzt bearbeitet:
Bau doch mal bitte diese Hilfsfunktion ein und lass dir damit beide male die $sql zurückgeben nachdem du den select / update reinschreibst.
PHP:
function echoHR($wert) 
{ 
?> 
<div style="padding:5px;text-align:left;margin:10px;border:2px solid #0000ff;background-color:#FFE7B5;font-size:16px;font-family:Arial;color:#000000;"> 
<?php 
    if(is_array($wert)) 
    { 
        echo "<pre>"; 
        echo print_r($wert); 
        echo "</pre>"; 
    } 
    else 
    { 
        if(mysql_error()) 
        { 
            echo "<span style=\"width:100%;border:2px dashed #ff0000;padding:5px;height:16px;font-weight:bold;color:000000;\"\">Fehlercode: " . mysql_errno() . "Fehlermeldung: " . mysql_error(). "</span>"; 
        } 
        echo $wert; 
    }     
?> 
</div> 
<?php 
}
 
Zuletzt bearbeitet:
Also deine Funktion bzw. die Ausgabe davon hat nichts ausgegeben.

Habe aber den "Fehler" gefunden. und zwar hab ich ja bei der INSERT Abfrage
PHP:
$db->prepare($data)
eingebaut. Nehme ich das $db->prepare() weg, als nur $data, klappt alles.

Nur weiss ich jetzt nicht wie das mit der Sicherheit aussieht, da ja nund $data nicht mehr durch

PHP:
PUBLIC function prepare($var)
{
return mysql_escape_string($var);
}

geprüft wird.

Komischerweise kann ich $db->prepare() problemlos bei der UPDATE Abfrage einsetzen.

Danke @Loomes für den Lesestoff. Mal schauen was für mich besser geeignet ist.
 
Zuletzt bearbeitet:
mh dann hast du was falsch gemacht die funktion funktioniert bei mir immer ganz normal :D aber wenns passt
 
Zurück