Antworten auf deine Fragen:
Neues Thema erstellen

Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Greenhorn79

Nicht mehr ganz neu hier

Hallo @all,

und schon habe ich das nächste Problem. Ich habe eine My-SQL-Datenbank geerbt in der in einem Blob-Feld Bilder gespeichert sind. Diese würde ich in der Datenbank gerne als Link speichern und das Bild selber irgendwo am Filer ablegen. Nun ist es mühselig dies von Hand zu machen, weshalb ich an ein Script dachte. Ich habe wochenlang die Suchfunktionen bemüht, Scripts gesucht geändert und bin doch nicht zum gewünschten Ergebnis gekommen. Aktuell sieht mein Script wie folgt aus:
Code:
<?php //parse_str{$_Server['QUERY_STRING']}; $dblink=mysql_connect("localhost", "root", "") or die("Login fehlgeschlagen."); mysql_select_db("tbl_company_logo") or die("Datenbank nicht gefunden");  //   $mysqli    $sql="SELECT * FROM tbl_company_logo.tbl_company_logo";    $recordset=mysql_query($sql);    $trefferzeile=mysql_fetch_assoc($recordset);     //$recordset = base64_decode($recordset);    while($trefferzeile=mysql_fetch_assoc($recordset)){    $Filenamestr =$trefferzeile['original_image_blob'].".jpg";    if (!empty($trefferzeile['image'])) {   //  $Blob=gzinflate($trefferzeile['image']);           file_put_contents($Filenamestr,$Blob);        echo "<pre>";     print_r($Filenamestr);     echo "</pre>";     }    }   ?>
Leider tut es nichts. Es bringt zwar keinen Fehler aber dennoch hat es auch noch den gewünschten Effekt und ich seh den Wald vor Bäumen nicht. Es wäre nett, wenn mir jemand vielleicht einen Tipp geben könnte, woran es liegt.

Danke und viele Grüße
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo,

wieso benutzt du
PHP:
gzinflate();
?

Eigentlich sollte reichen wenn du den Inhalt eines Blob-Feldes direkt als Datei speicherst. In der Datenbank sollte noch ein Feld für den Mime-Typ des Bildes geben. So etwas benötigst du noch um die Dateiendung zu bestimmen. Ansonsten erst einmal .jpg benutzen und dann auf der Konsole mittels "file" nachsehen um welchen Dateityp es sich wirklich handelt.

Folgendes Beispiel sollte funktionieren, wobei es ein besserer Programmirstil wäre Prepared Statements (mysqli) zu benutzen.
PHP:
<?php

$conn = mysql_connect("localhost", "root", "");

if (!$conn) {
    echo "Keine Verbindung zu DB möglich: " . mysql_error();
    exit;
}

if (!mysql_select_db("tbl_company_logo")) {
    echo "Konnte tbl_company_logo nicht selektieren: " . mysql_error();
    exit;
}

$sql = "SELECT original_image_blob FROM tbl_company_logo";

$result = mysql_query($sql);

if (!$result) {
    echo "Konnte Abfrage ($sql) nicht erfolgreich ausführen von DB: " . mysql_error();
    exit;
}

if (mysql_num_rows($result) == 0) {
    echo "Keine Zeilen gefunden, nichts auszugeben, also Ende";
    exit;
}

$idx = 0;
while ($row = mysql_fetch_assoc($result)) {
    $data = $row["original_image_blob"];
    $typ = 'jpg';
    $filename = sprintf('blobdata_%05d.%s', $idx++, $typ);
    file_put_contents($filename, $data);
}

mysql_free_result($result);

mysql_close($conn);

?>
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo Philbring,

Vielen Dank für deine Antwort und Hilfestellung. Benutzt habe ich PHP, weil meine SQL-Kenntnisse leider nicht ausreichen. Ja ich weiß, die PHP-Kenntnisse auch nicht. ;-)
Nein im Ernst: am liebsten wäre mir natürlich schon ein SQL-Select oder ähnliches, aber leider bin ich damit nicht wirklich weit gekommen, auch nach langer Suche im Internet nicht.

Liebe Grüße
Michaela
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo Michaela,

was bekommst du denn für eine Meldung wenn du mein PHP Script startest?


Ich schätze mal das die Meldung

"Konnte tbl_company_logo nicht selektieren: ..."
erscheint. In diesem Fall ist der Name deiner Datenbank nicht korrekt.

Den Datenbanknamen darfst du dabei nicht mit dem Namen einer Tabelle verwechseln.

Viele Grüße

Peter
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Der Datenbankname und auch der Tabellenname lauten tbl_company_logo, sodass ich gar keinen Fehler bekomme. Aber leider sind die Bilder halt auch nirgendwo abgespeichert. Ich glaube ich habe da noch einen großen Denkfehler drin, um ehrlich zu sein. Ich möchte ja aus meiner Ursprungsdatenbank die Blob-felder auslesen, abspeichern und in einer anderen Tabelle oder von mir aus auch in der gleichen als Link speichern, wo die Bilder liegen. Im Script gebe ich aber ja gar nicht an, wo er denn mit dem Inhalt aus dem Blobfeld hin soll, kann er also auch nicht wissen und tut (meine Vermutung) nix...
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Irgend wo sollten die Bilder schon abgespeichert werden.

Gib in in meinem Script mal anstelle von
file_put_contents($filename, $data);

folgendes an:
printf("Datei: %s%s%s%s", dirname(__FILE__), DIRECTORY_SEPARATOR, $filename, PHP_EOL);

Damit solltest du die Dateinamen angezeigt bekommen. Falls keine Anzeige erscheint werden keine Daten aus der Datenbank ausgelesen.

Tests das mal und gib Bescheid ob etwas angezeigt wird.
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Strike. Das war die erste Hürde. Nun weiß ich auch wo er die Bilder hingespeichert hat. :danke:
Ich habe nun noch den notwendigen Befehl eingefügt zum Dekodieren. In den Tiefen war nämlich irgendwo dokumentiert, dass man die Bilder mit base64 decodieren muss.
Die Bildvorschau kann zwar leider immer noch nicht angezeigt werden....

$data = $row["original_image_blob"];
$row = base64_decode($data);
$typ = 'jpg';
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Das bekommen wir auch noch hin ;-)

Ich gucke gleich mal ob ich da etwas machen kann.

Melde mich gleich noch einmal....
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hat die Tabelle irgend ein Index-Feld (ID oder so etwas) und welcher Wert steht darin? Wichtig ist, das du in jeder Zeile der Tabelle einen unterschiedlichen Wert in diesem Indexfeld stehen hast.

Zusätzlich musst du die Tabelle um einige Felder erweitern. Das kannst du mit folgendem SQL-Befehl machen:
ALTER TABLE tbl_company_logo ADD filename VARCHAR(256) NULL, ADD width INT(5) NULL, ADD height INT(5) NULL, ADD mime VARCHAR(64) NULL;

Damit hast du die neuen Spalten filename, width, height und mime, in welche nachher die Daten der Datei geschrieben werden.

Komplettes Script folgt, sobald die Sache mit dem Indexfeld geklärt ist.
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

ja das hat sie: das feld heißt company_id. das feld ist vom format bigint(20)
ich habe auch manuell schon eine tabelle angelegt n die der link und die neue alte tabelle rein sollen. allerdings habe ich es nicht geschafft das in das script so einzubauen, dass die tabelle gefüllt wird.
du bist mein persönlicher held, weißt du das? ganz ernst... irgendwie sind meine script-kenntnisse in dem fall sehr rudimentär, da hilft dann alles lesen nix. ich kann dir zwar einen sql select schreiben, der verschiedene felder aus wählt und auch noch einen insert, der bei mir aber falsch ist, weil einfach die sonstigen script-kenntnisse fehlen.
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo,

ist ja auch ziemlich viel auf einmal (PHP, MySQL).

Hier ist erst einmal das fertige Script:
PHP:
<?php

$conn = mysql_connect("localhost", "root", "");

if (!$conn) {
    echo "Keine Verbindung zu DB möglich: " . mysql_error();
    exit;
}

if (!mysql_select_db("tbl_company_logo")) {
    echo "Konnte tbl_company_logo nicht selektieren: " . mysql_error();
    exit;
}

$sql = "SELECT company_id, original_image_blob FROM tbl_company_logo";

$result = mysql_query($sql);

if (!$result) {
    echo "Konnte Abfrage ($sql) nicht erfolgreich ausführen von DB: " . mysql_error();
    exit;
}

if (mysql_num_rows($result) == 0) {
    echo "Keine Zeilen gefunden, nichts auszugeben, also Ende";
    exit;
}

$idx = 0;
while ($row = mysql_fetch_assoc($result)) {
    $data = base64_decode($row["original_image_blob"]);
    $typ = 'jpg';
    $path = dirname(__FILE__);
    $filename = sprintf('blobdata_%05d.%s', $idx++, $typ);
    $file = $path . DIRECTORY_SEPARATOR . $filename;
    file_put_contents($file, $data);
    $img_data = getimagesize($file);
    
    // Insert/Update Query zusammen bauen
    $query  = "UPDATE tbl_company_logo.tbl_company_logo ";
    $query .= "SET filename ='" . $filename . "' ";
    $query .= "SET width = " . $img_data[0] . " ";
    $query .= "SET HEIGHT = " . $img_data[1] . " ";
    $query .= "SET mime = '" . $img_data['mime'] . " ";
    $query .= "WHERE tbl_company_logo.company_id = " . $row["company_id"] . ";";
    if(mysql_query($query) === false) {
        printf("Fehler: %s%s", mysql_error($conn), PHP_EOL);
    }
}

mysql_free_result($result);

mysql_close($conn);

/*
    ALTER TABLE tbl_company_logo ADD filename VARCHAR( 256 ) NULL ,
    ADD width INT( 5 ) NULL ,
    ADD height INT( 5 ) NULL ,
    ADD mime VARCHAR( 64 ) NULL 
 */
?>
Wichtig ist, das du die Tabelle tbl_company_logo mit der ALTER TABLE Anweisung erweiterst hast bevor du das Script laufen läßt.

In den neuen Spalten findest du anschließend die Daten der Bilder. Das Feld filename enthält nur den Dateinamen da der Pfad für den Webserver natürlich nicht der Pfad in deinem Filesystem entspricht sondern relativ zum DocumentRoot des Webservers.

Den DocumentRoot kannst du in PHP über folgende Variable bestimmen:

$_SERVER["DOCUMENT_ROOT"]

Bei Fragen kannst du dich ruhig noch einmal melden.

Ansonsten einen guten Rutsch ins neue Jahr


Peter
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo Peter,

erweitert habe ich die Tabelle, bekomme aber folgenden Fehler

Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET width = 1275 SET HEIGHT = 1760 SET mime = 'image/jpeg WHERE tbl_company_logo' at line 1

Ich arbeite mit Server Version: 5.5.16

Viele Grüße. Ich wünsche dir auch einen guten Rutsch und alles gute für das kommende Jahr.
Michaela
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Hallo Michaela,

sorry, gerade gesehen.

Ein kleiner Fehler steckt im Script.

Die Zeile
$query .= "SET mime = '" . $img_data['mime'] . " ";

muss gegen die folgende Zeile getaucht werden:
$query .= "SET mime = '" . $img_data['mime'] . "' ";

(Ein zusätzliches ' zwischen den letzten beiden ")

Damit sollte das dann funktionieren.

Zur Sicherheit könnte man auch die Zeile
$query .= "WHERE tbl_company_logo.company_id = " . $row["company_id"] . ";";
wie folgt erweitern
$query .= "WHERE tbl_company_logo.company_id = " . $row["company_id"] . " LIMIT 1;";

Viele Grüße

Peter
 
Zuletzt bearbeitet:

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Nee leider tut er noch nicht...

Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET width = 1275 SET HEIGHT = 1760 SET mime = 'image/jpeg' WHERE tbl_company_log' at line 1

aber ich finde nichts was ihn stört
 
T

Tammo01

Guest

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Nee leider tut er noch nicht...

Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET width = 1275 SET HEIGHT = 1760 SET mime = 'image/jpeg' WHERE tbl_company_log' at line 1

aber ich finde nichts was ihn stört

WHERE tbl_company_log << sollte da nicht noch ein o für _tbl_company_logo hin ???

Nur so ein spontaner Einfall ;)

Vom SQl Server kenne ich statt der Syntax: "SET width = 1275 SET HEIGHT = 1760 SET mime = 'image/jpeg'"
nur die Schreibweise : Update tabelle_name Set width = 1275, height = 1760, mime = 'image/jpeg' where spalte_name = 1
also SET nur einmal schreiben, dann die spalten und werte mit Komma getrennt ...
oder ist beides korrekt?
 
Zuletzt bearbeitet von einem Moderator:

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Noch einmal sorry,

immer diese Flüchtigkeitsfehler :uhm:

Im Update-Block hatte ich jeweils die Kommata vergesen. Korrekt sieht das dann so aus:
PHP:
    // Insert/Update Query zusammen bauen
    $query  = "UPDATE tbl_company_logo.tbl_company_logo ";
    $query .= "SET filename ='" . $filename . "', ";
    $query .= "SET width = " . $img_data[0] . ", ";
    $query .= "SET height = " . $img_data[1] . ", ";
    $query .= "SET mime = '" . $img_data['mime'] . "' ";
    $query .= "WHERE tbl_company_logo.company_id = " . $row["company_id"] . " LIMIT 1;";
Ich hoffe, das das nun ohne Fehler Funktioniert.


Viele Grüße

Peter:)
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

du willst die Antwort gar nicht wissen ;-)
 

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

das ist der akutelle Code

PHP:
<?php

$conn = mysql_connect("localhost", "root", "");

if (!$conn) {
    echo "Keine Verbindung zu DB möglich: " . mysql_error();
    exit;
}

if (!mysql_select_db("tbl_company_logo")) {
    echo "Konnte tbl_company_logo nicht selektieren: " . mysql_error();
    exit;
}

$sql = "SELECT company_id, original_image_blob FROM tbl_company_logo";

$result = mysql_query($sql);

if (!$result) {
    echo "Konnte Abfrage ($sql) nicht erfolgreich ausführen von DB: " . mysql_error();
    exit;
}

if (mysql_num_rows($result) == 0) {
    echo "Keine Zeilen gefunden, nichts auszugeben, also Ende";
    exit;
}

$idx = 0;
while ($row = mysql_fetch_assoc($result)) {
    $data = base64_decode($row["original_image_blob"]);
    $typ = 'jpg';
    $path = dirname(__FILE__);
    $filename = sprintf('blobdata_%05d.%s', $idx++, $typ);
    $file = $path . DIRECTORY_SEPARATOR . $filename;
    file_put_contents($file, $data);
    $img_data = getimagesize($file);

    // Insert/Update Query zusammen bauen
    $query  = "UPDATE tbl_company_logo.tbl_company_logo ";
    $query .= "SET filename ='" . $filename . "', ";
    $query .= "SET width = " . $img_data[0] . ", ";
    $query .= "SET height = " . $img_data[1] . ", ";
    $query .= "SET mime = '" . $img_data['mime'] . "' ";
    $query .= "WHERE tbl_company_logo.company_id = " . $row["company_id"] . " LIMIT 1;";

    if(mysql_query($query) === false) {
        printf("Fehler: %s%s", mysql_error($conn), PHP_EOL);
    }
}

mysql_free_result($result);

mysql_close($conn);
?>

der Fehler lautet:
Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET width = 1275, SET height = 1760, SET mime = 'image/jpeg' WHERE tbl_company_l' at line 1
 
Zuletzt bearbeitet:

Greenhorn79

Nicht mehr ganz neu hier

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Müssen in der Zeile die doppelten Anführungszeichen sein

$query .= "SET filename ='" . $filename . "', ";
 

philbring

Webdesigner

AW: Blob-Felder aus Datenbank auslesen, abspeichern und Link die Datenbank aufnehmen

Du könntest auch
PHP:
$query .= "SET filename = '$filename', ";
schreiben. Wichtig ist, das der Inhalt der Variablen $filename in einfache Anführungszeichen geklammert ist damit MySQL erkennt das es sich um einen Stringtype (VARCHAR) und nicht um einen numerischen Typ handelt.

Das selbe gilt für den Inhalt der Variablen $img_data['mime']

Mit Prepared Statements sähen die SQL Anweisungen schöner aus, jedoch ist die dazu notwendige mysqli Erweiterung nicht in jedem Fall in PHP aktiviert.

Zusätzlich könnte man noch dem Dateinamen ($filename) anhand des Mimetypes die korrekte Dateiendung verpassen.

Ansonsten wünsche ich dir ein schönes und erfolgreiches Jahr 2012.

Viele Grüße

Peter:)
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.359
Mitglieder
67.536
Neuestes Mitglied
QuestionMark
Oben