« 1 2 3 4 5 6 7 8 »
Autor Zpráva
perwin
Profil
Ahoj,
chci se zeptat: Jak lze vyrobit chat, jako je např. na Facebooku, že si uživatel může povídat s těmi, kteří jsou online? Děkuji
LosFilipos
Profil
perwin:
Ajax
Přikládám odkaz, na jednoduchý chat s použitím ajaxu a XMLHttpRequest.
Podívej se do zdroje, snad to bude k pochopení.
Obsah skriptu run.php:
<?php
require('./core.inc'); // obsahuje připjení k databázi...

$nick = $_SESSION["login"];
$text = htmlspecialchars($_POST["text"]);

$db = new database(); // mám vlastní třídu na práci s databází, takže tady by stačilo spojení s db
if($text!="") {
$db -> insert('chat',"null|$nick|$text"); // vložení do tabulky insert
// ekvivalent k mysql_query(INSERT INTO chat VALUES atd...)
}

echo '<login style="display:none;">'.$nick.'</login>'; // tohle tam je, aby javascript poznal, kdo píše příspěvek a podle toho vypsal jméno (viz ř. 80 - engine.js na webu v ukázce)
$query = "SELECT * FROM `chat` ORDER BY `id` DESC";
$try = mysql_query($query);
echo '<h6>Diskuse...</h6>';
while($result = mysql_fetch_array($try)) {
if($result["nick"]==$nick) {
echo '<i><b>'.$result["nick"].'</b></i>: '.$result["text"]).'<br />';
} else {
echo '<b>'.$result["nick"]).'</b>: '.$result["text"].'<br />';
}
}
perwin
Profil
LosFilipos:
Ano toto vím a dokážu sestrojit chat .. ale je to live chat? Jako že když tam někdo napíše zprávu, že se to druhému uživateli hnedka aktualizuje? Třeba něco jako ICQ, že když někdo odešle do chatu zprávu, že se tomu druhému hnedka objeví, a jetu ještě jeden mega problém, - potřebuji zařídit, aby ten chat navázal uživatel s druhým (ale pouze s tím druhým, ne jako veřejná diskuse). Aby ten chat navázal jen s tím, na kterého klikne. A aby také byl ten chat jenom dočasný, že při přístím přihlášení uživatele už bude ten chat smazaný.
LosFilipos
Profil
perwin:
ale je to live chat?
Ano, kdyby jsi pořádně prostudoval kód, viděl by jsi, že je tam funkce reload() která se pouští v intervalu 1s.

potřebuji zařídit, aby ten chat navázal uživatel s druhým (ale pouze s tím druhým, ne jako veřejná diskuse). Aby ten chat navázal jen s tím, na kterého klikne.
To už je jenom o tom si s tím vyhrát. Rozhodně to ale není mega problém.

A aby také byl ten chat jenom dočasný, že při přístím přihlášení uživatele už bude ten chat smazaný.
Při logoutu se jednoduše přidá funkce, která z db odstraní všechny zprávy se jménem toho uživatele...
perwin
Profil
Aha.. tak mi s tím prosím pomoz... děkuji
LosFilipos
Profil
perwin:
To opravdu není na vypisování do diskuse. Pokud to nedokážeš sám, zkus se obrátit na téma Práce a zakázky
LosFilipos
Profil
perwin:
Rámcově:
Vytvořil bych tabulku "aktivní chaty". Když klikne uživatel na kamaráda se kterým chce chatovat, id kamaráda a id uživatele se do ní uloží. Skript u kamaráda pozná, že v tabulce aktivní chaty vznikl zápis s jeho user_id a otevře okno chatu. V tabulce chat (zprávy) bude navíc sloupec id_chatu a zprávy se budou vypisovat pouze uživatelům, jejichž user_id je uvedeno v tabulce aktivní chaty právě v řádku s id_chatu. Při odhlášení se odebere user_id odhlášeného člověka. Pokud je odhlášený člověk poslední v tabulce aktivní chaty, provede se vymazání všech zpráv s daným id_chatu, následně se vymaže i aktivní chat...

Zkoušej tvořit:-D, když budeš potřebovat potom pomoct s dolaďováním, napiš...
perwin
Profil
LosFilipos:
1) Tím id kamaráda a uživatele myslíš jejich jméno?
2) S tím scriptem to asi bude trošku problém.... jak pozná, že se jeho user id zapsalo do tabulky?
3) Nechápu, proč je tabulka aktivní chaty a tabulka zpravy ...?
4) Cože mám udělat při tom odhlášení?
Díky za radu ale potřebuju ještě trošku víc popostrčit na to abych to zvladnul... díky
perwin
Profil
LosFilipos:
Nemáš prosímtě rovnou ten script? Nebo aspoň něco, co by mi s tím pomohlo? Děkuji
LosFilipos
Profil
perwin:
Hele, žádný skript nemám, ještě jsem nic takového nepotřeboval a to co jsem psal bylo to první, co mě napadlo.
K tvým otázkám:

1) Tím id kamaráda a uživatele myslíš jejich jméno?
Předpokládám, že na stránkách máš v databázi mysql nějakou tabulku uživatelů. Id by mělo být jedinečné identifikačí číslo (nebo přezdívka, pokud zamezíš, aby se nanašli dva uživatelé s jedním jménem). Je lepší jako id použít sloupec s primary key a auto increment, tedy že to jedinečné číslo se bude generovat automaticky při uložení uživatele do databáze - zamezí se tím opakování čísel.

2) S tím scriptem to asi bude trošku problém.... jak pozná, že se jeho user id zapsalo do tabulky?
Jako je v současném ukázkovém skritpu, funkce reload kontroluje, zda se nezměnil počet zpráv v databázi, tak něco podobného by kontrolovalo každou sekundu tabulku chatů, jestli se tam náhodou není tvoje jedinečné číslo, nebo jméno.

3) Nechápu, proč je tabulka aktivní chaty a tabulka zpravy ...?
Tož to je pro usnadnění práce s chatem. V tabulce aktivní chaty budou tři sloupce:
id_chatu | id_uzivatele | id_kamarada
Kde se vždy při zahájení chatu vloží řádek a id_chatu bude automaticky vygenerované číslo, aby se zabránilo duplicitě.

Tabulka zprávy ude vypadat následovně:
id_zpravy | id_chatu | id_autora | text_zpravy
Id_zpravy je jedinečné číslo konkrétního příspěvku, id_chatu bude číslo onoho chatu aby skript poznal, komu má ty zprávy zobrazovat, id_autora bude jedinečné číslo pisatele zprávy (tzn pokud tu zprávu napíšeš ty, bude stejné, jako id_uzivatele v tabulce aktivni_chaty, když ji napíše tvůj kamarád, bude to to samé jako id_kamarada) a konečně text zprávy, což snad není potřeba vysvětlovat ;-)

4) Cože mám udělat při tom odhlášení?
Při odhlášení zjistíš, zda je tvoje id_uzivatele vedeno v nějaké tabulce aktivní chaty a pokud ano, tak ho smaž. Aby ovšem zůstaly zprávy v chatu tvému kamarádovi i po tvém odhlášení, nemůžeš je hned vymazat z tabulky zprávy, ale počkáš, až se odhlásí i tvůj kamarád. V tom případě skript smaže záznam v tabulce aktivní_chaty, kde bude id_kamarada uvedeno a navíc vymaže z tabulky zprávy všechny zprávy, kde jako id_chatu bylo uvedeno to, co jsi právě smazal...

Příklad:
Máš tabulku uživatelé, pomocí které se návšteníci tvých stránek přihlašují.
Řekněme, že vypadá takto:
id_uzivatele | prezdivka | heslo | další nezajímavé sloupce...

a v tabulce jsou tři uživatelé: Ty, tvůj kamarád Marek a někdo další.
jejich řádka v tabulce bude vypadat takto:
1 | Perwin | tajné heslo
2 | Marek | ...
3 | Nekdo jiný | ...

Pokud budeš chtít chatovat s Markem, do tabulky aktivní chaty se vytvoří řádek takto:
(řekněme že chat bude 265. v pořadí...)
id_chatu | id_uzivatele | id_kamarada
265 | 1 | 2

Skript pozná, že v tabulce je Markovo id a tudíž mu otevře okno chatu. Napíšeš Markovi zprávu:
,,Nazdar Marku, jak je?"
do tabluky zpravy se uloží následující:
(náhodou to bude zrovna 10000. zpráva v tabulce zprávy)
id_zpravy | id_chatu | id_autora | text_zpravy
10000 | 265 | 1 | Nazdar Marku, jak je?

Marek odpoví:
,,Ale jde to"
uloží se:
10001 | 265 | 2 | Ale jde to

A takhle se budou přidávat další a další zprávy, ale uživateli Nekdo jiný se nezobrazí, ani kdyby měl otevřené okno chatu, protože jeho id (3) není v tabulce aktivní chaty vedeno u chatu č. 265.

Doufám, že tohle aspoň trošku pomuže v začátku. Nejlepší bude, když zkusíš nejdřív vytvořit funkce pro chat bez ajaxu (tzn, že pro příjem zpráv budeš muset reloadovat stránku) a až to poběží, tak přidat realtime kontrolu a ostatní funkce...
perwin
Profil
LosFilipos:
1) Jak mám zařídit, aby se při kliknutí na jméno Marek (ve výpisu Online uživatelé) zapsalo do tabulky id_chatu | id_uzivatele | id_kamarada ? Jako vím jak zařídit aby se to zapsalo jako to samotný, ale jak udělat aby se ta funkce vykonala při kliknutí na Marek?
2) Jak udělat, aby se do databáze nahrávaly čísla chatů a zpráv za sebou? Jako že jeden chat bude mít číslo 1 (protože bude první) a jak udělat, aby ten druhý chat měl číslo 2?
LosFilipos
Profil
<a href="./zapis_do_tabulky_aktivnich_chatu.php?id_kamarada=2&url=puvodni_stranka.php">chatovat s Markem</a>


Soubor zapis_do_tabulky_aktivnich_chatu.php bude obsahovat onene kód na záspos do db a přesměrování zpět na původní adresu.

Tohle je řešení bez ajaxu. Pro realtime zápis bys ještě přidal
onclick="novy_aktivni_chat(2);return false;"


přičemž funkce novy_aktivni_chat(2) by ajaxem odkazovala na soubor podobný zapis_do_tabulky_aktivnich_chatu.php, ovšem bez přesměrování.
Tady je příklad podobné funkce. Zkoukni zdroj. Tam je to zkombinováno s jQuery.

perwin:
2) Jak udělat, aby se do databáze nahrávaly čísla chatů a zpráv za sebou? Jako že jeden chat bude mít číslo 1 (protože bude první) a jak udělat, aby ten druhý chat měl číslo 2?
Při tvorbě tabulky v phpmyadmin zaškrtneš u položky id kolonku (checkbox) auto_increment.
Při vkládání dat přes INSERT INTO pak uvedeš místo id_chatu hodnotu null...
Příklad:
$add = mysql_query("INSERT INTO `aktivni_chaty`(`id_chatu`, `id_uzivatele`, `id_kamarada`) VALUES (null,'$id_uzivatele_tedy_moje','$id_kamarada')");
perwin
Profil
LosFilipos:
a ten sloupec id_chatu má být jakého typu? TEXT nebo INT...?
Hlásí mi to totiž:
#1063 - Incorrect column specifier for column 'id_chat' 
LosFilipos
Profil
perwin:
a ten sloupec id_chatu má být jakého typu? TEXT nebo INT...?
Určitě INT. Auto_increment je přípůstný pouze u INT...
perwin
Profil
Nojo ale teď mi to hlásí:
#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key 


Takto má nyní tedy vypadat odkaz na aktivní chat s vybraným uživatelem?:
<?php
	require_once "db.php";
	  $query = MySQL_Query("SELECT jmeno, online FROM `uzivatele` WHERE online = 'yes'") or die (mysql_error());
$vypis = "";
$rows = mysql_num_rows($query);
if($rows>0) {
   while($Vysledek = mysql_fetch_array($query)) {
      $vypis .= ($vypis=="" ? $Vysledek['jmeno'] : ', '.$Vysledek['jmeno']);
   }
} else {
$vypis = 'Nikdo';
}
echo '<u>Online uživatelé:</u> <a href="aktivnichat.php?'.$vypis.'=''.$vypis.'&url=puvodni_stranka.php">'.$vypis.'</a>' ;
?>

- co je myšleno tím: url=puvodni_stranka.php?
LosFilipos
Profil
perwin:
#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
Musíš nastavit slupci chat_id že má primary_key neboli INDEX -> PRIMARY.

- co je myšleno tím: url=puvodni_stranka.php?
Aby se při přesměrování pomocí headers vrátil zpět na předchozí stránku, musíš si jí taky poslat skriptu...

Mělo by to vypadat takto:
<?php
    require_once "db.php";
      $query = MySQL_Query("SELECT id, jmeno, online FROM `uzivatele` WHERE online = 'yes'") or die (mysql_error());
$vypis = "";
$rows = mysql_num_rows($query);
if($rows>0) {
   while($Vysledek = mysql_fetch_array($query)) {
      $vypis .= ($vypis=="" ? '<a href="aktivnichat.php?pridej='.$Vysledek['id'].'&amp;url='.urlencode($_SERVER["REQUEST_URI"]).'"> '.$Vysledek['jmeno'].'</a>' : ', <a href="aktivnichat.php?pridej='.$Vysledek['id'].'&amp;url='.urlencode($_SERVER["REQUEST_URI"]).'"> '.$Vysledek['jmeno'].'</a>');
   }
} else {
$vypis = 'Nikdo';
}
echo '<u>Online uživatelé:</u> '.$vypis;
?>
perwin
Profil
LosFilipos:
Ano, ale v souboru aktivnichat.php musí být nadefinováno to pridej=, nebo ne? Prosím poraď, jak bude vypadat ten soubor. Děkuji
LosFilipos
Profil
perwin:
Ano, ale v souboru aktivnichat.php musí být nadefinováno to pridej
Ano to musí... Rámcově by měl soubor aktivnichat.php vypadat takto:
<?php
    require_once "db.php";
    
$id_uzivatele = $_SESSION["to, co se uloží do session při přihlášení"];
$id_kamarada = mysql_real_escape_string($_GET["pridej"]);
    
    $add = mysql_query("INSERT INTO `aktivni_chaty` (`id_chatu`,`id_uzivatele`,`id_kamarada`) VALUES (null,'$id_uvizatele','$id_kamarada')") or Die(mysql_error());
    
$url = urldecode($_GET["url"]);
    
    if($add) {
    Header("Location: ".$url . SID);
    } else {
    Header("Location: ".$url."?error=nepodarilo_se_pripojit_k_chatu" . SID);    
    }
    exit();
?>
perwin
Profil
LosFilipos:
Trošku jsem upravil script, který odkazuje na chat, tak, aby se ten odkaz ukázal jenom přihlášeným:
<?php
    require_once "db.php";
      $query = MySQL_Query("SELECT jmeno, online FROM `uzivatele` WHERE online = 'yes'") or die (mysql_error());

$vypis = "";
$rows = mysql_num_rows($query);
if($rows>0) {
   while($Vysledek = mysql_fetch_array($query)) {
      $vypis .= ($vypis=="" ? '<a id="aktiv" href="aktivnichat.php?pridej='.$Vysledek['jmeno'].'&amp;url='.urlencode($_SERVER["REQUEST_URI"]).'"> '.$Vysledek['jmeno'].'</a>' : ', <a href="aktivnichat.php?pridej='.$Vysledek['jmeno'].'&amp;url='.urlencode($_SERVER["REQUEST_URI"]).'" id="aktiv"> '.$Vysledek['jmeno'].'</a>');
      $vypis2 .= ($vypis2=="" ? ' '.$Vysledek['jmeno'].'' : ','.$Vysledek['jmeno'].'');   
}
} else {
$vypis = 'Nikdo';
$vypis2 = 'Nikdo';
} 
if(isset($_SESSION['prihlasen']) and $_SESSION['prihlasen']==1){
echo '<u>Online uživatelé:</u> '.$vypis; 
}else{
echo '<u>Online uživatelé:</u> '.$vypis2; 
}
?>


$id_uzivatele = $_SESSION["to, co se uloží do session při přihlášení"];

Tam můžu přeci dát "jmeno", nebo ne?

Poté, co uživatel klikne na jméno kamaráda, odkáže ho to na
web.php?page=uvodSID

Proč to SID?
LosFilipos
Profil
perwin:
Tam můžu přeci dát "jmeno", nebo ne?
Pro lepší práci se dalšími stripty by tam ukládal právě to číslo.

Takhle je to rychlejší:
echo '<u>Online uživatelé:</u> '.(if(isset($_SESSION['prihlasen']) and $_SESSION['prihlasen']==1) ? $vypis : $vypis2); 
LosFilipos
Profil
perwin:
Proč to SID?
SID je zkratka pro SESSION ID. Některé prohlížeče při přesměrování pomocí headers zahodí session a uživatele by to odhlásilo. Proto se tam dává SID, ovšem jako konstatnta - tedy ne v uvozovkách.
perwin
Profil
LosFilipos:
A potřebuju poradit s tim odkazem na chat: Když to vypisuje ty uživatele, kteří jsou online (vypíše to i mě samotného), potřebuji zařídit, aby uživatel nemohl kliknout sám na sebe (na svoje jméno). Protože to by zapsalo do databáze: id_kamarada = perwin, id_uzivatele = perwin, a to je přece hloupost. Jak na to?
LosFilipos
Profil
perwin:
potřebuji zařídit, aby uživatel nemohl kliknout sám na sebe
SELECT id, jmeno, online FROM `uzivatele` WHERE online = 'yes' && `id` != '$id_uzivatele'
perwin
Profil
LosFilipos:
$query = MySQL_Query("SELECT jmeno, online FROM `uzivatele` WHERE online = 'yes'  && `jmeno` != '$id_uzivatele'") or die (mysql_error());

A kde je definováno to $id_uzivatele?
Nešlo by tam nějak dát
$_SESSION['login'] = $id_uzivatele 
?
LosFilipos
Profil
perwin:
A kde je definováno to $id_uzivatele?
To si definuješ někde na začátku kódu
$id_uzivatele = $_SESSION["id_uzivatele"]; // tedy to, co si tam uložíš při přihlášení
, aby si nemusel pořád vypisovat
$_SESSION["id_uzivatele"];

Trošku přemýšlej...
perwin
Profil
LosFilipos:
Ano, ale to způsobí to, že se do seznamu Online uživatelé nevypíše moje jméno. Ale já chci, aby se tam vypsalo, akorát ne jako odkaz. Děkuji
LosFilipos
Profil
Ano, ale nezobrazí se to jen tobě. Ostatním se zobrazíš... Na co potřebuješ v seznamu vidět svoje jméno, když víš, že jsi online?
perwin
Profil
LosFilipos:
To je totéž, jako když tam napíšu
$query = MySQL_Query("SELECT jmeno, online FROM `uzivatele` WHERE online = 'yes'  && `jmeno` != '$_SESSION[login]'") or die (mysql_error());

?
LosFilipos
Profil
perwin
Ne, chybí ti tam uvozovky...
$query = MySQL_Query("SELECT jmeno, online FROM `uzivatele` WHERE online = 'yes'  && `jmeno` != '".$_SESSION["login"]."'") or die (mysql_error());
perwin
Profil
LosFilipos:
Nevím, zřejmě to nefunguje, pořád se mi moje jméno vypisuje mezi Online uživatelé
« 1 2 3 4 5 6 7 8 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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