PHP实现最简单的聊天室应用

本文由码农网 –
王国峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

做了一个QQ聊天交友网站,想加个聊天的功能,于是做完用PHP做了简单又强大的聊天室

一.PHP中常用的MySQL操作函数

介绍

聊天应用程序在网上非常常见。开发人员在构建这类应用程序时的选择也很多。这篇文章介绍了如何实现基于PHP-AJAX的聊天应用程序,并且不需要刷新页面就可以发送和接收消息。

1.
创建mysql数据库表:create
table chat( id bigint AUTO_INCREMENT,username varchar(20), chatdate
datetime,msg varchar(500), primary key(id));

1.1.连接MySQL服务器

     
 进行MySQL数据库操作前,首先确保成功连接mysql数据库服务器。php中连接MySQL数据库服务器最简单的函数是mysql_connect()。
       语法格式:resource mysql_connect(string hostname,string
username,string password);
     
 函数功能:通过php程序连接MySQL数据库服务器。如果成功连接MySQL服务器,则返回一个MySQL服务器连接标识(link_identifier),否则返回FALSE。
     
 函数说明:连接远程数据库服务器时,只需将hostname指定为该服务器的IP地址即可。

例如,如下程序connection.php连接了本地MySQL服务器。

<?php 
$serverlink1=mysql_connect("localhost","root","root");
echo $serverlink1;
echo "<br>";
$serverlink2=mysql_connect("localhost","root","root");
echo $serverlink2;
echo "<br>";
?>
  •      
     在同一个PHP脚本程序中连接同一个MySQL数据库服务时,PHP将不会创建新的mysql服务器连接,程序connection.php中$serverlink2的值与$serverlink1的值相对,表示它们是由的是同一个数据库服务器连接。

核心逻辑

在定义应用程序的核心功能之前,先来看一看聊天应用程序的基本外观,如以下截图所示:

图片 1

通过聊天窗口底部的输入框输入聊天文本。点击Send按钮,就开始执行函数set_chat_msg。这是一个基于Ajax的函数,因此无需刷新页面就可以将聊天文本发送到服务器。程序在服务器中执行chat_send_ajax.php以及用户名和聊天文本。

//
// Set Chat Message
//

function set_chat_msg()
{
    if(typeof XMLHttpRequest != "undefined")
    {
        oxmlHttpSend = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
       oxmlHttpSend = new ActiveXObject("Microsoft.XMLHttp");
    }
    if(oxmlHttpSend == null)
    {
       alert("Browser does not support XML Http Request");
       return;
    }

    var url = "chat_send_ajax.php";
    var strname="noname";
    var strmsg="";
    if (document.getElementById("txtname") != null)
    {
        strname = document.getElementById("txtname").value;
        document.getElementById("txtname").readOnly=true;
    }
    if (document.getElementById("txtmsg") != null)
    {
        strmsg = document.getElementById("txtmsg").value;
        document.getElementById("txtmsg").value = "";
    }

    url += "?name=" + strname + "&msg=" + strmsg;
    oxmlHttpSend.open("GET",url,true);
    oxmlHttpSend.send(null);
}

PHP模块从Query
String(查询字符串)中接收表单数据,更新到命名为chat的数据库表中。chat数据库表有命名为IDUSERNAMECHATDATEMSG的列。ID字段是自动递增字段,所以这个ID字段的赋值将自动递增。当前的日期和时间,会更新到CHATDATE列。

require_once('dbconnect.php');

db_connect();

$msg = $_GET["msg"];
$dt = date("Y-m-d H:i:s");
$user = $_GET["name"];

$sql="INSERT INTO chat(USERNAME,CHATDATE,MSG) " .
      "values(" . quote($user) . "," . 
      quote($dt) . "," . quote($msg) . ");";

      echo $sql;

$result = mysql_query($sql);
if(!$result)
{
    throw new Exception('Query failed: ' . mysql_error());
    exit();
}

为了接收来自数据库表中所有用户的聊天消息,timer函数被设置为循环5秒调用以下的JavaScript命令,即每隔5秒时间执行get_chat_msg函数。

var t = setInterval(function(){get_chat_msg()},5000);

get_chat_msg是一个基于Ajax的函数。它执行chat_recv_ajax.php程序以获得来自于数据库表的聊天信息。在onreadystatechange属性中,另一个JavaScript
函数get_chat_msg_result被连接起来。在返回来自于数据库表中的聊天消息的同时,程序控制进入到get_chat_msg_result函数。

//
// General Ajax Call
//

var oxmlHttp;
var oxmlHttpSend;

function get_chat_msg()
{
    if(typeof XMLHttpRequest != "undefined")
    {
        oxmlHttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
       oxmlHttp = new ActiveXObject("Microsoft.XMLHttp");
    }
    if(oxmlHttp == null)
    {
        alert("Browser does not support XML Http Request");
       return;
    }

    oxmlHttp.onreadystatechange = get_chat_msg_result;
    oxmlHttp.open("GET","chat_recv_ajax.php",true);
    oxmlHttp.send(null);
}

在chat_recv_ajax.php程序中,来自于用户的聊天消息会通过SQL select命令进行收集。为了限制行数,在SQL查询中还给出了限制子句(limit 200),即要求聊天数据库表中的最后200行。所获得的消息再返回给Ajax函数,用于在聊天窗口中显示内容。

require_once('dbconnect.php');

db_connect();

$sql = "SELECT *, date_format(chatdate,'%d-%m-%Y %r') 
as cdt from chat order by ID desc limit 200";
$sql = "SELECT * FROM (" . $sql . ") as ch order by ID";
$result = mysql_query($sql) or die('Query failed: ' . mysql_error());

// Update Row Information
$msg="";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
{
   $msg = $msg . "" .
        "" .
        "";
}
$msg=$msg . "<table style="color: blue; font-family: verdana, arial; " . 
  "font-size: 10pt;" border="0">
  <tbody><tr><td>" . $line["cdt"] . 
  " </td><td>" . $line["username"] . 
  ": </td><td>" . $line["msg"] . 
  "</td></tr></tbody></table>";

echo $msg;

数据准备就绪的同时,JavaScript函数会收集来自于PHP接收到的数据。这些数据将被安排置于DIV标签内。oxmlHttp.responseText会保留从PHP程序接收到的聊天消息,并复制到DIV标签的document.getElementById(“DIV_CHAT”).innerHTML属性。

function get_chat_msg_result(t)
{
    if(oxmlHttp.readyState==4 || oxmlHttp.readyState=="complete")
    {
        if (document.getElementById("DIV_CHAT") != null)
        {
            document.getElementById("DIV_CHAT").innerHTML =  oxmlHttp.responseText;
            oxmlHttp = null;
        }
        var scrollDiv = document.getElementById("DIV_CHAT");
        scrollDiv.scrollTop = scrollDiv.scrollHeight;
    }
}

下面的SQL CREATE
TABLE命令可用于创建名为chat的数据库表。所有由用户输入的信息都会进入到数据库表中。

create table chat( id bigint AUTO_INCREMENT,username varchar(20), 
chatdate datetime,msg varchar(500), primary key(id));

2.编写建议连接数据库函数:

1.2.设置数据库字符集

     
 PHP与MySQL服务器连接成功后才可以进行信息互换。信息交互之前,为了防止中文乱码,通常将字符集设置为gbk或utf8.将MySQL数据库的字符集character_set_database设置为gbk或utf-8是避免乱码问题的前期工作,除此以外还需要将character_set_client、character_set_connectioncharacter_set_results的字符集设置为gbk字符集。

兴趣点

这段用于实现聊天应用程序的代码非常有意思。它可以改进成为一个完全成熟的HTTP聊天应用程序。创建该应用程序的逻辑也非常简单。即使是初学者理解起来也不会有任何困难。

dbconnect.php

1.3关闭MySQL服务器连接

       使用函数mysql_close()可以关闭MySQL服务器连接。
       mysql_close()函数的语法格式:bool mysql_close([resource
link_identifier])
     
 函数功能:mysql_close()函数关闭指定的连接标识所关联到的MySQL服务器的连接。如果没有指定link——identifier,则关闭上一个打开的连接。如果关闭成功则返回TRUE,失败则返回FALSE。

例如,closeConnecttion.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
if($serverLink){
    echo "与MySQL服务器连接成功!<br/>";
}
$close = @mysql_close($serverLink);
if($close){
    echo "关闭MySQL服务器连接成功!<br/>";
}else{
    exit("关闭MySQL服务器连接失败!程序中断执行!");
}
?>
  •      
     php脚本程序执行结束后,MySQL服务器连接会作为垃圾被PHP垃圾回收程序自动的“回收”。

许可证

这篇文章,以及任何相关的源代码和文件,都获得了The Code Project Open
License (CPOL)的许可。

<?php

1.4.选择当前操作的数据库

       使用函数mysql_select_db()可以设置当前操作的数据库。
       语法格式:bool mysql_select_db (string
database_name[,resource link_identifier])
     
 函数功能:如果没有指定MySQL服务器连接标识符,则使用上一个打开的MySQL服务器连接。成功返回TRUE,失败返回FALSE。

例如,程序selectDB.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("student",$serverLink) or die("选择当前数据库失败!程序中断执 
行!");
if($dbLink){
    echo "选择student数据库为当前数据库!";
}
$close = @mysql_close($serverLink);
?>

function db_connect()
{

1.4.发送sql语句或mysql命令

     
 建立MySQL服务器连接,设置gbk字符集,并选择了当前操作的数据库后,就可以使用mysql_query()函数向MySQL服务器发送MySQL命令。
       语法格式:{bool|resource} mysql_query() (string sql
[,resource link_identifier])
     
 函数功能:如果没有指定MySQL服务器连接标识,则使用已打开的连接。然后向数据库引擎发送sql字符串。当发送的sql字符串执行失败时,返回FALSE;发送的sql字符串是insert语句、update语句或delete语句,成功返回TRUE;发送的sql字符串是select语句,并且select语句成功执行时,mysql_query()函数返回结果集(result)类型的数据(实际是resource类型的数据)。

  date_default_timezone_set(“Asia/Shanghai”);

       1)发送insert语句,update语句或delete语句。

     
 使用PHP的mysql_query()函数向MySQL服务器引擎发送insert语句,update语句或delete语句后,可以使用mysql_affected_rows()函数查看该SQL语句影响到的表记录行数。
       mysql_affected_rows()函数的语法格式:

int mysql_affected_rows([resource link_identifier])

     
 函数功能:取的最近一次与link_identifier关联的insert、update语句或delect语句,所影响的记录行数。

     
 使用php的mysql_query()函数发送insert语句向某个数据库中添加记录时,若该数据库表中某个字段为auto_increment自增字段,可以使用mysql_insert_id()函数得到当前insert语句执行后的该字段值。
       语法格式:int mysql_insert_id([resource
link_identifier])
       
mysql_insert函数功能:mysql_insert_id()函数返回给定的link_identifier中上一条insert语句产生的auto_increment的ID号;
     
 mysql_insert_id()函数说明:如果上一条sql字符串语句没有产生auto_increment的值,则mysql_insert_id()函数的值返回0;

例如:如下程序studentManage.php分别使用mysql_query()函数,mysql_affected_rows()函数和mysql_insert_id()函数完成student数据库中student表的更新记录操作。

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");
$insertSQL = "insert into student values(null,'test','test',2)";
$updateSQL = "update student set class_id=1 where student_name='test'";
$deleteSQL = "delete from student where student_name='test'";
$inserted = mysql_query($insertSQL);
echo "当前插入记录的student_id值为:".mysql_insert_id()."<br/>";
$insertedRows = mysql_affected_rows();
echo "插入记录的行数:$insertedRows<br/>";
$updated = mysql_query($updateSQL);
$updatedRows = mysql_affected_rows();
echo "修改记录的行数:$updatedRows<br/>";
$deleted = mysql_query($deleteSQL);
$deletedRows = mysql_affected_rows();
echo "删除记录的行数:$deletedRows<br/>";
$close = @mysql_close($serverLink);
?>

  $link = mysql_connect(“xxx.xxx.xxx.xxx”, “databasename”,
“password”)
            or die(‘无法连接: ‘ . mysql_error());
 
mysql_select_db(“databasename”)
or die(‘没有你找到指定数据库’);
  return true;
}

2).发送select语句

     
 mysql_query()函数还可以向mysql服务器引擎发送select语句,此时mysql_query()函数将返回一个结果集(result)数据,可以使用mysql_num_rows()函数查看该select语句查询到的表记录行数。
       mysql_num_rows()函数的语法格式:int mysql_num_rows(resource
result)
     
 mysql_num_rows()函数功能:返回结果集result中记录的行数,该函数仅对select语句有效。

     
 结果集(result)使用过后,应该尽快地将其占用地服务器内存资源释放,可以使用函数mysql_free_result()实现。
       mysql_free_result()函数的语法格式:bool
mysql_free_result(resource result)
     
 mysql_free_result()函数功能:释放结果集result占用的服务器内存资源。成功返回,TRUE。

例如,下面程序select.php使用mysql_query()函数、mysql_num_rows()函数和mysql_free_result()函数实现student数据库student表的查询操作。

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dblink=@mysql_select_db("student") or die("选择当前数据库失败!程序中断执行");
$selectSQL = "select * from student";
$resultSet = @mysql_db_query($selectSQL);
var_dump($resultSet);
echo "<br/>";
echo "student表的记录数为:".mysql_num_rows($resultSet);
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

 

3)发送mysql命令

使用mysql_query()函数还可以向MySQL服务器引擎发送MySQL命令。例如mysql_query(“set
name ‘gbk’ “);
将character_set_client、character_set_connetion和character_set_results的字符集设置为gbk。

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$resultSet = mysql_query("show databases");
while($db = mysql_fetch_array($resultSet)){
    echo $db["Database"]."<br/>";
}
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

function quote($strText)
{
    $Mstr = addslashes($strText);
    return “‘” . $Mstr . “‘”;
}

1.6.遍历结果集中的数据

     
 使用mysql_query()函数去的select语句的结合集result后,可以使用mysql_fetch_row()函数或mysql_fetch_array()函数遍历结果集中的数据,这两个函数共同特征是需要结果集类型的数据作为函数的参数。
       mysql_fetch_row()函数的语法格式:array
mysql_fetch_row(resource result)
     
 mysql_fetch_row()函数功能:从结果集result取的下一行记录,并将该记录生成一个数组,数组的元素的键为从零开始的整数,数组元素的值依次为select语句中“字段列表”的值。若结果集result中没有下一行记录,则函数返回FALSE。
       mysql_fetch_array()函数的语法格式:
       array mysql_fetch_array(resource result)
       array mysql_fetch_array(resource
result)函数功能:该函数是mysql_fetch_row()函数的扩展版本,该函数的返回值中包含了mysql_fetch_row()函数的返回值,还包含select语句中“字段列表=>字段列表值”的数组元素。

     
 例如:如下程序fetchArray.php遍历student数据库中student表的记录,并将student表中的所有记录打印在页面上。

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
//mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");
$selectSQL = "select * from student";
$resultSet = mysql_query($selectSQL);
while($student = mysql_fetch_array($resultSet)){
    echo $student['student_id']." ";
    echo $student['student_no']." ";
    echo $student['student_name']."<br/>";
}
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

     
 如果student数据库的字符集设置为gbk,遍历student表时,需使用mysql_query(“srt
names ‘gbk’
“);语句将character_set_client、character_set_connection、character_set_results的字符集设置为gbk。若没有该语句,页面显示将出现中文乱码。
     
 fetchArray.php程序中不能将mysql_fetch_array()替换成mysql_fetch_row()函数。
反之可以。

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");
$selectSQL = "select * from student";
$resultSet = mysql_query($selectSQL);
while($student = mysql_fetch_row($resultSet)){
    echo $student[0]." ";
    echo $student[1]." ";
    echo $student[2]."<br/>";
}
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

function isdate($d)
{
   $ret = true;
   try
   {
       $x = date(“d”,$d);
   }
   catch (Exception $e)
   {
       $ret = false;
   }
   echo $x;
   return $ret;
}

1.7MySQL服务器连接与关闭最佳时机

     
 MySQL服务器连接应该今早地关闭,这并不意味着在同一个php脚本中,每一次数据库操作后,立即关闭MySQL服务器连接,例如,closeConnectionTime.php

<?php
function student_query(){
            $serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
            mysql_query("set names 'gbk'");
            $dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");
    $selectSQL = "select * from student";
    $resultSet = mysql_query($selectSQL) or die(mysql_error());
    while($student = mysql_fetch_array($resultSet)){
        echo $student['student_id']." ";
        echo $student['student_no']." ";
        echo $student['student_name']."<br/>";
    }
    mysql_free_result($resultSet);
            mysql_close($serverLink);
}
student_query();
student_query();
?>

     
 在closeConnectionTime.php程序中,每调用一次student_query()函数,都会开启新的MySQL服务器连接和关闭mysql服务器连接,耗费了网络资源和服务器资源,修改如下:

<?php
function student_query(){
    $selectSQL = "select * from student";
    $resultSet = mysql_query($selectSQL) or die(mysql_error());
    while($student = mysql_fetch_array($resultSet)){
        echo $student['student_id']." ";
        echo $student['student_no']." ";
        echo $student['student_name']."<br/>";
    }
    mysql_free_result($resultSet);

}
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");
student_query();
student_query();
mysql_close($serverLink);
?>

 
?>

1.8MySQL服务器连接与关闭函数地制作

     
 为了方便管理数据库服务器连接,可以制作PHP函数专门管理数据库服务连接,例如,程序database.php如下。

<?php 
$databaseConnection = null;
function getConnection(){
    $hostname = "localhost"; //数据库服务器主机名,可以用IP代替
    $database = "users"; //数据库名
    $userName = "root"; //数据库服务器用户名
    $password = ""; //数据库服务器密码
    global $databaseConnection;
    $databaseConnection = @mysql_connect($hostname, $userName, $password) or die(mysql_error()); //连接数据库服务器
    mysql_query("set names 'gbk'");//设置字符集
    @mysql_select_db($database, $databaseConnection) or die(mysql_error());

}
function closeConnection(){
    global $databaseConnection;
    if($databaseConnection){
        mysql_close($databaseConnection) or die(mysql_error());
    }
}
?>

     
 程序database.php首先定义了一个全局变量$databaseConnection,然后定义了一个开启数据库服务器的连接函数getConnection()和数据库服务器连接关闭函数closeConnection()。

  1. 编写ajax发送和接收函数:

二.PHP中其他MySQL操作函数

ajax发送函数chat_send_ajax.php

1.数据库操作函数

<?php
     require_once(‘dbconnect.php’);

1.1mysql_create_db()函数

       语法格式:bool mysql_create_db ( string $database name [,
resource $link_identifier ] )
       函数功能:新建一个MySQL数据库。
       说明:如果MySQL扩展库是基于MySQL4.x客户端库建立的,本函数不可用。

     db_connect();

1.2mysql_list_dbs()函数

       语法格式:resource mysql_list_dbs ([ resource
$link_identifier ] )
     
 函数功能:列出MySQL服务器中所有的数据库。mysql_list_dbs()函数返回了一个包含了当前MySQL服务器中所有可用的数据库的结果集。

     $msg =
iconv(“UTF-8″,”GB2312”,$_GET[“msg”]);
     $dt = date(“Y-m-d H:i:s”);
     $user = iconv(“UTF-8″,”GB2312”,$_GET[“name”]);

1.3mysql_drop_db()

       语法格式:bool mysql_drop_db ( string $database_name [,
resource $ link_identifier ] )
       函数功能:删除一个mysql数据库。
     
 说明:如果MySQL扩展库是基于MySQL4.x客户端库建立的,本函数不可用。
例如,database_manage.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$resultSet = mysql_list_dbs();
while($db = mysql_fetch_array($resultSet)){
    echo $db[0]."<br/>";
}
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

     $sql=”INSERT INTO chat(USERNAME,CHATDATE,MSG) ” .
          “values(” . quote($user) . “,” . quote($dt) . “,” .
quote($msg) . “);”;

2.数据库表操作函数

          echo $sql;

2.1mysql_list_tables()函数

       语法格式:resource mysql_list_tables ( string $database [,
resource link_identifier ] )
     
 函数功能:列出MySQL数据库database_name中的所有表。该函数将返回一个包含了database_name数据库中所有可用数据库表的结果集。

     $result = mysql_query($sql);
     if(!$result)
     {
        throw new Exception(‘Query failed: ‘ . mysql_error());
        exit();
     }

2.2mysql_tablename()函数

       语法格式:string mysql_tablename ( resource result , int i )
     
 函数功能:取得表名。该函数接受mysql_list_tables()函数的返回值以及一个整数索引作为参数并返回表名。
例如,table.php

<?php
$server_link = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$resultSet = @mysql_list_tables("student");
for($i = 0; $i < mysql_num_rows($resultSet); $i++){
    printf ("表: %s<br/>", mysql_tablename($resultSet, $i));
}
mysql_free_result($resultSet);
mysql_close($server_link);
?>

?>

3.择当前操作的数据库并发送SQL语句

 

       mysql_db_query()函数

     
 语法格式:发送一条SQL语句。mysql_db_query()函数选择一个当前操作的数据库并向数据库服务器引擎中发送SQL语句。
例如:select.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$selectSQL = "select * from student";
$resultSet = @mysql_db_query("student",$selectSQL);
var_dump($resultSet);
echo "<br/>";
echo "student表的记录数为:".mysql_num_rows($resultSet);
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

ajax接收函数chat_recv_ajax.php

4.表字段操作

<?php
header(“Content-Type:text/html;charset=gb2312”);
header(“Expires: Thu, 01 Jan 1970 00:00:01 GMT”);
   header(“Cache-Control: no-cache, must-revalidate”);
   header(“Pragma: no-cache”);
     require_once(‘dbconnect.php’);

1.mysql_num_fields()函数

       语法格式:int mysql_num_fields ( resource $result )
       函数功能:去的结果集result中字段的数目。

     db_connect();
    
     $sql = “SELECT *, date_format(chatdate,’%Y年%m月%d日 %r’) as cdt
from chat order by ID desc limit 200”;
     $sql = “SELECT * FROM (” . $sql . “) as ch order by ID”;
     $result = mysql_query($sql) or die(‘Query failed: ‘ .
mysql_error());
    
     // Update Row Information
     $msg=”<table border=’0′ style=’font-size: 10pt; color: white;
font-family: verdana, arial;’>”;
     while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
     {
           $msg = $msg . “<tr><td>” . $line[“cdt”] . ”
</td>” .
                “<td>” . $line[“username”] . “: </td>” .
                “<td>” . $line[“msg”] .
“</td></tr>”;
     }
     $msg=$msg . “</table>”;
    
     echo $msg;

2.mysql_filed_name()函数

       语法格式:string mysql_field_type ( resource $result , int
$field_offset )
       函数功能:取得结果集result中指定字段的字段名。
     
 说明:mysql_field_name()函数返回指定字段索引的字段名。field_index是该字段的数字偏移量,该偏移量从0开始。

?>

3.mysql_field_type()函数

       语法格式:string mysql_field_type ( resource $result , int
$field_offset )
       函数功能:取得结果集result中指定字段的MySQL数据类型。
     
 说明:mysql_field_type()返回指定字段的MySQL数据类型。field_offset是该字段的数字偏移量,该偏移量从0开始。

 

4.mysql_field_len()函数

       语法格式:int mysql_field_len ( resource $result , int
$field_offset )
       函数功能:返回结果集result中指定字段的长度。

4.聊天室页面:

5.mysql_field_flags()函数

       语法格式:string mysql_field_flags ( resource $result , int
$field_offset )
     
 函数功能:从结果集result中取得和指定字段关联的标志。每个标记对应一个单词,之间用空格分开。
例如:

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$selectSQL = "select * from student";
$resultSet = @mysql_db_query("student",$selectSQL);
$fieldsNum = mysql_num_fields($resultSet);
echo "student表共有".$fieldsNum."个字段,各个字段属性如下:";
echo "<br/>";
echo "<table>";
echo "<tr><td>字段名</td><td>字段类型</td><td>字段长度</td><td>字段标识</td></tr>";
for($i=0;$i<$fieldsNum;$i++){
    echo "<tr>";
    echo "<td>".mysql_field_name($resultSet,$i)."</td>";
    echo "<td>".mysql_field_type($resultSet,$i)."</td>";
    echo "<td>".mysql_field_len($resultSet,$i)."</td>";
    echo "<td>".mysql_field_flags($resultSet,$i)."</td>";
    echo "</tr>";
}
echo "</table>";
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

chat.html

5.其他常用函数

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“;
<html xmlns=”” >
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″
/>
    <title>聊天页面</title>
  
<script
type=”text/javascript”>

1.mysql_fetch_lengths()函数

       语法格式:array mysql_fetch_lengths ( resource $result )
     
 函数功能:返回结果集result中每个字段内容的长度。使用mysql_fetch_lengths()函数前通常先使用mysql_fetch_row()函数或mysql_fetch_array()函数取得记录集中所有字段。如果mysql_fetch_lengths()函数成功执行,将返回一个整数键数组;如果执行失败,返回或没有任何结果
返回FALSE。
fetchLengths.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$selectSQL = "select * from student";
$resultSet = @mysql_db_query("student",$selectSQL);
var_dump(mysql_fetch_row($resultSet));
echo "<br/>";
var_dump(mysql_fetch_lengths($resultSet));
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

var t = setInterval(function(){get_chat_msg()},5000);

2.mysql_result()函数

       语法格式:mixed mysql_result(resource result,int row [,mixed
field])
     
 函数功能:返回结果集result中一个字段的字段值。字段参数可以是字段偏移量或者字段名,或者是“表名.字段名”。
例如: mysql_result.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$selectSQL = "select * from student";
$resultSet = @mysql_db_query("student",$selectSQL);

echo "<br/>";
echo mysql_result($resultSet,0,0);
echo " ";
echo mysql_result($resultSet,0,1);
echo " ";
echo mysql_result($resultSet,0,2);
echo " ";
echo mysql_result($resultSet,0,3);
mysql_free_result($resultSet);
mysql_close($serverLink);
?>

//
// General Ajax Call
//
     
var oxmlHttp;
var oxmlHttpSend;
     
function get_chat_msg()
{

3.mysql_errno()函数

       语法格式:int mysql_error([resource link_identifier])
     
 函数功能:返回MySQL数据库服务器的错误代码,如果没有出错则返回0。
     
 说明:mysql_errno()函数仅返回最近一次MySQL函数的错误代码,因此尽早调用该函数。

    if(typeof XMLHttpRequest !=
“undefined”)
    {
        oxmlHttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
       oxmlHttp = new ActiveXObject(“Microsoft.XMLHttp”);
    }
    if(oxmlHttp == null)
    {
        alert(“浏览器不支持XML Http Request!”);
       return;
    }
   
    oxmlHttp.onreadystatechange = get_chat_msg_result;
    oxmlHttp.open(“GET”,encodeURI(“chat_recv_ajax.php”),true);
    oxmlHttp.send(null);
}
    
function get_chat_msg_result()
{
    if(oxmlHttp.readyState==4 || oxmlHttp.readyState==”complete”)
    {
        if (document.getElementById(“DIV_CHAT”) != null)
        {
            document.getElementById(“DIV_CHAT”).innerHTML = 
oxmlHttp.responseText;
            oxmlHttp = null;
        }
        var scrollDiv = document.getElementById(“DIV_CHAT”);
        scrollDiv.scrollTop = scrollDiv.scrollHeight;
    }
}

4.mysql_error()函数

       语法格式:string mysql_error ([ resource $link_identifier ]
)
     
 函数功能:返回MySQL数据库服务器产生的错误文本信息,如果没有出错返回””(空字符串)。
     
 说明:mysql_error()函数仅返回最近一次MySQL函数的错误文本信息,因此尽早调用该函数。
例如:error.php

<?php
$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");
mysql_query("set names 'gbk'");
$dbLink = @mysql_select_db("unknown");
echo mysql_errno();
echo "<br/>";
echo mysql_error();
mysql_close($serverLink);
?>

     
function set_chat_msg()
{

    if(typeof XMLHttpRequest != “undefined”)
    {
        oxmlHttpSend = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
       oxmlHttpSend = new ActiveXObject(“Microsoft.XMLHttp”);
    }
    if(oxmlHttpSend == null)
    {
       alert(“浏览器不支持XML Http Request!”);
       return;
    }
   
    var url = “chat_send_ajax.php”;
    var strname=”noname”;
    var strmsg=””;
    if (document.getElementById(“txtname”) != null)
    {
        strname = document.getElementById(“txtname”).value;
        document.getElementById(“txtname”).readOnly=true;
    }
    if (document.getElementById(“txtmsg”) != null)
    {
        strmsg = document.getElementById(“txtmsg”).value;
        document.getElementById(“txtmsg”).value = “”;
    }
   
    url += “?name=” + strname + “&msg=” + strmsg;
    oxmlHttpSend.open(“GET”,encodeURI(url),true);
    oxmlHttpSend.send(null);
}
function clickBtn(e)
  {
   if(window.event.keyCode==13)
   {
    var id=e.id;
    switch(id)
    {
     case “txtmsg”:
      document.getElementById(“Submit2”).click();
      window.event.returnValue=false;
      break;
     }
   }
}
function fRandomBy(under, over){
switch(arguments.length){
case 1: return parseInt(Math.random()*under+1);
case 2: return parseInt(Math.random()*(over-under+1) + under);
default: return 0;
}
}
function SetTxtName(){
var i=fRandomBy(10);
if(i==0)document.getElementById(‘txtname’).value=’无敌战神’;
if(i==1)document.getElementById(‘txtname’).value=’令狐冲’;
if(i==2)document.getElementById(‘txtname’).value=’西门吹雪’;
if(i==3)document.getElementById(‘txtname’).value=’超级玛丽’;
if(i==4)document.getElementById(‘txtname’).value=’奥巴马’;
if(i==5)document.getElementById(‘txtname’).value=’恐怖分子’;
if(i==6)document.getElementById(‘txtname’).value=’聊斋奇女子’;
if(i==7)document.getElementById(‘txtname’).value=’天朝?潘?;
if(i==8)document.getElementById(‘txtname’).value=’中500万了’;
if(i==9)document.getElementById(‘txtname’).value=’神级奇葩’;
if(i==10)document.getElementById(‘txtname’).value=’爱你不是两三天’;
}
</script>

</head>
<body onload=”SetTxtName();”>
    
    <div style=”border-right: black thin solid; border-top: black
thin solid;
        border-left: black thin solid; border-bottom: black thin
solid;
        background:#fff url(”)
repeat-x left top;
        height: 450px;width: 500px; “>
        <table style=”width:100%; height:100%”>
            <tr>
                <td colspan=”2″ style=”font-weight: bold; font-size:
16pt; color: white; font-family: verdana, arial;
                    text-align: center”>
                    聊天窗口–全球最大QQ聊天交友网站</td>
            </tr>
            <tr>
                <td colspan=”2″ style=”font-weight: bold; font-size:
16pt; color: white; font-family: verdana, arial;
                    text-align: left”>
                    <table style=”font-size: 12pt; color: white;
font-family: Verdana, Arial;border: white thin solid; “>
                        <tr>
                            <td style=”width: 100px”>
                                名字:</td>
                            <td style=”width: 100px”><input
id=”txtname” style=”width: 150px” type=”text” name=”name” maxlength=”15″
value=”匿名” /></td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td style=”vertical-align: middle;” valign=”middle”
colspan=”2″>
                    <div style=”width: 480px; height: 300px;
border-right: white thin solid; border-top: white thin solid; font-size:
10pt; border-left: white thin solid; border-bottom: white thin solid;
font-family: verdana, arial; overflow:scroll; text-align: left;”
id=”DIV_CHAT”>
                    </div>
                </td>
            </tr>
            <tr>
                <td style=”width: 310px”>
                    <input id=”txtmsg” style=”width: 350px”
type=”text” name=”msg” onkeydown=”return
clickBtn(this)”/></td>
                <td style=”width: 85px”>
                    <input id=”Submit2″ style=”font-family: verdana,
arial” type=”button” value=”发送”
onclick=”set_chat_msg()”/></td>
            </tr>
            <tr>
                <td colspan=”1″ style=”font-family: verdana, arial;
text-align: center; width: 350px;”>
                    </td>
                <td colspan=”1″ style=”width: 85px; font-family:
verdana, arial; text-align: center”>
                </td>
            </tr>
        </table>
    </div>
</body>
</html>

 

效果:

 

图片 2

发表评论

电子邮件地址不会被公开。 必填项已用*标注