Mysql + php barát lista

Mysql + php barát lista
2013-03-25T13:01:10+01:00
2013-03-28T18:10:18+01:00
2022-11-28T15:55:35+01:00
szaszu10
Üdv olyan kérdésem lenne hogy van egy olyan oldalrészem hogy ha rákattint a bejelentkezett felhasználó egy másik nevére akkor kiadja az adatait és amellé egy gombot amivel felveheti a barátai közé.
Ez eddig működik is.
Ezt az egészet nekem 2 feltételhez kell kötnöm ugye az egyik hogyha a saját nevére kattint akkor ez a gomb ne jelenjen meg. Ez is működik.
A probléma ott van hogy, azt is meg kell néznem hogy már felvette-e már régebben barátként az illetőt és ha igen akkor se jelenjen meg a gomb.
De az istennek nem tudom úgy megoldani hogy ez működjön. Ötlet hol a baki?

Az én elképzelésem
/* A BEJELENTKEZETT FELHASZNÁLÓ IDJÉNEK LEKÉRDEZÉSE */ $nevem = $_SESSION['login']; $bele = "SELECT * FROM felhasznalok WHERE nev = '$nevem'"; $eler = mysql_query($bele); $adat = mysql_fetch_array($eler); if (mysql_num_rows($eler) == 1) $id = $adat['id'];//a bejelentkezett felhasználó idje /* A BEJELENTKEZETT FELHASZNÁLÓ BARÁT LISTÁJÁNAK LEKÉRDEZÉSE ID ALAPJÁN */ $bele = "SELECT * FROM baratok WHERE id = '$id'"; $eler = mysql_query($bele) or die ("Hiba id:1"); while($adat = mysql_fetch_assoc($eler)) { $b_id = $adat['b_id'];//a barát idje if($f_id == $b_id) $hiba = 1;//már a barátlistán van else $hiba = 0;//hozzáadás } if($nevem != $nev && $hiba == 0) { echo"<table><tr><td><form method="POST"><input type="submit" name="felvesz" value="Felvétel barátok közé"></form></td></tr>" ."</tr></table>"; if(isset($_POST["felvesz"])) { mysql_query("INSERT INTO baratok SET b_id = '$f_id', b_neve = '$b_neve', id = '$id'") or die ("Hiba: ".$b_neve." nem került barátlistádra!"); print("".$b_neve." sikeresen hozzá lett adva a <a href="barat_lista.php">Barátaidhoz!"); } }
Mutasd a teljes hozzászólást!
Szia !

A barát táblába az alábbiak kellenek
id,juzer1_id,juzer2_id,milyen_a_kapcsolat_id

id = azonosító
juzer1 = tag x
juzer2 = tag y
milyen a kapcsolat pl
b = barátok
2 = juzer1 megjelölte juzer2-t
3 = juzer2 megjelölte juzer1-t
x = tiltólista (azaz ne tudjon írni a másiknak)

úgy hiretelen ...
Mutasd a teljes hozzászólást!

  • Miért nem a "barát" neve alapján keresed - kéred le, hogy felvette-e már?...
    Mutasd a teljes hozzászólást!
  • a lényegen szerintem nem változtatna maximum átláthatóság szempontjából lenne előnyösebb.
    Mutasd a teljes hozzászólást!
  • Ha a barátok közül kérdezed a listát, akkor ott már senkinek sem kéne feldobni azt a lehetőséget, hogy újra hozzáadjuk az illetőt a barátokhoz, nem?

    Egyébként az sql alapjaival nem ártana megismerkedned!

    lekéred a felhasználók listáját úgy, hogy a barátok táblából xxx felhasználó barátait hozzá csatolod a felhasználók táblához és az aktuális felhasználó már ki is veszed:
    select f.*,b.barat_id from felhasznalok f left join baratok b on f.id=b.barat_id and b.id=xxx where f.id<>xxx

    Ha a barat_id-ben vmilyen szám van (nem null vagy üres mező), akkor az barát és kihagyhatod a gombot (de a form-ot se generáld le!).
    Mutasd a teljes hozzászólást!
  • 1. $f_id hol kap értéket?

    2. Biztos jó az INSERT INTO?
    Nem így kéne azt?:

    mysql_query("INSERT INTO baratok (b_id, b_neve, id) VALUES($f_id, $b_neve, $id) ") or die ("Hiba: ".$b_neve." nem került barátlistádra!");
    Mutasd a teljes hozzászólást!
  • Ha a barátok közül kérdezed a listát, akkor ott már senkinek sem kéne feldobni azt a lehetőséget, hogy újra hozzáadjuk az illetőt a barátokhoz, nem?

    nem csak annak nem látható a gomb aki be van jelentkezve és a barátlistáján van.

    Mutasd a teljes hozzászólást!
  • az $f_id korábban már fel van töltve annak a felhasználónak az idjével akinek az adatlapját nézzük
    ja és a létrehozással nincs probléma
    Mutasd a teljes hozzászólást!
  • if($f_id == $b_id) $hiba = 1;//már a barátlistán van echo "nincs gomb"; else $hiba = 0;//hozzáadás echo "van gomb";

    Itt is van a saját megoldásod. A $b_id tartalmazza az f_id-t, aki a barátja. Akinél egyenlő a 2 oda nem kell felvesz gomb, ahol nem egyenlő oda pedig kell. Saját magadnál meg nem szabad megengedni, hogy a saját id-éd legyen a b_id-ben. A lekérdezésből egyszerűen kizárod magad az f_id alapján, így a találatok között már nem szerepelsz, nem kell magaddal törődnöd.
    ---------------------------------------------

    echo "<table><tr><td><form method="POST"><input type="submit" name="felvesz" value="Felvétel barátok közé"></form></td></tr>" ."</tr></table>";
    ebből a feldolgozó script honnan fogja tudni, hogy kit, hova kell felvenni barátnak? $_POST['felvesz']="Felvétel barátok közé" ->ennyit küldesz tovább a submittal.
    Mutasd a teljes hozzászólást!
  • Szia !

    A barát táblába az alábbiak kellenek
    id,juzer1_id,juzer2_id,milyen_a_kapcsolat_id

    id = azonosító
    juzer1 = tag x
    juzer2 = tag y
    milyen a kapcsolat pl
    b = barátok
    2 = juzer1 megjelölte juzer2-t
    3 = juzer2 megjelölte juzer1-t
    x = tiltólista (azaz ne tudjon írni a másiknak)

    úgy hiretelen ...
    Mutasd a teljes hozzászólást!
  • Tehát te ezt mondod!?

    while($adat = mysql_fetch_assoc($eler)) { $b_id = $adat['b_id'];//a barát idje if($f_id == $b_id); else echo"<table><tr><td><form method="POST"><input type="submit" name="felvesz" value="Felvétel barátok közé"></form></td></tr>" ."</tr></table>"; } if(isset($_POST["felvesz"])) { mysql_query("INSERT INTO baratok SET b_id = '$f_id', b_neve = '$b_neve', id = '$id'") or die ("Hiba: ".$b_neve." nem került barátlistádra!"); print("".$b_neve." sikeresen hozzá lett adva a <a href="barat_lista.php">Barátaidhoz!"); }
    Amennyiben erre gondolsz ez nekem is eszembejutott meg is csináltam azonban ez így weblapon annyit csinál nekem hogy aki barát listán van ott 2 gomb van aki meg nincs annál pedig 3 és gondolom a ciklus miatt de nem értem hogy miért
    Mutasd a teljes hozzászólást!
  • Legvégső esetben át fogom így alakítani az egészet, de egyenlőre még gyötröm ezt egy picit
    Mutasd a teljes hozzászólást!
  • élből egyszerűbb lenne, mert átláthatóbb
    látod hogy ki kit jelölt és mindent vissza tudsz keresni pláne ha dobsz hozzá egy time stamp-ot (kivel mióta barátok)
    plusz a profilon ki tudni hozni az összes ismerősét a juzernek
    majd a jövő héten átalakítod ... :)
    Mutasd a teljes hozzászólást!
  • Értem én és egyszerűbb is lenne de már kíváncsi vagyok hogy ezt hogyan lehetne megoldani :D miután megvan a hiba forrása utána kerülöm csak meg :D
    Mutasd a teljes hozzászólást!
  • Valószínűleg az általad megadott kód rövidsége miatt nem látom miért ír ki 2, v 3 gombot a program. A kódban összesen 1 helyen van kiíratás, bár ott egymás után teszi a gombokat.


    $bele = "SELECT * FROM baratok WHERE id = '$id'";
    Itt megint a bejelentkezett felh adatait kéred le. Nem véletlenül mindenki más kellene, aki vagy barát vagy nem?
    Ez után vizsgáld, hogy kinél $f_id==$b_id.

    De akár 2 db lekérdezést is csinálhatsz:
    1: ki a barát -> nem kap gombot
    2: ki nem barát -> kap gombot
    Mutasd a teljes hozzászólást!
  • Ez a teljes kód
    function adatlap($nev) { /* NÉV ALAPJÁN FELHASZNÁLÓ ADATAINAK LEKÉRÉSE*/ $bele = "SELECT * FROM felhasznalok WHERE nev = '$nev'"; $eler = mysql_query($bele) or die ("Hiba id:1"); $adat = mysql_fetch_array($eler); if (mysql_num_rows($eler) == 1) { $f_id = $adat['id'];// felhasználó idje $nev = $adat['nev'];// felhasználó neve $b_neve = $adat['nev'];//barát listához hozzáadáskor név $v_nev = $adat['v_nev'];//felhasználó vezetékneve $k_nev = $adat['k_nev'];//felhasználó keresztneve $email = $adat['email'];//felhasználó emailje $avatar = $adat['avatar'];//felhasználó avatarja $reg_datum = $adat['reg_datum'];//felhasználó regisztróciójának dátuma $kor = $adat['kor'];//felhasználó életkora $nem = $adat['nem'];//felhasználó neme $rang = $adat['rang'];//felhasználó rangja } /* NÉV ALAPJÁN A FELHASZNÁLÓ ADATAINAK LISTÁZÁSA*/ echo "<div id="kartya_tarto">" ."<div id="kartya_bal">" ."Nick:<b>". $nev ."</b>"; echo "<center><img src="".$avatar."" height="200px"></center>"; if($rang == 1) print("Rang:<b>Tag</b>"); if($rang == 3) print("Rang:<b>Site Admin</b>"); echo"</div>" ."<div id="kartya_jobb">" ."<table><tr>" ."<th>Teljes Név:</th>" ."<td>".$v_nev." ".$k_nev."</td>" ."<tr><th>Email:</th>" ."<td>".$email."</td></tr>" ."<tr><th>Kor:</th>" ."<td>".$kor."</td></tr>" ."<tr><th>Nem:</th>" ."<td>".$nem."</td></tr>" ."<tr><th>Regisztrált:</th>" ."<td>".$reg_datum."</td></tr>" ."<tr><th></th>" ."</tr></table>"; /* A BEJELENTKEZETT FELHASZNÁLÓ IDJÉNEK LEKÉRDEZÉSE */ $nevem = $_SESSION['login']; $bele = "SELECT * FROM felhasznalok WHERE nev = '$nevem'"; $eler = mysql_query($bele); $adat = mysql_fetch_array($eler); if (mysql_num_rows($eler) == 1) $id = $adat['id'];//a bejelentkezett felhasználó idje /* A BEJELENTKEZETT FELHASZNÁLÓ BARÁT LISTÁJÁNAK LEKÉRDEZÉSE ID ALAPJÁN */ $bele = "SELECT * FROM baratok WHERE id = '$id'"; $eler = mysql_query($bele) or die ("Hiba id:1"); while($adat = mysql_fetch_assoc($eler)) { $b_id = $adat['b_id'];//a barát idje if($f_id == $b_id); else echo"<table><tr><td><form method="POST"><input type="submit" name="felvesz" value="Felvétel barátok közé"></form></td></tr>" ."</tr></table>"; } if(isset($_POST["felvesz"])) { mysql_query("INSERT INTO baratok SET b_id = '$f_id', b_neve = '$b_neve', id = '$id'") or die ("Hiba: ".$b_neve." nem került barátlistádra!"); print("".$b_neve." sikeresen hozzá lett adva a <a href="barat_lista.php">Barátaidhoz!"); } echo "</div>" ."<div id="clear"></div>" ."</div>"; }
    Mutasd a teljes hozzászólást!
  • if(($nevem != $nev) && ($hiba == 0))
    ???
    bevallom annyira nem néztem ... :)
    miért nem 1 SQL -l kérdezed le?
    Mutasd a teljes hozzászólást!
  • az isset post rész miért a kód végén van ?
    hogy ne frissüljön ? :)
    Mutasd a teljes hozzászólást!
  • 2. Biztos jó az INSERT INTO? Nem így kéne azt?:

    működik INSERT INTO tábla SET mezo='$mezo' is, de ez MYSQL specifikus.
    Mutasd a teljes hozzászólást!
  • Nekem az már kutymulda.


    $bele = "SELECT * FROM felhasznalok WHERE nev = '$nev'";
    később

    $bele = "SELECT * FROM felhasznalok WHERE nev = '$nevem'";
    A felhasználó adatai és a bejelentkezett felhasználó adatai nem ugyanazok?!
    Ezek szerint $nev != $nevem. Akkor ezt már nem értem.

    Ennyire specifikus (összetett, összekavart) fv-t nem kellene írni. Feladatok alapján oszd szét a lekéréseket és a kiírásokat külön fv-be és hívd meg a megfelelő helyeken.

    A fv-nek mindig legyen visszatérési értéke, ha nincs, akkor a végére tedd ki: return;
    Mutasd a teljes hozzászólást!
  • Az elsővel annak az adatait kérem le akire rákattintottak pl: jóska
    a máodikkal pedig azt aki be van jelentkezve pl: béla
    :)
    Mutasd a teljes hozzászólást!
  • Jaj. Nagyon jaj.


    Véletlenül se ismerkedj meg az sql alapjaival! De tényleg ne!
    Mutasd a teljes hozzászólást!
  • a barátok bejelölésénél tárolj le csak ID ket, a userek ID értékeit, és akkor nem kell külön lekérned.
    Mutasd a teljes hozzászólást!
  • Remélem tudok segíteni ezekkel a kis példákkal és érthető is.

    Barát tábla:

    sajat_id
    barat_id
    statusz:
    - jelolve
    - igazolva

    Persze szájízed szerint modosíthatod.:)


    /* A BEJELENTKEZETT FELHASZNÁLÓ IDJÉNEK LEKÉRDEZÉSE */ $nevem = $_SESSION['login']; $bele = "SELECT * FROM felhasznalok WHERE nev = '$nevem'"; $eler = mysql_query($bele); $adat = mysql_fetch_array($eler); if (mysql_num_rows($eler) == 1) $id = $adat['id']; //a bejelentkezett felhasználó idje // Mikor megnézel egy felhasználó adatlapját, meg kell nézni, hogy ti már barátok vagytok vagy sem // Ha igen, akkor barát törlés gomb jelenik meg, vagy semmi (amit szeretnél), és ha nincs akkor a felvétel // Itt ugye lekéred az adott felhasználó dolgait, ezzel nem foglalkozom (lekért felhasználó id: $uid) $barat_sql = "SELECT statusz FROM barat WHERE sajat_id = $id AND barat_id = $uid"; // Barát táblából lekérdezés ID-k alapján (összefűzéssel persze és (int)/intval()) $sql = mysql_query($barat_sql); $ell = mysql_num_rows($sql); // fasle ha nincs, true ha van if ($ell == true) { // Már barátnak van jelőlve // Itt nincs gomb, vagy csak törlés van // És még lehet is cifrázni! Remélem nem zavar össze // Itt tömbbe teszed $fb = mysql_fetch_assoc($sql); if ($fb["statusz"] == "igazolva") { // Itt ugye visszajelölte a kérésed // Törlés gomb, link megjelenik } else { // Még nem jelölt vissza gomb, vagy bármi amit akarsz } } else { // Nincs barátnak jelőlve // Barát jelölés gomb/link // Ne formot használj jelölésre és ehhez hasonló dolgokra (törlés, stb), hanem linket, persze ez lehet kép is echo '<a href="barat.php?muvelet=hozzaad&id=' . $uid . '>Barátnak jelölöm</a>'; } // Feldolgozo php $id = $_GET["id"]; mysql_query("INSERT INTO ... (sajat_id, barat_id) VALUES ($id, $uid)"); // Itt beírod adatbázisba // Mellék, hogy ne jelölhesse saját magát barátnak: // A feldolgozó php elején csinálj egy ellenörzést if ($id == $id) { // Alapból a belépett felhasználó id-ja és a GET-ből/url-ből kapott id die("Hiba! Saját magad nem jelölheted barátnak!"); }

    Bízom benne, hogy semmi nem maradt ki. Ugye alapból nem így néz ki a belépő rendszered, illetve az azonosításod?
    Mutasd a teljes hozzászólást!
  • Ismételten csak jaj.
    Mutasd a teljes hozzászólást!
  • Miért is? Miképpen mutatnád meg példával, hogy értse is?
    Mutasd a teljes hozzászólást!
  • Miért is?

    mert ciklusban kérdezel külön lekérdezésekkel adatokat ahelyett, hogy egy join-nal egy lekérdezéssel lerendeznéd.

    Miképpen mutatnád meg példával, hogy értse is?


    Már leírtam fentebb a példát. Nem érdekelte. Az ő kódja, az ő gondja.
    Mutasd a teljes hozzászólást!
  • Az elsővel annak az adatait kérem le akire rákattintottak pl: jóska
    a máodikkal pedig azt aki be van jelentkezve pl: béla
    :)


    A mosoly miatt emelem ki a válaszod.
    Ha már egyszer bejelentkezett, akkor minek lekérdezni a felhasználó adatait minden alkalommal, amikor műveletet hajt végre?
    Amikor bejelentkezett, akkor már megtetted, ha jól csináltad. Az akkori állandó adatokat (név, id, taj, adósz. stb.) egy session-ben eltárolom és feleslegesen nem ugráltatom az adatbázist.
    Ezért mondtam pl. hpgy nem értem és, hogy kutymulda (nem átgondolt) a kódod.
    De ahogy elnézem a válaszokkal, ami nem tetszik neked, nem is törődsz. Úgyhogy ezt se olvasd el.
    Mutasd a teljes hozzászólást!
  • dehogynem törődök csak nemtudok mit mondani rá :) igyekszem mindegyikőtök ötletét, megoldását átgondolni csak ugyebár ezt meg is kell érteni :)
    Mutasd a teljes hozzászólást!
  • Csak egyetlen egy ciklust mutass, egyet. Szép lenne, ha ciklusban kérdeznék. Alap, hogy joinol az ember, de miért zavartam volna össze vele? Amint magától megtanul normális lekérdezéseket csinálni, utána elkezd optimalizálni. Kétlem, hogy ezt egy éles oldalba tenné be, csak tanul, én sem egyből a joinokkal tanultam (sőt szerintem senki), szép karácsony lett volna... Ez a barát dolog nem egy bonyolult valami és még ennek a megvalósítását sem tudta, majd {200} táblát összekapcsol egyből. Nem bántom, de így van. Itt szépen le is írtad:

    Véletlenül se ismerkedj meg az sql alapjaival!

    Ha az alapok nincsenek, biztos menne a join...
    Mutasd a teljes hozzászólást!
  • Szép lenne, ha ciklusban kérdeznék.


    Ennek a technikának az a vége, hiszen lekérdezed egy lekérdezésben az azonosítót egy táblából, utána az alapján jön a másik lekérdezés a másik táblából. Abban a pillanatban, ahogy egynél több rekord jön le az 1. lekérdezés eredményeképpen, máris jönnek ciklusban a lekérdezések.

    Alap, hogy joinol az ember, de miért zavartam volna össze vele?


    Azmiért a kérdező összezavarása, ha leírod a lehető legoptimálisabb megoldást?

    Ha az alapok nincsenek, biztos menne a join...


    A join szerintem alap dolog. Nem azzal kezdesz, az biztos, de ettől még alap dolog. Ahogy egy programozási nyelv tanulását sem ciklusokkal kezded, de attól azok ismerete még alap dolog.

    z a barát dolog nem egy bonyolult valami és még ennek a megvalósítását sem tudta, majd {200} táblát összekapcsol egyből.


    Nem 200, hanem 2 tábláról van szó. Nincsenek allekérdezések, nincsenek bonyolult join feltételek.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd