Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Wyświetlanie zdjęcia po ścieżce (path)
Forum PHP.pl > Forum > Przedszkole
Yoozer
Witam
Na wstępie chcę zaznaczyć, że wykorzystane skrypty nie są mojego autorstwa są jedynie przerobione pod bazę z której korzystam. Pochodzą z różnych źródeł.

Mam już stworzoną bazę, wyświetlanie rekordów, dodawanie przez formularz.

Najpierw przedstawię trochę kodu, aby było wiadomo o co chodzi.
Formularz dodawania zdjęć:
  1. <form method="post" enctype="multipart/form-data">
  2. <table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
  3. <tr>
  4. <td width="246">
  5. <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
  6. <input name="userfile" type="file" id="userfile">
  7. </td>
  8. <td width="80"><input name="upload" type="submit" class="box" id="upload" value=" Upload "></td>
  9. </tr>
  10. <p> </p>
  11. </form>

Skrypt dodający dane zdjęcia (typ, ścieżkę itp.) do Bazy MySQL:
  1. <?php
  2. require "connection.php";
  3. connection();
  4. $uploadDir = 'C:/serwer/strony/uploads/';
  5. if(isset($_POST['upload']))
  6. {
  7. $fileName = $_FILES['userfile']['name'];
  8. $tmpName = $_FILES['userfile']['tmp_name'];
  9. $fileSize = $_FILES['userfile']['size'];
  10. $fileType = $_FILES['userfile']['type'];
  11. $filePath = $uploadDir . $fileName;
  12. $result = move_uploaded_file($tmpName, $filePath);
  13. if (!$result) {
  14. echo "Error uploading file";
  15. }
  16. {
  17. $fileName = addslashes($fileName);
  18. $filePath = addslashes($filePath);
  19. }
  20. $query = "INSERT INTO upload2 (name, size, type, path ) ".
  21. "VALUES ('$fileName', '$fileSize', '$fileType', '$filePath')";
  22. mysql_query($query) or die('Error, query failed : ' . mysql_error());
  23. echo "<br>Files uploaded<br>";
  24. }
  25. ?>

Formularz dodający rekordy:
  1. <form action="logowanie_udane.php" method="post">
  2. <span class="styllog">Nazwa:<br /></span>
  3. <input type="text" name="Nazwa" /><br />
  4. <span class="styllog">Typ:<br /></span>
  5. <input type="text" name="Typ" /><br />
  6. <span class="styllog">Opis:<br /></span>
  7. <textarea name="Opis" cols="60" rows="3"></textarea>
  8. <br />
  9. <input type="submit" value="dodaj" name="main" />
  10. </form>

Skrypt dodający rekordy do bazy:
  1. <?php
  2. // odbieramy dane z formularza
  3. $Nazwa = $_POST['Nazwa'];
  4. $Typ = $_POST['Typ'];
  5. $Opis = $_POST['Opis'];
  6. if($Nazwa and $Typ and $Opis) {
  7.    $connection = @mysql_connect('localhost', 'admin', 'admin')
  8.    or die('Brak połączenia z serwerem MySQL');
  9.    $db = @mysql_select_db('energomex', $connection)
  10.    or die('Nie mogę połączyć się z bazą danych');
  11.    $ins = @mysql_query("INSERT INTO stacje_trafo SET Nazwa='$Nazwa', Typ='$Typ', Opis='$Opis'");
  12.    $id = mysql_insert_id();
  13.    if($ins) echo '<font color="#fff">Rekord o ID: '.$id.' został dodany poprawnie</font>';
  14.    else echo 'Błąd nie udało się dodać nowego rekordu';
  15.    mysql_close($connection);
  16. }
  17. ?>

Wreszcie wyświetlenie rekordów z bazy w tabeli:
  1. <?php
  2. $wynik = mysql_query("SELECT * FROM stacje_trafo")
  3. or die('Błąd zapytania');
  4. if(mysql_num_rows($wynik) > 0) {
  5.    echo "<table cellpadding=\"2\" border=1 align=center bgcolor=#FAFAFA>";
  6.    echo "<tr>";
  7.    echo "<th>".Nazwa."</th>";
  8.    echo "<th>".Typ."</th>";
  9.    echo "<th>".Opis."</th>";
  10.    echo "</tr>";
  11.    while($r = mysql_fetch_array($wynik)) {
  12.        echo "<tr>";
  13.        echo "<td>".$r[1]."</td>";
  14.        echo "<td>".$r[2]."</td>";
  15.        echo "<td>".$r[3]."</td>";
  16.        echo "<td>
  17.       <a href=\"logowanie_udane.php?a=del&id_stacje={$r[0]}\">DEL</a>
  18.       <a href=\"logowanie_udane.php?a=edit&id_stacje={$r[0]}\">EDIT</a>
  19.       </td>";
  20.        echo "</tr>";
  21.    }
  22.    echo "</table>";
  23. }
  24. $id = trim($_GET['id_stacje']);
  25. if($a == 'del' and !empty($id)) {
  26.    mysql_query("DELETE FROM stacje_trafo WHERE id_stacje='$id'")
  27.    or die('Błąd zapytania: '.mysql_error());
  28.    echo '<font color="#fff"> Rekord został usunięty z bazy </font>';
  29. }
  30. ?>

Zdjęcie jest dodawane do katalogu "uploads/", dane o zdjeciu sa wpisywane jako kolejny rekord w tabeli "upload2"
dodatkowe rekordy do bazy w tabeli "stacje_trafo" są dodawane oddzielnym formularzem
Jak umożliwić wyświetlanie zdjęć ?

1. Czy zlikwidować dodatkową tabelę ze zdjęciami "upload2"? i zamiast tego upychać zdjęcia w kolumnie bez dodatkowych zmiennych jedynie samo "Path" w odpowiedniej tabeli - "stacje_trafo" ?
2. Czy mogę wykorzystać istniejącą już tabelę ze zdjęciami "upload2" ?
3. Stworzyć następną kolumnę za "Opis" ? która będzie przekierowaniem do skryptu wyświetlającego zdjęcia przypisane po ID ?

Proszę o pomoc, jeśli ktoś nie ma czasu to proszę o kontakt ze mną i możemy się dogadać.
TheaSiX
Myślę, że warto byłoby dodawać wszystko w jednym formularzu.

Zapytam jeszcze dlaczego potrzebne są Ci te wszystkie informacje o plikach. NAME, SIZE, TYPE, PATH

Jeśli umieszczasz wszystkie zdjęcia w jednym folderze to przy później można je wyświetlać po nazwie. Przy zachowaniu odpowiedniego nazewnictwa oszczędza się dużo czasu. Np. każdemu plikowi nadawać NAME takie jak NAZWA (w polu input) i wtedy możesz zrezygnować i z NAME i PATH (jeśli ścieżka jest zawsze ta sama).
Przykład?

Wybierasz informacje o danym rekordzie i tak:

  1. <?php
  2. $result = mysql_query("SELECT * FROM twoja_tabela");
  3. while($row = mysql_fetch_array($result))
  4. {
  5.    $nazwa = $row["nazwa"];
  6.    $dir = "C:/serwer/strony/uploads/";
  7.    $dir .= $nazwa;
  8.    $dir .= ".jpg";
  9.    print "<img src=\"$nazwa\">";
  10. }
  11. ?>


Wtedy nie musisz martwić się o wyciąganie nazw plików z bazy etc. Chyba, że będzie przypadek, ze dwie nazwy będą identyczne, a zdjęcia takie same. Ale nie podałeś takiej informacji.

Jeśli jednak zostajesz przy swojej metodzie to czy masz w tabeli ze zdjęciami pole nazwa_id lub cokolwiek co by łączyło obie tabele?
Yoozer
Wszystkie te informacje o plikach (NAME, SIZE itp) tak jak mówisz są zbędne, więc postaram się to zmodyfikować, ale tu nasuwa się pytanie:
czy mogę zrezygnować z tabeli ze zdjęciami i umieścić jedynie jedną informację o ścieżce do zdjęcia w istniejącej już tabeli jako następna kolumna?

Ścieżka będzie zawsze ta sama, nazwy plików zawsze inne i dlatego tak jak mówisz najlepiej pobierane z input'a.
Czy masz dostępny jakiś przykład odnośnie tego zagadnienia ? - input ?
Wybacz, ale nie jestem dobry w pisaniu własnych inwencji i na razie opieram się na twórczości innych.
Spróbuję wykorzystać to co mi podpowiedziałeś.
TheaSiX
tak możesz wyświetlać obraz opierając się tylko na polu NAZWA (nie musisz nawet mieć dodatkowej kolumny w tabeli, chyba, że kolejny warunek o którym piszę nie będzie spełniony), ale musisz być pewien, że NAZWA nigdy się nie powtórzy, albo gdy się powtórzy to będzie do niej przypisany ten sam obraz.

Teoretycznie wygląda to tak:

1. w input wstawiasz daną nazwę
2. dodajesz plik
3. wysyłasz wszystko POSTem do pliku wykonującego polecenia
4. pobierasz wszystkie dane
5. przy obsłudze pliku - przenosisz go do danego folderu zmieniając jego nazwę
6. wstawiasz informacje do bazy

i wyświetlanie już tak jak napisałem wyżej. Wszystko jest naprawdę sprawne, ale tylko jeśli to co napisałem na początku tego posta weźmiesz pod uwagę.

spróbuj coś wymyślić, jak Ci się nie uda to po powrocie z pracy pokażę Ci przykład, który używam na swojej stronie..
Yoozer
Ok zrobiłem, ale jest problem ponieważ ścieżka path jest zapisywana w innym rekordzie - chyba problem tkwi w dodawaniu do bazy... trzeba to jakoś przypisać do danego rekordu, może po ID ?
Formularz dodawania:
  1. <form action="logowanie_udane.php" method="post" enctype="multipart/form-data">
  2. <p><span class="styllog">Nazwa:<br /></span>
  3. <input type="text" name="Nazwa" />
  4. <br />
  5. <span class="styllog">Typ:<br /></span>
  6. <input type="text" name="Typ" />
  7. <br />
  8. <span class="styllog">Opis:<br /></span>
  9. <textarea name="Opis" cols="60" rows="3"></textarea>
  10. <span class="styllog"><br />Dodaj Zdjęcie (max 2048kb):<br /></span>
  11. <input type="file" name="userfile" id="userfile" />
  12. <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
  13. <br />
  14. <input name="upload" type="submit" class="box" value="Załaduj" />
  15. </p>
  16. </form>


EDIT: Poprzedni problem naprawiony
Rozwiązanie:
  1. <?php
  2. $Nazwa = $_POST['Nazwa'];
  3. $Typ = $_POST['Typ'];
  4. $Opis = $_POST['Opis'];
  5. require "connection.php";
  6. connection();
  7. $uploadDir = 'C:/serwer/strony/uploads/';
  8. if(isset($_POST['upload']))
  9. {
  10. $fileName = $_FILES['userfile']['name'];
  11. $tmpName = $_FILES['userfile']['tmp_name'];
  12. $filePath = $uploadDir . $fileName;
  13. $result = move_uploaded_file($tmpName, $filePath);
  14. if (!$result) {
  15. echo "Error uploading file";
  16. }
  17. {
  18. $fileName = addslashes($fileName);
  19. $filePath = addslashes($filePath);
  20. }
  21. echo '<font color="#fff">Plik przesłany: '.$filePath.', Nazwa: '.$fileName.'</font>';
  22. }
  23. if($Nazwa and $Typ and $Opis)
  24. {
  25.    $ins = @mysql_query("INSERT INTO stacje_trafo SET Nazwa='$Nazwa', Typ='$Typ', Opis='$Opis', Zdjecie_stacje='$filePath'");
  26.    $id = mysql_insert_id();
  27.    if($ins) echo '<font color="#fff">Rekord o ID: '.$id.' został dodany poprawnie</font>';
  28.    else echo 'Błąd nie udało się dodać nowego rekordu';
  29.    mysql_close($connection);
  30. }
  31. ?>


EDIT2:
Teraz biorę się za wyświetlenie tego zdjęcia... jednak jestem troche zielony z tego jak to zrobić
moja nie udana próba:

  1. <?php
  2. require "connection.php";
  3. connection()
  4. $result = mysql_query("SELECT * FROM stacje_trafo");
  5. while($row = mysql_fetch_array($result))
  6. {
  7.   $nazwa = $row["Zdjecie_stacje"];
  8.   $dir = "C:/serwer/strony/uploads/";
  9.   $dir .= "$nazwa";
  10.   $dir .= ".jpg";
  11.   echo "<img src='$nazwa'>";
  12. }
  13. ?>

[27-May-2009 20:35:05] PHP Parse error: parse error in C:\serwer\strony\view.php on line 12
Line 12: $result = mysql_query("SELECT * FROM stacje_trafo");
Może ktoś pomóc z wyświetleniem tego ?
TheaSiX
  1. <?php
  2. echo "<img src='$dir'>";
  3. ?>


A tak działa?
Yoozer
Nie, to samo Parse Error w linii 12
erix
Średnik zjadłeś w jednej linii...
TheaSiX
w 4 linii zapomniałeś ";"

  1. <?php
  2. connection()
  3. ?>


linia 12 ale którego pliku, bo podzieliłeś kod na kilka bloków i nie wiem do czego błąd się odnosi
Yoozer
Dziękuję. Mimo zaprzestania generowania błędu składniowego, zdjęcie nadal się nie wyświetla.
Sprawdziłem kolumnę w bazie czy jest tak samo nazwana, małe duże litery.
Dodałem:
header("Content-type: image/jpg");
zamiast pustej kartki teraz wyświetla: "http://127.0.0.1/view.php"

EDIT: tak srednik w connection() zjadłem - już zmienione ale nadal pusto, brak błędów
TheaSiX
Czy jak ładujesz plik to pojawia się on na serwerze? Jaka jest jego nazwa? Czy jest taka sama jak wynik nazwy z bazy? Jeśli możesz. Pokaż przykładowy wpis do bazy + plik dołączany do niego i opisz rzeczy, które napisałem wyżej..
Yoozer
Cytat(TheaSiX @ 28.05.2009, 01:00:49 ) *
Czy jak ładujesz plik to pojawia się on na serwerze? Jaka jest jego nazwa? Czy jest taka sama jak wynik nazwy z bazy? Jeśli możesz. Pokaż przykładowy wpis do bazy + plik dołączany do niego i opisz rzeczy, które napisałem wyżej..
Tak plik pojawia się na serwerze w katalogu uploads.
Nazwa jego pozostaje nie zmieniona czyli oryginalna, jest taka sama jak w bazie.
Plik dołączany do bazy - 117KB

TheaSiX
jeśli folder jest zawsze taki sam nie ma sensu do bazy wstawiac

Cytat
C:/serwer/strony/uploads

Możesz to dodawać przy wyświetlaniu.

przy tym kodzie co podałem parę postów wyżej.. wpisz
  1. <?php
  2. print "$nazwa";
  3. ?>

I powiedz czy w ogóle wypluwa zmienną
Yoozer
Tak wydrukował zmienną $nazwa z wszystkich rekordów:
C:/serwer/strony/uploads/berwick2.jpgC:/serwer/strony/uploads/dane_tech_trafo.jpgC:/serwer/strony/uploads/plock.jpg
tak to wygląda

Proszę o szybką podpowiedź w sprawie pokazania tego zdjęcia ... bardzo mi na tym zależy

EDIT: tak zmienie to aby zapisywał samą nazwę w bazie bez sciezki, ale zależy mi na wyswietleniu tego
TheaSiX
zrób jakąś stronę np. test.html i wpisz tam
  1. <img src="berwick2.jpg" alt="1">
  2. <Br><br>
  3. <img src="C:/serwer/strony/uploads/berwick2.jpg" alt="2">


i powiedz czy wyświetla wtedy jakikolwiek obrazek, a jeśli tak to którym sposobem
Yoozer
Nie wyświetliło, żadnym sposobem sadsmiley02.gif - zmieniłem na berwick1.jpg, taki mam plik w /uploads/
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Untitled Document</title>
  5. </head>
  6. <img src="berwick1.jpg" alt="1">
  7. <Br><br>
  8. <img src="C:/serwer/strony/uploads/berwick1.jpg" alt="2">
  9. </body>
  10. </html>

EDIT: po zmianie content na image/jpg tez nie wyświetla
nospor
no ale do obrazka w <img> nie mozna podawac sciezki jak do pliku na dysku. To ma byc sciezko do zasobu www, czyli nie:
C:/serwer/strony/uploads/berwick1.jpg
a:
uploads/berwick1.jpg
albo
strony/uploads/berwick1.jpg
(nie wiem co jest u ciebie rootem, stad te "albo")
Yoozer
Ok działa:
<img src="uploads/berwick1.jpg">
Mam jeszcze jedno pytanie odnośnie wyświetlania tego, jak zrobić żeby w tabeli gdzie wyświetlam rekordy znajdował się link do obrazka w danym rekordzie ?
TheaSiX
masz na myśli zwykły:
  1. <a href="uploads/berwick1.jpg"></a>
?
Yoozer
Tak, tylko w wyświetlaniu bazy zamiast rekordu numer 4, tak jak jest teraz:
echo "<td>".$r[4]."</td>";
EDIT:
  1. <?php
  2. echo "<td>
  3.        <a href=\"view.php?a=photo&Zdjecie_stacje={$r[0]}\">Photo</a>
  4.           <a href=\"logowanie_udane.php?a=del&id_stacje={$r[0]}\">DEL</a>
  5.           <a href=\"logowanie_udane.php?a=edit&id_stacje={$r[0]}\">EDIT</a>
  6.           </td>";
  7. ?>

Jest link tylko nie wiem czy idę w dobrą stronę z tym ? pobiera mi teraz id rekordu.
Teraz muszę dorobić funkcję if($a =='photo') tak jak z DEL'etem ?
Próbuję, ale nie wychodzi mi nic. Czy da się to jakoś inaczej? bo czuję, że chcę "pokrętną" drogą.
TheaSiX
  1. <?php
  2. $id_s = $r["0"];
  3. print "<a href=\"logowanie_udane.php?a=del&id_stacje=$id_s\">EDIT</a>";
  4. ?>


no i w pliku logowanie_udane

  1. <?php
  2. $a = $_GET["a"];
  3. $id_s = $_GET["id_stacje"];
  4. if($a == "edit" && $id_s != "")
  5. {
  6. }
  7. ?>


spróbuj zrobić analogicznie dla usuwania.. by plik zniknął z serwera użyj unlink() co do edita to musiałbyś pobierać jeszcze NAZWE co by nadpisywało plik..
Yoozer
OK, najpierw wyświetlanie bo to nadal nie działa jedynie jak wpisałem kod html do konkretnego pliku to wyswietlił plik, jak podał nospor.
Zmieniłem dodawanie rekordu w bazie sql'a na samą nazwę gdzie jest "berwick1.jpg"
TheaSiX: Ten sposób nie pobiera id rekordu, próbowałem z nim zrobić następny DEL2 (do usuwania) ale nie działa przez to pewnie, że nie widać id rekordu.
  1. <?php
  2. $id_s = $r["0"];
  3.   echo "<td>
  4.    <a href=\"logowanie_udane.php?a=del2&id_stacje=$id_s\">del2</a>
  5.           </td>";
  6. ?>

Jednak bardziej w tym momencie zależy mi na wyświetleniu.
Moja nieudana próba wyświetlenia zdjęcia w danym rekordzie (pobiera id) Chyba już konkretnie namieszałem proszę najpierw o pomoc z wyświetleniem tego.
plik logowanie_udane.php:
  1. <?php
  2. echo "<td>
  3.        <a href=\"view.php?a=photo&Zdjecie_stacje={$r[0]}\">Photo</a>
  4.           <a href=\"logowanie_udane.php?a=del&id_stacje={$r[0]}\">DEL</a>
  5.           <a href=\"logowanie_udane.php?a=edit&id_stacje={$r[0]}\">EDIT</a>
  6.        </td>";
  7. ?>

EDIT: Teraz nie wiem jak zacząć w view.php -
Już się zamotałem z tym wyświetleniem... :( wyświetlanie w html działa tak: <img src="uploads/berwick1.jpg">
analogicznie w php to: echo "<img src='uploads/berwick1.jpg'>"; i ok działa,
ale jak zrobić ten link do zdjęcia w każdym rekordzie, poprzez id + warunek if w tym samym pliku ? czy id + rezultat w drugim pliku fetch_array'em ?
TheaSiX
link do zdjęcia? czyli te dwa EDIT i DEL ?

jeśli $r[0] jest pobierana poprawnie to w czym problem?

podałem Ci wyżej jak pobrać metodą GET id, a potem pozostaje reszta kodu usuwająca wpis w bazie i plik na serwerze
Yoozer
Cytat(TheaSiX @ 29.05.2009, 17:52:04 ) *
link do zdjęcia? czyli te dwa EDIT i DEL ?
jeśli $r[0] jest pobierana poprawnie to w czym problem?
podałem Ci wyżej jak pobrać metodą GET id, a potem pozostaje reszta kodu usuwająca wpis w bazie i plik na serwerze


Nie, chodzi mi o przekierowanie na drugą stronę i wyświetlenie zdjęcia. Czyli link do niego (chyba, że jest inny lepszy sposób na wyświetlenie zdjęcia). Zawsze, żeby był dopisywany nowy po dodaniu nowego rekordu.
Ta metoda, którą podałeś nie pobiera $r['0'];
  1. <?php
  2. $id_s = $r["0"];
  3.  echo "<td>
  4.   <a href=\"logowanie_udane.php?a=del2&id_stacje=$id_s\">del2</a>
  5.          </td>";
  6. ?>

[29-May-2009 20:24:05] PHP Notice: Undefined variable: r in C:\serwer\strony\logowanie_udane.php on line 147
#147: $id_s = $r["0"];

EDIT:
Już myślałem, że rozum mnie opuścił, ale dałem radę z wyświetleniem poprzez link.
w logowanie.php:

  1. <?php
  2. while($r = mysql_fetch_array($wynik))
  3.    {
  4.        $image1 = $r[4];
  5.                echo "<td>
  6.        <a href=\"/uploads/$image1\">Zdjęcie1</a>
  7. </td>";
  8. ?>


Zrobiłem usuwanie pliku, ale nie działa:
  1. <?php
  2. <a href=&#092;"logowanie_udane.php?a=del&id_stacje={$r[0]}\">DEL</a> //link oczywiscie,  do kodu takiego jak u góry
  3.  
  4. $a = $_GET["a"];
  5. $id = trim($_GET['id_stacje']);
  6. $image1 = $_GET["Zdjecie_stacje"];
  7. if ($a =='del' and !empty($id))
  8.    {
  9.  !unlink($image1)
  10.  echo '<font color="#fff"> Plik: '.$image1.' został usunięty z bazy </font>';
  11.  }
  12. else
  13.  {
  14.  echo '<font color="#fff"> Błąd przy usuwaniu pliku: '.$image1.' </font>';
  15.  }
  16. ?>

Czy mam to robić w oddzielnej funkcji if niż usuwanie rekordów ? czy można to podpiąć pod poprzednią ?
TheaSiX
To zależy.. możesz zrobić ogólne usuwanie całego rekordu (dane + plik) chyba, że dopuszczasz możliwość, że będziesz chciał usunąć plik, ale nie dane. Wtedy trzeba to zrobić w oddzielnych funkcjach.

  1. <?php
  2. !unlink($image1)
  3. ?>


----->
  1. <?php
  2. unlink($image1);
  3. ?>


i jak teraz?
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.