Hogy írjam meg ezt a MYSQL lekérdezést? Már megbolondulok tőle!
Összesen 4 táblából szeretnék lekérdezni adatokat, ezt UNION utasítással csináltam meg.
Az utasítással azokat a sorokat szeretném kiírni, ahova én már hozzászóltam, és ez után érkezett oda új üzenet.
Tehát ahol a küldő az én ID-m, az üzenet időbélyege nagyobb, mint az általam küldött utolsó üzenet időbélyege az adott fogadó fél adatlapján.
Tehát:
(
SELECT
users.name AS name, users.id AS id,
kommentek.fogado AS fogado, kommentek.uzenet AS uzenet, kommentek.timestamp AS timestamp, kommentek.uzenet_id AS uzenet_id
FROM
users, kommentek
WHERE
kommentek.kuldo='$my_id'
AND
kommentek.timestamp>(SELECT MAX(timestamp) FROM kommentek WHERE kuldo='$my_id' AND fogado='????')
)
UNION
...
...
...
ORDER BY timestamp DESC LIMIT 20
Nem tudom hogy hivatkozzak a fogadóra.
Egy adott adatlapról csak 1 üzenet érdekel, mégpedig az, ami az én hozzászólásom után érkezett (de csak ha volt hozzászólásom ott).
Nem tudom ez így érthető e. Ez a lekérdezés meghaladja a tudásomat sajnos.
Első: '$my_id' < ez micsoda? PHP váltózót így nem helyettesítünk be!
Hogy néz ki pontosan a 4 tábla?
a táblák szerkezete így néz ki:
table_id,kuldo,fogado,uzenet,timestamp,uzenet_id.
mind a 4 tábláé, csak egyik az adatlap alatti kommenteké, a másik egy üzenőfalé, stb stb.
Ezekből szeretném lekérdezni az általam küldött utolsó üzenet után érkezett 1 darab üzenetet.
A $my_id -t azt a felhasználó a bejelentkezéskor kapja meg, ez az ő saját azonosítója, erre sok helyen tudok hivatkozni, hogy kiről van éppen szó. egyébként miért nem jó az úgy?
Miért nem jó? SQL injection. Keress rá! Ha ez megvan, akkor nézz után a PDO-nak és a mysqli-nek valamint a prepared statementnek!
A tárolási mód nem túl szerencsés. Ha minden tök ugyan az, ahogy írtad, akkor egyszerűbb lenne egy tábla, és annak lenne egy mezője, ami alapján el lehetne dönteni, hogy melyik melyik üzenőfalról van szó pontosan.
Egy táblára:
SELECT k1.* FROM komment AS k1 WHERE k1.timestamp > (SELECT k2.timestamp FROM komment AS k2 WHERE k2.kuldo = ? ORDER BY k2.timestampe DESC LIMIT 1) ORDER BY k1.timestamp DESC LIMIT 20
Lehet, hogy nem sikerült pontosan leírni, de a lényeg: a belső lekérdezés meghatározza az "én" utolsó hozzászólásom idejét. Az külső lekérdezés pedig listázza azokat a hozzászólásokat, amik ettől régebbiek.
a kuldo utáni kérdőjel mit takarna, vagy ez egy bevett módszer?
légy szíves részletezd kicsit.
egyébként nem értem, hogy a $my_id változó miért veszélyes, mert ez egy szerver oldali változó, ezt nem tudják módosítani.
de ha rosszul tudom javíts
Írtam, hogy minek nézz utána! Ha megnézed, akkor rájössz, hogy mi az a kérdőjel.
Ha biztosan szerver oldali a váltózó, akkor nem olyan veszélyes a használata, de mivel semmivel nem kerül többe tisztességesen megírni, ezért célszerű mindig a már írt technikákat használni, így véletlenül sem lehet olyan, hogy átengedsz valamit, amit nem kellene.
köszönöm a segítséget! még egy egyszerű kérdésem van.
a $_SESSION az egy szerver oldali változó?
tehát azt nem tudja módosítani a látogató?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!