AJAX应用之注册用户即时检测 不指定

jed , 2008-1-16 13:44 , 代码编程 , 评论(0) , 阅读(2947) , Via 本站原创
AJAX的无刷新机制使得在注册系统中对于注册名称的检测能即时显示。

常见的用户注册是用户输入用户名,后台程序检测数据库中用户名是否重复而做出注册的成功与失败之提示(当用户注册重名时将返回重新注册),或者稍微人性化一点就是在用户名文本框后添加一个检测按钮,让用户检测后再做注册。

以上操作,对于用户体验方面来说是比较“差劲”的,一个很好的用户体验就是:当用户输入完注册用户名后,Web系统应能即时检查并即时显示,并在检查和显示的同时不影响当前页面的操作。这也就是“异步获取数据”的要求,而这正是AJAX的强项

比如如下的示例就能展现AJAX的该功能:

http://www.cnbruce.com/test/ajax/t1.htm

当输入已经存在的用户名(如cnbruce、cnrose)时页面将显示重名不能注册(false),否则将显示可以注册(true),这为用户的注册提供了快速的参考,用户体验至上。

那么下面就来说说是如何来实现这样的功能的。

其实通过如上的t1.htm的源代码,各位就可以看到AJAX的精髓

首先是定义XMLHttp对象


var xmlHttp = false;
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}





关于这部分内容的说明请看:
http://www.cnbruce.com/blog/showlog.asp?cat_id=34&log_id=987

接着是自定义函数



function callServer() {
var u_name = document.getElementById("u_name").value;
if ((u_name == null) || (u_name == "")) return;
var url = "cu.asp?name=" + escape(u_name);
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);
}




该函数的主要功能就是异步获得cu.asp的内容,在此前将先提取当前页表单元素“u_name”即用户名文本框zhogn 的值,通过cu.asp其后的参数及赋值而得到了不同的结果(true or false)。

那么这里要说的即是cu.asp,他的主要功能就是接受URL参数name的值做内容显示,该内容最终被t1.htm异步获取。




<!--cu.asp的源码示例-->

<!--#include file="conn.asp"-->
<%
name=request.querystring("name")
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from u_ser where u_name='"&name&"'"
rs.Open sql,conn,1,1
if rs.eof and rs.bof then
   response.write("true")
else
   response.write("false")
end if
rs.close
set rs=nothing
call CloseDatabase
%>





如何将异步获取的信息显示在当前页呢



function updatePage() {
if (xmlHttp.readyState < 4) {
   test1.innerHTML="loading...";
}
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
   test1.innerHTML=response;
}
}




其中xmlHttp.readyState中的readyState表示服务器在处理请求时的进展状况,其值分别有0-4,各有其说明情况,具体请参看:

http://www.cnbruce.com/blog/showlog.asp?cat_id=34&log_id=718

使用DHTML中的innerHTML可显示信息在定义的 是否能注册 上。

其余表单页面就不详叙了

打包文件下载(右键选择另存为,下载后修改文件后缀名为rar,解压打开):

http://www.cnbruce.com/test/ajax/ajax.htm

还记得几年前的那些讨厌的浏览器战争吗?没有一样东西在不同的浏览器上得到同样的结果。不管您是否相信,这些战争仍然在继续,虽然规模较小。但令人奇怪的是,XMLHttpRequest 成了这场战争的牺牲品之一。因此获得 XMLHttpRequest 对象可能需要采用不同的方法。下面我将详细地进行解释。

使用 Microsoft 浏览器

Microsoft 浏览器 Internet Explorer 使用 MSXML 解析器处理 XML。因此如果编写的 Ajax 应用程序要和 Internet Explorer 打交道,那么必须用一种特殊的方式创建对象。

但并不是这么简单。根据 Internet Explorer 中安装的 JavaScript 技术版本不同,MSXML 实际上有两种不同的版本,因此必须对这两种情况分别编写代码。请参阅如下代码,其中的代码在 Microsoft 浏览器上创建了一个 XMLHttpRequest。

Tags:
同步登录跟官方的没有什么两样,现在重点是怎么进行积分同步。
先看看dedecms通行证的原理:
bbs文件 ->
发送GET请求到 -> dedecms/member/passport/pp_dederemote_new.php ->
pp_dederemote_new.php 处理GET数据并返回成功与否

所以所有操作都是在pp_dederemote_new.php这文件进行的,其它的只是按指定规格调用这参数SynchDedeCms()

织梦的用户表中有money一项,我们就用money与discuz的积分initcredits项来整合同步。

修改如下:
Tags:

foreach 的用法   不指定

jed , 2007-11-22 11:36 , 代码编程 , 评论(1) , 阅读(6198) , Via 本站原创
foreach
PHP 4(不是 PHP 3)包括了 foreach 结构,和 Perl 以及其他语言很像。这只是一种遍历数组简便方法。foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种比较次要但却是第一种的有用的扩展。


foreach (array_expression as $value) statement
foreach (array_expression as $key => $value) statement




第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键值也会在每次循环中被赋给变量 $key。


注: 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。



注: 此外注意 foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此即使有 each() 的构造,原数组指针也没有变,数组单元的值也不受影响。



注: foreach 不支持用“@”来禁止错误信息的能力。


你可能注意到了以下的代码功能完全相同:


<?php
$arr = array("one", "two", "three");
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>\n";
}

foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
?>



以下代码功能也完全相同:

<?php
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Key: $key; Value: $value<br>\n";
}

foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br>\n";
}
?>




示范用法的更多例子:


<?php
/* foreach example 1: value only */

$a = array (1, 2, 3, 17);

foreach ($a as $v) {
print "Current value of \$a: $v.\n";
}

/* foreach example 2: value (with key printed for illustration) */

$a = array (1, 2, 3, 17);

$i = 0; /* for illustrative purposes only */

foreach ($a as $v) {
print "\$a[$i] => $v.\n";
$i++;
}

/* foreach example 3: key and value */

$a = array (
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);

foreach ($a as $k => $v) {
print "\$a[$k] => $v.\n";
}

/* foreach example 4: multi-dimensional arrays */

$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach ($a as $v1) {
foreach ($v1 as $v2) {
print "$v2\n";
}
}

/* foreach example 5: dynamic arrays */

foreach (array(1, 2, 3, 4, 5) as $v) {
print "$v\n";
}
?>


分开检索也很容易啊,只不过如果你没有别的特殊需要和起来就够用了
1、在{dede:artlist}{/dede:artlist}中把stime的显示格式由0000-00-00改为其他格式



[field:pubdate function='strftime("%m-%d",@me)'/] 格式00-00
[field:pubdate function='strftime("%m/%d",@me)'/] 格式00/00
[field:pubdate function='strftime("%y/%m/%d",@me)'/] 0000/00/00



2、栏目名称边上加(文章条数)功能
方法: 打开 \include\inc_arcpart_view.php 在 "//获得一个类目的链接信息" 下面找到


if(!is_array($row)) return "";



在其上面加上两行:



$countarc = $this->dsql->GetOne("Select count(ID) as dd From #@__archives where typeid='$typeid'");
$row['totalarc']=$countarc['dd'];



然后 在 模版的 [field:typename /] 后加上 ( [field:totalarc /] ) 调用即可!

3、相关文章更相关的修改方法
相关的含义是:文章的关键字和其它文章的关键字相同或者文章的关键字在其它文章题目中。
在inc_fun_SpGetArcList.php中可以看出来


$orwhere .= " And CONCAT(arc.title,arc.keywords) REGEXP '$rstr' ";


原帖mylove2046写的:
"相关文章"的正确修改方法
无论是V3版还是V4版,"相关文章"都不相关,修改方法如下:
includeinc_archives_view.php
在第330行附近找到


if($tagname=="likeart") $keywords = ""; //str_replace(" ",",",trim($this->Fields['keywords']));


改为

if($tagname=="likeart") $keywords = str_replace(" ",",",trim($this->Fields['keywords']));

在335行附近找到

else if($tagname=="likeart") $orderby = "near";

改为

else if($tagname=="likeart") $orderby = "id";

其实改动一下代码和系统配置,其它配置里面的系统变量,使用关键词关连文章:

if($tagname=="likeart") $keywords = ""; //str_replace(" ",",",trim($this->Fields['keywords']));

改为

if($tagname=="likeart") $keywords = str_replace(" ",",",trim($this->Fields['keywords']));

4、dedecms会员登录后修改个人资料报错
现象
member\index_do.php on line 262
解决办法
在 $dsql->SetQuery($query);之前加上一段

$dsql = new DedeSql();

5、Tag加链接

{dede:field name='keywords' runphp='yes' }
if(!empty(@me)){
$kws = explode(' ',@me);
@me = "";
foreach($kws as $k){
  @me .= "<a href='/plus/search.php?keyword=$k' target='blank'>$k</a> ";
}
@me= str_replace('+', ' ',trim(@me));
}
{/dede:field}

6、栏目合并:

update dede_archives set typeid=新ID where typeid=原ID
update dede_addonarticle set typeid=新ID where typeid=原ID

6、新文章带NEW

[field:senddate runphp='yes']
$ntime = time();
$oneday = 3600 * 24;
if(($ntime - @me)<$oneday) @me = "<font color='red'>[new]</font>";
else @me = "";
[/field:senddate]

7、LOOP标记调用最新评论

{dede:loop table="dede_feedback" sort="dtime" row="5"}    
<a href='http://xxxxx/plus/view.php?aid=[field:aid /]' target="_blank" title='文章标题:[field:arctitle/]    
评论时间:[field:dtime function="GetDateMk('@me')"/]    
发布作者:[field:username /]'>  
[field:msg function="cn_substr('@me',50)" /]    
</a>  
<br>  
{/dede:loop}


使用函数去除空格的程序 不指定

jed , 2007-11-6 09:44 , 代码编程 , 评论(1) , 阅读(5509) , Via 本站原创


<?php  
      $string="     My   dog   is   very   clever             ";  
      echo   "原字符串长度:".strlen($string)."字符<br>";  
      $s1=chop($string);  
      echo   "去掉末端空格:".strlen($s1)."字符<br>";  
      $s2=trim($string);  
      echo   "去掉首尾空格:".strlen($s2)."字符<br>";  
      $s3=ltrim($string);  
      echo   "去掉前端空格:".strlen($s3)."字符<br>";  
  ?>  

PHP文本数据库的搜索方法 不指定

jed , 2007-11-6 09:42 , 代码编程 , 评论(0) , 阅读(3689) , Via 本站原创


<?

//PHP文本数据库的搜索方法
searchstr=("/".preg_quote($searchstr)."/");
//$searchstr是查找的关键字
$records=file($file);//获取所有的记录数
//$file是查找的数据文件
$search_reocrds=preg_grep ($searchstr, $records);//开始查找记录
//$search_reocrds为查找到的记录数
unset($records);
if($search_records){
//开始显示记录,写下你自己的处理程序********************
while (list ($key, $val) = each ( $search_records)) {
echo "$val";
}
//****************************************************
}

?>

 PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法
我用一个留言本程序作为例子,阐述PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法。

此文本数据库共有字段10个:客户IP、发言时间、客户名、客户EMAIL、客户主页地址、留言表情图片名、客户QQ、客户形象图片、留言内容、管理员回复内容。

1、加入数据程序段。



$date=date("Y-m-d H:i:s");//取得系统时间
$ip = $HTTP_SERVER_VARS[REMOTE_ADDR]; //取得发言的IP地址
$text=encode($gb_text);//去掉留言内容后面的空格.
$fp=fopen("gb.dat","a");//以只写模式打开gb.dat文本文件,文件指针指向文件尾部.
$str=$ip." ".$date." ".$gb_name." ".$gb_email." ".$gb_home." ".$face." ".$gb_qq." ".$head." ".$text." ".$reply."\n";//将所有留言的数据赋予变量$str," "的目的是用来今后作数据分割时的数据间隔符号。
fwrite($fp,$str);//将数据写入文件
fclose($fp);//关闭文件
showmessage("留言成功!","index.php","3");//留言成功,3秒后自动返回主界面。
其中的$gb_name 、$gb_email、$gb_home、$face、$gb_qq、$head、$gb_text、$reply是由发言表单传过来的数据。



获取服务器IP和获取访问者IP 不指定

jed , 2007-10-10 10:13 , 代码编程 , 评论(0) , 阅读(3971) , Via 本站原创
$_SERVER['SERVER_ADDR']
获取服务器IP
$_SERVER['REMOTE_ADDR']
获取访问者IP


$PS="http://$_SERVER[HTTP_HOST]$_SERVER[PHP_SELF]";//当前页文件地址
$PD=dirname("http://$_SERVER[HTTP_HOST]$_SERVER[PHP_SELF]");//当前目录地址
$PR="http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";//当页地址栏,含?后的请求项 
$BF=$_SERVER['HTTP_REFERER']; //取得上一页的地址,含?后的请求项 

php自带函数大全 不指定

jed , 2007-9-18 14:44 , 代码编程 , 评论(0) , 阅读(3955) , Via 本站原创
Abs: 取得绝对值。
Acos: 取得反余弦值。
ada_afetch: 取得资料库的传回列。
ada_autocommit: 开关自动更动功能。
ada_close: 关闭 Adabas D 连结。
ada_commit: 更动 Adabas D 资料库。
ada_connect: 连结至 Adabas D 资料库。
ada_exec: 执行 SQL 指令。
ada_fetchrow: 取得传回一列。
ada_fieldname: 取得栏位名称。
ada_fieldtype: 取得栏位资料形态。
ada_freeresult: 释出传回资料的记忆体。
分页: 14/26 第一页 上页 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]