Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблемка с аяксом
 
 автор: Rembrant   (08.05.2007 в 23:27)   письмо автору
 
 

Два фрейма. В одном html форма. В другом аякс обращающийся к файлу data.xml.
В форме вводится фраза (name='text') после отправки в обработчик add.php фраза возвращается в переменную $text. Эту переменную я стараюсь запихать в файл data.txt следующим образом:


<?php
$text
=$_POST['text'];
$login=$_POST['login'];

$file=fopen('datal.xml','w');

$ff=fwrite($dfile,'<?xml version="1.0" encoding="windows-1251"?><root><data>'.$text.'</data></root>');

header("Location:send.php?login=".$login.);
?>


Если файла data.xml не существует, то он нормально создается и $text туда вносится.
Если файл существует, то возникает проблема - файл не может быть открыт и перезаписан. Понятно почему так происходит, потомучто к нему обращается аякс во втором фрейме.
Скажите, как всётаки его перезаписать? Если это невозможно, то какие есть обходные пути?

   
 
 автор: bronenos   (08.05.2007 в 23:40)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:27)
 

ты открываешь файл и заносишь дескриптор $file, а пишешь в $dfile + не надо присваивать чему то функцию fwrite, она ниче не возвращает

   
 
 автор: Rembrant   (08.05.2007 в 23:42)   письмо автору
 
   для: bronenos   (08.05.2007 в 23:40)
 

dfile - это описка

   
 
 автор: bronenos   (08.05.2007 в 23:44)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:42)
 

так data.txt или data.xml

   
 
 автор: Rembrant   (08.05.2007 в 23:46)   письмо автору
 
   для: bronenos   (08.05.2007 в 23:44)
 

data.xml

   
 
 автор: Rembrant   (08.05.2007 в 23:48)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:46)
 

если написать например data2.xml то создает, при повторной отправке фразы опять перестает записывать

   
 
 автор: Rembrant   (09.05.2007 в 00:01)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:48)
 

Ниужели никто при написании чата на аякс с таким не сталкивался?????

   
 
 автор: Rembrant   (08.05.2007 в 23:44)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:42)
 


<?php 
$text
=$_POST['text']; 
$login=$_POST['login']; 

$file=fopen('data.xml','w'); 

fwrite($file,'<?xml version="1.0" encoding="windows-1251"?><root><data>'.$text.'</data></root>'); 

header("Location:send.php?login=".$login.); 
?>


переписал вот так, не работает

   
 
 автор: Drago   (09.05.2007 в 01:19)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:44)
 

У вас лишняя точка в функции header(), после переменной $login. В результате, скрипт обрабатывающий аякс запрос выдает ошибку и файл не записывается.


<?
header
("Location:send.php?login=".$login); 
?>

   
 
 автор: bronenos   (09.05.2007 в 07:45)   письмо автору
 
   для: Rembrant   (08.05.2007 в 23:44)
 

скажи-ка... что должен делать этот скрипт?
записывать в виде xml одно единственное сообщение?

   
 
 автор: Drago   (09.05.2007 в 01:14)   письмо автору
 
   для: bronenos   (08.05.2007 в 23:40)
 

>не надо присваивать чему то функцию fwrite, она ниче не возвращает
Вообще-то, возвращает.

fwrite() возвращает количество записанных байтов или FALSE в случае ошибки.

http://www.php.net/manual/ru/function.fwrite.php

   
 
 автор: bronenos   (09.05.2007 в 03:11)   письмо автору
 
   для: Drago   (09.05.2007 в 01:14)
 

ну я имел в виду в данном контексте к данной задаче: ничего полезного

   
 
 автор: Drago   (09.05.2007 в 12:48)   письмо автору
 
   для: bronenos   (09.05.2007 в 03:11)
 

Ну почему же? Можно поставить проверку. Если функция fwite возвращает false, то вывести на экран сообщение об ошибке записи в файл.

Хотя, конечно, понятие полезности, несколько относительное. :)

   
 
 автор: Rembrant   (09.05.2007 в 13:16)   письмо автору
 
   для: Drago   (09.05.2007 в 12:48)
 

to bronenos! Да. Этот скрипт зарисывает в xml файл одно сообщение. Я в конце написал еще fclose и стал записывать. А вот аякс не хочет читать эти сообщения, кроме самого превого.

   
 
 автор: Rembrant   (09.05.2007 в 13:23)   письмо автору
 
   для: Rembrant   (09.05.2007 в 13:16)
 

Если нужно, то могу скинуть исходники.

   
 
 автор: bronenos   (09.05.2007 в 13:32)   письмо автору
 
   для: Rembrant   (09.05.2007 в 13:23)
 

зачем тебе этот XML нужен?
в асю кинь исходные

   
 
 автор: Rembrant   (09.05.2007 в 13:47)   письмо автору
 
   для: bronenos   (09.05.2007 в 13:32)
 

Войди в асе в сеть. У меня 719 контактов. Если ты невидим то мне тебя час придется искать =)

   
 
 автор: Rembrant   (09.05.2007 в 14:18)   письмо автору
 
   для: Rembrant   (09.05.2007 в 13:47)
 

Нижний фрейм send.php

<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM NAME="sendform" action="add.php" method="post">
<?
error_reporting
(0);
$login=$_GET['login'];
?>
<INPUT TYPE="hidden" VALUE="<? echo $login;?>" NAME="login">
<INPUT TYPE="text" NAME="who">
<INPUT TYPE="text" NAME="text">
<TD WIDTH="15%"><INPUT TYPE="submit" VALUE="Сказать">
</FORM>
<FORM ACTION="del.php" METHOD="get" NAME="closeform" TARGET="_parent">
<TD WIDTH="20%">
<INPUT TYPE="hidden" NAME="login" VALUE="<? echo $login;?>">
 <INPUT TYPE="submit" VALUE="Выход">
</FORM>
</BODY>
</HTML>


Обработчик сообщений add.php:

<?php
$text
=$_POST['text'];
$who=$_POST['who'];
$login=$_POST['login'];

$file=fopen('chat.txt','r');
fwrite($file,"\n <B>".$login." => ".$who."</B> : ".$text."<small> (".date("H:i:s").") </small>");//пишу лог
fclose($file);

$myfile=fopen('data.xml','w');
fwrite($myfile,'<?xml version="1.0" encoding="windows-1251"?><root><data>'.$text.'</data></root>');//сообщение
fclose($dfile);

header("Location:send.php?login=".$login."&who=".$who."&text=".$text);
?>


Фрейм сообщений text.php:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 
<script type="text/javascript">
function ajaxRead(file){ 
var xmlObj = null; 
if(window.XMLHttpRequest){ 
xmlObj = new XMLHttpRequest(); 
} else if(window.ActiveXObject){ 
xmlObj = new ActiveXObject("Microsoft.XMLHTTP"); 
} else { 
return; 

xmlObj.onreadystatechange = function(){ 
if(xmlObj.readyState == 4){ 
updateObj('xmlObj', xmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data); 


xmlObj.open ('GET', file, true); 
xmlObj.send (''); 

function updateObj(obj, data){ 
document.getElementById(obj).firstChild.data = data; 

</script> 
</head> 
<body> 
<h1>мой чат</h1> 
<p>Здесь ссылкой определяю изменился ли файл data.xml</p> 
<p id="xmlObj"> 
Это данные по умолчанию. <a href='data.xml'  title="Обзор данных XML файла." onclick="ajaxRead('data.xml'); 
this.style.display='none'; return false">Обзор введенного сообщения в xml файл</a> 
</p> 
</body> 
</html> 

   
 
 автор: bronenos   (09.05.2007 в 15:43)   письмо автору
 
   для: Rembrant   (09.05.2007 в 14:18)
 

1. не очень хорошо передавать ник через GET
2. посоветовал бы применять htmlspecialchars()
3. чтоб записать сообщение открывай файл в режиме a, а не r
4. закрываеш $dfile, которого не открывал

   
 
 автор: Rembrant   (09.05.2007 в 16:20)   письмо автору
 
   для: bronenos   (09.05.2007 в 15:43)
 

да причина не в этом, жаль что в нете нет нигде сайта где бы можно было узнать всё об ajax и как он применяется в написании чатов

   
 
 автор: bronenos   (09.05.2007 в 16:50)   письмо автору
 
   для: Rembrant   (09.05.2007 в 16:20)
 

я тебе свои дам участки

   
 
 автор: Blizard   (09.05.2007 в 20:29)   письмо автору
 
   для: bronenos   (09.05.2007 в 16:50)
 

После избавления от xml:

send.php

<HTML>
<HEAD>
</HEAD>
<BODY>
<FORM NAME="sendform" action="add.php" method="post">
<?
error_reporting
(0);
$login=$_GET['login'];
?>
<INPUT TYPE="hidden" VALUE="<? echo $login;?>" NAME="login">
<INPUT TYPE="text" NAME="who" STYLE="width:15%">
<INPUT TYPE="text" NAME="text" STYLE="width:75%" >
<INPUT TYPE="submit" VALUE="Сказать">
</FORM>
<FORM ACTION="del.php" METHOD="get" NAME="closeform" TARGET="_parent">
<INPUT TYPE="hidden" NAME="login" VALUE="<? echo $login;?>">
 <INPUT TYPE="submit" VALUE="Выход">
</FORM>
</HTML>


add.php

<?php
$text
=$_POST['text'];
$who=$_POST['who'];
$login=$_POST['login'];

$file=fopen('chat.txt','r');
fwrite($file,"\n <B>".$login." => ".$who."</B> : ".$text."<small> (".date("H:i:s").") </small>");
fclose($file);

header("Location:send.php?login=".$login."&who=".$who."&text=".$text);
?>


text.php

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 

<script type="text/javascript"><!-- 
function ajaxRead(file){ 
  var Obj = null; 
  if(window.XMLHttpRequest){ 
       Obj = new XMLHttpRequest(); 
  } else if(window.ActiveXObject){ 
      Obj = new ActiveXObject("Microsoft.XMLHTTP"); 
  } else { 
      return; 
  } 
  Obj.onreadystatechange = function(){ 
  if(Obj.readyState == 4){ 
  updateObj('Obj', Obj.responseText); 
  } 
  } 
Obj.open ('GET', file, true); 
Obj.send (''); 


function updateObj(object, data){ 
document.getElementById(object).firstChild.data = data; 
setTimeout("ajaxRead('chat.txt')",1000);

</script> 
</head> 
<body onload="ajaxRead('chat.txt')"> 
<p id="Obj"> 

</p> 
</body> 
</html> 


выводит только один раз после загрузки то что есть в файле

   
 
 автор: bronenos   (09.05.2007 в 20:37)   письмо автору
 
   для: Blizard   (09.05.2007 в 20:29)
 

повторяю...
1. проводи текст через htmlspecialchars от некоторых хитрецов
2. chat.txt открывай через режим a (add), а не r (read)
насчет списка сейчас посмотрю

   
 
 автор: bronenos   (09.05.2007 в 20:45)   письмо автору
 
   для: Blizard   (09.05.2007 в 20:29)
 

зачем трудности
document.getElementById(object).innerHTML = data;
еще в том файле поставь там где запрос шлеш в методе open вместо file - file+'?'+Math.random()

   
 
 автор: Blizard   (09.05.2007 в 21:33)   письмо автору
 
   для: bronenos   (09.05.2007 в 20:45)
 

bronenos!!! Огромнейшее тебе СПАСИБО! Вывод сообщений без рефрэша сделан!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования