Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapis/odczyt grafiki z bazy danych - wyświetlają się krzaczki
Forum PHP.pl > Forum > Przedszkole
Kisior
Witam wszystkich,

Piszę tego posta z prośbą o pomoc. Podjąłem się stworzenia od podstaw sklepu internetowego (znając tylko podstawy php i mysql). Wszystko dotychczas szło bardzo dobrze do czasu gdy natknąłem się na problem - dodanie zdjęcia produktu.

Szukałem informacji na temat dodawania zdjęć - i tutaj pierwsze pytanie: czy dodawać zdjęcia do bazy danych czy na serwer? czytałem różne opinie - w moim sklepie nie będzie więcej niż 1.000 produktów, a potrzebuję tylko zamieścić miniaturkę, dodam że zdjęcia produktu dodawać może tylko administrator. Z moich przemyśleń wynika że ładowanie zdjęć na serwer może być dużym problemem (nawiązywanie połączenia z serwerem, weryfikacja użytkownika no i sam sposób przesyłania pliku). Znalazłem więc stronę, gdzie opisano sposób dodawania obrazków do bazy jako typ BLOB : Dodawanie zdjęć do bazy. Stworzyłem więc sobie testową stronkę, żeby sprawdzić jak to działa - i tutaj totalna klapa - zawsze wyświetlają mi się same krzaczki. Myślałem że być może to problem z kodowaniem znaków (pracuję na Krasnalu i w bazie mam ustawione na latin1 i w żaden sposób tego nie mogę zmienić) więc zarejestrowałem sobie na szybko taki serwer: http://kisior.aq.pl/wyswietl.php - i korzystam z tamtejszej bazy gdzie kodowanie mam ustawione na utf8 - tak jak i na stronie www.
Czy ktoś mi pomoże? Proszę o jakieś wskazówki co robię źle, ewentualnie inną metodę na zapis i wyświetlanie obrazków.
Poniżej zamieszczam kod, jaki użyłem na tej stronie testowej:

plik upload1.html

<FORM ACTION="upload2.php" METHOD="POST" ENCTYPE="multipart/form-data">
<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="8388608">
<INPUT TYPE="FILE" NAME="plik" VALUE="" size="30">
<INPUT TYPE="SUBMIT" VALUE="Wczytaj">
</FORM>


plik upload2.php

if (isset($_FILES['plik']))
{
if ($_FILES['plik']['error']==UPLOAD_ERR_OK)
{
$filename=$_FILES['plik']['name'];//Nazwa wysłanego pliku
$filetype=$_FILES['plik']['type'];//Typ wysłanego pliku
$filesize=$_FILES['plik']['size'];//Rozmiar wysyłanego pliku
$filesrc=$_FILES['plik']['tmp_name'];//Ścieżka do pliku tymczasowego na serwerze

if ($filetype=="image/png" || $filetype=="image/x-png" || $filetype=="image/gif" || $filetype=="image/jpeg" || $filetype=="image/pjpeg")
{
$plik=fopen($filesrc,"r"); //otwórz ten plik w trybie do odczytu<BR>
$mysqlplik = addslashes(fread($plik,$filesize)); //odczytaj go do końca, dodaj znaki "\" przed apostrofami i cudzysłowami. Całość zapisz w zmiennej $mysqlplik
fclose($plik); //zamykamy plik
unlink($filesrc); //i kasujemy go, bo już nie jest potrzebny
$mysqlfiletype = addslashes($filetype); //dodajemy znaki "\" przed apostrofami i cudzysłowami do wartości zmiennej $filetype, w której został zdefiniowany typ MIME
//naszego pliku. Wynik zapisujemy w zmiennej $mysqlfiletype
$mysqlfilename = addslashes($filename); //dodajemy znaki "\" przed apostrofami i cudzysłowami do wartości zmiennej $filename, w której została zapisana nazwa naszego
//pliku. Wynik zapisujemy w zmiennej $mysqlfilename.

//Nawiązujemy połączenie z serwerem bazy MySQL
$conn=mysql_connect("mysql2.ph-hos.osemka.pl","user","pass")
or die ('Błąd połączenia z bazą MySQL: '.mysql_error());

//Wybieramy bazę w której mamy tabelę z polem blob<BR>
$result2=mysql_select_db("baza",$conn)
or die ('Błąd podczas wyboru bazy: '. mysql_error());

//Tworzymy zapytanie zapisujące do tabeli "obrazy" plik,<BR>
//w naszym przypadku obrazek, jego typ MIME, nazwę<BR>
//oraz rozmiar w bajtach.<BR>
$sql1="INSERT INTO obrazy (ID_obrazy,obrazek,typ,nazwa,rozmiar) VALUES ('','$mysqlplik','$mysqlfiletype','$mysqlfilename','$filesize')";

//Wykonujemy zapytanie $sql1<BR>
$result1=mysql_query($sql1,$conn)
or die ('Błąd wykonania zapytania 1: '. mysql_error());

}
else {die("Nieobsługiwany format pliku !!!"); exit;}
}
else {die("Błąd podczas wysyłania pliku !!!"); exit;}
}
else {die("Nie wskazano pliku do wysłania !!!"); exit;}

?>


plik wyswietl.php

$conn=mysql_connect("mysql2.ph-hos.osemka.pl","user","pass")
or die ('Błąd połączenia z bazą MySQL: '.mysql_error());

//Wybieramy bazę w której mamy tabelę z polem blob<BR>
$result1=mysql_select_db("baza",$conn)
or die ('Błąd podczas wyboru bazy: '. mysql_error());

$sql1="select * from obrazy where ID_obrazy='2'";
$result2=mysql_query($sql1,$conn)
or die ('Błąd wykonania zapytania 1: '.mysql_error());

//tworzymy tablicę asocjacyjną $row i wczytujemy do niej
//dane z wybranego rekordu tabeli. W naszym przypadku
//jest to rekord 1.
$row = mysql_fetch_assoc($result2);

//Z tablicy $row wydobywamy zawartość komórki "obrazek"<BR>
//i zapisujemy ją do zmiennej $grafika.<BR>
$grafika=$row['obrazek'];

//Na podstawie strumienia danych przechowywanych w polu BLOB,<BR>
//traktowanych w tej chwili jako ciąg znaków tworzymy obrazek<BR>
//w pamięci serwera i przypisujemy go do wskaźnika $obraz.<BR>
$obraz = imagecreatefromstring($row['obrazek']);


//Generujemy w przeglądarce obrazek, w tym przypadku JPG.<BR>
imagejpeg($obraz);

//Uwalniamy z pamięci wskaźnik $obraz.<BR>
//imagedestroy($obraz);
?>


a tutaj jeszcze plik wyswietl2.php z drugą metodą wyświetlania obrazka, który również nie działa:


<?php
ob_start();
//Nawiązujemy połączenie z serwerem bazy MySQL<BR>
$conn=mysql_connect("mysql2.ph-hos.osemka.pl","user","pass")
or die ('Błąd połączenia z bazą MySQL: '.mysql_error());

//Wybieramy bazę w której mamy tabelę z polem blob<BR>
$result1=mysql_select_db("baza",$conn)
or die ('Błąd podczas wyboru bazy: '. mysql_error());

//Tworzymy zapytanie wybierające z bazy MySQL zapisaną w niej<BR>
//zawartość wczytanego wcześniej pliku wraz z jego typem MIME,<BR>
//nazwą i rozmiarem.<BR>
$sql1="select * from obrazy where ID_obrazy='2'";

//Wykonujemy zapytanie $sql1<BR>
$result2=mysql_query($sql1,$conn)
or die ('Błąd wykonania zapytania 1: '.mysql_error());

//tworzymy tablicę asocjacyjną $row i wczytujemy do niej<BR>
//dane z wybranego rekordu tabeli. W naszym przypadku<BR>
//jest to rekord 1.<BR>
$row = mysql_fetch_assoc($result2);

//Z tablicy $row wydobywamy zawartość komórki "obrazek"<BR>
//i zapisujemy ją do zmiennej $grafika.<BR>
$grafika=$row['obrazek'];

//Z tablicy $row wydobywamy zawartość komórki "typ"<BR>
//i zapisujemy ją do zmiennej $typpliku.<BR>
$typpliku=$row['typ'];

//Wysyłamy do przeglądarki nagłówek HTTP, informujący<BR>
//przeglądarkę że wynik który za chwilę wyświetlimy to<BR>
//obrazek w formacie określonym przez zmienną $typpliku.<BR>
header("Content-type:$typpliku");

//Drukujemy zawartość zmiennej $grafika,<BR>
//czyli wyświetlamy zawartość naszego obrazka<BR>
print $grafika;
ob_end_flush();
?>
Majzok
Tak rzucając okiem na szybkiego. Na pewno masz błędy w plikach które wyświetlają: w pierwszym masz krzaki, bo nie masz wywołanego header'a
header("Content-type:$typpliku"); <- to linijka z pliku nr 2 i o nią chodzi. Jak nie zdefiniujesz rodzaju wyświetlanego pliku, to przeglądarka przedstawi go jako tekst, a nie obrazek.
W drugim pliku masz jakieś herezje, ob_start(); cały output przechwytuje i nic nie pokazuje, więc print $grafika; zamiast się wyświetlić na ekranie, to wrzucane jest do bufora.

No i kolego chyba złe forum, bo Ty nie masz problemu z bazą, lecz ze skryptem.
thek
Pierwszy post i od razu naruszenie regulaminu w kilku punktach. Niewłaściwy dział i brak bbcode to chyba najbardziej rzucające się w oczy... Przenoszę do Przedszkola i zamykam. Moderatorzy otworzą jeśli poprawisz bbcode. A żeby nie było, że tylko się czepiam, to odpowiedzią na 90% jest brak wspomnianego headers przy wysyłaniu obrazka do przeglądarki...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.