[MySQL|PHP]mysql_insert_id()

The Prophet

Rear Admiral
Registriert
Aug. 2001
Beiträge
5.981
Nabend,

ich versuche gerade Images als Binary in eine MySQL DB zu schreiben.
Das DB Schema schaut wie folgt aus:
Code:
CREATE TABLE binary_data (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50),
bin_data LONGBLOB,
filename CHAR(50),
filesize CHAR(50),
filetype CHAR(50)
);
wurde von phpmyadmin ohne Mucken erstellt.

Um die Bilder einzufügen habe ich folgendes versucht.
PHP:
<html>
<head><title>hmm</title></head>
<body>

<?php


if ($submit) {



$link = mysql_connect('localhost', 'login', 'pw');
if (!$link) {
   die('Keine Verbindung möglich: ' . mysql_error());
}
mysql_select_db('binary_data');
$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));
mysql_query("INSERT INTO binary_data (description, bindata, filename, filesize, filetype) values ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')");
printf("Der zuletzt eingefügte Datensatz hat die ID %d\n", mysql_insert_id());

} else {

?>

    <form method="post" action="<?php $PHP_SELF; ?>" enctype="multipart/form-data">
    File Description:<br>
    <input type="text" name="form_description"  size="40">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    <br>File to upload/store in database:<br>
    <input type="file" name="form_data"  size="40">
    <p><input type="submit" name="submit" value="submit">
    </form>

<?php

}

?>

</body>
</html>

Nur leider erhalte ich immer ID=0.
Das PHP Manual meint dazu
mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat. Falls Sie den Wert zur späteren Verwendung speichern möchten, stellen Sie sicher, dass Sie mysql_insert_id() direkt nach der Abfrage aufrufen, die einen Wert erzeugt hat.
Allerdings hilft mir das auch nicht wirklich weiter. Das es nicht sonderlich sinnvoll ist komplette Images in einer DB zu speichern weiß ich auch allerdings wollte ich das mal testen ;)

Any hints?
 
Zuletzt bearbeitet:
msql_error liefert: No Database Selected was ich allerdings nicht verstehe weil vor der Query ja eigentlich die Selektion erfolgt.
 
OMG, wenn man den Wald vor lauter Bäumen nicht sieht...
Danke über Nacht ist es mir jetzt auch eingefallen geht natürlich :)
 
Guten Morgen,

so nen neues Problem. Ich weiß das es nur nen konzeptioneller Fehler ist aber ich finde ihn einfach nicht. Es geht noch um die gleiche DB / Tabelle.

PHP:
////////////////
//Daten ändern//
////////////////

$link =  mysql_connect( "localhost", $benutzer, $passwort );
if (!$link1) die ("Keine Verbindung zu MySQL");
mysql_select_db($db, $link) or die ("Konnte Datenbank \"$db\" nicht oeffnen: ".mysql_error());

if($_GET['action']=="update")
{ 
	if(isset($_GET['change'])) 
	{
	mysql_query("UPDATE binary_data SET filename=$filename where id=$id") or die (mysql_error()); 
	}

//////////////////
//Daten loeschen//
//////////////////
	if (isset($_GET['delete'])) 
	{
	mysql_query("DELETE from binary_data where id=$id") or die (mysql_error());
	}
}

//////////////////
//Daten anzeigen//
//////////////////



$daten = mysql_query("Select * From binary_data");
$count = mysql_num_rows($daten);
echo "<font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\">Es sind zur Zeit <b>$count</b> Bilder in der Datenbank</font>";
?>

HTML:
		<table border=0 cellspacing="0">
			<tr>
				<td class="top" ><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif">ID</font></b></td>
				<td class="top"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Dateiname</font></b></td>
				<td class="top"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Anzeige</font></b></td>
				<td class="top"><b><font size="2" 
				face="Verdana, Arial, Helvetica, sans-serif">Lösche Eintrag</font></b></td>
				<td class="top"><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Update</font></b></td>
			<tr>


<?php while ($datensatz = mysql_fetch_array($daten))
	{
	?>
		<form action="<?php echo $SELF_PHP; ?>" method="get" name="update">
				<input type="hidden" name="action" value="change" border="0">
					<td class="top" valign="top" height="29">
						<input type="text" name="id" value="<?php echo $datensatz[id]; ?>"></td>
					<td class="top" valign="top" height="29">	
						<input type="text" name="filename" value="<?php echo $datensatz[filename]; ?>">
					</td>
					<td class="top" valign="top" height="29">
					<a href="get.php?id=<?=$id ?>">Bild</a>
					</td>
						
					<td class="top" valign="top" height="29">
						<input type="checkbox" name="delete" value="update" border="0">
					</td>
					<td class="top" valign="top" height="29">
						<input type="submit" name="action" value="update" border="0">
					</td>
					</tr>
			</form>

So das ist der Code um Daten zu löschen, zu ändern und anzuzeigen. Löschen und anzeigen funktioniert prima. Wenn ich allerdings den Wert von filename ändern will funktioniert dies nicht. Es wird immer wieder der Wert geschrieben der schon beim Laden in die Tabelle drin stand. Wenn ich im HTML Feld die Ausgabe mittels $datensatz[filename] weglasse funktioniert das update auch. Wenn der Wert allerdings gesetzt ist nicht. Ich find den Fehler momentan nicht, sicherlich ist es wieder nur konzeptioneller Fehler...

Danke
 
Zuletzt bearbeitet:
ändere mal

Code:
if(isset($_GET['change'])) 
    { 
    mysql_query("UPDATE binary_data SET filename=$filename where id=$id") or die (mysql_error()); 
    }

in [sorry, aba des ist mein style ^^]

Code:
if(isset($_GET['change'])) 
    { 
$filename=$_GET["filename"];
$id=$_GET["id"];

$sql="UPDATE binary_data SET filename='$filename' where id='$id' ";
$result=mysql_query($sql);
}
 
Zuletzt bearbeitet:
Morgen,

so ähnlich hatte ich es auch schon ;) Bringt leider nix.
Wenn ich es ausführe schaut die Query so aus:
Code:
.../admin.php?action=change&id=16&filename=test&action=update
Aber danke für deine Antwort.

/Edit
Fehler gefunden! name und value verwechsler :)
 
Zuletzt bearbeitet:
Neuer Abend neues Problem :)
Habe mich entschieden gleich beim Uploaden Thumbnails mit zu erstellen. Macht die Arbeit später leichter. Jedoch werden die Images über ein Tempfile neugeschrieben was mir allerdings nicht so behagt.

PHP:
MYSQL_CONNECT("localhost","lala","bla");
mysql_select_db("blub");

$im = imagecreatefromjpeg($form_data);
$im_width=imageSX($im);
$im_height=imageSy($im);
$new_height=100;
$new_width=$im_width / ($im_height / $new_height);
$temp=imagecreate($new_width,$new_height);
imagecopyresized($temp,$im,0,0,0,0,$new_width,$new_height,$im_width,$im_height);
/////////////////// TEMP File ///////////////
imagejpeg($temp,"temp.jpg");

$thumbnail = addslashes(fread(fopen("temp.jpg", "r"), filesize("temp.jpg"))); 
$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));
/////////////////////////// Temp File /////////////////////////////
$result=MYSQL_QUERY("INSERT INTO binary_data (description,bin_data,filename,filesize,filetype,thumb_nail) ".
"VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type','$thumbnail')");
Meine Frage nun, ob das auch anders geht, sprich eleganter und ohne Tempfile.
 
Probiers mal mit:
PHP:
MYSQL_CONNECT("localhost","lala","bla");
mysql_select_db("blub");

$im = imagecreatefromjpeg($form_data);
$im_width=imageSX($im);
$im_height=imageSy($im);
$new_height=100;
$new_width=$im_width / ($im_height / $new_height);
$temp=imagecreate($new_width,$new_height);
imagecopyresized($temp,$im,0,0,0,0,$new_width,$new_height,$im_width,$im_height);
/////////////////// TEMP File ///////////////
[B]ob_start();
imagejpeg($temp);
$thumbnail = addslashes(ob_get_contents()); 
ob_end_clean();[/B]
$data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));
/////////////////////////// Temp File /////////////////////////////
$result=MYSQL_QUERY("INSERT INTO binary_data (description,bin_data,filename,filesize,filetype,thumb_nail) ".
"VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type','$thumbnail')");
 
Zuletzt bearbeitet von einem Moderator: (Mit [php] statt [code] wirds doch übersichtlicher)
Funktioniert super! Danke
 
So hab mal wieder ne Frage. Ich glaube das es sich mit ob_start() etc beheben lässt allerdings bin ich noch nicht ganz dahinter gestiegen.
PHP:
ob_start();
echo "bla bla";
ob_end_flush();

Das eigentliche Problem liegt darin das ich bereits einen Header senden muss um das Bild auszugeben. Und ich ja dann nix mehr ausgeben kann.
PHP:
...
$data = @MYSQL_RESULT($result,0,"thumb_nail");
$type = @MYSQL_RESULT($result,0,"filetype");

Header( "Content-type: $type");
echo $data;

Mit der Outputbufferung kann man es ja umgeben allerdings ist mir noch nicht ganz klar wie. Habe es so versucht:
PHP:
ob_start();
echo "bla bla";
Header( "Content-type: $type");
echo $data;
ob_end_flush();
 
Zuletzt bearbeitet:
Ganz einfach es geht nicht ;-) Oder versteh ich das Prinzip mal wieder net.
 
Wenn du ein Bild aus der Datenbank einfügen willst würde ich das so machen.
Du machst auf der Seite ein Gewöhnliches Bild-Tag, jedoch nicht mit einem direkten Link zu einem Bild:

<img src="get_image.php?id=1">

In der get_image.php Datei kannst du das Bild dann anhand der übergebenen ID per GET aus der Datenbank lesen. In dieser Datei kannst du dann die Header für ein Bild setzen und das Bild ausgeben.

Ich hoffe das hat dir geholfen.

Gruss Hornet
 
Das mache ich bereits. Ich lasse mir das Bild als Thumbnail ausgeben und verlinke auf das Großbild.

PHP:
<a href="get.php?id=<?php echo $datensatz[id]; ?>"><img src="thumbs_get.php?id=<?php echo $datensatz[id]; ?>" border="0" title="volle Bildgröße anzeigen"></img></a>

Oder wie meintest du das genau? Danke jedenfalls für deine Antwort.
 
Was genau funktioniert daran nicht? Davon abgesehen, dass es recht sinnlos ist, einen Text vor dem Source eines Bildes auszugeben, wenn man das Bild angezeigt haben möchte...
 
Jep das Stimmt schon aber ich wollte das zu testzwecken mal machen um z.b.: einen einfachen HTML Headbereich einzufügen. Wenn ich die Ausgabe mit ob_start() Puffern will erhalte ich leider keine Ausgabe.
PHP:
ob_start(); 
echo "bla bla"; 
Header( "Content-type: $type"); 
echo $data; 
ob_end_flush();
Lasse ich den echo Befehl mit dem Text weg funktioniert es tadellos.
 

Ähnliche Themen

Zurück
Oben