Jednoduchý chat v PHP

PHP Ostatní Jednoduchý chat v PHP

V tomto tutoriálu si ukážeme jak si vytvořit jednoduchý chat v PHP.

Potřebujeme nějaký kvalitní webhosting, ne Endoru – ta to má zakázáno, ne Webzdarma nebo IC – ti mají děsně pomalou databázi

Takže, chat si uděláme do framesetu.

Připravíme si databázi.

Vytvořte si tabulku, např. "chat", se sloupci

  • ID - typ INT a zaškrtneme AUTO_INCREMENT
  • jmeno - typ TEXT, porovnání utf8_bin
  • zprava - typ TEXT, porovnání utf8_bin
  • cas - typ DATETIME

Vytvoříme si 7 souborů.

  1. databaze.php
  2. index.php
  3. chat_type.php
  4. chat_screen.php
  5. messages.php
  6. messages.js
  7. msg_write.php

Do souboru databaze.php si uložíme údaje do databáze, např.

<?php
if(!mysql_connect("kam","uzivatel","heslo")) // Připojí se k databázi
{die("Nepodařilo se připojit k databázi");} // pokud selže připojení, vyhodí chybu

if(!mysql_select_db("databaze")) // vybere databázi
{die("Nepodařilo se vybrat databázi");} // pokud selže výběr databáze, vyhodí chybu

mysql_query("SET NAMES `utf-8`");  // nastaví kódování UTF
?>

Do souboru index.php napíšeme

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Chat</title>
</head>
<frameset rows="*, 100" cols="*">
<frame src="chat_screen.php" name="chat-screen">
<frame src="chat_type.php" name="chat-type">
</frameset>
</html>

Jdeme dál, do souboru chat_screen.php. Zde se budou zobrazovat zprávy. Soubor vypadá takto:

<script type="text/javascript" src="messages.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div id="messages"></div>

Soubor chat_type.php slouží k zápisu zprávy. Vložíme:

<?php session_start(); //použijeme pro uložení jména ?>
<br><br>
<form action="msg_write.php" method="post">
<input type="text" name="jmeno" <?php if(isset($_SESSION['jmeno'])){echo('value="' . $_SESSION["jmeno"] . '" ');} ?> > <input type="text" name="zprava"><input type="submit" value="Pošli !">
</form>

Nyní vkládání zprávy do databáze. Do souboru msg_write.php si vložíme:

<?php
session_start(); // Slouží pro uložení jména
include('databaze.php'); // includuje soubor s údaji do databáze
$jmeno = mysql_real_escape_string($_POST['jmeno']); // Ochrana proti SQL injekci
$zprava = mysql_real_escape_string($_POST['zprava']);

if($jmeno != "" || $zprava != "") // Pokud jméno a zpráva něco obsahuje (není prázdné)
{
mysql_query("INSERT INTO `chat`(`jmeno`, `zprava`,`cas`) VALUES ('$jmeno','$zprava',Now())"); // Vloží do databáze... vkládáme pouze do jméno, zpráva a datum, ID se vloží samo
$_SESSION['jmeno'] = $jmeno; // Nastaví jméno
header("Location: chat_type.php"); // Vrátí se zpět k psaní zprávy
}
else // Pokud je něco prázdné
{
header("Location: chat_type.php"); // Vrátí se zpět k psaní zprávy
}
?>

Nyní zobrazování zpráv. Do souboru messages.php vložíme:

<?php
include('databaze.php'); // Includuje údaje pro připojení k DB

$vyber = mysql_query("SELECT * FROM `chat` ORDER BY `cas` DESC"); // Vybere z tabulky chat, seřazeno podle času
while($radek = mysql_fetch_assoc($vyber)) // Dokud není na konci, vybírá zprávy
{
echo htmlspecialchars($radek['cas'] . " ~ " . $radek['jmeno'] . " ~ " . $radek['zprava']); echo("<br><br>"); // Vypíše zprávy, htmlspecialchars zakazuje HTML
}
?>

Aktualizaci zpráv uděláme pomocí JavaScriptu, přesněji technologií AJAX. Do souboru messages.js vložíme:

function getMessages(letter) {
     var div = $("#messages");
     $.get('messages.php', function(data) {
               div.html(data);
          });
}

setInterval(getMessages, 2000);

2000 je čas aktualizace v milisekundách, příliš malé hodnoty budou zatěžovat server.


 

Stáhnout

Staženo 1391x (2.56 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (1)

Článek pro vás napsal Daniel Vítek
Avatar
Primárně PHP programátor, rád si hraje s Arduinem a píše články do sekce Batch.

Jak se ti líbí článek?
Celkem (5 hlasů) :
4.84.84.84.84.8


 



 

 

Komentáře
Zobrazit starší komentáře (64)

Avatar
Richard
Člen
Avatar
Richard:

David Čápka - neuvažoval jsi o přepisování starých/neaktu­álních článků? Přecijen třeba tohle by tu být nemělo (a popravdě ani před těma dvouma rokama asi ne).

Není to ani hezky napsané, ani moderní, velice brzy nefunkční, zkrátka dalo by se to udělat mnohem lépe. Představa že se z tohohle někdo učí je dost děs, nehledě na to že to dost snižuje celkový kredit itnetworku.

Možná by stálo za to mít možnost hodit někam do seznamu podobné články, co potřebují revizi (nebo komplet přepracování), aby se tomu redaktoři mohli věnovat.

Nerad rýpu, ale toto opravdu nemá co dělat mezi php tutoriály :(.

Odpovědět  +8 9.6.2015 21:52
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Richard
David Čápka:

Co konkrétně se ti tam nezdá? Když opominu, že tam používá mysql_, tak na blbnutí pro začátečníky to je docela fajn. SQL injekce tam nemá, je tam nějaký rámec. Já nevím, nepřijde mi to tak hrozné.

Odpovědět  +2 9.6.2015 22:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Richard
Člen
Avatar
Odpovídá na David Čápka
Richard:

Tak hlavně to mysql_*, to je největší průser (a možná jsem jen detailista a je to jediný průser), spíš jde o tu ideu toho aby se nezapomínalo na staré články jak jsem psal ve třetím odstavci.

Takhle od pohledu mi tam úplně nesedí to jQuery - používá se jen na reload (tzn docela zbytečná věc navíc), kdybychom chtěli ukázat práci s jQuery, zrovna u chatu je padesát super možností, škoda je nevyužít (a škoda tím nevyhodit rámy). Slušelo by tomu trochu sex appealu (nejen v kódu) a hlavně, na to že je to pro začátečníky, je tam dost málo vysvětlující omáčky okolo, sice je to okomentované, jako jako začátečník bych z toho moc moudrý nebyl.

Odpovědět 9.6.2015 22:44
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Richard
David Čápka:

Mně tenhle nepřijde tak hrozný. Až se tu ty hlavní seriály dopíší (to by mělo být do konce roku), tak budu dělat nějakou revizi. Také zde chci udělat možnost "Navrhnout úpravu", zatím do těchto funkcí příliš neinvestujeme vývojový čas, materiály jsou tu v porovnání se zbytkem českého internetu v podstatě úplně nové :)

Odpovědět  +2 9.6.2015 22:58
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Vojtěch Jedlička:

U toho ajaxu, pochopil jsem správně ze to vola ten soubor messages.php a to co ten soubor vypíše hodí do toho divu?

 
Odpovědět  +1 9. března 21:25
Avatar
Šimon Rataj
Člen
Avatar
Šimon Rataj:

V PHP 7 už je rozšíření MySQL original API vymazáno, teď je lepší přejít na mysqli či PDO.

Editováno 2. června 19:05
 
Odpovědět  +1 2. června 19:05
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovědět  +1 2. června 19:30
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Šimon Rataj
Člen
Avatar
Odpovídá na Matúš Petrofčík
Šimon Rataj:

Já pracuji na projektu SimonMySQL, je to podobné jako PDO, ale na ovládání dat s tabulky nepotřebuješ SQL. ;-)

 
Odpovědět 3. června 16:21
Avatar
Matúš Priezvisko:

Dobrý deň, vedeli by ste mi niekto poradiť? Spravil som si tabulku na http://localhost/phpmyadmin/ ale neviem ako to pripojiť, vždy mi vypíše iba: Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\xampp\htdoc­s\chat\databa­ze.php:2 Stack trace: #0 C:\xampp\htdoc­s\chat\messages­.php(2): include() #1 {main} thrown in C:\xampp\htdoc­s\chat\databa­ze.php on line 2. Zmenil som meno a aj heslo...ak mi niekto vie poradiť, ocenil by som to, ďakujem.

Editováno 6. července 20:15
 
Odpovědět 6. července 20:14
Avatar
Petr Linhart
Člen
Avatar
Odpovídá na Matúš Priezvisko
Petr Linhart:

Ahoj,
podívej se do php info jestli máš k dispozici MySql extension. Pokud máš verzi php > 5.5.x pak máš k dispozici pouze MySqli a PDO.

Zkus tedy opravit připojení na databázi na
if(!mysqli_con­nect("localhos­t","uzivatel","hes­lo"))

 
Odpovědět 20. srpna 1:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 74. Zobrazit vše