-3

我有一个使用 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";
     }
}

需要你的帮助请...

之前谢谢

4

1 回答 1

0

HTTP 协议本身无法实现这一点。用户 B 执行他的请求并从服务器获得响应。现在客户端和服务器之间的通信已经完成,直到用户发出另一个请求。如果您想通知用户浏览器中显示的当前站点的更改,那么您需要实时技术。

一种选择是例如每 10 秒询问服务器是否通过异步 xml 请求 (ajax) 发生了某些更改,然后使用 javascript 修改客户端浏览器的 DOM。这不是一个很好的解决方案,因为如果您有很多客户端并且每个客户端每 10 秒询问一次服务器,您将获得大量流量。

更好的选择是打开从客户端到服务器的套接字,这意味着您永久连接到服务器,并且服务器能够通知客户端发生了某些变化。

您需要类似 nodejs ( http://nodejs.org/ ) 的东西才能从服务器端通知其他客户端。Nodejs 是一个服务器端的 javascript 实现,您可以使用它来打开服务器上的端口,监听来自客户端的套接字连接。

socket.io ( http://socket.io/ ) 是您喜欢检查的另一件事。Socket.io 能够处理像 IE 9 这样的 js 套接字不可用的旧浏览器。

另一种选择(如果您不喜欢使用服务器端 javascript)是棘轮套接字服务器的 php 实现,它有一个很好的文档和一些示例来向您展示它是如何工作的。我在棘轮( http://socketo.me/ )方面取得了很好的经验,尤其是这个例子非常好,应该是你正在寻找的:

http://socketo.me/docs/push

请注意,这不是在 3 分钟内完成的。如果您之前从未使用过套接字,则需要一些时间来理解并将其集成到您的项目中。但如果它完成了,那是一件非常好的事情。请注意,这仅适用于能够打开 HTML5 Websocket 的较新浏览器。

于 2013-06-11T05:02:14.280 回答