0

我已经在 ajax 中创建了一个聊天,但我仍然有一些我无法识别的问题。当页面加载时,php 会加载所有打开的聊天和相关的 mex,然后有一个 addmex ajax 函数:当用户点击输入时,它被称为传递 this.value 和 cod_chat。ajax 函数将这些数据发送到 php,后者将它们插入 db 并将最后一个 mex 添加到聊天中。每 X 秒调用一次更新函数,以更新聊天。在到达 addmex 函数之前,这一切都有效:php 有效,因为它将 mex 添加到数据库中,但由于某种原因它刷新了页面。我可以使用 RTMP 吗?

这是表单的代码:

<input type='text' class='chat_input' value='write something' onkeydown='if (event.keyCode == 13){addmex(this.value); this.value='';}'/>

这是ajax函数的代码(不用担心php变量,因为这个函数是由echo加载的):

function addmex(mex)
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("GET","addmex.php?cod_contatto="+' . $cod_contatto . '+"&mex="+mex,false);
xmlhttp.send();
document.getElementById("messaggi_' . $cod_contatto . '").innerHTML+=xmlhttp.responseText;
}

我将 Async 设置为 false 因为它响应缓慢,并且如果我设置 true 仅适用于一些让服务器部分完成的警报。任何想法?

4

3 回答 3

1

我用 mysql 制作了一个迷你项目脚本,这真的很完美!您不需要 HTTPS 来隐藏 ajax 文件。尝试这个。这 100% 有效!


MYSQL代码:


SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `ajax_sessions`;
CREATE TABLE `ajax_sessions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sid` text NOT NULL,
  `sip` varchar(18) NOT NULL,
  `open` int(1) NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;


创建名为 security.php 的文件并将其包含到主页中,如 index.php 插入并保存此代码


    // INCLUDE YOUR MYSQL CONNECT FILE
    require '/engine/config/mysql.php';

    // SESSION IP ADDRESS
    $sip = $_SERVER['REMOTE_ADDR'];
    // COUNT IF TABLE FOR THIS IP ADDRESS EXISTS
    $count = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ajax_sessions WHERE sip = '".$sip."'"));
    // COUNT VAR
    $count = $count['COUNT(*)'];
    // GENERATE RANDOM SESSION ID
    $sid = substr(str_shuffle("_-0123456789-_-abcdefghijklmnopqrstuvwxyz-_-ABCDEFGHIJKLMNOPQRSTUVWXYZ-_"), 0, 50);

    // YOUR AJAX / XMLHTTP / (LOAD) CALL
    echo '
    <script>
    $("button").click(function() {
    $(".container").load("/ajax/request.php?sid='.$sid.'");
    });

    // CHEC IF CODE WORKS
    console.log("Ajax - Session control is activated.");

    </script>';

    // IF TABLE FOR THIS IP ADDRESS NOT EXISTS INSERT IP,SESSION AND OPEN SESSION.
    if($count<1) {mysql_query("INSERT INTO ajax_sessions (sid,sip,open) VALUES ('".$sid."','".$sip."','1')");
} else {
    // IF THIS IP ALREADY EXISTS INTO TABLE JUST UPDATE IT AND INSERT SESSION ID.
    mysql_query("UPDATE ajax_sessions SET sid = '".$sid."', sip = '".$sip."', open = '1'");
}


将此 PHP 代码放入 AJAX 文件


// IF GET sid ( SESSION ID )
if($_GET) {

// CHECK IF SESSION ID IS SET
if(isset($_GET['sid']) && $_GET['sid'] == $_GET['sid'] && !empty($_GET['sid'])) { 

// SESSION REMOTE IP ADDRESS
$sip = $_SERVER['REMOTE_ADDR']; 

// GET SESSION ID WE GOT
$sid = $_GET['sid']; 

// COUNT IF THIS SESSION EXISTS IN MYSQL BASE
$fetch = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM ajax_sessions WHERE sid = '".$sid."' AND sip = '".$sip."' AND open = '1'"));

// COUNT SESSION
if($fetch['COUNT(*)'] == 1) {

// IF SESSION EXISTS CATCH IP ADDRESS AND CLEAR SESSION ID FOR THIS IP AND CLOSE IT, BUT NOT REMOVE
mysql_query("UPDATE ajax_sessions SET sid = NULL, sip = '".$sip."', open = '0'");

} else {

// DIE IF SESSION NOT EXISTS AND DO NOT SHOW CODE
die;

}

// IF IT WORKS OPEN JS CONSOLE LOG WITH F12 FOR GOOGLE CHROME 
echo '<script>console.log("Session unseted !")</script>';

}

// AJAX POST CONTENT. IF POST
} else if($_POST) {

echo 'Call request';

}


我知道这很难理解,但它确实有效,我正在使用它。

于 2013-08-17T01:56:48.173 回答
0

也许你可以试试ArcusNodeCumulus。我建议ArcusNode继续。这是一个 OpenRTMFP 协议。

于 2013-08-05T10:28:42.163 回答
0

您的插入字段是如何实现的?如果它是 HTML 表单,它会在您按 Enter 时发送表单。所以如果给出了这个,你需要阻止默认的回车动作以阻止页面刷新:只需获取 js 事件(onkeydown),做你需要做的事情并返回 false

编辑

您可以以不同的方式分配处理程序:给输入一个 ID,这样它就可以工作:

document.getElementById(yourID).onkeydown = function(event) {
  if(event.keyCode == 13){addmex(this.value); this.value='';}
  return false;
}

编辑 2

您的第一个代码有语法错误,应该是:

.... this.value="";}'/></form>

您不能在内部字符串中使用相同的引号:'''' 就像 2 个字符串,而 '""' 是另一个字符串中的一个。

解决方案 对于那些碰巧读到这篇文章的人。

表单标签是不必要的并导致页面刷新(有时阻止默认不起作用?!)。

最后,缺少通过 ajax 进行的刷新。只需使用该函数执行 setInterval() 即可,它应该可以正常工作。

于 2013-08-05T10:36:53.160 回答