Ajax/PHP Chat Problem

raage

Grünschnabel
Ich habe folgende File: Chat.php

PHP:
<?php

error_reporting(0);
session_start();
header('Cache-control: private'); // IE6 fix
header("Content-Type: text/html; charset=utf-8");
if (!isset($_SESSION['USER_ID'])) $_SESSION['USER_ID'] = rand(1, 24);
$USER_ID = $_SESSION['USER_ID'];
session_write_close();
ob_flush();
flush();


$fn = 'chat.txt';

$read = &$_GET['r'];
if (isset($read)) {

  if (!file_exists($fn)) {
    touch($fn);
    chmod($fn, 0644);
  }
  if ($read == 0) chat_write('<E>');

  ignore_user_abort(true);
  $i = 0;
  while (true) {
 
    $f = fopen($fn, 'r');
    flock($f, 2);
    $offset = 0;
    $offset = trim(fgets($f));

    if ($offset > $read) break;

    flock($f, 3);
    fclose($f);
    @set_time_limit(0);
 
    if ($i > 20) sleep(10);
    else sleep(3);

    echo "\n";
    ob_flush();
    flush();
    if (connection_status() != 0) {

      chat_write('<L>');
      exit();
    }
    $i++;
  }

  while ($s = fgets($f)) {
    echo utf8_encode($s);
    if ($offset <= ++$read) break;
  }

  flock($f, 3);
  fclose($f);
  exit();
}


function chat_write($write) {
  global $USER_ID, $fn;

  $maxlines = 35;
  if (trim($write) == '') return;

  if (!file_exists($fn)) {
    touch($fn);
    chmod($fn, 0644);
  }

  $f = fopen($fn, 'r+');
  flock($f, 2);
  $offset = 0;
  fscanf($f, "%s\n", $offset);

  $offset++;
  $i = 0;
  $chat = '';

  while (($i < $maxlines) && ($s = fgets($f))) {
    $chat .= $s;
    $i++;
  }

  $time = date('H:i:s');
  $js = "cs($offset,$USER_ID,'$time','User','$write','');\n";

  fseek($f, 0);

  ftruncate($f, 0);

  fwrite($f, "$offset\n");

  fwrite($f, $js);

  fwrite($f, $chat);

  flock($f, 3);
  fclose($f);

  return $js;
}

function chat_delete($delete) {
  global $fn;
  if ($delete == '') exit();
  if (!file_exists($fn)) {
    touch($fn);
    chmod($fn, 0644);
  }
  $f = fopen($fn, 'r+');
  flock($f, 2);
  $offset = 0;
  fscanf($f, "%s\n", $offset);
  $chat = '';
  $i = 0;
  while ($s = fgets($f)) {
    $s = str_replace("'$delete'", "''", $s);
    $chat .= $s;
    $i++;
  }
  fseek($f, 0);
  ftruncate($f, 0);
  fwrite($f, "$offset\n");
  fwrite($f, $chat);
  flock($f, 3);
  fclose($f);
}


$write = &$_POST['w'];
if (isset($write)) {
  if ($write == '') exit();

  $write = stripslashes($write);

  $write = htmlspecialchars($write, ENT_QUOTES);
  $write = addslashes($write);
  if (strpos($write, '/del ') === 0) {
    $delete = str_replace('/del ', '', $write);
    chat_delete($delete);
    exit();
  }

  $lines = wordwrap($write, 100, "\n", true);
  $lines = explode("\n", $lines);
  foreach ($lines as &$line) {

    echo utf8_encode(chat_write($line));
  }
  exit();
}
?>
var lines    = 35;
var title    = '';
var offset   = 0;
var messages = new Array();
var message  = document.getElementById('message');
var chat     = document.getElementById('chat');
var tmrRead = setTimeout('chat_read();', 300);

function request_write(url, post) {
  r = false;
  if (window.XMLHttpRequest) {
    r = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      r = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        r = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
      }
    }
  }
  if (!r) return false;
  r.onreadystatechange = alert_write;
  if (post == null) {
    r.open('GET', url, true);
    r.send(null);
  } else {
    r.open('POST', url, true);
    r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    r.send(post);
  }
}

function alert_write() {
  try {
    if ((r.readyState == 4) && (r.status == 200)) parse(r.responseText);
  } catch(e) {
  }
}

function request_read(url, post) {
  r2 = false;
  if (window.XMLHttpRequest) {
    r2 = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      r2 = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        r2 = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
      }
    }
  }
  if (!r2) return false;
  r2.abort();
  r2.onreadystatechange = alert_read;
  if (post == null) {
    r2.open('GET', url, true);
    r2.send(null);
  } else {
    r2.open('POST', url, true);
    r2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    r2.send(post);
  }
}

function alert_read() {
  clearTimeout(tmrRead);
  try {
    if ((r2.readyState == 4) && (r2.status == 200)) {
      parse(r2.responseText);
      tmrRead = setTimeout('chat_read();', 30);
    }
  } catch(e) {
    tmrRead = setTimeout('chat_read();', 3000);
  }
}

function chat_read() {
  clearTimeout(tmrRead);
  request_read('chat.php?r='+offset, null);
}

function keyup(e) {
  if (window.event) k = window.event.keyCode;
  else if (e) k = e.which;
  else return true;
  if (k == 13) chat_write();
}

function chat_display() {
  html = '';
  i = 0;
  while ((i < lines) && (i < offset)) {
    h = offset-i;
    if (messages[h]) html = messages[h] + html;
    i++;
  }
  chat.innerHTML = html;
  if (title != '') {
    title = title.replace(/&amp;/g, '&');
    title = title.replace(/&quot;/g, '"');
    title = title.replace(/'/g, '\'');
    title = title.replace(/&lt;/g, '<');
    title = title.replace(/&gt;/g, '>');
    document.title = title + ' - Chat by WebTemp.org';
  }
}

function chat_write() {
  request_write('chat.php', 'w='+escape(message.value));
  message.value = '';
}

function cs(o, i, t, u, m, c) {
  if (m == '<E>') {
    if (u != '') messages[o] = '<span id="C'+i+'">['+t+'] * '+u+' has entered the chat *</span><br />';
  } else if (m == '<L>') {
    if (u != '') messages[o] = '<span id="C'+i+'">['+t+'] * '+u+' has left the chat *</span><br />';
  } else {
    if (u != '') {
      u += ':';
      spaces = 5 - u.length;
      for (j = 0; j < spaces; j++) u += "&nbsp;";
      u += ' ';
    }
    if (title == '') title = m;
    m = m.replace(/ /g, '&nbsp;');
    messages[o] = '<span id="C'+i+'">['+t+'] '+u+'<b>'+m+'</b></span><br />';
  }
  if (o > offset) {
    offset = o;
    window.focus();
    message.focus();
  }
}

function parse(s) {
  if (s != '') {
    s = unescape(s);
    eval(s);
    chat_display();
  }
}


Nun will ich das er aus meinem Membereich die Namen auslie´t, ich habe es schonmal versucht anhand der Session uid die ich mit dem Login habe die Namen auslesen zu lassen und dann an den Chat zu übergeben. an dieser Stelle ist das geregelt welcher Name benutzt wird:


PHP:
$js = "cs($offset,$USER_ID,'$time','User','$write','');\n";


Wenn ich da jetzt Statt User, Hallo eingeb funktioniert der Chat noch, wenn ich nun meine MySQL ausgabe da einfüge ($row['username']) dann bleibt der Chat bei Connecting..... stehen.
Kann mir wer nen Tipp geben? habe auch schon die ausgabe anders definiert und es funktioniert nicht... auch schon bei der Chat Session selber statt User_ID uid eingetragen aber i-wie ist es verhext...
hier wichtige Daten:
Mein Userbereich hat flgende Userid Session $_Session['uid']
meine MySQL Datenbank hat folgende Struktur:
user.sql:
Code:
`id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(255) NOT NULL,
  `name` varchar(64) NOT NULL,
  `icq` varchar(16) NOT NULL,
  `admin` int(11) NOT NULL default '0',
  `time` int(15) NOT NULL default '0',
  `msn` varchar(45) NOT NULL,
  `hobbie` text NOT NULL,
  `lieblingsfaecher` text NOT NULL,
  `hassfaecher` text NOT NULL,
  `klasse` varchar(3) NOT NULL,
  `schule` text NOT NULL,
  `avatarid` int(8) NOT NULL,
  `online` int(2) default NULL,
  PRIMARY KEY  (`id`)

Vielen Dank schon mal!

Mfg Raage
 
Ich habe folgende File: Chat.php

PHP:
$js = "cs($offset,$USER_ID,'$time','User','$write','');\n";

Wieso steht das in Anführungszeichen? Ich würde das so schreiben:

PHP:
$js = cs($offset, $USER_ID, $time, "User", $write, "");

LG
Kerstel
 
klar kannst du auch '' anstatt "" schreiben, ich meinte die Anführungszeichen um die Variablen und um die Funktion, damit wäre $js ein String mit dem Inhalt:
cs($offset,$USER_ID,'$time','User','$write','');\n, d.h. die Funktion cs wird gar nicht aufgeführt. Also Anführungszeichen um Funktion weg, dann darf bei der Übergabe an eine Funktion eine Variable nicht in Anführungszeichen stehen, da Du sonst auch hier nur einen String übergibst, also anstatt '$time' $time übergeben.
 
Ich habe jetzt mal über alles andere folgendes gesetzt:
PHP:
$sql="SELECT username FROM users WHERE id='".$_SESSION['uid']."'";
$result = mysql_query($sql) OR die(mysql_error()); 
$row = mysql_fetch_assoc($result);
weil ich ja meine User auslesen möchte und den Namen an den Chat übergeben möchte damit da nicht immer nur User steht :) dementsprechend habe ich diese Zeile abgeändert und diesmal die ' ' weg gelassen:

PHP:
  $time = date('H:i:s');
  $js = "cs($offset,$USER_ID,$time,$row['username'],$write,'');\n";

Funktioniert immer noch nicht obwohl es für mich logisch erscheint... wenn ich statt $row['username'] XYZ oder Halll oeingebe heißen alle User entweder XYZ oder Hallo... warum funktioniert das hier nicht mit dem Usernamen... bzw. was mache ich falsch?

hier nochmal die File die den Chat später anzeigt: index.php
PHP:
 echo " <style type=\"text/css\">";
 echo"<!--";
 echo"body {color:black; background:white; font-family:verdana,arial,helvetica,sans-serif; font-size:13px;}";
 echo"#C1  {color:#000;}";
 echo"#C2  {color:#008;}";
 echo"#C3  {color:#004;}";
 echo"#C4  {color:#080;}";
 echo"#C5  {color:#088;}";
 echo"#C6  {color:#084;}";
 echo"#C7  {color:#040;}";
 echo"#C8  {color:#048;}";
 echo"#C9  {color:#044;}";
 echo"#C10 {color:#800;}";
 echo"#C11 {color:#808;}";
 echo"#C12 {color:#804;}";
 echo"#C13 {color:#880;}";
 echo"#C14 {color:#888;}";
 echo"#C15 {color:#884;}";
 echo"#C16 {color:#840;}";
 echo"#C17 {color:#848;}";
 echo"#C18 {color:#844;}";
 echo"#C19 {color:#400;}";
 echo"#C20 {color:#408;}";
 echo"#C21 {color:#404;}";
 echo"#C22 {color:#480;}";
 echo"#C23 {color:#4CC;}";
 echo"#C24 {color:#440;}";
 echo"#chat {height:561px; width:830px; font-family:courier new,monospace; font-size:11px; line-height:16px; border:1px solid #CCC; background:#EEE;}";
 echo"#message {font-family:courier new,monospace; font-size:12px; color:#00F;}";
 echo"a.copyright {font-size: 10px; color:#888;}";
 echo"-->";
 echo"</style>";
 echo"</head>";
 echo"<body>";
 echo"<div id=\"chat\">Connecting...</div>";
 echo"<input id=\"message\" type=\"text\" size=\"100\" onkeyup=\"keyup(event);\" />";
 echo"<input type=\"button\" value=\"Absenden\" onclick=\"chat_write();\" /><br />";
 echo" <script language=\"JavaScript\" type=\"text/javascript\" src=\"chat.php\"></script>";
 
Zuletzt bearbeitet:
PHP:
  $js = "cs({$offset},{$USER_ID},{$time},{$row['username']},{$write},'');\n";
Details zu {} findest du im Link in meiner Signatur (letzter Punkt).

PHP:
// Funktioniert aber beachten Sie: außerhalb von
// String-Anführungszeichen funktioniert das anders
echo "Eine Banane ist $früchte[Banane].";
.....
// Funktioniert nicht; verwenden Sie geschweifte Klammern. Das
// erzeugt einen Parser-Fehler.
echo "Eine Banane ist $früchte['Banane'].";

// Funktioniert
echo "Eine Banane ist {$früchte['Banane']}.";

Ich bevorzuge die letzte Variante
 
Zuletzt bearbeitet:
Probier doch mal mit
PHP:
error_reporting(E_ALL);
ob eine Fehlermeldung kommt.
Wenn ja, dann poste Sie bitte...
Edit: Er könnte es auch so probieren:
PHP:
echo "Eine Banane ist ".$früchte['Banane'].".";
LG
Daniel
 
Zuletzt bearbeitet:
vielen dank leute^^ das problem lag wo anders... habe meine datenbankabfrage an den anfang des Scriptes gesetzt wobei es eigentlich eher mittig gesetzt werden sollte :)
 
Zurück