我有一个PHP日历活动。
如果用户在日期发布有关事件的信息,我需要其他用户可以直接看到更改而无需点击刷新按钮。我怎么做的?用ajax,jquery还是什么?
这是代码
<?php
include "connection.php";
$monthNames = Array(
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
);
if (!isset($_REQUEST["month"]))
$_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"]))
$_REQUEST["year"] = date("Y");
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];
$prev_year = $cYear;
$next_year = $cYear;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($prev_month == 0)
{
$prev_month = 12;
$prev_year = $cYear - 1;
}
if ($next_month == 13)
{
$next_month = 1;
$next_year = $cYear + 1;
}
?>
<table width="200">
<tr align="center">
<td bgcolor="#999999" style="color:#FFFFFF">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" align="left"><a href="<?php
echo $_SERVER["PHP_SELF"] . "?month=". $prev_month . "&year=" . $prev_year;
?>" style="color:#FFFFFF">Previous</a></td>
<td width="50%" align="right"><a href="<?php
echo $_SERVER["PHP_SELF"] . "?month=". $next_month . "&year=" . $next_year;
?>" style="color:#FFFFFF">Next</a></td>
</tr>
</table>
</td>
</tr>
</table>
<tr>
<td align="center">
<table width="100%" border="1" cellpadding="2" cellspacing="2">
<tr align="center">
<td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong><?php
echo $monthNames[$cMonth-1].' '.$cYear;
?></strong></td>
</tr>
<tr>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>M</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>W</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>F</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td>
</tr>
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];
for ($i=0; $i<($maxday+$startday); $i++)
{
if(($i % 7) == 0 )
{
echo "";
}
if($i < $startday)
{
echo "<td></td>\n";
}else
{
$sql = "select * from data_agenda where date='".($i - $startday + 1).'-'.$cMonth.'-'.$cYear."'";
$hs = mysql_query($sql);
$event = mysql_num_rows($hs);
echo "<td align='center' valign='middle' height='20px'".($event > 0 ? " bgcolor='yellow'" : '').">";
echo "<a href=2.php?tgl=".urlencode($i - $startday + 1)."&month=".urlencode($monthNames[$cMonth-1])." onclick=\"window.open(this.href,'window','width=640,height=480,resizable,scrollbars,toolbar,menubar') ;return false;\">".($i - $startday + 1)."</a><br>";
echo "</td>\n";
}
if(($i % 7) == 6 )
{
echo "</tr>\n";
}
}
需要你的帮助...
之前感谢,
答案 0 :(得分:0)
HTTP协议本身无法实现。用户B执行他的请求并从服务器获得响应。现在,客户端和服务器之间的通信已完成,直到用户执行另一个请求。如果您想通知用户当前网站上显示的更改,那么您需要实时技术。
一个选项是,如果使用asyncron xml请求(ajax)更改了某些内容,则每10秒向服务器询问一次,然后使用javascript修改客户端浏览器的DOM。这不是一个非常好的解决方案,因为如果你有很多客户端,并且每个客户端每10秒询问一次服务器,你将获得大量流量。
更好的选择是打开从客户端到服务器的套接字,这意味着您永久连接到服务器,服务器能够通知客户端某些内容已发生变化。
您需要像nodejs(http://nodejs.org/)之类的东西才能从服务器端通知其他客户端。 Nodejs是一个服务器端的javascript实现,可用于打开服务器上的端口,监听来自客户端的套接字连接。
socket.io(http://socket.io/)是您想要查看的另一件事。 Socket.io能够处理像IE 9那样没有js套接字的旧浏览器。
另一个选择(如果你不喜欢使用服务器端的javascript)是一个套接字服务器的php实现,它有一个很好的文档和一些例子来向你展示它是如何工作的。我已经用棘轮(http://socketo.me/)取得了很好的经验,特别是这个例子非常好,应该是你想要的:
请注意,这不是在3分钟内完成的。如果您从未使用套接字,则需要一些时间来理解并将其集成到您的项目中。但如果它完成了它是一件非常好的事情。请注意,这只适用于能够打开HTML5 Websocket的新浏览器。