Autor | Zpráva | ||
---|---|---|---|
kozusnik.jan Profil * |
#1 · Zasláno: 10. 12. 2012, 21:33:47
Ahoj, mám tuto relativně složenou podmínku, ale nefunguje mi - pořád to vypisuje ty samé záznamy dookola, i když by to mělo uložit id posledního záznamu a pak vypisovat jen ty, které mají vyšší id. Nevíte, co mám špatně?:
$lId=isset($_SESSION["lastid"][$recipient])?$_SESSION["lastid"][$recipient]:0; $result = mysql_query("SELECT * FROM chat WHERE (sender = $sender and recipient = $recipient) or (sender = $recipient and recipient = $sender) and id > $lId ORDER BY time desc limit 5"); Děkuji za odpovědi |
||
Taps Profil |
#2 · Zasláno: 10. 12. 2012, 21:42:29
kozusnik.jan:
nemáš tam překlep ? $result = mysql_query("SELECT * FROM chat WHERE (sender = $sender and recipient = $recipient) or (sender = $recipient and recipient = $sender) and id > $lId ORDER BY time desc limit 5"); |
||
Tori Profil |
#3 · Zasláno: 10. 12. 2012, 21:46:43
kozusnik.jan:
Vypsal jste si výsledný dotaz, jestli se do session ukládá správné číslo? |
||
kozusnik.jan Profil * |
#4 · Zasláno: 10. 12. 2012, 21:55:24
překlep tam není. číslo by se mělo vypisovat správné ;) i když místo proměnné $lId tam do podmínky vložím napevno nějaké číslo, tak mi to nefunguje...
|
||
Tori Profil |
Chyba je v logice podmínky - AND má vyšší prioritu než OR, takže se to vyhodnotí takto:
( sender.. AND...recipient) OR ( (sender...AND...recipient) AND id ) ( ( sender.. AND...recipient) OR (sender...AND...recipient) ) AND id WHERE sender IN($sender, $recipient) AND recipient IN($sender, $recipient) AND id > $lId edit: Zajímavá věc - přestože následující dotaz vrátí stejné výsledky jako předchozí (teda kromě těch, kde odesilatel == adresát), tak se mi nepodařilo přimět MySQL k použití indexů, ale četla pořád celou tabulku - sice má jen 300 řádků, ale FORCE INDEX by se mělo projevit, ne? Nevíte někdo proč? WHERE (sender, recipient) IN(($sender, $recipient), ($recipient, $sender)) |
||
kozusnik.jan Profil * |
#6 · Zasláno: 11. 12. 2012, 20:31:22 · Upravil/a: kozusnik.jan
tak chyba byla v té podmínce, jak říkal Tori. Děkuji. Ale narazil jsem ještě na druhý problém, asice, že prostě asi blbě inicializuji proměnnou, kde se to má uložit... nevím, co je blbě. Mohli byste mi to zkouknout? Děkuji
tady je kód: $action=isset($_GET["action"])?$_GET["action"]:"aktualizovat"; switch($action){ case "aktualizovat": $sender = $_GET['senderId']; $recipient = $_GET['recipientId']; //získání id, defaultně 0 $lId=isset($_SESSION["lastid"][$recipient])?$_SESSION["lastid"][$recipient]:0; echo $_SESSION['lastid'][$recipient]; //$last = $_SESSION['chat']['lastid'][$recipient]; $result = mysql_query("SELECT * FROM chat WHERE ( (sender = $sender and recipient = $recipient) or (sender = $recipient and recipient = $sender) ) and id > $lId ORDER BY time desc limit 5"); //pro každý příspěvek se vygeneruje HTML kód while ($zaznam = mysql_fetch_array($result)){ echo '<li><h3>'.$zaznam['name'].'</h3><span class="time">'.$zaznam['time'].'</span>'.$zaznam['text'].'</li>'; $lastid=($lastid>$zaznam['id'])?$lastid:$zaznam['id']; } $_SESSION['lastid'][$recipient] = $lastid; echo "|lastid=".$_SESSION['lastid'][$recipient]; //do proměnné lastid se bude ukládat nejvyšší id //echo $_SESSION[$zaznam['recipient']]['lastid']."aaa"; //na konec je vypsáno nejvyšší aktuální id za oddělovačem, šlo by to samozřejmě udělat i jiným způsobem... kurnik. zjistil jsem, že mi tak ještě část chybí.. jsem to špatně zkopíroval. tak ještě jednou ten kód ;) $action=isset($_GET["action"])?$_GET["action"]:"aktualizovat"; switch($action){ case "aktualizovat": $sender = $_GET['senderId']; $recipient = $_GET['recipientId']; //získání id, defaultně 0 $lId=isset($_SESSION["lastid"][$recipient])?$_SESSION["lastid"][$recipient]:0; echo $_SESSION['lastid'][$recipient]; //$last = $_SESSION['chat']['lastid'][$recipient]; $result = mysql_query("SELECT * FROM chat WHERE ( (sender = $sender and recipient = $recipient) or (sender = $recipient and recipient = $sender) ) and id > $lId ORDER BY time desc limit 5"); //pro každý příspěvek se vygeneruje HTML kód while ($zaznam = mysql_fetch_array($result)){ echo '<li><h3>'.$zaznam['name'].'</h3><span class="time">'.$zaznam['time'].'</span>'.$zaznam['text'].'</li>'; $lastid=($lastid>$zaznam['id'])?$lastid:$zaznam['id']; } $_SESSION['lastid'][$recipient] = $lastid; echo "|lastid=".$_SESSION['lastid'][$recipient]; //do proměnné lastid se bude ukládat nejvyšší id //echo $_SESSION[$zaznam['recipient']]['lastid']."aaa"; //na konec je vypsáno nejvyšší aktuální id za oddělovačem, šlo by to samozřejmě udělat i jiným způsobem... break; |
||
Tori Profil |
#7 · Zasláno: 11. 12. 2012, 21:02:39
kozusnik.jan:
„narazil jsem ještě na druhý problém“ Čím se projevuje? |
||
kozusnik.jan Profil * |
#8 · Zasláno: 11. 12. 2012, 21:19:20
no jde o to, že chci po vypsání těch příspěvků uložit do sessions["lastid"][$recipient] ($recipient - id toho, komu tu zprávu posílám. PHP hodnotu téhle proměnné získá přes AJAX). AJAX mi hodnotu toho sessions vypíše dobře, ale PHP pak už není zpětně schopno to asi zrpacovat nebo co... prostě když dám do té podmínky, že id příspěvku musí být větší než hodnota toho sessions, tak se mi stále dokola vypisuje 5 nejnovějších příspěvků ( limit 5 order by time desc) a nevím, jak to vyřešit
|
||
Tori Profil |
#9 · Zasláno: 11. 12. 2012, 21:40:38 · Upravil/a: Tori
Nová zpráva v chatu se ukládá do DB v tomto skriptu, nebo jiném? Nechybí v některém souboru session_start()? Když už máte teď správně logiku podmínky, zobrazí to správná data v případě, že ID napíšete do dotazu jako číslo?
Jinak možná se pletu, ale mám pocit, že ve chvíli kdy odešlu příspěvek, se mi nebudou zobrazovat žádné (ani ten můj) až do chvíle, kdy někdo jiný pošle další příspěvek - a i potom se mi zobrazí jen ten jeden cizí. Kvůli té podmínce s ID. (Ale jestli to tak má být tak pardon.) Jo ještě jedna věc, to bude možná příčina: Pokud někde nad tímhle kusem kódu nemáte řádek $lastid = $_SESSION['lastid'][$recipient]; , tak se vám hodnota ze session smaže pokaždé, když zavoláte tento skript a v DB nebudou žádné řádky odpovídající podmínce.
|
||
kozusnik.jan Profil * |
#10 · Zasláno: 11. 12. 2012, 22:36:35
session_start je v index.php, do kterého se to includuje. resp se tam includuje view.php. v něm je formulář, chaty... po odeslání se zavolá ajax a ten zavolá php takže by to php mělo mít sessions zapnuté... navíc mi je vypisuje, takže to je v pohodě. v té podmínce se pletete ;)
podmínka: ( recepient = $recepient and sender = $sender ) or ( recipient = $sender and sender = $recipient) - vypisuji ty, kde jsem já odesílatel a mají příjemce jednoho a kde jsem já příjemce a odesílatel je ten stejný. ten řádek je tady: $lId=isset($_SESSION["lastid"][$recipient])?$_SESSION["lastid"][$recipient]:0; |
||
Tori Profil |
#11 · Zasláno: 11. 12. 2012, 22:39:43
kozusnik.jan:
„ten řádek je tady:“ Neni, tady je proměnná $lId a dál pracujete s $lastid . V obou případech by to ale měla být stejná proměnná.
|
||
kozusnik.jan Profil * |
#12 · Zasláno: 12. 12. 2012, 18:18:24
i když jsem to změnil, tak to pořád nefunguje...
kod vypadá teďka takhle: case "aktualizovat": $sender = $_GET['senderId']; $recipient = $_GET['recipientId']; //získání id, defaultně 0 $lastid=isset($_SESSION["lastid"][$recipient])?$_SESSION["lastid"][$recipient]:0; //$last = $_SESSION['chat']['lastid'][$recipient]; $result = mysql_query("SELECT * FROM chat WHERE ( (sender = $sender and recipient = $recipient) or (sender = $recipient and recipient = $sender) ) and id > $lastid ORDER BY time desc limit 5"); //pro každý příspěvek se vygeneruje HTML kód while ($zaznam = mysql_fetch_array($result)){ echo '<li><h3>'.$zaznam['name'].'</h3><span class="time">'.$zaznam['time'].'</span>'.$zaznam['text'].'</li>'; $lastid=($lastid>$zaznam['id'])?$lastid:$zaznam['id']; } $_SESSION['lastid'][$recipient] = $lastid; echo "|lastid=".$_SESSION['lastid'][$recipient]; //do proměnné lastid se bude ukládat nejvyšší id //echo $_SESSION[$zaznam['recipient']]['lastid']."aaa"; //na konec je vypsáno nejvyšší aktuální id za oddělovačem, šlo by to samozřejmě udělat i jiným způsobem... break; |
||
kozusnik.jan Profil * |
#13 · Zasláno: 13. 12. 2012, 17:54:09
tak co, nevíte, kde je chyba?
|
||
abc Profil |
#14 · Zasláno: 13. 12. 2012, 18:28:31
Co to má dělat? Co to dělá?
|
||
Tori Profil |
#15 · Zasláno: 13. 12. 2012, 18:30:23
abc:
viz [#8] |
||
abc Profil |
Tak to se omlouvám, ale tomu nerozumím. Už to čtu po čtvrté a na začátku chce uložit id uživatelů, kterým posílá nějakou zprávu a vyprávění končí tím, že se vypisuje 5 nejnovějších příspěvků.
Ke kódu: V tomto cyklu procházíš 5 posledních řádku z databáze a přepisuješ si je v proměnné $lastid , tzn. v $lastid imho musí být vždy 5. nejnovější id.
while ($zaznam = mysql_fetch_array($result)){ echo '<li><h3>'.$zaznam['name'].'</h3><span class="time">'.$zaznam['time'].'</span>'.$zaznam['text'].'</li>'; $lastid=($lastid>$zaznam['id'])?$lastid:$zaznam['id']; } |
||
kozusnik.jan Profil * |
#17 · Zasláno: 13. 12. 2012, 19:23:44
No id uživatelů ukládám, protože je používám k tomu, abych poukázal, které poslední id chci porovnávat...
Př. píšu si s uživatelem, který má id = 2. já mám id = 1. Vypíši příspěvky s danou podmínkou a poslední id ukládám do $_SESSION['lastid'][id_uzivatele_se_ktery_si_pisi]. Proč? Protože když budu mít více chatů s více uživateli, tak jak mám poznat, které poslední id patří k danému uživateli? |
||
abc Profil |
kozusnik.jan:
Stále nepíšeš, co je špatně a co má být správně! Neukládá se ti poslední ID? viz [#16] imho se ukládá vždy 5. id od konce Vypisuje se ti 5 posledních příspěvků, ty jich chceš x? Změn dotazu limit z 5 na x |
||
kozusnik.jan Profil * |
#19 · Zasláno: 14. 12. 2012, 20:01:14
Špatně je to, že se asi neukládá id posledního příspěvku... správně se má uložit id poslední příspěvku do SESSION['lastid'][$recipient] ($recipient = proměnná). Jenže se prostě asi neukládá nebo co. Když ji pošlu do ajaxu, tak se vypíše v pohodě, ale v PHP už použít nelze...
to s 5 posledními příspěvky je dobře ;) |
||
Tori Profil |
#20 · Zasláno: 14. 12. 2012, 22:03:55
kozusnik.jan:
Neukládá se do session vůbec, anebo se uloží jinam než čekáte? (zkontrolujte výsledek var_dump($_SESSION); )
|
||
kozusnik.jan Profil * |
#21 · Zasláno: 15. 12. 2012, 17:56:05
vypisuje to NULL... takže se to asi špatně ukládá... když to ale pošlu do AJAXu, tak se mi session vypíše...
|
||
abc Profil |
#22 · Zasláno: 15. 12. 2012, 18:35:50
1) dej si na 15. řádek
echo $lastid; je v té proměnné něco?
2) ukládá se ti něco do session? je session nastartovaná - session_start? |
||
kozusnik.jan Profil * |
#23 · Zasláno: 16. 12. 2012, 19:25:19 · Upravil/a: kozusnik.jan
do $lastid se hodnota ukládá.
Mám soubor index.php, ve kterém mám session_start(); Do souboru index.php includuji soubor chatView.php. V tom je AJAX a ten volá na zpracování souboru chatZpracovani.php, takže by tam sessions měly být zapnuté No zkusil jsem tam hodit to session_start() a už to vypisuje hodnoty sessions, takže chyba byla tam. Děkuji za rady |
||
Tori Profil |
#24 · Zasláno: 17. 12. 2012, 12:37:05
kozusnik.jan:
„Do souboru index.php includuji soubor chatView.php. V tom je AJAX a ten volá na zpracování souboru chatZpracovani.php“ Pokud se chatZpracovani.php nevolá oklikou přes index.php, tak tam session nemohla být automaticky zapnutá. |
||
Časová prodleva: 11 let
|
0