分类 网页与编程 中的文章

终于搞定了

想写几个通用的 AJAX 所用的函数,在写 postRequest() 这个函数的时候总是得不到返回值,后来才知道,用异步数据是不行的,得同步,记录下。。。

在此要感谢这篇文章 http://xujingbao.javaeye.com/blog/186050
 
下面的 writePostRequest() 函数因为不想脚本臃肿,就直接调用了 postRequest() 函数了,因为没有返回值可以用异步回调的方式,不过要另写整个函数,所以如果想看上去执行速度快一些的话就可以重写 writePostRequest() 函数用异步的方式。
另外一点就是如果 Post 数据的时候中文要编码,否则发送到服务器端会乱码,当然可以在服务器端转换编码,详情可以参考《PHP的unescape()函数》这篇文章。

JavaScript代码

var xmlHttp;   
var isie = false;   
function createXmlHttp(){   
    var theObject;   
    if(window.ActiveXObject){ //Get xmlHttp   
        theObject = new ActiveXObject("Microsoft.XMLHTTP"); //IE6及以上版本   
        isie = true;   
    }else if(window.XMLHttpRequest){   
        theObject = new XMLHttpRequest();   
    }else{   
        alert("您的浏览器不支持XMLHTTP,页面无法创建对象,将会影响到页面的正常功能!");   
    }   
    return theObject;   
}   
  
function getRequest(url){   //获取 GET 返回数据   
    xmlHttp = createXmlHttp();   
    try{   
        if(isie == false ){   
            xmlHttp.open("GET", url, false);   
            xmlHttp.setRequestHeader("If-Modified-Since","0");    
            xmlHttp.overrideMimeType("text/html;charset=gb2312");   
            xmlHttp.send(null);   
            return xmlHttp.responseText;   
        }else{   
            xmlHttp.open("GET", url, false);   
            xmlHttp.setRequestHeader("If-Modified-Since","0");    
            xmlHttp.send(null);   
            if(xmlHttp.readyState == 4){   
                if(xmlHttp.status == 200 || xmlHttp.status == 0){   
                    return Recenspace(xmlHttp.responseBody);   
                }   
            }   
        }   
    }catch(exception){       
        document.write('exception:'+exception.message);       
    }       
}   
  
function postRequest(url,postString){   //获取 POST 返回数据   
    xmlHttp = createXmlHttp();   
    var returnText = null;   
    xmlHttp.onreadystatechange = function(){   
        if(xmlHttp.readyState == 4 && xmlHttp.status == 200){   
            returnText = xmlHttp.responseText;   
        }   
    }   
    xmlHttp.open("POST", url, false);   
    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");   
  //xmlHttp.overrideMimeType("text/html;charset=gb2312");   
    xmlHttp.send(postString);   
    return returnText;   
}   
  
function Recenspace(Html){   
    var rs=new ActiveXObject("ADODB.RecordSet");   
    rs.fields.append("a",201,1);   
    rs.open();   
    rs.addNew();   
    rs(0).appendChunk(Html);   
    rs.update();   
    return rs(0).value;   
    rs.close();   
}   
  
function writeGetRequest(url,element){  //写入 GET 返回值   
    document.getElementById(element).innerHTML = getRequest(url);   
}   
  
function writePostRequest(url,postString,element){  //写入 POST 返回值   
    document.getElementById(element).innerHTML = postRequest(url,postString);   
}   
  
function doIt(){   
    //无操作函数    
}


Pader 2008-6-20 1

PHP的unescape()函数

昨天把自己的留言本后台回复改成AJAX无刷新的时候POST数据到服务器端中文总是乱码,郁闷的很~后来在网上查了一下才知道 JavaScript 用 XmlHTTP POST数据时中文是被当成 UTF-8 编码发送出去的,一个解决的方法是在客户端把中文用 JavaScript 的 escape() 函数编码了再到服务器端解码,可是在服务器端怎么解码呢,那就看下面一段我从网上找到的 PHP 中和 JavaScript 的 unescape() 函数功能一样的解码函数吧(这句话怎么听着有点别扭??)

PHP代码

function unescape($str){   
 $str = rawurldecode($str);    
 preg_match_all("/%u.{4}|&#x.{4};|&#d+;|.+/U",$str,$r);    
 $ar = $r[0];   
 foreach($ar as $k=>$v){   
  if(substr($v,0,2) == "%u"){   
   $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4)));   
   }elseif(substr($v,0,3) == "&#x"){   
   $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,3,-1)));   
   }elseif(substr($v,0,2) == "&#"){   
   $ar[$k] = iconv("UCS-2","GBK",pack("n",substr($v,2,-1)));   
  }   
 }   
 return join("",$ar);   
}


Pader 2008-6-1 1

给留言本做了个小后台

一直没有后台,最近花了点时间为我的“用心聆听留言本”做了一个小后台,简单的很,呵呵。
仍然保持文本存储,优化了一些操作的方法,现在整个留言本源码有 19 个文件,总大小 41.9KB,当然,写的那个模仿 Session 的 Impression 生成的临时数据就不算了,可以随时删除,如果把改成 PHP 自带的 Session 进行传递,总程序肯定会更小了,过两天再一时兴起把清理留言和搜索的功能加上去就算完了。

[attach=42]

[attach=43]

错误提示也是用的一样的方法:
[attach=44]

 28号那天奥运圣火来合肥,本来我们学校和一个集团(哪个集团呢,大家应该能猜到)说好了大家在那天去参加他们的助威团,27号中午还召集我们开了会,正当我们热血沸腾的时候下午又把我们叫去说不去了,学校里五百个学生的热血就这样被浇灭了,哎,原因是中央组委会下发文件说国丧期间,一切从简,呵呵,我们还是能理解的,叭一的想法就是遗憾。。。
最近发生了很多事,都想记下来,可是现在正发烧,头晕,什么都想不起来,就像以前一样,本来有很多东西想写,可是一登陆自己的网站便什么都想不起来了,晕~

另外把网站下方的小统计程序改了个文本版的,突然觉得这小东西用 MySQL 数据库是不是太浪费了,又改成了个单用户的文本版。
自己研究吧。

PHP代码
  1. <?php   
  2. /*  
  3. 网站访问统计程序TXT版  
  4. 统计全部点点击,全部人次,今日点击,今日人次。  
  5. 数据判断根据存入数据库、现在时间和存入用户机器的COOKIE判断  
  6. 每台计算机每天只可以增加全部人次和今日人次一次,全部点击和今日点击每打开网页一次便增加一次  
  7. 设计 BY pader  
  8. E-mail: [email protected]  
  9. */  
  10. $datafile = "count.txt";  //数据文件   
  11. $cookiename = "vgotcnstatis"//COOKIE的名称   
  12.   
  13. function writedata($indata){ //写数据函数   
  14.  global $datafile;   
  15.  $iswrite = false;   
  16.  if($fp = fopen($datafile,"w")){   
  17.   if(flock($fp,LOCK_EX)){   
  18.    if(fwrite($fp,$indata)){$iswrite = true;}   
  19.    flock($fp,LOCK_UN);   
  20.   }    
  21.   fclose($fp);   
  22.  }    
  23.  return $iswrite;   
  24. }   
  25.   
  26. header("programa:no-cache");  //没有缓存   
  27. $today = date("Ymd"); //今天   
  28.   
  29. //判断数据文件是否存在   
  30. if(file_exists($datafile)){   
  31.  $datagot = file_get_contents($datafile);   
  32.  $row = explode("|",$datagot);   
  33.  list($day,$all_click,$all_once,$today_click,$today_once,$about) = $row;   
  34.  $all_click++;   
  35.  if($day == $today){   
  36.   $today_click++;   
  37.   if((!$_COOKIE[$cookiename]) or ($_COOKIE[$cookiename] < $today)){   
  38.    $all_once++;   
  39.    $today_once++;   
  40.   }   
  41.   setcookie($cookiename$today, time()+3600*24);   
  42.  }else{   
  43.   $today_click = "1";   
  44.  $all_once++;   
  45.  $today_once = "1";   
  46.  setcookie($cookiename$today, time()+3600*24);   
  47.  }   
  48.  $datastring = $today."|".$all_click."|".$all_once."|".$today_click."|".$today_once;   
  49.  writedata($datastring);   
  50. echo <<<EOF   
  51. <!--   
  52. document.write("全部点击:$all_click,全部人次:$all_once,今日点击:$today_click,今日人次:$today_once");   
  53. //-->   
  54. EOF;   
  55.   
  56. }else//否则即如果数据文件不存在   
  57.  echo "数据文件不存在,正在创建数据文件...<br>";   
  58.  if(@touch($datafile)){   
  59.   echo "<font color=red>创建数据文件成功,准备写入初始数据...</font><br>";   
  60.   $datastring = $today."|1|1|1|1";   
  61.   if(writedata($datastring)){   
  62.    echo "<font color=red>写入初始数据成功,现在可以正常使用统计功能了.请刷新页面</font><br>";   
  63.   }else{   
  64.    die("<font color=black>写入初始数据失败!</font><br>");   
  65.   }   
  66.  }else{   
  67.    die("<font color=black>创建数据文件失败!</font><br>");   
  68.  }   
  69. }   
  70. ?>  
Pader 2008-5-30 0

做了一个“用心聆听”PHP文本留言本

    以前在虎冀网的一个用户的网站(网站设计的很漂亮)看到一个留言本,很漂亮,我非常喜欢,当时找他要要好几遍源码,他都不愿意给,现在我突然想起这件事,我想我的 CSS+HTML 知识完全可以设计一个嘛,至于后台,怎么搞都行,于是我找到我很久以前在 PHPWIND 官方论坛上发的该留言本的一张截图(多亏我以前截了张图找别人要相似的留言本,不然现在还真想不起来是什么样子的),照着做了个大概,内部代码肯定不同,因为我纯粹喜欢它的漂亮界面,哈哈。
   还有现在用的酷虫在线的留言本由于没有验证码功能,经常有一些广告机发的广告,总得手动删除,于是我还给它加了个验证码的功能,验证用上了我做的 Impression (印象)函数,左边的留言框也不是漂浮的了,现在大多数浏览器都默认对漂浮元素进行过滤,所以就没让它漂,对客户端发表留言的验证错误了也没有用 alert() 弹出提示,而是在留言框下方的小 div 里显示提示文字,并且都测试了与 FireFox 兼容,够好玩吧,我给它取名叫用心聆听留言本,秀秀:
留言本地址:  http://padertools.512j.com/myfacebook/

Pader 2008-2-25 0

PHP类似于Session的功能函数Impression(印象)

闲来无事写的PHP类似于Session的功能函数,我想尽脑门给它取了个名叫 Impression(印象),自己觉得好玩,和PHP中的Session功能差不多,但还是要差很多,额..

具体代码如下:

PHP代码
  1. <?php   
  2. /*  
  3. PHP类似于Session的功能函数Impression(印象)  
  4. 原创 by pader [QQ:270075658] [Homepage:www.vgot.cn] [E-mail:[email protected] 
  5. 版权所有:Pader - http://www.vgot.cn  
  6.  
  7. require_once 'impression.func.php';  
  8. */  
  9.   
  10. //开始印象应用,必须在任何数据被输出到浏览器之前   
  11. function impression_start(){   
  12. global $_impression,$_impression_cfg;   
  13. $_impression_cfg["datafolder"] = "F:/wwwroot/impression"//印象数据存储的系统绝对目录,后面不要带斜杠   
  14. $_impression = array();   
  15. if($_COOKIE["PHPIMPRESSID"]){   
  16.  $_impression_cfg["data"] = $_impression_cfg["datafolder"]."/impress_".$_COOKIE["PHPIMPRESSID"].".php";   
  17.  if(file_exists($_impression_cfg["data"])){   
  18.   $data = file($_impression_cfg["data"]);   
  19.   $filemax = count($data);   
  20.   $zline = explode('||',$data[0]);   
  21.   $_impression_cfg["vid"] = $zline[1];   
  22.   for($i=1;$i<$filemax;$i++){   
  23.    $vline = explode("||",$data[$i]);   
  24.    $n = str_replace(array('\|',"\\\\r\\\\n"),array('|',""),$vline[0]);   
  25.    $v = str_replace(array('\|',"\\\\r\\\\n"),array('|',""),$vline[1]);   
  26.    $_impression["$n"] = $v;   
  27.   }   
  28.  }else{   
  29.  setcookie("PHPIMPRESSID");   
  30.  die('<p><b>印象应用错误:</b>发生一个错误,印象应用被注销,请刷新页面重新开始一个印象应用对话。</p>');   
  31.  }   
  32. }else{   
  33.  for($i=1;;$i++){   
  34.   $ncode = md5($i);   
  35.   $_impression_cfg["data"] = $_impression_cfg["datafolder"]."/impress_".$ncode.".php";   
  36.   if(!file_exists($_impression_cfg["data"])){   
  37.    if(@touch($_impression_cfg["data"])){   
  38.     $_impression_cfg["vid"] = "impress_".$i;   
  39.     if(setcookie("PHPIMPRESSID",$ncode)){   
  40.     $st = 1;   
  41.     $writeData = '<?php exit; ?>||'.$_impression_cfg["vid"].'||'.time()."||";   
  42.      if($fp = @fopen($_impression_cfg["data"],"w")){   
  43.       if(@fwrite($fp,$writeData)){$st = 1;}   
  44.       fclose($fp);   
  45.      }   
  46.    }else{   
  47.     echo '<p><b>印象应用错误:</b>使用 impression_start() 函数必须在任何数据被输出到浏览器之前。</p>';   
  48.    }   
  49.    }else{   
  50.     echo '<p><b>印象应用错误:</b>发生一个错误,印象数据创建失败,请检查相关权限。</p>';   
  51.    }   
  52.    break;   
  53.   }   
  54.  }   
  55. }   
  56. }   
  57.   
  58. //应用印象数据   
  59. function impression_apply(){   
  60. global $_impression,$_impression_cfg;   
  61. $st = 0;   
  62. $writeData = '<?php exit; ?>||'.$_impression_cfg["vid"].'||'.time()."||";   
  63. foreach($_impression as $n => $v){   
  64.  $n = str_replace(array('|',""),array('\|',"\\\\r\\\\n"),$n);   
  65.  $v = str_replace(array('|',""),array('\|',"\\\\r\\\\n"),$v);   
  66.  $writeData .= $n.'||'.$v."||";   
  67. }   
  68. if($fp = @fopen($_impression_cfg["data"],"w")){   
  69.  if(@fwrite($fp,$writeData)){$st = 1;}   
  70.  fclose($fp);   
  71. }   
  72. if(!$st){echo '<p><b>印象应用错误:</b>发生一个错误,印象数据存储失败,请检查相关权限。</p>';}   
  73. return $st;   
  74. }   
  75.   
  76. //卸载印象数据   
  77. function impression_unset(){   
  78. global $_impression,$_impression_cfg;   
  79. $writeData = '<?php exit; ?>||'.$_impression_cfg["vid"].'||'.time()."||";   
  80. if($fp = @fopen($_impression_cfg["data"],"w")){   
  81.  if(@fwrite($fp,$writeData)){$st = 1;}   
  82.  fclose($fp);   
  83. }   
  84. }   
  85. ?>  

和 Setcookie() 一样,在开始使用时 impression_start() 函数必须在任何数据被输出到浏览器之前进行调用,得到的全局变量是 $_impression ,在页面中要获取或存取值直接把值赋给 $_impression[] :

PHP代码
  1. <?php   
  2. require 'impression.func.php'//调用函数文件   
  3.   
  4. impression_start(); //开始印象应用   
  5.   
  6. $_impression["hello"] = "http://www.vgot.cn";   
  7. $_impression["world"] = "哈哈哦哈哈";   
  8. $_impression["你好世界"] = "http://
    ww
    w.vgot.cn"//可以存储带有换行的字符串,但是不可以存储数组和类等   
  9.   
  10. impression_apply();   
  11. //要想印象内容被存储并在其它页面被调用,必须使用impression_apply()函数,此函数的功能就是把之前被赋值的$_impression变量存储进数据库   
  12.   
  13. //如果想要清除印象当前会话的所有数据,则可以使用impression_unset()函数,这样,$_impression的内容就为空   
  14.   
  15. ?>  
PHP代码
  1. <?php //test.php   
  2. require 'impression.func.php'//调用函数文件   
  3.   
  4. impression_start(); //开始印象应用   
  5.   
  6. echo $_impression["hello"]; //输出 "http://www.vgot.cn"   
  7. echo $_impression["world"]; //输出 "哈哈哦哈哈"   
  8. echo $_impression["你好世界"]; 
  9. /*输出 "http://
    www.vgot.cn"
  10. */
  11.   
  12.   
  13. ?>  

希望大家能够多给意见把它变得更好玩~

Pader 2008-2-19 0