php ajax debug,调试一个ajax要呕血了

调试一个ajax要吐血了

写了一个英汉词典,具体流程:

1. 把本地文件按照{English: Chinese}的格式写入memcached服务器

2. 通过ajax提交英语单词,并返回中文释义

遇到的问题: 查询对应的单词,可以通过file_put_contents函数写入本地,证明查询到了相应的单词,在客户端,通过readyState属性可以依次看到返回1,2,3,4,但是在window.alert(type res)时显示未定义。

//这部分代码是OK的,用于读取并解析本地的txt格式词典

class Word

{

private $query_en='#\w+\b#i';

private  $query_ch='#[\x{4e00}-\x{9fa5}][\x{4e00}-\x{9fa5},\)\.\( \w]*#u';

private $arr_word=array();

private  $recycle_num=100;

private  $fp=null;

public function __construct($fileName)

{

$this->fp=fopen($fileName,'r') or die('打开ciba失败');

}

public function readWord()

{

while(!feof($this->fp))

{

$word=fgets($this->fp);

$word=trim($word);

if($word=='') continue;

$en=$this->parseEn($word);

$ch=$this->parseCh($word);

$this->arr_word["$en"]=$ch;

/* $this->recycle_num--;

if($this->recycle_num==0) return; */

}

}

public function parseEn(&$word)

{

if(preg_match($this->query_en, $word, $en))

{

return $en[0];

}

else

{

echo "match english word failed
";

}

}

public function parseCh(&$word)

{

if(preg_match($this->query_ch, $word, $ch))

{

return $ch[0];

}

else

{

echo "match chinese failed
";

}

}

public  function getWord()

{

return $this->arr_word;

}

public function __destruct()

{

fclose($this->fp);

}

}

//$word=new Word('ciba.txt');

//$word->readWord();

//echo "

";

//print_r($word->getWord());

//echo "

";  */

?>

//这部分代码也是OK的,用于将词条写入memcached

require_once('parseWord.php');

class MemStore

{

private $mem=null;

private $pat='#^[a-zA-Z]+\b#i';

public function __construct()

{

$this->mem=new Memcache();

$this->mem->connect("127.0.0.1", 11211) or die("connect memcached failed!!!
");

}

public function __destruct()

{

$this->mem->close();

}

public function addWord()

{

$word=new Word('ciba.txt');

$word->readWord();

$result=$word->getWord();

//echo count($result)."字符
";

//exit();

foreach($result as $en => $ch)

{

$this->mem->add($en, $ch, MEMCACHE_COMPRESSED, time()+10*24*3600) or die("添加词条失败". __LINE__ ."
");

}

}

public function setWord($en,$ch)

{

//控制器判断输入是否合法

$en=$this->filterWord($en);

$en=$this->mem->get($en) or die("找不到词条 $en");

$this->mem->set($en, $ch, MEMCACHE_COMPRESSED, time()+31*24*3600) or die("添加词条$en失败");

}

public function getWord($en)

{

//控制器判断输入是否合法

$en=$this->filterWord($en);

$ch=$this->mem->get($en) or die("找不到词条 $en");

return $ch;

}

public function replaceWord($en,$ch)

{

//控制器判断输入是否合法

$en=$this->filterWord($en);

$en=$this->mem->get($en) or die("找不到词条 $en");

$this->mem->replace($en, $ch, MEMCACHE_COMPRESSED, time()+31*24*3600) or die("替换词条$en失败");

}

public function deleteWord($en)

{

//控制器判断输入是否合法

$en=$this->filterWord($en);

$this->mem->delete($en,0) or die("删除词条$en失败");

}

//过滤掉中文,包括空格的词组,长度大于20的词条

public function filterWord($en)

{

$en=trim($en);

if(preg_match('#[\x{4e00}-\x{9fa5},\)\.\(]+#u', $en))

{

//echo '暂时不支持中文查询
';

if(preg_match('#\b[a-z]+\b#i', $en, $res))

{

if(strlen($res[0])>20)

{

//echo "字符过长
";

return strtolower(substr($res[0], 0,20));

}

return strtolower($res[0]);

}

}

else if(preg_match('#\s+#', $en))

{

//$en=explode(' ', $en);

//echo "含有空格
";

$res=null;

if(preg_match('#[a-z]+#i', $en, $res))

{

if(strlen($res[0])>20)

{

//echo "字符过长
";

return strtolower(substr($res[0], 0,20));

}

return strtolower($res[0]);

}

}

else if(preg_match('#[—_\+\?\*\^\$\#\%\&\/\\,\.!@=\`\'\"\"""]#',$en, $res))

{

//

//echo '含有非法字符
';

if(preg_match('#[a-z]+#i', $en, $res))

{

if(strlen($res[0])>20)

{

echo "字符过长
";

return strtolower(substr($res[0], 0,20));

}

return strtolower($res[0]);

}

}

else if(strlen($en)>20)

{

//echo "字符过长
";

return strtolower(substr($en, 0,20));

}

else

{

return $en;

}

}

public function flushAll()

{

$this->mem->flush();

}

public function getTime()

{

if (function_exists("micro_time"))

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

else

{

return time();

}

}

}

//$mem=new MemStore();

//$mem->addWord();

//$mem->flushAll();

//$mem->replaceWord('abandon', 100000000);

//$mem->deleteWord('abandon');

//echo $mem->getWord('_*&^%abandon^%$#');

//echo "ok";

?>

//下面这段代码也是OK的,根据客户端提交的英语单词,可以成功查询到对应的中文,并写入本地文件成功过

header("content-type: text/xml; charset=utf-8");

header("Cache-Control: no-cache");

require_once "storeWord.php";

if(!empty($_GET['enword']))

{

$en=$_GET['enword'];

//file_put_contents('aword.txt', $en."\t\t",FILE_APPEND);

$mem=new MemStore();

$ch=$mem->getWord($en);

$en=$mem->filterWord($en);

$res="".$en."".$ch."";

file_put_contents('aword.txt', $res."\r\n",FILE_APPEND);//这里是OK的

echo $res;

//echo '{'.$en.':'.$res.'}';

}

else

{

file_put_contents('aword.txt', "receive NON data \r\n",FILE_APPEND);

}

?>

//我估计问题出在下面这段代码,,但是就是找不出问题所在,一直显示undefined

function getXMLHttpRequest()

{

var xmlhttp=null;

if(window.ActiveXObject)

{

xmlhttp = new ActiveXObject("Microsoft.XMLHttp");

}

else

{

xmlhttp=new XMLHttpRequest();

}

return xmlhttp;

}

function query()

{

var url="/ciba/process.php";

var data="?enword="+$('enWord').value+"&rand="+Math.random();

$('enWord').value="";

//var url+=data;

//window.alert(url+data);

xmlhttp=getXMLHttpRequest();

if (xmlhttp)

{

xmlhttp.open("get", url+data,true);

xmlhttp.onreadystatechange=function()

{

//window.alert(xmlhttp.readyState);

if (xmlhttp.readyState==4 && xmlhttp.status==200)

{

var res=xmlhttp.responseXML;

window.alert(typeof $res);//这个位置一直显示undefined

var en=res.getElementsByTagName("en")[0].childNodes[0].nodeValue;

var ch=res.getElementsByTagName("ch")[0].childNodes[0].nodeValue;

$("chWord").innerText= en+": 的中文意思是: "+ch;

}

}

xmlhttp.send(null);

}

}

function $(id)

{

return document.getElementById(id);

}

ajax调试要吐血了

------解决思路----------------------

var res=xmlhttp.responseXML;

window.alert(typeof $res);

一样吗?不一样当然不行

------解决思路----------------------

sublime  or  notepad++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值