Fehler in Script

Fehler in Script

am 19.12.2006 15:57:02 von Hans-Peter Nicasius

Hallo,

ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
anzuzeigen. Das Usenet habe ich durchsucht und viele Informationen
gefunden. Nun funktioniert (so vermute ich) mein bild.php nicht, da es
mir kein Bild anzeigt. Das PHP ist kurz und sieht so aus:

/* Verbindung aufbauen, auswählen einer Datenbank */
$link =3D mysql_connect("localhost", "root", "")
or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("fax") or die("Auswahl der Datenbank fehlgeschlagen");

/* ausführen einer SQL Anfrage */
$query =3D "SELECT bild FROM `fax datentabelle` LIMIT 1";
$result =3D mysql_query($query) or die("Anfrage fehlgeschlagen: " .
mysql_error());

/* Ausgabe der Ergebnisse in HTML */
$line =3D mysql_fetch_array($result) or die("mysql_fetch fehlgeschlagen
" mysql_error());
header("Content: image/wbmp");
print $line[0];

/* Freigeben des Resultsets */
mysql_free_result($result);

/* schliessen der Verbinung */
mysql_close($link);
?>

Ich vermute in diesem Script einen Fehler. Da ich aber Neuling bin,
habe ich den leider nicht gefunden. Ihr seht den Fehler bestimmt auf
Anhieb. Wäre sehr nett, wenn Ihr mir kurz sagt, woran es liegt. Noch
schöner wäre es, wenn Ihr mir auch noch sagen könnt, wie ich
php-code debuggen kann. Bisher rufe ich den Code einfach in meinem ie
bei installiertem Apache und Mysql auf.

Noch ein paar Informationen: Die Datenbank habe ich mit einem Export
aus Access 2003 erstellt. Wenn ich mir die Bilder unter Access per
ODBC-Verknüpfung anschaue, öffnet ein Doppelklick Paint und zeigt das
Bild sauber an.
Die Idee, das Bild als BMP in der Datenbank zu speichern ist nicht von
mir sondern vom Entwickler der Datenbank. :-(

Ich hoffe, Ihr könnt mir bei dem Problem helfen. Vielen Dank schon
mal.

Gruß
Charly

Re: Fehler in Script

am 19.12.2006 16:18:42 von Heiko Richler

Hallo Hans-Peter,

> ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
> anzuzeigen. Das Usenet habe ich durchsucht und viele Informationen
> gefunden. Nun funktioniert (so vermute ich) mein bild.php nicht, da es
> mir kein Bild anzeigt. Das PHP ist kurz und sieht so aus:

Wo wird Dir kein Bild angezeigt?
Hast Du das PHP-Skript selbst mit http://www..../bild.php im Browser
aufgerufen, oder indirekt über ?

Wenn es das zweite war, versuch mal die erste Variante.

Sollte der Header nicht Content-Type sein?
header("Content-Type: ...")

Ansonsten könntest Du mal nachsehen was denn aus der Datenbank kommt.

Gruß

Heiko
--
http://portal.richler.de/ Namensportal zu Richler
http://www.richler.de/ Heiko Richler: Computer - Know How!
http://www.richler.info/ private Homepage

Re: Fehler in Script

am 19.12.2006 16:42:22 von sk

Hans-Peter Nicasius schrieb:

> /* Ausgabe der Ergebnisse in HTML */
> $line = mysql_fetch_array($result) or die("mysql_fetch fehlgeschlagen
> ". mysql_error());
> header("Content: image/wbmp");
> print $line[0];


Probiermal an der Stelle:

$img=mysql_fetch_row($result);
header("Content-Type: image/bmp");
echo $img[0];

Dann weiter, wie groß sind denn die Bilder in Bytes?
Gibt es Fehlermeldungen?


Jörg

Re: Fehler in Script

am 19.12.2006 18:09:42 von Claus Reibenstein

Hans-Peter Nicasius schrieb:

> ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
> anzuzeigen.

Wo anzuzeigen? Im Browser? Das ist keine gute Idee. BMP ist kein
offizielles Grafikformat für Webseiten. Ein Browser muss das nicht
unterstützen. Besser wäre eines der offiziellen Formate JPEG, PNG oder GIF.

> header("Content: image/wbmp");

header("Content-Type: ...");

Aber was ist wbmp?

> Die Idee, das Bild als BMP in der Datenbank zu speichern ist nicht von
> mir sondern vom Entwickler der Datenbank. :-(

Welche Idee? Es als BMP zu speichern oder es in der Datenbank zu
speichern? Krank sind beide Ideen.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Fehler in Script

am 19.12.2006 19:23:11 von Matthias Esken

On 19 Dec 2006 06:57:02 -0800, Hans-Peter Nicasius wrote:

> ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
> anzuzeigen.

Wenn die Anzeige auf einer Webseite passieren soll, dann solltest du das
Bild noch in PNG umwandeln.

Gruß,
Matthias

Re: Fehler in Script

am 28.12.2006 13:19:34 von Hans-Peter Nicasius

Jörg Singendonk schrieb:

> Hans-Peter Nicasius schrieb:
>
> Probiermal an der Stelle:
>
> $img=3Dmysql_fetch_row($result);
> header("Content-Type: image/bmp");
> echo $img[0];

Hab ich gemacht! Bringt auch nix. Ich hab jetzt mal folgenden Code
eingefügt:

$dat =3D fopen("test_img.bmp","w+");
fwrite($dat,$img[0]);
fclose($dat);

Das Ergebnis ist eine Datei mit 220.884 Bytes, die sich allerdings in
keinem Image-Viewer öffnen läßt. Ich habe mir mal ein Bild (ich
meine es ist sogar das gleiche!) aus der Datenbank raus kopiert. Das
hat 220.800 Bytes und unterscheidet sich im Inhalt doch sehr von der
erstellten Datei.

Wenn ich versuche, das Image via img2bmp auszugeben (soll ja angeblich
funktionieren) sagt mir der Debugger, das der übergebene Parameter
kein gültiger Imagetyp sei.

Wer kann mir hier noch weiterhelfen?

ein kleinwenig verzweifelt...
Charly

Re: Fehler in Script

am 28.12.2006 14:03:14 von Claus Reibenstein

Hans-Peter Nicasius schrieb:

> $dat = fopen("test_img.bmp","w+");

"w+" erzeugt eine Datei im Textmode. Die Endung ".bmp" deutet aber eher
auf eine Binärdatei hin. Versuch's mal mit "w+b".

Gruß. Claus
--
) )
(,) Ich wünsche allen Mitlesern (,)
__|__ einen guten Rutsch ins neue Jahr __|__
| | | |

Re: Fehler in Script

am 28.12.2006 14:41:44 von Hans-Peter Nicasius

Claus Reibenstein schrieb:

>
> "w+" erzeugt eine Datei im Textmode. Die Endung ".bmp" deutet aber eher
> auf eine Binärdatei hin. Versuch's mal mit "w+b".

Hat leider auch nix gebracht. Aber ich hab mir die Datei noch einmal
genauer mit einem Hex-Editor angesehen. Dabei bin ich auf folgendes
gestoßen: Es stehen am Anfang der Datei 72 Zeichen in denen im
Klartext zu lesen ist "Bitmap.Picture... PBrush. Wenn ich diese ersten
72 Bytes weglösche, kann ein Bildviewer die Datei ohne Probleme
öffnen. Nun ist meine Vermutung, das sich MYSQL oder schon Access (von
da stammt die Datei ja) am Anfang von dem mediumblob merkt, welches
Format drin gespeichert ist. Kann das sein?


Und wie bekomme ich die ersten 72 Bytes von dem $img[0] abgeschnitten?

Danke schon einmal für Eure Mühe.

Gruß
Charly

Re: Fehler in Script

am 28.12.2006 15:19:37 von Manuel Berken

Hans-Peter Nicasius schrieb:

> ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
> anzuzeigen. Das Usenet habe ich durchsucht und viele Informationen
> gefunden. Nun funktioniert (so vermute ich) mein bild.php nicht, da es
> mir kein Bild anzeigt.

Meinst du damit, dass wenn du die bild.php aufrufst, eine Fehlermeldung
oder ähnliches angezeigt wird, oder siehst du nur eine leere Seite?

> > /* Verbindung aufbauen, auswählen einer Datenbank */
> $link = mysql_connect("localhost", "root", "")
> or die("Keine Verbindung möglich: " . mysql_error());
> mysql_select_db("fax") or die("Auswahl der Datenbank fehlgeschlagen");
>
> /* ausführen einer SQL Anfrage */
> $query = "SELECT bild FROM `fax datentabelle` LIMIT 1";

Welchen Datensatz sollte die Datenbank dir hier liefern? Ohne ORDER BY
ist das so nur brauchbar, wenn die Tabelle maximal einen Datensatz enthält.

> $result = mysql_query($query) or die("Anfrage fehlgeschlagen: " .
> mysql_error());

> /* Ausgabe der Ergebnisse in HTML */
> $line = mysql_fetch_array($result) or die("mysql_fetch fehlgeschlagen
> ". mysql_error());
> header("Content: image/wbmp");
> print $line[0];

Mach an dieser Stelle mal ein

print md5($line[0]);

und vergleiche das Ergebnis mit der MD5-Summe deines BLOB-Feldes in der
Datenbank.

SELECT MD5(bild) FROM `fax datentabelle` WHERE id = :ID

> Ich vermute in diesem Script einen Fehler. Da ich aber Neuling bin,
> habe ich den leider nicht gefunden. Ihr seht den Fehler bestimmt auf
> Anhieb. Wäre sehr nett, wenn Ihr mir kurz sagt, woran es liegt.

Also einen Fehler hat dein Script nicht, außer das komische Query,
dessen Sinn sich mir nicht ganz erschliesst.

> Noch schöner wäre es, wenn Ihr mir auch noch sagen könnt, wie ich
> php-code debuggen kann. Bisher rufe ich den Code einfach in meinem ie
> bei installiertem Apache und Mysql auf.

Das ist wohl auch die gängigste, wenn auch nicht effizienteste Variante;
hat allerdings mit Debugging im Sinne von Breakpoints setzen, Variablen
überwachen, etc. nicht wirklich etwas zutun.

Es gibt zu diesem Zweck den PHP-Debugger (und Profiler) DBG. Der ist in
vielen IDEs integriert und erlaubt dir das klassische Debuggen von
serverseitig ausgeführtem PHP-Code. Ob man damit standalone (also ohne
IDE, die das Ding über COM-Interfaces integriert) etwas anfangen kann,
weiß ich nicht.

IDEs die DBG integrieren wären - um mal ein paar zu nennen - Zend
Studio, phpEd, Weaverslave oder TruStudio. Viele andere aber natürlich auch.

> Die Idee, das Bild als BMP in der Datenbank zu speichern ist nicht von
> mir sondern vom Entwickler der Datenbank. :-(

Heul doch ;)

Re: Fehler in Script

am 28.12.2006 15:23:52 von Manuel Berken

Hans-Peter Nicasius schrieb:
> Claus Reibenstein schrieb:

>> "w+" erzeugt eine Datei im Textmode. Die Endung ".bmp" deutet aber eher
>> auf eine Binärdatei hin. Versuch's mal mit "w+b".

> Hat leider auch nix gebracht. Aber ich hab mir die Datei noch einmal
> genauer mit einem Hex-Editor angesehen. Dabei bin ich auf folgendes
> gestoßen: Es stehen am Anfang der Datei 72 Zeichen in denen im
> Klartext zu lesen ist "Bitmap.Picture... PBrush. Wenn ich diese ersten
> 72 Bytes weglösche, kann ein Bildviewer die Datei ohne Probleme
> öffnen. Nun ist meine Vermutung, das sich MYSQL oder schon Access (von
> da stammt die Datei ja) am Anfang von dem mediumblob merkt, welches
> Format drin gespeichert ist. Kann das sein?

MySQL verkrüppelt deine Daten mit Sicherheit nicht. Zudem MySQL gar
keine Kenntnis von PBrush o.ä. hat.

> Und wie bekomme ich die ersten 72 Bytes von dem $img[0] abgeschnitten?

Naja, das ginge ziemlich einfach mit substr($img[0], 72), aber das
willst du nicht wirklich, oder? Ich würde versuchen zu ergründen, wo
diese störenden Bytes herkommen und das abstellen.

Falls es sich um einen Fehler handelt, der bei deinem Export aufgetreten
ist und die Daten nun nicht mehr über Access geladen werden (wie gesagt,
MySQL verstümmelt die Daten nicht), dann kannst du die vorhandenen Daten mit

UPDATE `fax datentabelle´ SET bild = SUBSTR(bild, 72)

reparieren. Vergiss aber nicht die Tabelle vorher zu sichern.

Re: Fehler in Script

am 28.12.2006 16:05:41 von Hans-Peter Nicasius

Manuel Berken schrieb:


>
> MySQL verkrüppelt deine Daten mit Sicherheit nicht.

Stimmt!

>...Ich würde versuchen zu ergründen, wo
> diese störenden Bytes herkommen und das abstellen.

Ich habe mir die MDB auch mal mit einem Hex-Editor angeschaut. Da steht
auf jedenfall
schon einmal der String Bitmap.Paint.Picture... und ...P.Brush...
drin.

Also kommen die 72 Bytes wohl aus der Access-Datenbank.

Ich werde mal bei den Access-Foren suchen, ob ich beim Export was
falsch gemacht habe. Wobei, viele Möglichkeiten was falsch zu machen
sehe ich da nicht.

Auf jedenfall vielen Dank für Deine Hilfe.

Dann noch eine Frage (weil es mir seltsam vorkommt und ich auch aus
meinen Pascal-Programmierzeiten anderes gewöhnt bin)

In der SQL-Datenbank steht ein mediumblob als binary-Feld. Und so ein
Feld kann man mit einer STR-Funktion bearbeiten? In Pascal ging das
früher nicht, da gab es einen deutlichen Unterschied zwischen strings,
die ja max 254 Zeichen lang sein konnten und Byte-Arrays, die ja
wesentlich größer werden konnten.

Aber mit Variablen-Typen unter PHP habe ich mich auch noch nicht so
richtig befasst. Werd ich wohl mal machen müssen.

Gruß
Charly

BTW.: Kannst Du mir eine PHP/MYSQL-Handbuch empfehlen, das ich mir
herunterladen könnte um Offline damit zu arbeiten?

Re: Fehler in Script

am 28.12.2006 17:34:40 von Manuel Berken

Hans-Peter Nicasius schrieb:
> Manuel Berken schrieb:

>> ....Ich würde versuchen zu ergründen, wo
>> diese störenden Bytes herkommen und das abstellen.

> Ich habe mir die MDB auch mal mit einem Hex-Editor angeschaut. Da steht
> auf jedenfall schon einmal der String Bitmap.Paint.Picture... und ...P.Brush...
> drin.

Lies mal .

> Dann noch eine Frage (weil es mir seltsam vorkommt und ich auch aus
> meinen Pascal-Programmierzeiten anderes gewöhnt bin)

> In der SQL-Datenbank steht ein mediumblob als binary-Feld. Und so ein
> Feld kann man mit einer STR-Funktion bearbeiten?

Moment, also MEDIUMBLOB und BINARY sind zwei Paar Schuhe. Eine Spalte,
die mit dem BINARY Attribut definiert wurde, wird binär sortiert, d.h.
es wird die Binärsortierung des entsprechenden Zeichensatzes genutzt.

In BLOB-Spalten hingegen werden Binärdaten oder besser "binary strings"
gespeichert, daher ist das Attribut hier nutzlos, weil BLOBs keinen
Zeichensatz haben.

> In Pascal ging das
> früher nicht, da gab es einen deutlichen Unterschied zwischen strings,
> die ja max 254 Zeichen lang sein konnten und Byte-Arrays, die ja
> wesentlich größer werden konnten.

Der Unterschied bei MySQL ist eher im Zusammenhang mit Zeichensätzen und
Steuerzeichen zu sehen, so ähnlich wie unter Windows der Unterschied
zwischen Text- und Binärdateien.

> Aber mit Variablen-Typen unter PHP habe ich mich auch noch nicht so
> richtig befasst. Werd ich wohl mal machen müssen.

PHP kennt auch keinen Unterschied zwischen einem Byte-Array und einem
String. Binärdaten werden wie Strings behandelt und können auch mit den
selben Funktionen bearbeitet werden.

> BTW.: Kannst Du mir eine PHP/MYSQL-Handbuch empfehlen, das ich mir
> herunterladen könnte um Offline damit zu arbeiten?

Also Handbücher kann ich dir genau zwei empfehlen:

MySQL 5.0 Referenzhandbuch
http://dev.mysql.com/doc/refman/5.0/en/

PHP Handbuch
http://www.php.net/manual/en/index.php

Davon gibt es auch Versionen zum runter holen und offline lesen.


So long,
Manuel

Re: Fehler in Script

am 29.12.2006 08:22:15 von Hans-Peter Nicasius

Manuel Berken schrieb:

> Hans-Peter Nicasius schrieb:
> > Manuel Berken schrieb:
>
> >> ....Ich würde versuchen zu ergründen, wo
> >> diese störenden Bytes herkommen und das abstellen.
>
> > Ich habe mir die MDB auch mal mit einem Hex-Editor angeschaut. Da steht
> > auf jedenfall schon einmal der String Bitmap.Paint.Picture... und ...P=
..Brush...
> > drin.
>
> Lies mal .
>

Habe ein wenig in den Foren von ms gestöbert. Bin dabei auf einen
Threat gestoßen, der genau dieses Thema behandelt. Access kapselt das
Bild wohl noch mit zusätzlichen Informationen. Stephan Lebans hat ein
Konvertiertool unter Access (mind. A2K) entwickelt, das die OLE-Objekte
auf Festplatte exportiert und dabei die zusätzlichen Daten entfernt.

Ich werde einmal prüfen, ob es mir reicht, die ersten 72 Bytes in der
Tabelle zu entfernen.
Wenn das nicht funktioniert, werden ich wohl die OLE-Objekte unter
Access exportieren und wieder nach SQL importiern müssen.

Gefunden hab ich den Threat in microsoft.public.access.externaldata.
Leider weiß ich nicht genau, wie ich einen Thread hier verlinke damit
jeder, dem es interessiert, das nachlesen kann.

Bedanke mich nochmals für die Hilfe und wünsch Dir einen guten Rutsch
ins neue Jahr.

Gruß
Charly

Re: Fehler in Script

am 29.12.2006 15:02:15 von Claus Reibenstein

Hans-Peter Nicasius schrieb:

> Habe ein wenig in den Foren von ms gestöbert. Bin dabei auf einen
> Threat gestoßen, der genau dieses Thema behandelt. Access kapselt das
^^^^^^

Welcher Art war denn diese Bedrohung (Threat)?

SCNR. Claus
--
) )
(,) Ich wünsche allen Mitlesern (,)
__|__ einen guten Rutsch ins neue Jahr __|__
| | | |

Re: Fehler in Script

am 04.01.2007 14:40:19 von Hans-Peter Nicasius

Hans-Peter Nicasius schrieb:

> Hallo,
>
> ich versuche, ein BMP-Bild aus einer Datenbank auszulesen und
> [snip]

Nur um meinen Kenntnisstand einmal weiterzugeben. (hilft vielleicht
jemanden, der ein ähnliches Problem lösen will)

Ausgangssituation:

Eine Tabelle in Access, die BMP-Bilder enthält. Diese wurde von mir
nach MySQL konvertiert und sollte von dort per PHP auf einer Webseite
angezeigt werden. -> Anzeige des BMP wollte einfach nicht
funktionieren!

gesammelte Infos:

Access kapselt Bilder in Tabellen mit zusätzlichen Informationen. In
meinen Fall standen 72 Bytes vor der eigentlichen Bildinformation und
ein paar dahinter.
Auf der Seite http://www.lebans.com/ gibt es ein Tool mit der man diese
Bilder aus einer Tabelle auf die Festplatte schreiben kann.

meine "primitive" Lösung:

Ich schreibe die Bilddaten ohne die 1. 72 Bytes mit fopen,fwrite auf
die Serverplatte und prüfe (natürlich vorher!), ob ich das schon
einmal gemacht habe. Wenn ja, nix machen und Bild anzeigen.
Funktioniert bei mir bisher ohne Probleme.

Bis dahin
Charly

Re: Fehler in Script

am 04.01.2007 15:27:13 von Claus Reibenstein

Hans-Peter Nicasius schrieb:

> Eine Tabelle in Access, die BMP-Bilder enthält. Diese wurde von mir
> nach MySQL konvertiert und sollte von dort per PHP auf einer Webseite
> angezeigt werden. -> Anzeige des BMP wollte einfach nicht
> funktionieren!

Habe ich schon erwähnt, dass BMP eine schlechte Idee ist? BMP ist kein
offiziell unterstützes Grafikformat im Web. Offizielle Formate sind GIF,
JPEG und PNG. Wenn ein Browser das trotzdem anzeigt, ist das ein Feature
des Browsers.

> Ich schreibe die Bilddaten ohne die 1. 72 Bytes mit fopen,fwrite auf
> die Serverplatte und prüfe (natürlich vorher!), ob ich das schon
> einmal gemacht habe. Wenn ja, nix machen und Bild anzeigen.
> Funktioniert bei mir bisher ohne Probleme.

Dann hast Du Glück gehabt.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /