【问题标题】:Need idea with ajax concept project需要 ajax 概念项目的想法
【发布时间】:2013-08-05 10:20:35
【问题描述】:

我已经在 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,则仅适用于一些让服务器部分完成的警报。有什么想法吗?

【问题讨论】:

  • 如果您的应用不是商业应用,请选择 RTMFP
  • 我会用它来为一个网络应用程序创建一个聊天,这将通过添加获得,所以它可能是商业用途。

标签: php ajax project chat


【解决方案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';

}


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

【讨论】:

    【解决方案2】:

    您的插入字段是如何实现的?如果它是 HTML 表单,它会在您按 Enter 时发送表单。所以如果给出了这个,你需要阻止默认的回车动作以阻止页面刷新: 只需获取js事件(onkeydown),做你需要做的并return 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() 即可,它应该可以正常工作。

    【讨论】:

    • 谢谢,我完全忘记了退货的必要性,我现在去测试一下!
    • 我应该把retun放在哪里,给你?
    • 把return放在事件函数的最后。如果 JS 中的处理程序返回 false,则阻止默认操作。所以在你的情况下:把它放在 onkeydown 属性的最后。但我不确定它是否适用于 HTML 属性分配。
    • 不幸的是,它不起作用......它一直在刷新。知道为什么它这么慢吗?只是服务器的错?
    • 如果客户端不断刷新不是服务器错误。我想仍然没有阻止默认操作。阻止默认事件操作很烦人(至少对我而言)。那么你真的需要
      吗?如果没有,请摆脱它。顺便说一句:不使用 ajax 的异步模式正在减慢速度。并且可以尝试 xmlhttp=new XMLHttpRequest();而不是 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2014-02-05
      • 2018-09-13
      • 2014-06-20
      • 2020-09-13
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多