
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...:)
|

user23
Kezdő
|
Hali!
Köszi szépen, minden remek, örülök neki! :)
|

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
|

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 ?
|

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!!
|

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.
|

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. :)
|

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 |
|

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
|
|