Autor Zpráva
kozusnik.jan
Profil *
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
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
kozusnik.jan:
Vypsal jste si výsledný dotaz, jestli se do session ukládá správné číslo?
kozusnik.jan
Profil *
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 )
zatímco vy chcete tohle:
( ( sender.. AND...recipient) OR (sender...AND...recipient) ) AND id
Šlo by to napsat i takto (přijde mi to čitelnější. Pomůže index přes sloupce sender+recipient, v libovolném pořadí. Akorát teda to najde i zprávy, které pošlu sama sobě, pokud to aplikace umožňuje.)
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 *
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...
je to jen část toho kódu... tento php kód je volán ajaxem při odeslání příspěvku.


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
kozusnik.jan:
narazil jsem ještě na druhý problém
Čím se projevuje?
kozusnik.jan
Profil *
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
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 *
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
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 *
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 *
tak co, nevíte, kde je chyba?
abc
Profil
Co to má dělat? Co to dělá?
Tori
Profil
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 *
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 *
Š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
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 *
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
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 *
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
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á.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: