webForumDet fria alternativet

Spara bild i blob

17 svar · 1 266 visningar · startad av Hampan90

Hampan90Medlem sedan feb. 2007137 inlägg
#1

Hej
Jag har denna kod:


<?php 
			
			
			if (isset($_POST['rubrik']))
			{
				include 'db_connect.php';
				include 'db_open.php';
				
				$rubrik = $_POST['rubrik'];
				$ingress = $_POST['ingress'];
				$text = $_POST['text'];
				$sdatum = $_POST['startdate'];
				$edatum = $_POST['enddate'];
				if (isset($_POST['stor']))
				{
				  $stor = '1';
				} 
				else{
				  $stor = '0';
				} 
				
				$text = ereg_replace("\r\n", "\n", $text);
				$text = ereg_replace("\r", "\n", $text);
				$text = ereg_replace("\n\n", '</p><p>', $text);
				$text = ereg_replace("\n", '<br />', $text);
				
				$text = str_replace(array('[b]', '[B]'), '<span class="bold">', $text);
				$text = str_replace(array('[/b]', '[/B]'), '</span>', $text);
				$text = str_replace(array('[i]', '[I]'), '<span class="italic">', $text);
				$text = str_replace(array('[/i]', '[/I]'), '</span', $text);
				
				$sql = "INSERT INTO event SET Rubrik='$rubrik', Ingress ='$ingress', Text ='$text', Datum ='$sdatum', DatumSlut ='$edatum', Stort ='$stor'";
				if (@mysql_query($sql)){
					echo "<p>Eventet är publicerad.</p>";
				}
				else {
					echo "<p>Ett fel uppstod när nyheten lades in. <br />" . mysql_error() . "</p>";
				}
			}
			
			else{
			
			?>
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
      <p>Rubrik<br />
      <input name="rubrik" /></p>
      <p>Ingress<br />
      <textarea name="ingress" cols="40" rows="4"></textarea></p>
      <p>Text<br />
      <textarea name="text" cols="40" rows="10"></textarea></p>
      <p>Bild<br /><br />
      <input type="file" name="photo" /></p>
      <p>Startdatum YYYY-MM-DD<br />
      <input name="startdate" /></p>
      <p>Slutdatum YYYY-MM-DD<br /><br />
      <input name="enddate" /></p>
      <p>Visa högst upp på startsida?<br />Ja:
      <input type="checkbox" name="stor" /><br />
      <input type="submit" value="Publicera" /></p>
      </form>
      
      <?php
      }
			?>

Som ni ser i min form så har jag en "file" där man kan ladda upp bilder.

Hur göra jag med min SQL fråga så att den lägs in i mitt BLOB fält?
Jag har sett att många har flera olika fält, inte bara det binära datat, men jag har bara ett fält som heter Bild (Blob)

Har försökt googla som en tok, men inget funkar för mig..

// Hampus

K@llenMedlem sedan mars 20032 667 inlägg
#2

Spara bilden i en katalog i stället och sökvägen/bildnamn i din databas.

SPiNMedlem sedan mars 20007 896 inlägg
#3

Nä, spara bilden i databasen. Men du måste även spara vilken typ av bild det är (gif, jpg, png).

Typ:

$fileType = $_FILES['photo']['type'];
$fileBinary = file_get_contents($_FILES['photo']['tmp_name']);
...
...("INSERT INTO Tabell (blobFält, typFält) VALUES('$fileBinary', '$fileType')");

När du sedan ska visa bilderna, måste du skapa en PHP-fil som läser av blob-fältet och visar bilden efter rätt content-type:

...("SELECT blobFält, typFält FROM Tabell WHERE bildId=5");
header("Content-Type: " . $query["typFält"]);
echo $query["blobFält"];

Enkelt förklarat. Du bör även lägga in en kontroll på vilka typer av filer som får laddas upp. Det skulle väl inte vara så roligt om det började trilla in .exe-filer och dina besökare tror att det är OK att ladda ner dessa när nedladdningsrutan kommer upp?! :)

Ett till säkerhetstips är att förhindra SQL-injektioner. Sök på forumet så kommer du få massor av träffar.

Hampan90Medlem sedan feb. 2007137 inlägg
#4

Tack SPiN för ditt svar.

Och till K@llen: Jag vet att detta är att föredra i ganska många lägen, men just nu är webbplatsen uppbyggd såhär. Inget jag vill ändra nu.

SPiN:
Jag kommer bra stödja JPG, så filtyp behövs inte här heller.
Detta är ett admin gränssnitt så inga andra vanliga kommer in här.
Så några kontroller behöver jag inte.
De sabbar bara sin egen sida isf :P

Min kod ser nu ut såhär:


<?php 
			
			
if (isset($_POST['rubrik']))
{
include 'db_connect.php';
include 'db_open.php';
				
$rubrik = $_POST['rubrik'];
$ingress = $_POST['ingress'];
$text = $_POST['text'];
$sdatum = $_POST['startdate'];
$edatum = $_POST['enddate'];
if (isset($_POST['stor']))
{
$stor = '1';
} 
else{
$stor = '0';
}
$fileBinary = file_get_contents($_FILES['photo']['tmp_name']);

				
$text = ereg_replace("\r\n", "\n", $text);
$text = ereg_replace("\r", "\n", $text);
$text = ereg_replace("\n\n", '</p><p>', $text);
$text = ereg_replace("\n", '<br />', $text);
				
$text = str_replace(array('[b]', '[B]'), '<span class="bold">', $text);
$text = str_replace(array('[/b]', '[/B]'), '</span>', $text);
$text = str_replace(array('[i]', '[I]'), '<span class="italic">', $text);
$text = str_replace(array('[/i]', '[/I]'), '</span', $text);
				
$sql = "INSERT INTO event SET Rubrik='$rubrik', Ingress ='$ingress', Text='$text', 
Datum ='$sdatum', DatumSlut ='$edatum', Stort ='$stor', Bild ='$fileBinary'";
if (@mysql_query($sql)){
	echo "<p>Eventet är publicerad.</p>";
}
else {
echo "<p>Ett fel uppstod när nyheten lades in. <br />" . mysql_error() . "</p>";
}
}
			
else{
			
?>
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
      <p>Rubrik<br />
      <input name="rubrik" /></p>
      <p>Ingress<br />
      <textarea name="ingress" cols="40" rows="4"></textarea></p>
      <p>Text<br />
      <textarea name="text" cols="40" rows="10"></textarea></p>
      <p>Bild<br />(Bara .jpg eller .jpeg filer)<br />
      <input type="file" name="photo" /></p>
      <p>Startdatum YYYY-MM-DD<br />
      <input name="startdate" /></p>
      <p>Slutdatum YYYY-MM-DD<br /><br />
      <input name="enddate" /></p>
      <p>Visa högst upp på startsida?<br />Ja:
      <input type="checkbox" name="stor" /><br />
      <input type="submit" value="Publicera" /></p>
      </form>
      
      <?php
      }
?>

Med fortfarande förblir BLOB fältet tomt (kollar med PHPmyAdmin).... :( Vad för fel?

SPiNMedlem sedan mars 20007 896 inlägg
#5

Märkligt. Hamnar all annan information i tabellen?

Om du, efter att ha läst in den binära datan, skriver ut det - får du någon output?
Alltså;

...
$fileBinary = file_get_contents($_FILES["photo"]["tmp_name"]);
header("Content-Type: image/jpeg");
echo $fileBinary;
die();
...

Visas bilden då?

Hampan90Medlem sedan feb. 2007137 inlägg
#6

OM jag har den koden i min tidigare kod så visas bara url:en för min sida när jag trycker på submit..

Ja, alla annan information hamnar i tabellen. Men ingen bild.

Denna kod är ju det enda som är av intresse antar jag:


<input type="file" name="photo" />

$fileBinary = file_get_contents($_FILES["photo"]["tmp_name"]);

$sql = "INSERT INTO event SET Rubrik='$rubrik', Ingress ='$ingress', Text ='$text', Datum ='$sdatum', DatumSlut ='$edatum', Stort ='$stor', Bild ='$fileBinary'";
SPiNMedlem sedan mars 20007 896 inlägg
#7

Visas bara URL:en? Hm. Det låter lite märkligt. file_get_contents() tar även en flagga för att visa att man vill läsa filen binärt, men det ska inte behövas - då standard-mode är binärt. Du kan ju alltid testa annars:

$fileBinary = file_get_contents($_FILES["photo"]["tmp_name"], FILE_BINARY);

Om du har specialtecken (som mellanslag) i URI:n till filen, måste du escape:a dom:

$fileBinary = file_get_contents(urlencode($_FILES["photo"]["tmp_name"]));

Testa att läsa in filen via ett annat tillvägagångssätt annars;

$cursor = fopen($_FILES["photo"]["tmp_name"], 'b');
$fileBinary = fread($cursor, filesize($_FILES["photo"]["tmp_name"]));
fclose($cursor);
SPiNMedlem sedan mars 20007 896 inlägg
#8

Nu vet jag varför det inte fungerar. Du har inte angett att du ska ladda upp filer i ditt formulär, vilket är nödvändigt.

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST" enctype="multipart/form-data">
...

Det första man blir blind på... ;)

Hampan90Medlem sedan feb. 2007137 inlägg
#9

Då får jag detta fel: (En massa konstiga tecken..


Ett fel uppstod när nyheten lades in.
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 '&#65533;&#474;O,&#65533;D&#65533;8O&#65533;+&#65533;v&#65533;)&#65533;&#65533;4N/&#65533;&#65533;v&#65533;[&#65533;&#65533;&#65533;Br&#65533;m&#65533;B-&#65533;&#65533;&#65533;]0+X&#429;&#65533;&#65533;S.a&#65533;&#65533;&#65533;c&#65533;@r&#65533;&#65533;2&#65533;2&#65533;P&#65533;g&#65533;Lb&#65533;Y' at line 1
spangoMedlem sedan juni 20008 205 inlägg
#10

Du har samma problem med filen som du har med den andra indatan. $fileBinary kan innehålla precis hur många 'enkelfnuttar' som helst vilket kan orsaka kaos i din databas.

Hampan90Medlem sedan feb. 2007137 inlägg
#11

ok, vad finns det för lösning på det?

SPiNMedlem sedan mars 20007 896 inlägg
#12

PDO och prepared statements. ;)

Hampan90Medlem sedan feb. 2007137 inlägg
#13

Så det är ingen som kan säga rakt av vad jag ska byta ut i min kod?
Förstod inte så mycket av den där länken..

Tack på förhand

// Hampus

SPiNMedlem sedan mars 20007 896 inlägg
#14

Du kan egentligen inte byta ut någonting i din kod. Du ska inte börja att mixtra med innehållet i $fileBinary, som att escape:a tecken osv. - det är ju trots allt binär data. Det bästa är om du pluggar in dig på PDO och prepared statements - så slipper du oroa dig för SQL-injektioner också, som jag varnade för tidigare.

PDO på PHP.net.

Hampan90Medlem sedan feb. 2007137 inlägg
#15

Detta är nu löst efter lite hjälp av en vän :)

// Hampus

SPiNMedlem sedan mars 20007 896 inlägg
#16

Posta gärna lösningen om någon i framtiden har samma problem!

Hampan90Medlem sedan feb. 2007137 inlägg
#17

Jag la till denna kodsnutt:

$fileBinary = mysql_real_escape_string($fileBinary);

SPiNMedlem sedan mars 20007 896 inlägg
#18

Det är inte rätt väg att gå... Du escape:ar tecken i en sträng av binära tecken - som jag sa i ett tidigare inlägg. Läs in dig på PDO och prepared statements istället.

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)