Ένα chat με JQuery: Ένα δείγμα chat_aux.php
Σε ένα προηγούμενο άρθρο που παρουσίασα την ανάπτυξη ενός chat σε JQuery, ανέφερα ότι διάφορες server-side παράμετροι αφορούν την εκάστοτε υλοποίηση. Παρόλα αυτά, σκέφτηκα ότι ίσως θα ήταν σκόπιμο να παρουσιάσω και ένα chat_aux.php σαν παράδειγμα, ώστε η παρουσίαση να είναι πληρέστερη. Φυσικά, σε πραγματικές συνθήκες, τα πράγματα θα ήταν αρκετά πιο πολύπλοκα από αυτό.
Ας αρχίσουμε με τη δημιουργία μίας υποδομής σε βάση δεδομένων MySQL. Κατ’ ελάχιστο, θα χρειαστούμε έναν πίνακα χρηστών που θα καταγράφει πότε ήταν η τελευταία φορά που “είδαμε” κάποιο χρήστη, και έναν πίνακα chat που θα καταγράφει τη συνομιλία.
CREATE TABLE `chat_user` ( `username` varchar(250) NOT NULL, `last_chat` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE `chat` ( `mark` int(11) NOT NULL AUTO_INCREMENT, `msg_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `username` varchar(250) NOT NULL, `message` text NOT NULL, PRIMARY KEY (`mark`) );
Για το κομμάτι της php, το παρακάτω θα μπορούσε να είναι ένα δείγμα chat_aux.php:
<?php
// Database Connection
$dbconn=new mysqli('host','dbuser','dbpass','db');
$dbconn->query('set names utf8');
// Determine the username for the current session
$t=date("Y-m-d H:i:s");
session_start();
if(!isset($_SESSION['username']))
{
$_SESSION['username']='user_'.rand();
$dbconn->query("insert into chat_user (username,last_chat) values ('".$_SESSION['username']."','$t')");
}
else
$dbconn->query("update chat_user set last_chat='$t' where username='".$_SESSION['username']."'");
// Utility function to fetch all rows from a parametrized stmt
function get_dataset($stmt)
{
$r=array();
if($stmt->execute()&&($d=$stmt->get_result()))
while($row=$d->fetch_assoc()) $r[]=$row;
return $r;
}
// get_username(): returns the username of the current user
function get_username() { return $_SESSION['username']; }
// get_conversation(): returns the last hour's messages from $mark onwards
function get_conversation($mark)
{
global $dbconn;
$limit=date("Y-m-d H:i:s",strtotime('-1 hour'));
$sql="select mark,msg_time,username,message from chat where mark>? and msg_time>?";
$stmt=$dbconn->prepare($sql);
$stmt->bind_param('ss',$mark,$limit);
return get_dataset($stmt);
}
// get_active_users(): returns all active users (last_chat not earlier than 15secs ago)
function get_active_users()
{
global $dbconn;
$not_seen=date("Y-m-d H:i:s",strtotime('-15 sec'));
$sql="select username from chat_user where last_chat>?";
$stmt=$dbconn->prepare($sql);
$stmt->bind_param('s',$not_seen);
return get_dataset($stmt);
}
// say(): records a user's message to the database
function say($user,$msg)
{
global $dbconn;
global $t;
$m=stripslashes(htmlspecialchars($msg));
$sql="insert into chat(msg_time,username,message) values (?,?,?)";
$stmt=$dbconn->prepare($sql);
$stmt->bind_param('sss',$t,$user,$m);
return get_dataset($stmt);
}
Το κομμάτι της σύνδεσης με τη Βάση Δεδομένων είναι αρκετά σαφές. Έπειτα, αρχικοποιούμε τη συνεδρία (session), δίνουμε στο χρήστη ένα νέο τυχαίο username και καταγράφουμε την παρουσία του στον πίνακα χρηστών. Υπάρχει επίσης μία βολική συνάρτηση get_dataset() που εκτελεί ένα mysqli prepared statement και επιστρέφει όλες τις εγγραφές του.
Η συνάρτηση get_username() είναι εύκολη: απλά επιστρέφει το username της συνεδρίας, όπως αρχικοποιήθηκε από τον παραπάνω κώδικα. Όλες οι άλλες συναρτήσεις επικοινωνούν με τη Βάση Δεδομένων, χρησιμοποιώντας prepared statements και την get_dataset() προκειμένου να επιστρέψουν τα εκάστοτε δεδομένα. Πιο συγκεκριμένα, η geet_conversation() επιστρέφει όλα μηνύματα που στάλθηκαν μέσα στην τελευταία ώρα, με mark μεγαλύτερο του $mark. Η get_active_users() υποθέτει ότι ένας χρήστης είναι ενεργός αν αν έχει καταγραφεί στον πίνακα χρηστών μέσα στα τελευταία 15 δευτερόλεπτα. Τέλος, η say() καταγράφει το μήνυμα του χρήστη στον πίνακα chat αφού πρώτα αφαιρέσει απ’ αυτό τυχόν html, για προφανείς λόγους 😉

Φανταστικό άρθρο !
Σε ευχαριστούμε που μαθαίνουμε με όσα χρήσιμα γράφεις !