PHP-Script.hu
Kiemelt hirdetés:
2026. október 17. 10:14 szombat, ma Hedvig névnap van


grafika


Videóbázis


Listázás:  Idő szerint:
Webprogramozás arr PHP info php msyl lekérdezések
(#9) Jedimaster 2014.02.23. 12:59

Jedimaster
Jedimaster
Kezdő

Sziasztok!
Van egy kisebb problémám:
van egy belső levelező rendszerem(része az alkalmazásnak).
A bejövő és kimenő üzenetek listázása jól műxik, ha kiválasztom az adott levelet checkbox segítségével és törlöm, az is - akár több levéllel is -, de ha meg próbálok nyitni egy levelet, akkor már array to string conversion figyelmeztetést kapok.
A levél megnyitása úgy néz ki, hogy van egy MainController::inbox(), ami két tagfüggvényt hív meg: a MessengerModel::inbox() és a MessengerModel::inbox_messages() -t. Ezek előállítják a beérkezők számát(inbox()) és az üzenet részleteit, amit egy $messages változóba ment, megformázva. Van egy InboxView.php, ami ezeket fogadja és abban íródik ki.
Az üzenet tartalma rész egy link, ami a MessengerController::view_inbox() metódusát hívja meg és átadja neki az id -t.
Ez alapján a MessengerModel::view_in() hívódik meg és megkapja az $id -t. Ez alapján kikeresi az üzenetet, aminek ez a PK -ja és ismét egy formázott kiíratás következik, amit megkap a vezérlőn keresztül a ReceivedView.php.
A kódok(csak a lényeg):

MainController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
// ...
    public function inbox() {
        include_once( BASE_PATH . "models/MessengerModel.php" );
        
        $model = new MessengerModel();
        $numbers = $model -> inbox();
        $messages = $model -> inbox_messages();
        
        if( !empty( $numbers ) ) {
            $this -> v[ "numbers" ] = $numbers;
        } else {
            $this -> v[ "numbers" ] = 0;
        }
        
        if( !empty( $messages ) ) {
            $this -> v[ "messages" ] = $messages;
        } else {
            $this -> v[ "messages" ] = null;
        }
        
        unset( $model );
        
        $this -> v[ "title" ] = "Beérkező üzenetek";
        
        $this -> add_view( "InboxView" );
    }
// ...
 


MessengerModel::inbox() és MessengerModel::inbox_messages():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
// ...
    public function inbox() {
        $query = "SELECT COUNT(id) AS numbers FROM inbox WHERE user_id='" . $_SESSION[ "id" ] . "'";
        $result = mysql_query( $query );
        
        if( $result ) {
            $this -> row = mysql_fetch_assoc( $result );
            $numbers = $this -> row[ "numbers" ];
        } else {
            $numbers = 0;
        }
            
        return $numbers;
    }
    
    public function inbox_messages() {
        $query = "SELECT * FROM inbox WHERE user_id='" . $_SESSION[ "id" ] . "' ORDER BY id DESC";
        $result = mysql_query( $query );
        
        $messages = "";
        
        while( $this -> row = mysql_fetch_assoc( $result ) ) {
            $messages .= '<tr>
                        <td width="50" align="center">
                            <input type="checkbox" name="checkbox[]" value="' . $this -> row[ "id" ] . '" />
                        </td>
                        <td width="350" align="center">
                           <a href="index.php?q=MessengerController/view_inbox/' . $this -> row[ "id" ] . '">';
            
            if( $this -> row[ "viewed" ] == 0 ) {
                $messages .=    '<b>' . $this -> row[ "title" ] . '</b>';
            } else if( $this -> row[ "viewed" ] == 1 ) {
                $messages .=    $this -> row[ "title" ];
            }
            
            $messages .=        '</a>
                        </td>
                        <td width="100" align="center">' .
                            $this -> row[ "from_username" ] .
                        '</td>
                    </tr>';
        }
            
        return $messages;
    }
// ...
 


Az InboxView semmi mást nem csinál, mint kiírja ezeket:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
    echo    '<div class="content">
            <div class="center">
                <h1>Beérkező üzenetek:</h1>
                <table align="center">
                    <form method="post" action="index.php?q=MessengerController/delete_inbox">
                        <tr>
                            <td width="50" align="center">
                                #
                            </td>
                            <td width="350" align="center">
                                Üzenet címe:
                            </td>
                            <td width="100" align="center">
                                Címzett:
                            </td>
                        </tr>';
    
    if( !empty( $this -> v[ "messages" ] ) ) {
        echo    $this -> v[ "messages" ];
    }
    
    echo                    '<tr>
                            <td colspan="3" align="center">';
    
    if( $this -> v[ "numbers" ] > 0 ) {
        echo    '<input type="submit" name="delete" value="Töröl" />';
    } else {
        echo    'Nincsenek üzenetek.';
    }
    
    echo                        '</td>
                        </tr>
                    </form>
                </table>
                <hr />';
 


MessengerController::view_inbox():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
// ...
    public function view_inbox( $id ) {
        include_once( BASE_PATH . "models/MessengerModel.php" );
            
        if( !empty( $id ) ) {
            $model = new MessengerModel();
            $message = $model -> view_in( $id );
            
            if( !empty( $messages ) ) {
                $this -> v[ "messages" ] = $messages;
            } else {
                $this -> v[ "messages" ] = null;
            }
                
            unset( $model );
        }
        
        $this -> v[ "title" ] = "Beérkező üzenetek";
        
        $this -> add_view( "ReceivedView" );
    }
// ...
 


MessengerModel::view_in():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
// ...
    public function view_in( $id ) {
        $query = "SELECT * FROM inbox WHERE id='" . $id . "'";
        $result = mysql_query( $query );
        
        $messages = "";
        
        while( $this -> row = mysql_fetch_assoc( $result ) ) {
            if( $this -> row[ "viewed" ] == 0 ) {
                $query = "UPDATE inbox SET viewed='1' WHERE id = '" . $id . "'";
                $result = mysql_query( $query );
                
                $messages .= '<table align="center">
                            <tr>
                                <td width="150">
                                    <b>Feladó:</b>
                                </td>
                                <td>' .
                                    $this -> row[ "from_username" ] .
                                '</td>
                            </tr>
                            <tr>
                                <td width="150">
                                    <b>Üzenet címe:</b>
                                </td>
                                <td>' .
                                    $this -> row[ "title" ] .
                                '</td>
                            </tr>
                            <tr>
                                <td width="150">
                                    <b>Küldés ideje:</b>
                                </td>
                                <td>' .
                                    $this -> row[ "receive_date" ] .
                                '</td>
                            </tr>
                            <tr>
                                <td width="150">
                                    <b>Üzenet:</b>
                                </td>
                                <td>' .
                                    $this -> row[ "content" ] .
                                '</td>
                            </tr>
                        </table>';
            }
        }
            
        return $messages;
    }
// ...
 


Végül a ReceivedView:
1
2
3
4
5
6
7
8
9
10
11
 
    echo    '<div class="content">
            <div class="center">
                <h1>Ezt küldték neked:</h1>';
    
    if( !empty( $this -> v[ "messages" ] ) ) {
        echo    $this -> v[ "messages" ];
    }
    
    echo            '<hr />';
 


Csak a lényeget másoltam ki, mivel a MessengerModel már vagy 400 soros és már nekem sincs kedvem kibogarászni...
A probléma ott jön ki, hogy kilistázza szépen a leveleket, az üzenet címe rész egy link, ha rákattintunk, meg kéne jelenjen az üzenet, de ehelyett az array to string conversion figyelmeztetést kapom, pedig az $id nem egy array. Ez az a
$this -> v[ "id" ], ami bár tömbindex, de önmaga nem egy tömb...
Jah: a keretrendszert én írtam meg, még elég basic, de majd idővel fejlesztgetem...:)

(#8) user23 2014.01.13. 14:52

user23
user23
Kezdő

Hali!

Köszi szépen, minden remek, örülök neki! :)

(#7) anti válasza erre: (#6) user23 2014.01.07. 19:00

anti
anti
Kezdő

Szia!

Egy GROUP BY-ra van szükséged az ORDER BY előtt, ami pontszám és játékos név alapján "csoportosítja" az eredményeket, aminek hatására az azonos játékoshoz tartozó azonos pontszám csak egyszer iródik ki.

Minta: SELECT * FROM `pont_tabla` WHERE jatek_id = 1 GROUP BY pontok, jatekos_nev ORDER BY pontok DESC

Ha eredmény kiírásnál azt is megjeleníted, hogy a pontot mikor szerezte, akkor a fenti lekérdezést még bővíteni kell, mert két azonos pontszám közül nem feltétlen azt fogja szűrni, ami az újabb.

Minta: SELECT *, MAX(pont_datum) as pd FROM `pont_tabla` WHERE jatek_id = 1 GROUP BY pontok, jatekos_nev ORDER BY pontok DESC

Ekkor kiírásnál ne a pont_datum mezőt írd ki, hanem a MAX() által képzett pd nevű mezőt.


Utoljára szerkesztette: anti 2014.01.07. 19:00
(#6) user23 2014.01.07. 17:27

user23
user23
Kezdő

Hali!

Csináltam 1 Top 10 játékost is, vagyis "Legjobb 10 játékból a TOP játékosok"
A problémám az, hogy játszottam kis idő elteltével ugyan avval a játékkal és direkt ugyan annyi pontot szedtem össze benne, de ahol megjeleníti a dolgokat, hogy ki hol első oda újból be rakott, tehát így van:
1. Játékos 50 pont ...
2. Játékos 50 pont ...
3. Játékos 16 pont ...

Pedig nem kéne kétszer ott lennie. :(
Szerintem itt az a gond, hogy nem megfelelő adatokat kérdezek le, mert ellemnben szépen ki írja a táblázatban, hogy id, név, pont, játék címe, kategória.

Így van a kód: ( ez a valós, már nem példa )
$resultm = dbquery("SELECT * FROM ".DB_PONTS." LEFT JOIN ".DB_GAMES." ON nyertpont=ppoints
LEFT JOIN ".DB_CATEGORYS." categorys ON categorys.cid=games.catid
WHERE pgamid=gid ORDER BY ppoint_date DESC LIMIT 0,10");

A games táblába úgye van:
játék id, kategória id, neve, rekord ( hányszor döntötték meg az eredményt ami addig a legjobb volt ), utolsó játék idő, nyertpont, ( ez a rekord azaz ami a legjobb pont eredmény) nyert user.
gid, catid, name, jatek, utolso_jatek, nyertpont

pont táblában:
pont id, pont játék id, jatekos, pont ( amit elért ), pont dátum.

pid, pgamid, user, ppoint, ppoint_date

a kategória táblában:
kategória id, kategória neve.

cid, cname

Most mit csináljak ? Már nagyon bele keveredtem :S
Valami ötletet tudnál mondani ?






(#5) user23 2014.01.05. 22:46

user23
user23
Kezdő

Szia!

Úgy néz ki, hogy jó lett. 3 db játék van most fent, mind a háromba azt mutatja ami ahhoz tartozik. Akkor szerintem sikerült megoldani és jó is.
Nagyon szépen köszönöm a segítséget!!

(#4) anti válasza erre: (#3) user23 2014.01.04. 18:37

anti
anti
Kezdő

Szerintem sejtem mit akarsz.

Tehát a cél az adott játékhoz tartozó eredmények kiíratása.
Ha az a rész működik, hogy ...category/game.php?game=1 formájú URL-eket tudsz hívni, ahol a game mondja meg, hogy melyik játékról van szó, akkor tudsz ennek megfelelő szűrést csinálni.

A game.php-ban biztos kelleni fognak az alábbi sorok:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$game_id = (int)$_GET[‘game’]; //Ezzel veszed át a játék azonosítóját az URL-ből.
 
//A korábbi lekérdezés bővítése
$sql = “
/**
 * Itt az előző lekérdezés szerepel, de most nem írtam be teljesen, csak a végét a módosítással.
 */
JOIN
    Games_cg
ON
    Games_cg.games_cg_id = Results.games_cg_id
WHERE
    Games.game_id = {$game_id}
ORDER BY points DESC
LIMIT 0,10
";


Ezzel amilyen game-mel hívod az URL-t olyan eredményeket ír ki.

(#3) user23 2014.01.03. 19:20

user23
user23
Kezdő

Üdv!

Hálasan köszönöm a segítséget, sokat segítettél. Ez alapján sikerült is, igaz több kisérlet után, de a lényeg, hogy sikerült.
Nagyon köszönöm!

De lenne egy kérdésem újfent hozzá.
Lehet olyat csinálni, hogy a lekérezés úgy van megcsinálva, hogy csak azokat az eredményeket írja ki ami az adott játékhoz tartozik ?

Na most ezt hogy magyarázzam laikusként. :S
Nagy fába vágtam a fejszém, na mind1.

Vannak kategóriák, a kategóriába játékok. Maga a játék alá azt szereném ki írni, hogy abban a játékban az utolsó 10 játékos ki volt.
Jelenleg úgy néz ki, hogy minden játék "alatt" vagy:
A: csak az jateknev=1 van, tehát WHERE jateknev=1 az első játéknak az utolsó 10 játékosát írja ki.

vagy:

B: összes utolsókat írja ki.

Nem akarok csinálni statisztika.php -t és oda be másolni a lekérdezést 10-szer és ott a jateknev=1,2,3,4,5..10 -t csinálni, mert a fájl nagyon hosszú lenne. ( sokat kell görgőzni le és fel, mire le ellenőrzöm aha evvel a játékkal cssak 2-3 játszank mindig, vagy aha hm.. evvel 10-en, mert minden sorba más felhasználó név van)

Hát nem tudom, hogy mennyire voltam érthető ?
Tehát ez lehet kivitelezni 1 fájlban, 1 lekérezésben ?
A kategória fájl meghívja a game fájlt és így az jelenik meg, hogy ...category/game.php?game=1
vagy ...category/game.php?game=2 stb. :)


(#2) anti válasza erre: (#1) user23 2014.01.02. 13:57

anti
anti
Kezdő

Egy lehetséges elméleti megoldás:

User tábla mezői: user_id, user_name
Games tábla mezői: game_id, game_title
Games_cg tábla mezői: games_cg_id, cname
Results tábla mezői: user_id, game_id, games_cg_id, points

Az újdonság a Results tábla, ami a játékokban elért eredményeket tárolja.

Többszörös kapcsolás úgy működik, mint az egyszeres, csak folytatni kell a sort.

Példa: Listázzuk ki a 10 legjobb eredményt az elért pontszámok alapján csökkenő sorrendben. (Tehát a legtöbb pontot elért játékos legyen legelöl.)

A kiírni kívánt mezők: Játékos neve, Játék neve, Játék kategóriája, Elért pontszám

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
    user_name,
    game_title,
    cname,
    points
FROM
    Results
JOIN
    User
ON
    User.user_id = Results.user_id
JOIN
    Games
ON
    Games.game_id = Results.game_id
JOIN
    Games_cg
ON
    Games_cg.games_cg_id = Results.games_cg_id
ORDER BY points DESC
LIMIT 0,10

(#1) user23 2013.12.30. 19:49

user23
user23
Kezdő

Üdv!

Elnézést a téma nyitásért, a keresőt használtam de nem találtam választ arra amit keresek, így nyitottam. Remélem nem gond és hogy majd valaki tud is segíteni nekem.

Szeretnék az adatbázisból lekérdezni adatokat, de 4 táblából.

Első tábla: User
user_id
user_name

Második tábla: Games
title

Harmadik tábla: Games_cg (games_category)
cname

Negyedik tábla: Games_pont
ponts

Amit a lapon szeretnék látni arra egy PÉLDA:

Teszt Elek játékosunk az Alma szedő játékba a Gyümölcsök csoportba 230 pontod gyűjtött össze.

"user_name" játékosunk az "title" játékban a "cname" csoportban "ponts" gyűjtött össze.

Nem, nem vagyok programozó.
Nem, nem tanulom.
Nem, nem tanultam.
Csak hobbi + internetről csipegetve próbálkozok kisebb nagyobb sikerrel.
Mért evvel, mért így ?
Mert így van, és szeretném. ( és most. )
1 táblából sikerült szépen lekérdezni amit próbáltam, még 2 táblából is ment... de ennyi, sajnos nem talált jó és használható leírást hozzá. Fentebb írtam mivel nem vagyok "szak" avatott, és nem szeretnék 3 napot a google társáságában élni, így felteszem itt a kérdésem és remélhetőleg valaki válaszol egy segítő megoldás példával.
Köszönöm.


Utoljára szerkesztette: user23 2013.12.30. 19:50
Listázás:  Idő szerint:


© 2006-2026 PHP-Script.hu, Minden jog fenntartva!
Design: Rácz Gergely, Oldalmotor: Rácz Gergely
Impresszum - Oldaltörténet - Oldalszabályzat