ugrás a tartalomhoz

2táblából lekérdezés, majd egyik UPDATE-elése

mokat · 2009. Feb. 25. (Sze), 14.58
sziasztok,

amiben a segítségeteket kérem:
van 2 táblám: tb1, tb2
db1 tartalmazza a username, pontszam mezőket (is)
db2 tartalmazza a meccs, eredmeny, who mezőket (ebben tárolom a userek által készített tippeket)

Van egy admin felületem ahol a bevitt eseményeknek megadtahatom a kimenetelét. Itt létrehoztam egy lekérdezést melyben ezt a 2 táblát egyesítem és ezen végigmassírozva megkeresem, hogy hol egyezik az általam bevitt (POST-olt) esemény a 'meccs' mező elemeivel, majd ha az 'eredmeny' is megegyezik az általam POST-olt eredménnyel akkor a hozzá tartozó 'who' mezőben tárolt felhasználónévhez megkeresem a db2-ben található 'username'-t és a hozzá tartozó 'pontszam' mező értékét megnövelem (ha meg nem talált akkor csökkentem)
remélem kibogozható a dolog, íme a kód:

$pontoz = mysql_query("SELECT meccs,eredmeny,who,username,pontszam FROM tb1 JOIN users ON tb1.who = tb2.username WHERE meccs = '$_POST[meccs]'");

while($info = mysql_fetch_array( $pontoz ))
{
if ($info['eredmeny'] == '$_POST[tipp]')
{
mysql_query("UPDATE tb2,tb1 SET pontszam = pontszam + 1 WHERE tb2.username = tb1.who") or die(mysql_error());;
}

else
{
mysql_query("UPDATE tb2,tb1 SET pontszam = pontszam - 1 WHERE tb2.username = tb1.who") or die(mysql_error());;
}

}


nem az történik amire számítok: Hogy az adott felhasználóhoz tartozó pontszám nő vagy csökken annak fejében egyezik-e az általa készített meccs-eredmeny a db1-ben.... mi a hiba? köszi előreis
 
1

elírtam a főcímben

mokat · 2009. Feb. 25. (Sze), 15.33
db=tb :) és

$pontoz = mysql_query("SELECT meccs,eredmeny,who,username,pontszam FROM tb1 JOIN tb2 ON tb1.who = tb2.username WHERE meccs = '$_POST[meccs]'");

A kérdés viszont ugyanaz mi a megoldás/hol a hiba?
2

Parancsolj

zila · 2009. Feb. 25. (Sze), 15.44
mysql_query("UPDATE tb1 SET pontszam = pontszam + 1 WHERE who = '".$info['username']."'") or die(mysql_error());
Remélem jól írtam az update-t, nem egyértelmű mi jön a tb1 és mi a tb2 táblából.

De ha összekapcsolsz két (vagy több) táblát, akkor használj egyértelmű minősítéseket pl.
SELECT t1.meccs, t1.eredmeny, t1.who, t2.username, t1.pontszam from t1 JOIN t1 on t1.who = t2.username WHERE t1.meccs = 1
Sokkal átláthatóbb lesz, és elkerülheted a névütközéseket is...
3

köszi megpróbálom

mokat · 2009. Feb. 25. (Sze), 17.53
".info['']." <--- szintaktikáról tudnál még mesélni? mi ez az előtte utána .?
5

összefűzés

gex · 2009. Feb. 25. (Sze), 18.13
http://php.net/manual/en/language.operators.string.php
8

a felhasználó megtalálva

mokat · 2009. Feb. 25. (Sze), 21.02
fordítva ment username = who ! köszi mindenki!
4

ígysem ok...

mokat · 2009. Feb. 25. (Sze), 18.04
ahányszor megtalálja a táblában a megfelelő 'eredmenyt' annyiszor hajtja végre a levonást és az összes useren aki a táblában van :|
Magyarul ha 4 ember találta el az 'eredmenyt' akkor -4-es lett az értéke mindenkinek a 'pontszam' :|

mintha az if ágba bele se ugrana csak az else be...
6

Csak most látom

zila · 2009. Feb. 25. (Sze), 18.23
if ($info['eredmeny'] == '$_POST[tipp]')
Olvasgasd a manual-t szorgosan. A php csak az idézőjelek között lévő stringekben végez változó behelyettesítést, az aposztrófok közöt nem. Ebben a feltételvizsgálatban teljesen felesleges az aposztróf, ami ráadásul rossz eredményre is vezet.

Helyesen:
if ($info['eredmeny'] == $_POST['tipp'])
7

jó de...

mokat · 2009. Feb. 25. (Sze), 20.19
most mindegyik pluszt kap :) valamelyik felététel nem teljesül és miért annyiszor hajtja végre ahány megfelelő eredmény szerepel ? (tehát annyiszor kap + vagy - pontot ahány megfelelő eredmény van a táblában)
10

Debugold

zila · 2009. Feb. 27. (P), 11.03
Most jön az a rész, hogy kicsit debugolod a programodat, kiiratod a feltételben szereplő értékeket, a where-be kerülő értékeket és ez alapján megoldod a problémát...
9

Szerintem lehet, hogy ezt az

ThomasEdison · 2009. Feb. 25. (Sze), 21.34
Szerintem lehet, hogy ezt az egészet egy query-vel is meg lehet oldani.
Mivel update-nél úgyis összekapcsolod a 2 táblát, még a where feltételbe beleteszed a meccs-re szűrést is és egy if-es függvénnyel a feltételnek megfelelően 1-et, vagy -1-et adsz hozzá a pontszámhoz.
11

átgondoltam ---> új igények ---> átírtam ---> újabb HELP

mokat · 2009. Feb. 28. (Szo), 09.49
Átneveztem az adatbázisokat, amibe a felhasználók vannak az a 'users' , amibe a tippek vannak az a 'tippmix' nevet adtam:

Még mindig megvan az admin felületem amin beviszem a meccshez tartozó végeredményt, de most felvettem a táblámba olyan mezőket amik a végeredményhez tartozó odds-okat is rögzíti.(értékük: $eredmenyH, $eredmenyD, $eredmenyV)

most 3 query-vel megoldom:

$hazaik = mysql_query("SELECT tippmix.meccs,tippmix.eredmeny,tippmix.who,users.username,users.pontszam FROM tippmix JOIN users ON tippmix.who = users.username WHERE tippmix.meccs = '$_POST[meccs]' AND tippmix.eredmeny = 'H'") or die(mysql_error());

és ugyanez a másik kettő, csak a végén tippmix.eredmeny = 'D', tippmix.eredmeny = 'V'

mindegyik után indítok egy while ciklust:

while($info = mysql_fetch_array( $hazaik ))

{

if ($info['eredmeny'] == $_POST[tippem])
//'eredmeny' amit a user tippelt, 'tippem' amit én adtam meg vegeredmenynek

{

mysql_query("UPDATE tippmix,users SET pontszam = pontszam + $eredmenyH WHERE username = '".$info['who']."'") or die(mysql_error());

}

else

{

mysql_query("UPDATE users SET pontszam = pontszam - $eredmenyh WHERE username = '".$info['who']."' ") or die(mysql_error());

}

}


a ha lefuttatom kiakadt a WHERE username = valaki sorokon:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE username = 'egyjuzernevemegjelenik'' at line 1

a szintaktikát pedig úgy írtam ahogy ajánlotáttok, mi a hiba? :/
12

Escape

Poetro · 2009. Feb. 28. (Szo), 13.44
Csak tudnám, hányszor kell még leírni, hogy minden SQLnek átadott stringet escapelni kell. A másik hogy sose íjunk már be változót SQL parancsokba, hanem használnuk valami behelyettesítést, mert
  • Átláthatóbb a kód.
  • Szépen lehet escapelni.
  • Később nem lesznek ilyen hibák.
  • Esztétikus.
  • SQL injection-t el lehet vele kerülni.
mysql_query(sprintf("UPDATE users SET pontszam = pontszam - %d WHERE username = '%s'", $eredmenyh, mysql_real_escape_string($info['who']));
13

de...

mokat · 2009. Már. 1. (V), 13.06
nincs olyan problémám, hogy inydzseksöntől kelljen félnem, mert a felhasználó csak általam felkínált lehetőségeket választhat. Utánanézek ennek a függvénynek, de mi a hiba az általan írt WHERE feltétellel??? köszi!
14

aha persze

gex · 2009. Már. 1. (V), 14.40
nincs olyan problémám, hogy inydzseksöntől kelljen félnem, mert a felhasználó csak általam felkínált lehetőségeket választhat
aha. szerintem egy kicsit jobban mélyedj el a témában.
15

köszi a tippet

mokat · 2009. Már. 1. (V), 15.37
igyekszem, de még mindig nem tudom miért írja ki a szintaktikai hibát a WHERE-hez... ehhez valakinek valami értelmes komment???
16

Pontos hiba

Poetro · 2009. Már. 1. (V), 17.28
Akkor leírnád PONTOSAN mi is a hiba. Azaz a pontos hibaüzenetet, mert ha valamit belőle behelyettesítesz valami mással, lehet pont a lényegi dolgot feded el.
Lehet a felhasználó nevében van idézőjel, vagy valami még nagyobb turpisság. És sose tudhatod, hogy egy felhasználó mit küld el egy formba, nem kell neki feltétlen azokat a lehetőségeket választania amire te számítasz, mindig kezeld úgy a felhasználótól jövő adatot, hogy biztosan hackelni akar, és akkor nem tévedhetsz. Azaz mindent vizsgálj meg, és mindent escapelj ott, ahol használod az általa beküldött adatot, jöjjön az formból vagy adatbázisból.
Lehet hogy a felhasználó valahol korábban adott meg olyan adatot, pl. felhasználónévnek, amit te valahol máshol használsz fel, de akkor már lehet hogy nem gondolsz rá, hogy újra escapelni kellene.
17

pontos hiba #2

mokat · 2009. Már. 1. (V), 17.57
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE username = 'gabor1102'" at line 1

de nem engedek SPEC karaktereket a nevekben (semmi ,'";<>)

plz help
18

elírás:

mokat · 2009. Már. 1. (V), 18.20
to use near 'WHERE username = 'gabor1102" at line 1 nah így ni