寫了一個英漢詞典,具體流程:
1. 把本地檔案按照{English: Chinese}的格式寫入memcached伺服器
2. 通過ajax提交英語單詞,並返回中文釋義
遇到的問題: 查詢對應的單詞,可以通過file_put_contents函數寫入本地,證明查詢到了相應的單詞,在用戶端,通過readyState屬性可以依次看到返回1,2,3,4,但是在window.alert(type res)時顯示未定義。
//這部分代碼是OK的,用於讀取並解析本地的txt格式詞典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的,用於將詞條寫入memcachedmem=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的,根據用戶端提交的英語單詞,可以成功查詢到對應的中文,並寫入本地檔案成功過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傳回資料,修改如下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是拿來的.* ,而且結果是在後面,ob過濾就失效了
36行應為 ob_clean();
36行應為 ob_clean();
我明白為什麼了,謝謝。 其實如果不用ob_clean(),在接受的時候採用innerHTML而不是innerText也是可以的。 3Q