热搜:NVER node 开发 php

调试一个ajax要吐血了

2024-08-18 19:05:01
调试一个ajax要吐血了

写了一个英汉词典,具体流程:
1. 把本地文件按照{English: Chinese}的格式写入memcached服务器
2. 通过ajax提交英语单词,并返回中文释义

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

//这部分代码是OK的,用于读取并解析本地的txt格式词典<?php 	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<?php 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的,根据客户端提交的英语单词,可以成功查询到对应的中文,并写入本地文件成功过<?php 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



ajax调试要吐血了


回复讨论(解决方案)

var res=xmlhttp.responseXML;
window.alert(typeof $res);

一样吗?不一样当然不行

var res=xmlhttp.responseXML;
window.alert(typeof $res);

一样吗?不一样当然不行




哎。这么明显的错误硬是没照出来。。我用的写字本写的代码。。怎么找都找不到。。。zend studio for eclipse 在我的机器上跑步起来,,有什么轻量级,功能齐全,自动高亮,自动补全的IDE推荐吗?

sublime or notepad++

var res=xmlhttp.responseXML;
window.alert(typeof $res);

一样吗?不一样当然不行



//客户端做出如下修改 xmlhttp.onreadystatechange=function()		{			//window.alert(xmlhttp.readyState);			if (xmlhttp.readyState==4 && xmlhttp.status==200)			{				var res=xmlhttp.responseText;				res=eval("("+res+")");				window.alert(res);				//var en=res.getElementsByTagName("en")[0].childNodes[0].nodeValue;								//var ch=res.getElementsByTagName("ch")[0].childNodes[0].nodeValue;				//var en=$("enWord").value;				/var ch=res.en;				$("chWord").innerText= en+": 的中文意思是: "+ch;   			}		} //服务器这边改成用json传回数据,修改如下<?phpheader("content-type: plain/text; charset=utf-8");require_once "storeWord.php";if(!empty($_GET['enword'])){	$en=$_GET['enword'];			$mem=new MemStore();	$ch=$mem->getWord($en);	$en=$mem->filterWord($en);		$res="$en$ch";	file_put_contents('aword.txt', $res."\r\n",FILE_APPEND);	//ob_start();	$res='{"'.$en.'":"'.$ch.'"}';	echo $res;}else{	file_put_contents('aword.txt', "receive NON data \r\n",FILE_APPEND);}

//可以收到数据,不过收到的是一个html网页,试图在ob缓存里把结果过滤出来,但最后还是一个空html+结果

我就不明白了这段HTML是拿来的.* ,而且结果是在