ugrás a tartalomhoz

Privát üzenetekhez fájlok csatolása

Anonymous · 2006. Júl. 22. (Szo), 09.59
Hello
Üzentett küldök PHP segitségével egy másik felhasználonak. Az üzenteket mySQL adatbázisban tárolom.

Az üzentett küldést úgy képzeljétek el mint egy forúmon történő private messaginget. Minden felhasználó aki üzenettet küld vagy kap tagja az oldalnak.

Szeretnék az üzenett mellé csatolni egy fájlt ami max. 2MB legyen, nem több.
Nem akarok hüjeséget kérdezni de mySQL-ben semmi képen nem tudok fájlokat
tárolni, vagy nem ajánlott ?

Milyen megoldást tudnátok mondani ? Köszi
 
1

Megoldás + helyesírás

janoszen · 2006. Júl. 22. (Szo), 10.09
1. A hüjeséget még mindíg LY-os J-vel írják.
2. Ha már ott tartasz, hogy adatbázisban tárolod az üzit, vegyél fel mellé egy BLOB mezőt és told bele abba a fájlt.
2

kerdes

Anonymous · 2006. Júl. 22. (Szo), 10.15
Ok, ha BLOB ként tárolom, és például 3-4 user kap fájlt nem lesz túl nagy méretű az adatbázis ?
3

Így is, úgy is

janoszen · 2006. Júl. 22. (Szo), 10.33
Hát figy, vagy az adatbázis lesz nagy, vagy a lemezterület. Lehet választani. :D
4

adatbázis

Anonymous · 2006. Júl. 22. (Szo), 10.47
El szeretném kerülni az adatbázisban való tárolást. Bár ha BLOB ként tárolonám minden usernek beszúrom a fájlt a saját mezőjébe.

Ha lemezterületen tárolom honnan tudja a user melyik fájl lett éppen neki küldve?
5

Szerintem

Anonymous · 2006. Júl. 22. (Szo), 12.06
A. Ne tárolj adatot többszörösen. Szerintem használj egy files táblát, ebbe tárold a fájlokat, az eddigi táblában meg csak azt kell az egyes üzenetekhez tárolni, melyik fájl ment neki.
B. Ha lemezen tárolod a fájlokat, akkor adatbázisba a fájl elérési helyét tárold.
6

Koszi

Anonymous · 2006. Júl. 22. (Szo), 12.28
Koszonom !
Találtam egy elégé jó leirást a következő cimen : http://php.about.com/od/phpwithmysql/ss/Upload_file_sql.htm

Megcsináltam mindent ahogy a lap ir és müködik.

A fájl a lemezen van tárolva, csak a fájl neve kerül be az adatbázisba.

Lehet, hogy láma kérdést teszek fel de, hogyan tudnék több fájlot küldeni, mindegyik fájl nevének kell egy külön mezöt csinálni ?

Köszönom a sok tanácsot '
7

array

dOMiNiS · 2006. Júl. 22. (Szo), 15.16
tarold tombben a fileneveket.
10

szérializáld ilyenkor

Joó Ádám · 2006. Júl. 25. (K), 17.12
Ehhez nézz utána a kézikönyvben a serialize() függvénynek.
31

mindig

Anonymous · 2006. Aug. 8. (K), 11.25
(A mindiget mindig rövid i-vel írják.)
8

3 tábla

Anonymous · 2006. Júl. 22. (Szo), 15.28
használj 3 táblát, egy az üzeneteknek, egy amiben összekapcsolod az üzenet azonosítóját a file azonosítójával (így lehet egy üzenethez több file-t tenni), egy táblát meg a file-oknak


BL
9

Kosz

Anonymous · 2006. Júl. 25. (K), 16.24
Jelenleg van ket tablam.

messages :

id   | kuldo   |   uid    | message
-------------------------------------
1    | andras  |    1     | hello   
2    | andras  |    1     | hello
3    | andras  |    1     | hello
files :

msg_id   | name      |  size  | type
-------------------------------------------
1        | photo.jpg | 3358   | image/jpeg   
3        | photo.jpg | 2103   | image/jpeg
Az elso tablaban (messages) van tarolva minden uzenett.
Az UID-ba kerul annak a usernek a szama akinek az uzenett lesz kuldve.
Ahogy fent latszik az 1-es szamu felhasznalo 3 uzenettet kap.

A masodik tablaban (files) a msg_id annak az uzenetnek az ID-jet tartalmaza amelyhez hozza van csatolva egy fajl.
Ebbol az derul ki, hogy az elso es harmadik uzenet tartalmaz egy fajlt, de a masodik uzenett nem tartalmaz fajlt.

Milyen modon tudnam most kiolvasni ezeket az uzeneteket, es csak azoknal az uzeneteknel legyen fajl amelyekhez lett kuldve (a peldaban elso es harmadik uzenett).

Kerem segitsetek, elege surgos lenne.
Kosznom !
11

Jó lesz

janoszen · 2006. Júl. 25. (K), 17.22
Ez így jó is lesz. Így tudod lekérni az üzeneteket:

SELECT id, kuldo, message FROM messages WHERE uid=olvasoidje
Aztán lekéred a csatolmányok listáját is:

SELECT name, size, type FROM files WHERE msg_id=azelöbbkiolvasottid
Ez volt a kérdés?
12

ok

Anonymous · 2006. Júl. 25. (K), 18.12
megoldottam a kovetkezo koddal

while ($row = mysql_fetch_array ($data)) {
print "<h4>From: {$row['kuldo']}<br /></h4>{$row['message']}<br />";   
$data2 = mysql_query("SELECT * FROM files WHERE msg_id={$row['id']}"); 

while ($row2 = mysql_fetch_array ($data2)) {
print "<a href=\"files/{$row2['name']}\">{$row2['name']}</a><br />";
} 

print "<a href=\"deletemsg.php?id={$row['id']}\">Uzenet torlese</a>";
}
13

Egy maisk problema.

Anonymous · 2006. Júl. 25. (K), 18.29
Lenne egy masik problema, ezutal az utolso is. Szeretnek egy kis segitseget kerni.

Mindegyik fajl amit egy felhasznalo kuld egy files nevu folderbe kerul a szerveren.

Peldaul User1 elkuldni User2-nek a photo.jpg fajlt. Jon User3 es o is elkuldi ugyanazt a fajlt (photo.jpg) User4-nek.

Az uj photo.jpg felulirja a regit.

Most gondolom azt lehetne megoldani, hogy minden kuldesnel egy random erteket szurok a photo.jpg ele. Peldaul : gs4gaphoto.jpg

Azt, hogy lehet megoldani, hogy amikor a felhasznalo letolti a fajlt a browszerben a random ertek nelkul toltse le, ugy mintha ott sem lett volna a random ertek?

Varok mindenfele otletett.
Koszonom !
14

Egyszerű

janoszen · 2006. Júl. 25. (K), 18.32
Elvileg kellett volna csinálnod a files táblába is egy ID mezőt INT PRIMARY KEY AUTO_INCREMENT deklarációval. A fájlokat meg ne az igazi fájlnevükkel tárold el, hanem az IDjükkel. Ergo, ilyen fájljaid lesznek, hogy 1,2,3,4... stb.

Aztán amikor kiszolgálod őket, akkor az igazi nevük szerint szolgálod ki. Közvetlenül ugye, meg nem adsz linket a fájlokra, mert akkor bárki bármilyen fájlokat megnyithat, még olyat is, ami nem az övé.
15

ok

Anonymous · 2006. Júl. 25. (K), 18.46
Letezik egy ID nevezetu mezo is a files tablaban INT PRIMARY KEY AUTO_INCREMENT deklaracioval.

A fajlokat link kent kuldom at. Kerlek nezd meg fent amit beszeltem a kolegaval, ott van egy pelda, egy $row['name']-en keresztul olvasom ki a file nevet.

Tudnal esetleg valami jobbat ajanlani ? Ha reszletesen leirod nem lenne rossz, kicsit kezdo vagyok.

Koszonom !
16

elnezest

Anonymous · 2006. Júl. 25. (K), 18.54
ok, elnezest fent is veled beszeltem :) csak valamiert elneztem
17

Link helyett...

janoszen · 2006. Júl. 25. (K), 18.59
Nézd meg az állományok kiszolgálása PHP-ből c. cikket.
18

kosz

Anonymous · 2006. Júl. 25. (K), 19.20
elolvastam nagyabol de nem latok olyasmit amire nekem szuksegem lenne.
19

Olvasd el még egyszer.

janoszen · 2006. Júl. 25. (K), 19.24
Akkor olvasd el még egyszer. Ugyanis ez pontosan arról szól, amire Neked szükséged van. Ugyanis Te állományokat akarsz kiszolgálni PHPből.

Ha kész kódot vártál az adott címen, akkor valóban nem arról szól, amire gondoltál. Azt ugyanis Neked kell megírni.
20

ID-k

janoszen · 2006. Júl. 25. (K), 19.26
Ami pedig az IDket illeti, a fájlok felvitelénél kapsz vissza egy id-t (last id-t le lehet kérdezni) és az lesz a file neve. Semmi kiterjesztés, csak egy szám. És utána PHPból kiszolgálod azt az állományt.
21

join

Hodicska Gergely · 2006. Júl. 25. (K), 22.25
A fenti helyett illendő lenne egy joinos queryt használni.


Felhő
22

Kezdő

janoszen · 2006. Júl. 25. (K), 22.33
Bocsánat, teljesen jogos a felvetés, de szted egy kezdő megértené a joinos queryt? Nekem is beletellett egy időbe, amíg átestem a tűzkeresztségen a komplexebb querykkel.
23

nem olyan bonyi

Hodicska Gergely · 2006. Júl. 26. (Sze), 08.02
szted egy kezdő megértené a joinos queryt? Nekem is beletellett egy időbe, amíg átestem a tűzkeresztségen a komplexebb querykkel

Szerintem a join igazán nem olyan bonyolult valami. Persze nem árt kicsit utánaolvasni, leginkább azzal lehet gond, hogy nem lesz elég gyors megfelelő indexek hiányában. Ökölszabályként lehet azt mondani, hogy az jó, hogy ha az összekapcsolás feltételében szereplő mindkét mezőn van index.


Felhő
24

Lassabb

Joó Ádám · 2006. Júl. 26. (Sze), 10.25
Magam is olvastam, hogy érdemesebb inkább több, egyszerű lekérdezést csinálni, mint joinost, mivel az lassabb. Megfelelő indexeléssel elérhető ugyanaz a sebesség?
25

Nem olyan egyértelmű

janoszen · 2006. Júl. 26. (Sze), 10.29
Az a baj, hogy ez nem olyan egyértelmű, mert a PHP-MySQL oda-visszának is van egy overheadje. Ha ilyen szinten optimalizálni kell, akkor esetenként kell eldönteni. De miután itt szemmel láthatólag nem egy olyan hatalmas terhelésről lesz szó, sztem úgy csinálja meg, ahogy neki egyszerűbb, mert a karbantartásra is gondolni kell.
26

általában nem lassabb

Hodicska Gergely · 2006. Júl. 26. (Sze), 14.07
A legtöbb esetben egy JOIN jóval gyorsabb lesz, csak figyelni kell, hogy használjon indexeket, amit ellenőrizni tudsz az EXPLAIN paranccsal, plusz sokszor nem mindegy a táblák összekapcsolásának sorrendje sem.


Felhő
27

link

Anonymous · 2006. Aug. 7. (H), 22.29
A felhasznalo a kov. keppen tolt le egy fajlt :

"http://www.mypage.com/attachment.php?d=fajlneve"

A fenti linket egy login.php lapon eri el a felhasznalo. Szoval rakatint a "http://www.mypage.com/attachment.php?d=fajlneve" cimre a login.php lapon.

Sajnos a linket elerheti szimplan is, csak belep a browszerben es elkuldi a kovetkezot: "http://www.mypage.com/attachment.php?d=fajlneve" akkor mar tolti is a fajlt.

Hogyan tudom megcsinalni, hogy csak a login.php laprol tudja a linket lekerni, ha szimplan keri le akkor egy hiba uzenet fogadja ?

Koszonom !
28

ne fájlnévvel

Marcell · 2006. Aug. 8. (K), 00.01
http://www.mypage.com/attachment.php?d=fajlneve
Ez így nem a legjobb! Már mondták, de felvetem újra: ne a fájl nevét add meg a linkben, mert akkor bármelyik másik felhasználó is letöltheti ugyanazt a fájlt. Használj helyette inkább egy egyedi ID-t, amivel aztán egy adatbázisból kibányászod az adott fájlnevet.
29

ok

Anonymous · 2006. Aug. 8. (K), 09.48
Egy random hash erteket hasznalok, de nem ez itt a lenyeg. Azert irtam egyszeruen, hogy erthetobb legyen.
Szoval meg a random erteket sem szeretnem elerni, csak ha a felhasznalo a login.php lapon keresztul eri el.
Lehetseges megoldani ?
30

session

Anonymous · 2006. Aug. 8. (K), 11.24
session ?
32

Jogok

Joó Ádám · 2006. Aug. 8. (K), 18.45
Akkor már nem egyszerűbb, ha van egy egyszerű jogosultságrendszer? Az attachment.php a kiszolgálás elött megnézi, hogy engedélyezett-e adott felhasználó számára az állomány megtekintése, és, ha nem, akkor hibaüzenetet ad.