当前位置:Gxlcms > PHP教程 > 调试一个ajax要呕血了

调试一个ajax要呕血了

时间:2021-07-01 10:21:17 帮助过:3人阅读

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

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

  1. <br><br>//这部分代码是OK的,用于读取并解析本地的txt格式词典<br><!--?php
  2. <br /-->class Word<br>{<br>
  3. private $query_en='#\w+\b#i';<br>
  4. private $query_ch='#[\x{4e00}-\x{9fa5}][\x{4e00}-\x{9fa5},\)\.\( \w]*#u';<br>
  5. private $arr_word=array();<br>
  6. private $recycle_num=100;<br>
  7. private $fp=null;<br>
  8. <br>
  9. public function __construct($fileName)<br>
  10. {<br>
  11. $this->fp=fopen($fileName,'r') or die('打开ciba失败');<br>
  12. }<br>
  13. <br>
  14. <br>
  15. public function readWord()<br>
  16. {<br>
  17. while(!feof($this->fp))<br>
  18. {<br>
  19. $word=fgets($this->fp);<br>
  20. $word=trim($word);<br>
  21. if($word=='') continue;<br>
  22. <br>
  23. $en=$this->parseEn($word);<br>
  24. $ch=$this->parseCh($word);<br>
  25. $this->arr_word["$en"]=$ch;<br>
  26. <br>
  27. /* $this->recycle_num--;<br>
  28. if($this->recycle_num==0) return; */<br>
  29. <br>
  30. <br>
  31. }<br>
  32. }<br>
  33. public function parseEn(&$word)<br>
  34. {<br>
  35. if(preg_match($this->query_en, $word, $en))<br>
  36. {<br>
  37. return $en[0];<br>
  38. }<br>
  39. else<br>
  40. {<br>
  41. echo "match english word failed<br>";<br>
  42. }<br>
  43. }<br>
  44. public function parseCh(&$word)<br>
  45. {<br>
  46. if(preg_match($this->query_ch, $word, $ch))<br>
  47. {<br>
  48. return $ch[0];<br>
  49. }<br>
  50. else<br>
  51. {<br>
  52. echo "match chinese failed<br>";<br>
  53. }<br>
  54. }<br>
  55. <br>
  56. public function getWord()<br>
  57. {<br>
  58. return $this->arr_word;<br>
  59. }<br>
  60. <br>
  61. public function __destruct()<br>
  62. {<br>
  63. fclose($this->fp);<br>
  64. }<br>}<br><br>//$word=new Word('ciba.txt');<br>//$word->readWord();<br>//echo "<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li>";<br>//print_r($word->getWord());<br>//echo "</li></ol></pre>"; */<br><br>?><br><br>//这部分代码也是OK的,用于将词条写入memcached<br><br><br><meta http-equiv="content-type" content="text/html; charset=utf-8"><br><br><br><!--?php <br /--><br>require_once('parseWord.php');<br>class MemStore<br>{<br>
  65. private $mem=null;<br>
  66. private $pat='#^[a-zA-Z]+\b#i';<br>
  67. <br>
  68. public function __construct()<br>
  69. {<br>
  70. $this->mem=new Memcache();<br>
  71. $this->mem->connect("127.0.0.1", 11211) or die("connect memcached failed!!!<br>");<br>
  72. }<br>
  73. public function __destruct()<br>
  74. {<br>
  75. $this->mem->close();<br>
  76. }<br>
  77. public function addWord()<br>
  78. {<br>
  79. $word=new Word('ciba.txt');<br>
  80. $word->readWord();<br>
  81. $result=$word->getWord();<br>
  82. //echo count($result)."字符<br>";<br>
  83. //exit();<br>
  84. foreach($result as $en => $ch)<br>
  85. {<br>
  86. $this->mem->add($en, $ch, MEMCACHE_COMPRESSED, time()+10*24*3600) or die("添加词条失败". __LINE__ ."<br>");<br>
  87. }<br>
  88. }<br>
  89. <br>
  90. public function setWord($en,$ch)<br>
  91. {<br>
  92. //控制器判断输入是否合法<br>
  93. $en=$this->filterWord($en);<br>
  94. $en=$this->mem->get($en) or die("找不到词条 $en");<br>
  95. $this->mem->set($en, $ch, MEMCACHE_COMPRESSED, time()+31*24*3600) or die("添加词条$en失败");<br>
  96. <br>
  97. }<br>
  98. <br>
  99. public function getWord($en)<br>
  100. {<br>
  101. //控制器判断输入是否合法<br>
  102. $en=$this->filterWord($en);<br>
  103. $ch=$this->mem->get($en) or die("找不到词条 $en");<br>
  104. return $ch;<br>
  105. }<br>
  106. <br>
  107. public function replaceWord($en,$ch)<br>
  108. {<br>
  109. //控制器判断输入是否合法<br>
  110. $en=$this->filterWord($en);<br>
  111. $en=$this->mem->get($en) or die("找不到词条 $en");<br>
  112. $this->mem->replace($en, $ch, MEMCACHE_COMPRESSED, time()+31*24*3600) or die("替换词条$en失败");
  113. <br>
  114. }<br>
  115. <br>
  116. public function deleteWord($en)<br>
  117. {<br>
  118. //控制器判断输入是否合法<br>
  119. $en=$this->filterWord($en);<br>
  120. $this->mem->delete($en,0) or die("删除词条$en失败");<br>
  121. }<br>
  122. <br>
  123. //过滤掉中文,包括空格的词组,长度大于20的词条<br>
  124. public function filterWord($en)<br>{<br>
  125. $en=trim($en);<br><br><br>
  126. if(preg_match('#[\x{4e00}-\x{9fa5},\)\.\(]+#u', $en))<br>
  127. {<br>
  128. //echo '暂时不支持中文查询<br>';<br>
  129. if(preg_match('#\b[a-z]+\b#i', $en, $res))<br>
  130. {<br>
  131. if(strlen($res[0])>20)<br>
  132. {<br>
  133. //echo "字符过长<br>";<br>
  134. return strtolower(substr($res[0], 0,20));<br>
  135. }<br>
  136. return strtolower($res[0]);<br>
  137. }<br>
  138. }<br>
  139. <br>
  140. else if(preg_match('#\s+#', $en))<br>
  141. {<br>
  142. //$en=explode(' ', $en);<br>
  143. //echo "含有空格<br>";<br>
  144. $res=null;<br>
  145. if(preg_match('#[a-z]+#i', $en, $res))<br>
  146. {<br>
  147. if(strlen($res[0])>20)<br>
  148. {<br>
  149. //echo "字符过长<br>";<br>
  150. return strtolower(substr($res[0], 0,20));<br>
  151. }<br>
  152. return strtolower($res[0]);<br>
  153. }<br>
  154. }<br>
  155. else if(preg_match('#[—_\+\?\*\^\$\#\%\&\/\\,\.!@=\`\'\"\"""]#',$en, $res))<br>
  156. {<br>
  157. //<br>
  158. //echo '含有非法字符<br>';<br>
  159. if(preg_match('#[a-z]+#i', $en, $res))<br>
  160. {<br>
  161. if(strlen($res[0])>20)<br>
  162. {<br>
  163. echo "字符过长<br>";<br>
  164. return strtolower(substr($res[0], 0,20));<br>
  165. }<br>
  166. return strtolower($res[0]);<br>
  167. }<br>
  168. }<br>
  169. <br>
  170. else if(strlen($en)>20)<br>
  171. {<br>
  172. //echo "字符过长<br>";<br>
  173. return strtolower(substr($en, 0,20));<br>
  174. }<br>
  175. else <br>
  176. {<br>
  177. return $en;<br>
  178. }<br>
  179. <br>}<br>
  180. <br>
  181. public function flushAll()<br>
  182. {<br>
  183. $this->mem->flush();<br>
  184. }<br>
  185. <br>
  186. public function getTime()<br>
  187. {<br>
  188. if (function_exists("micro_time"))<br>
  189. {<br>
  190. list($usec, $sec) = explode(" ", microtime());<br>
  191. return ((float)$usec + (float)$sec);<br>
  192. }<br>
  193. else<br>
  194. {<br>
  195. return time();<br>
  196. }<br>
  197. }<br>}<br><br>//$mem=new MemStore();<br>//$mem->addWord();<br>//$mem->flushAll();<br>//$mem->replaceWord('abandon', 100000000);<br>//$mem->deleteWord('abandon');<br>//echo $mem->getWord('_*&^%abandon^%$#');<br>//echo "ok"; <br><br>?><br><br><br><br><br>//下面这段代码也是OK的,根据客户端提交的英语单词,可以成功查询到对应的中文,并写入本地文件成功过<br><!--?php <br /-->header("content-type: text/xml; charset=utf-8");<br>header("Cache-Control: no-cache");<br>require_once "storeWord.php";<br>if(!empty($_GET['enword']))<br>{<br>
  198. $en=$_GET['enword'];<br>
  199. //file_put_contents('aword.txt', $en."\t\t",FILE_APPEND);<br>
  200. <br>
  201. $mem=new MemStore();<br>
  202. $ch=$mem->getWord($en);<br>
  203. $en=$mem->filterWord($en);<br>
  204. <br>
  205. <br>
  206. $res="<res><en>".$en."</en><ch>".$ch."</ch></res>";<br>
  207. file_put_contents('aword.txt', $res."\r\n",FILE_APPEND);//这里是OK的<br>
  208. echo $res;<br>
  209. //echo '{'.$en.':'.$res.'}';<br>}<br>else<br>{<br>
  210. file_put_contents('aword.txt', "receive NON data \r\n",FILE_APPEND);<br>}<br><br>?><br><br>//我估计问题出在下面这段代码,,但是就是找不出问题所在,一直显示undefined<br><br><br><br><meta http-equiv="content-type" content="text/html; charset=utf-8"><br><br><br><br><br><br><center><br><input type="text" name="enWord" id="enWord" size="100" maxlength="40"><input type="button" value="查询" onclick="query();"><br><br><br></center><br><br><br><br><br>


ajax调试要吐血了
------解决思路----------------------
var res=xmlhttp.responseXML;
window.alert(typeof $res);

一样吗?不一样当然不行
------解决思路----------------------
sublime or notepad++

人气教程排行