Chat box via Mssql

07/07/2012 12:59 xXConsXx#1
hi hab ein kleines problem.
undzwar möchte ich das die ausgabe von der sql abfrage live ist ( wie in ner chatbox halt).

die frage ist nun wie ich das anstelle.. kann mir da jemand helfen?

hier ist mal der code der abfrage.

Code:
<?php
	odbc_exec($mssql, 'USE [****]');
	if(isset($_POST['ok'])) {
		if($_POST['post'] == '') {
			echo '<div class="fail">Du musst einen Text eingeben</div>';
		} else {
			odbc_exec($mssql, 'INSERT INTO [web_shoutbox](username, post, datetime) VALUES(\''.mssql_escape_string($_POST['uname']).'\', \''.mssql_escape_string($_POST['post']).'\', \''.date('d.m.Y H:i:s').'\')');

		}
	}
	
	$select = odbc_exec($mssql, 'select * from (select top 13 * from [web_shoutbox] order by nid Desc) as a Order by nid ASC');

	echo '	<div id="box"></div>
		<table id="table" style="width: 700px; height: 200px; background-color:#FFFFFF;" "border-width:thick; padding:5px; border-color:#000000;
      		border-style:ridge;">
		<tr>
			<td id="key" style="width:500px;"></td>
			<td id="key" style="width:100px;"></td>
			<td id="key" style="width:50px;"></td>
		</tr>';
	while($result = odbc_fetch_array($select)) {
	echo '<tr id="did_'.$result['nid'].'" class="row">
			<td id="value" style="width:500px;">'.$result['username'].': '.$result['post'].'</td>
			<td id="value">'.date('G:i', strtotime($result['datetime'])).'Uhr '.date('d.m.y', strtotime($result['datetime'])).'';
		odbc_exec($mssql, 'USE [******]');
		$auth = odbc_exec($mssql, 'SELECT Authority FROM [ACCOUNT_TBL] WHERE account=\''.mssql_escape_string($_SESSION['user']).'\'');
		if(odbc_result($auth, 'Authority') == 'A' || odbc_result($auth, 'Authority') == 'M') {

		echo'<a href="javascript:chat_delete('.$result['nid'].');" title="Delete"><img src="img/delete.png" /></a></td>';
		}
		echo'</tr>';
		
	}


	echo '</table>';
	echo '<span id="text"></span>';
	echo '<div id="box"></div>';
	echo '<form method="post"  >
		<input type="hidden" name="uname" value="'.$_SESSION['user'].'" />
		<table id="table"><center>

			<tr>
				<td id="key"></td>
				<td id="value"><textarea name="post" style="width: 400px; height: 15px;"></textarea></td>
			</tr>

			<tr>
				<td id="key"></td>
				<td id="value"><input type="submit" name="ok" value="OK"/></td>
		</tr>
		</center></table>
	</form><br/>';
?>
07/07/2012 14:03 NotEnoughForYou#2
mit ajax immer die neuen einträge nachholen
07/08/2012 07:47 xXConsXx#3
ok hab das ganze nun mal probier..
muss dazu sagen hab noch nie vorher mit java oder ajax gearbeitet...
funktionieren tut es jedoch will ich nochmal das ok bekommen ob man das so lassen kann oder ob ich es noch verbessern soll. und wenn verbessern wie..

die funktion
PHP Code:
<script type "text/javascript">
var 
reg;
get();

function 
get()
{
    
rq = new XMLHttpRequest();
    
rq.open("post""getchat.php"true);
    
rq.send(null);
    
rq.onreadystatechange auswerten;
        
window.setTimeout(get10000);
}

function 
auswerten()
{
    if(
rq.readyState == && rq.status == 200)
        
document.getElementById("chatshowbox").innerHTML rq.responseText;
}

</script> 
07/08/2012 13:25 Xijezu#4
Ich persönlich würde es über Cache laufen lassen, direkte Datenbankverbindungen bei einer Shoutbox ist meist etwas resourcen-kostspielig, vorallem bei MS SQL.
07/08/2012 13:44 NotEnoughForYou#5
Quote:
Originally Posted by Xijezu View Post
Ich persönlich würde es über Cache laufen lassen, direkte Datenbankverbindungen bei einer Shoutbox ist meist etwas resourcen-kostspielig, vorallem bei MS SQL.
das sowieso, außerdem sollte man auch immer nur die neuen Beiträge aus der DB holen und nicht alle.
07/08/2012 17:21 xXConsXx#6
und wie mache ich das?
wie gesagt hab noch nie damit gearbeitet
07/08/2012 17:54 Fratyr#7
Quote:
PHP Code:
<script type "text/javascript">
var 
reg;
get();

function 
get()
{
    
rq = new XMLHttpRequest();
    
rq.open("post""getchat.php"true);
    
rq.send(null);
    
rq.onreadystatechange auswerten;
        
window.setTimeout(get10000);
}

</script> 
Du solltestper try .. catch erstmal prüfen ob das ActiveXObject vorhanden ist, und wenn ja welche Version, da das XMLHttpRequest im IE8 oder 9 verbuggt ist, und wenn ActiveXObjekt vorhanden ist schauen welche Version (Microsoft.XMLHTTP oder Msxml2.http). Auserdem sendest du ja nichts, von daher solltest du "get" anstelle von "post" verwenden.

Quote:
PHP Code:
function auswerten()
{
    if(
rq.readyState == && rq.status == 200)
        
document.getElementById("chatshowbox").innerHTML rq.responseText;

Würde mich wundern wenn das in jedem Browser hinhaut, man kann sich bei JS da ja nie richtig sicher sein.
07/08/2012 18:15 xXConsXx#8
Also gestestet habe ich es mit IE 8,9 Google crome, Firefox, Opera und Safari.
funktionieren tut es überall.

und das es ziemlich resourcen lastig ist habe ich mitlerweile schon bemerkt wir haben ihn mal getestet mit 15 leuten und da ging bei manchen die ladezeit hoch ohne ende...

wie mache ich das so das er nur dann abfragt wenn was neues gepostet wurde... die sql abfrage zu erstellen ist ja nicht das problem bei mir harkt es am ajax

Ich hab mal nen bisi weitergemacht.
komme nun aber wieder nicht mehr weiter.
bekomme die Funktionen nicht richtig hin.
Zur Zeit sieht mein script so aus;

Der Eigentliche Chatroom:

PHP Code:
<?php
    session_start
();
    include(
'inc/config.inc.php');
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">
<head>
    <title>Chat Box</title>

    <!-- Contents -->
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="res/template.css" media="screen" />
    

<script type = "text/javascript">
var rq;
send();



function send()
{

}

function checknew()
{

}

function get()
{
    rq = new XMLHttpRequest();
    rq.open("get", "getchat.php", true);
    rq.send(null);
    rq.onreadystatechange = auswerten;
            window.setTimeout(get, 10000); /* Soll später wieder hier raus und bei send reinkommen*/
}
function auswerten()
{
    if(rq.readyState == 4 && rq.status == 200)
        document.getElementById("chatshowbox").innerHTML = rq.responseText;
}

</script>
</head>
<body topmargin="0" leftmargin="0" style="background-color: #000000;">
<br>
<div border=1; style="background-color: #FFFFFF; width: 250px; height: 50px;><font size='2'>
<span id="loggedin">Logged in as <b><?php echo $_SESSION['user']; ?></b></span><br>
<a href="chat.php">Refresh</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="./../account.php">Zurück</a>
</font></div>
<?php

    



    odbc_exec
($mssql'USE [WEBSITE_TCR_DBF]');
    if(isset(
$_POST['ok'])) {
        if(
$_POST['post'] == '') {
            echo 
'<div class="fail">You must fill-in all fields!</div>';
        } else {
            
odbc_exec($mssql'INSERT INTO [web_shoutbox](username, post, datetime) VALUES(\''.mssql_escape_string($_POST['uname']).'\', \''.mssql_escape_string($_POST['post']).'\', \''.date('d.m.Y H:i:s').'\')');

        }
    

    }



    echo
'<div id = "chatshowbox"><font size="2">';
    

    echo
'</font></div>';

    echo 
'</table>';
    echo 
'<span id="text"></span>';

        
    
    
    echo 
'<form method="post">';
    echo 
'<input type="hidden" name="uname" value="'.$_SESSION['user'].'" />
        <table id="table"><center>

            <tr>
                <td id="key"></td>
                <td id="value"><textarea name="post" style="width: 400px; height: 15px;"></textarea></td>
            </tr>

            <tr>    <td id="key"></td>
                <td id="value"><input type="submit" name="ok" value="OK" onclick="send();"></td>'
;


        echo
'</tr>
        </center></table>
    </form><br/>'
;
    
?>

</body>
</html>
Hier ist die getchat.php wird bereits durch die funktion get() aufgerufen
PHP Code:
<?php    session_start(); 
    include(
'inc/config.inc.php');
    
    
odbc_exec($mssql'USE [****_DBF]');



    echo 
'    <div id="box"></div>
        <table id="table" style="width: 900px; height: 200px; background-color:#FFFFFF;" "border-width:thick; padding:5px; border-color:#000000;
              border-style:ridge;">
        <tr>
            <td id="key" style="width:90%;"></td>
            <td id="key" style="width:10%;"></td>
        </tr>'
;

    
$select odbc_exec($mssql'select * from (select top 10 * from [web_shoutbox] order by nid Desc) as a Order by nid ASC');

    while(
$result odbc_fetch_array($select)) {
    echo 


            <td id="value" style="width:700px;">'
.$result['username'].': '.$result['post'].'</td>
            <td id="value" align="right">'
.date('G:i'strtotime($result['datetime'])).'Uhr '.date('d.m.y'strtotime($result['datetime'])).'</td>';        
    echo
'</tr>';    
    }


?>
die Checknew.php soll mit der function checknew() gestartet werden
PHP Code:
<?php

    
include('inc/config.inc.php');    
    
odbc_exec($mssql'USE [*****_DBF]');


if(isset(
$_GET['nid'])){
    
$get=($_GET['nid']);
    
$select odbc_exec($mssql'SELECT top 1 nid FROM [web_shoutbox] ORDER BY nid DESC');
    if(
odbc_result($select'nid') !=$get) {
                echo 
'<script language="JavaScript"><!--send;();// --></script>';
        } else {
        echo 
'<script language="JavaScript"><!--get();// --></script>';
    }else{
    echo 
'<script language="JavaScript"><!--send();// --></script>';
    }
?>
und die letzt die getnid.php soll mit der function Send() abgefragt werden
PHP Code:
<?php

    
include('inc/config.inc.php');    
    
odbc_exec($mssql'USE [****_DBF]');
    
$select odbc_exec($mssql'SELECT top 1 * FROM [web_shoutbox] ORDER BY nid DESC');
 

 if(
$result odbc_fetch_array($select) )
    {
    echo
'
    <script type = "text/javascript">
    window.location.href = "*******/inc/chat.php?nid='
.$result['nid'].'";
    </script>'
;
}else{ 
    echo
'
    <script type = "text/javascript">
    window.location.href = window.location.href;
</script>'
;

exit; 
?>