Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用php覆盖包含特定用户名的文本文件中的一行_Javascript_Php_Text Files_Overwrite - Fatal编程技术网

Javascript 用php覆盖包含特定用户名的文本文件中的一行

Javascript 用php覆盖包含特定用户名的文本文件中的一行,javascript,php,text-files,overwrite,Javascript,Php,Text Files,Overwrite,我在这个网站上看到了很多关于覆盖文本文件的例子,但是找不到解决这个问题的方法。我正在使用php和txt文件编写一个小脚本来存储一些数据 我有以下纺织品: <div class="chatmsg"><b>John</b>: sfdfsdfd<br/></div> <div class="chatmsg"><b>Jane</b>: dd<br/></div> <div cla

我在这个网站上看到了很多关于覆盖文本文件的例子,但是找不到解决这个问题的方法。我正在使用php和txt文件编写一个小脚本来存储一些数据

我有以下纺织品:

<div class="chatmsg"><b>John</b>: sfdfsdfd<br/></div>
<div class="chatmsg"><b>Jane</b>: dd<br/></div>
<div class="chatmsg"><b>John</b>: sdsd<br/></div>
<div class="chatmsg"><b>Jane</b>: sf<br/></div>
<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
<div class="chatmsg"><b>Jane</b>: df<br/></div>
John:sfdfsdfd
简:dd
约翰:sdsd
简:sf
鲍勃:dsf
简:df
这是使用添加一行的php文件创建的:

if(!empty($name) && !empty($msg)){
    $fp = fopen($chatroom."_chat.txt", 'a');  
     fwrite($fp, '<div class="chatmsg"><b>'.$name.'</b>: '.$msg.'<br/></div>'.PHP_EOL);  
    fclose($fp);   
}
if(!empty($name)和&!empty($msg)){
$fp=fopen($chattroom.\u chat.txt,'a');
fwrite($fp,'.$name'.:'.$msg'
'.PHP_EOL); fclose($fp); }
过一会儿,这个文件将变得巨大。我可以删除该文件,但我想在这里尝试另一种方法

假设3个人添加了一行,文本文件如下:

<div class="chatmsg"><b>John</b>: sdsd<br/></div>
<div class="chatmsg"><b>Jane</b>: sf<br/></div>
<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
John:sdsd
简:sf
鲍勃:dsf
当前,新条目将在文本文件中添加一行,但是否也可以用新消息覆盖Bobs以前的消息?如果是,如何做到这一点?通过这种方式,我将文本文件保持为小文件(因此,除非一个全新的人输入一行,否则不会添加更多的行)


非常感谢

谢谢大家,我在这里找到了答案:

关于数据库的答案,是的,db更好,但我想使用SSE,我还没有找到mysql和SSE的工作示例。我想使用某种轮询或check-every3sec-for-new-data解决方案将数据和我找到的所有示例推送到哪里


如果有人有一个教程或例子证明这是可以做到的,我真的很想看看它(然后我需要升级我的谷歌技能,因为我什么也没找到)

PHP不是我的强项,但嘿,你有一个公开的赏金,所以我决定试一试。;-)如果您想继续使用当前的IO方法,可以切换到在XML文件中使用一些结构化数据,而不是纯文本。如果切换到XML,则可以根据需要查询、删除或修改节点。下面是一个简单的示例,让您开始学习。此示例删除包含“John”值的节点

// http://php.net/manual/en/domdocument.load.php

//<?xml version="1.0" encoding="utf-8" ?>
//<root>
//<div class="chatmsg"><b>John</b>: sfdfsdfd<br/></div>
//<div class="chatmsg"><b>Jane</b>: dd<br/></div>
//<div class="chatmsg"><b>John</b>: sdsd<br/></div>
//<div class="chatmsg"><b>Jane</b>: sf<br/></div>
//<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
//<div class="chatmsg"><b>Jane</b>: df<br/></div>
//</root>

<?php
$doc = new DOMDocument();
$doc->load("chat.xml");
$xpath = new DOMXpath($doc);
$html = $doc->documentElement;
$elements = $xpath->query("//div[contains(b,'John')]");
if ($elements->length) {
    $html->removeChild($elements);
}
$doc->save("chat.xml");
?>
//http://php.net/manual/en/domdocument.load.php
//
//
//约翰:sfdfsdfd
//简:dd
//约翰:sdsd
//简:sf
//鲍勃:dsf
//简:df
// 文档元素; $elements=$xpath->query(“//div[contains(b,'John')]”); 如果($elements->length){ $html->removeChild($elements); } $doc->save(“chat.xml”); ?>
“保持日志小”并在其中保存大量不必要的HTML。。为什么不保存姓名和消息并动态创建HTML?因为我使用SSE读取/加载日志,所以它需要在日志文件中,如果您只保留此人的最后一条消息,它会是什么样的?我不明白,你可以加载文件,加载行,找到以“Bob”开头的行,然后用新行替换它。不过,运行聊天程序似乎是一种非常笨拙的方式。没有历史记录可供查找。如果它不记录所有的事情,那它就不是一个真正的日志文件,但是认真地说,使用一个数据库。如果两个进程同时执行此操作会怎么样?数据库消除了所有这些低级的担忧。不确定您对SSE的意思是什么,但根据您的实际使用情况,像MongoDB这样的非关系型数据库可能比MySQLHmm更适合,这也是可以选择的。将尝试此+1