2015年11月

我的个人博客:逐步前行STEP

PHP的图像处理功能强大,做一张验证码图片也是非常简单的,但是,在实现实时验证时,确遇到了一个难题:
我用nat123对我的电脑上的网站进行端口映射,实现了在外网访问,本来是采用cookie的方式用js对验证码进行验证,但是经检验发现nat123虽然使我的网站可以通过一个自定义的网址进行访问,但是产生验证码的php文件在网络上的位置竟然和其它页面不在一个域,经查询得知,因为输出图片的缘故,被作为缓存文件映射在了某个文件夹内,所以——其他页面在我的网址下,产生验证码的页面又在另一个网址里,所以它们的cookie不能共用,不管怎么设置path和domain都不管用,于是我只好采用session存储验证码了,因为session存在于服务器,也就是在我本地网址中都可以存取。
接下来是重头戏,之前只是粗略了解过ajax,对于它的用途和特性还是知道的,获取后台来的数据这个比较泛泛的概念具体的使用起来就不知道如何下手了。
首先,我分析了个例题的代码,用途是获取后台的一个文本文件的内容:

function getHTTPObject(){
    if(typedef XMLHttpRequest == "undefined")
        XMLHttpRequest = function(){
            try{ return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
            catch(e){}
            try{ return new ActiveXObject("Msxml2.XMLHTTP.3.0");}
            catch(e){}
            try{ return new ActiveXObject("Msxml2.XMLHTTP");}
            catch(e){}
            return false;
        }
        return new XMLHttpRequest();
}
function getNewContent(){
    var request = getHTTPObject();
    if(request){
        request.open("GET","TEST.txt",true);
        request.onreadystateschange = function(){
            alert(request.responseText);
        }
    }else{
    alert("no support XMLHttpRequest!");
    }
}

其中的关键是:

        request.open("GET","TEST.txt",true);
        request.onreadystateschange =function(){
            alert(request.responseText);
        }

这三句指定了GET请求发向的页面和XMLHttpRequest对象送回响应的时候触发的处理函数,而数据正是通过request.responseText获取的。


可是我要获取的数据是后台php文件产生的验证码,怎么让后台发送验证码?
无论GET还是POST方式都是把数据发送到后台,ajax从哪里取回后台的数据呢?
百思不得其解之下,我又查询了另一本资料,找到一个示例:
其中XMLHttpRequest对象送回响应的处理语句是:

request.onreadystateschange=alertContent;
function alertContent(){
...
    alert(request.responseText);
...
}

请求的文件为check.php
其中有这么几句条件输出:

if($info){
    echo "你的用户名可以使用";
}else {
    echo "该用户名已被注册";
}

而运行实例效果图中赫然在静态页面弹出消息框,内容如check.php页面的输出!!!
也就是说ajax能请求到一个php页面的输出内容,于是,接下来简单多了,因为图片也是验证码页面的输出,所以不能直接ajax验证码页面,不然就把图片的数据也获取了。
新建一个php页面:

sission_start();
$code="";
if(!empty($_session['check']))$code=$_session['check'];
echo $code;

再在前端用ajax向这个页面GET一个请求,就能用request.responseText获取验证码了。
然后把验证过程封装在一定条件触发的函数里,即可实时验证。

配置MySQL:

  (直接下载msi文件或者exe文件安装的可忽略)
基础配置:
 1. 将安装包解压到根目录,如`E:\mysql`;
2. 进入mysql文件夹找到my-default.ini文件,并将文件名改为my.ini;

3.用记事本打开my.ini,找到如图所示项:
这里写图片描述

将basedir的值改为mysql文件夹的路径,将datadir改为mysql文件夹中data文件夹的路径,记住不要添加任何额外字符,不要标点。   
开启MySQL:
此时,打开cmd.exe,输入任何mysql的命令会显示这不是合法命令,因为MySQL服务尚未开启。
4,配置环境变量,在path环境变量上添加bin文件夹的路径;
5,安装mysql服务,在命令行中输入:`mysqld - -install`
6,开启MySQL,在命令行中输入:`net start mysql`
注意:
1,安装和开启服务的时候都要在bin目录里;
2,如果提示“系统错误 5 拒绝访问”,说明权限不够,应该用
-管理员命令提示符-;
3,如果提示“系统错误 2 找不到指定文件”,说明环境变量有问题,再确认bin目录路径与path里的是否相符,如果确认一致后还是有这个错误,就在注册表中把mysql这个项整体删除,再`mysql --remove`,然后回到步骤4;
4,如果提示“系统错误 3 找不到指定文件” ,先把服务卸载了:
`mysqld --remove` 重新安上面步骤安装;

PHPmyadmin配置:

将解压后的文件夹放在网站根目录下,确保在浏览器中输入正确路径后可以访问phpadmin文件夹的index.php 页面。
1,在libraries文件夹中找到config.default.php文件,用记事本打开,分别进行一下操作:

1找到`$cfg['PmaAbsoluteUri'] = ''`,在引号内添加----你本地访问网站时的网址+PHPmyadmin文件夹名+/  
2找到`$cfg['Servers'][$i]['host'] = 'localhost'`;主机名
3找到`$cfg['Servers'][$i]['port'] = ''`,端口号
4找到`$cfg['Servers'][$i]['user'] = 'root'`,你所用的用户名
5找到`$cfg['Servers'][$i]['password'] = ''`,你的用户名的密码
6找到`$cfg['Servers'][$i]['auth_type'] = 'cookie'`,指定需要用户名和密码的验证方式

2,开启MySQL服务,在index页面选择语言,输入刚才配置的用户名和密码。
注意:
1,有可能登录后跳转的页面会出现找不到的情况,那是因为$cfg['PmaAbsoluteUri'] = ''的配置不正确,看着当前显示的网址更在配置调整即可;
2,这里配置的用户名和密码是root用户的,如果在安装MySQL的过程中没有设置密码,就用 mysql>set password =password('密码');先设置。

备注:
使用mysql_connect()语句进行连接数据库时,很可能出现
----PHP Deprecated 和php waring ,
解决办法:

1,用PHPmyadmin添加一个新用户,用这个新用户来对相应数据库建立连接;
2,在`mysql_connect()`语句前加 `@` ,阻止这些非错误的提醒。


今天遇到一个小问题,使用UTF-8这种Unicode编码存储格式时,用js中的字符串的length属性获取输入框中输入的字符长度时,输入中文也是按一个字符算,刚才查了下资料,原来在JS中字符串的长度不分中英文字符, 每一个字符都算一个长度,于是自己写了个strlen函数,让它按输入一个英文字符算一个字符,一个中文字符算三个字符来算字符个数:


function getstrlen(str){
var len=0;
for(var i=0;i< str.length;i++){
    var code=str.charCodeAt(i);
    if(code<=0&&code<=128){
            len=len+1;
    }else len=len+3;
   }
   return len;
}

charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。)


备忘:
转自[1]http://www.php100.com/html/it/biancheng/2015/0316/8789.html
[字符编码ASCII,Unicode和UTF-8概念扫盲]


Unicode是一种符号集,能存储世界上所有文字符号,所以是一种通用的编码,而UTF-8则是最通用的Unicode编码的存储格式,UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx