<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Just is here--恰恰在这里 &#187; PHP</title>
	<atom:link href="http://ishere.cn/category/keyboards-joy/php-keyboards-joy-2/feed" rel="self" type="application/rss+xml" />
	<link>http://ishere.cn</link>
	<description>Jena&#039;s blog</description>
	<lastBuildDate>Sat, 14 Apr 2012 07:27:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP将汉字转换成拼音的操作类</title>
		<link>http://ishere.cn/2011/12/13/php%e5%b0%86%e6%b1%89%e5%ad%97%e8%bd%ac%e6%8d%a2%e6%88%90%e6%8b%bc%e9%9f%b3%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b1%bb.html</link>
		<comments>http://ishere.cn/2011/12/13/php%e5%b0%86%e6%b1%89%e5%ad%97%e8%bd%ac%e6%8d%a2%e6%88%90%e6%8b%bc%e9%9f%b3%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b1%bb.html#comments</comments>
		<pubDate>Tue, 13 Dec 2011 07:15:58 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[拼音]]></category>

		<guid isPermaLink="false">http://ishere.cn/?p=565</guid>
		<description><![CDATA[&#60;?php class pinyin{ /** * 将字符串转化为拼音 * EDIT.JENA.20111213 */ public static function _($_String, $_Code=&#8217;gb2312&#8242;) { $_DataKey =”a&#124;ai&#124;an&#124;ang&#124;ao&#124;ba&#124;bai&#124;ban&#124;bang&#124;bao&#124;bei&#124;ben&#124;beng&#124;bi&#124;bian&#124;biao&#124;bie&#124;bin&#124;bing&#124;bo&#124;bu&#124;ca&#124;cai&#124;can&#124;cang&#124;cao&#124;ce&#124;ceng&#124;cha”. “&#124;chai&#124;chan&#124;chang&#124;chao&#124;che&#124;chen&#124;cheng&#124;chi&#124;chong&#124;chou&#124;chu&#124;chuai&#124;chuan&#124;chuang&#124;chui&#124;chun&#124;chuo&#124;ci&#124;cong&#124;cou&#124;cu&#124;”. “cuan&#124;cui&#124;cun&#124;cuo&#124;da&#124;dai&#124;dan&#124;dang&#124;dao&#124;de&#124;deng&#124;di&#124;dian&#124;diao&#124;die&#124;ding&#124;diu&#124;dong&#124;dou&#124;du&#124;duan&#124;dui&#124;dun&#124;duo&#124;e&#124;en&#124;er”. “&#124;fa&#124;fan&#124;fang&#124;fei&#124;fen&#124;feng&#124;fo&#124;fou&#124;fu&#124;ga&#124;gai&#124;gan&#124;gang&#124;gao&#124;ge&#124;gei&#124;gen&#124;geng&#124;gong&#124;gou&#124;gu&#124;gua&#124;guai&#124;guan&#124;guang&#124;gui”. “&#124;gun&#124;guo&#124;ha&#124;hai&#124;han&#124;hang&#124;hao&#124;he&#124;hei&#124;hen&#124;heng&#124;hong&#124;hou&#124;hu&#124;hua&#124;huai&#124;huan&#124;huang&#124;hui&#124;hun&#124;huo&#124;ji&#124;jia&#124;jian&#124;jiang”. “&#124;jiao&#124;jie&#124;jin&#124;jing&#124;jiong&#124;jiu&#124;ju&#124;juan&#124;jue&#124;jun&#124;ka&#124;kai&#124;kan&#124;kang&#124;kao&#124;ke&#124;ken&#124;keng&#124;kong&#124;kou&#124;ku&#124;kua&#124;kuai&#124;kuan&#124;kuang”. “&#124;kui&#124;kun&#124;kuo&#124;la&#124;lai&#124;lan&#124;lang&#124;lao&#124;le&#124;lei&#124;leng&#124;li&#124;lia&#124;lian&#124;liang&#124;liao&#124;lie&#124;lin&#124;ling&#124;liu&#124;long&#124;lou&#124;lu&#124;lv&#124;luan&#124;lue”. “&#124;lun&#124;luo&#124;ma&#124;mai&#124;man&#124;mang&#124;mao&#124;me&#124;mei&#124;men&#124;meng&#124;mi&#124;mian&#124;miao&#124;mie&#124;min&#124;ming&#124;miu&#124;mo&#124;mou&#124;mu&#124;na&#124;nai&#124;nan&#124;nang&#124;nao&#124;ne”. “&#124;nei&#124;nen&#124;neng&#124;ni&#124;nian&#124;niang&#124;niao&#124;nie&#124;nin&#124;ning&#124;niu&#124;nong&#124;nu&#124;nv&#124;nuan&#124;nue&#124;nuo&#124;o&#124;ou&#124;pa&#124;pai&#124;pan&#124;pang&#124;pao&#124;pei&#124;pen”. “&#124;peng&#124;pi&#124;pian&#124;piao&#124;pie&#124;pin&#124;ping&#124;po&#124;pu&#124;qi&#124;qia&#124;qian&#124;qiang&#124;qiao&#124;qie&#124;qin&#124;qing&#124;qiong&#124;qiu&#124;qu&#124;quan&#124;que&#124;qun&#124;ran&#124;rang”. “&#124;rao&#124;re&#124;ren&#124;reng&#124;ri&#124;rong&#124;rou&#124;ru&#124;ruan&#124;rui&#124;run&#124;ruo&#124;sa&#124;sai&#124;san&#124;sang&#124;sao&#124;se&#124;sen&#124;seng&#124;sha&#124;shai&#124;shan&#124;shang&#124;shao&#124;”. “she&#124;shen&#124;sheng&#124;shi&#124;shou&#124;shu&#124;shua&#124;shuai&#124;shuan&#124;shuang&#124;shui&#124;shun&#124;shuo&#124;si&#124;song&#124;sou&#124;su&#124;suan&#124;sui&#124;sun&#124;suo&#124;ta&#124;tai&#124;”. “tan&#124;tang&#124;tao&#124;te&#124;teng&#124;ti&#124;tian&#124;tiao&#124;tie&#124;ting&#124;tong&#124;tou&#124;tu&#124;tuan&#124;tui&#124;tun&#124;tuo&#124;wa&#124;wai&#124;wan&#124;wang&#124;wei&#124;wen&#124;weng&#124;wo&#124;wu”. “&#124;xi&#124;xia&#124;xian&#124;xiang&#124;xiao&#124;xie&#124;xin&#124;xing&#124;xiong&#124;xiu&#124;xu&#124;xuan&#124;xue&#124;xun&#124;ya&#124;yan&#124;yang&#124;yao&#124;ye&#124;yi&#124;yin&#124;ying&#124;yo&#124;yong&#124;you”. “&#124;yu&#124;yuan&#124;yue&#124;yun&#124;za&#124;zai&#124;zan&#124;zang&#124;zao&#124;ze&#124;zei&#124;zen&#124;zeng&#124;zha&#124;zhai&#124;zhan&#124;zhang&#124;zhao&#124;zhe&#124;zhen&#124;zheng&#124;zhi&#124;zhong&#124;”. “zhou&#124;zhu&#124;zhua&#124;zhuai&#124;zhuan&#124;zhuang&#124;zhui&#124;zhun&#124;zhuo&#124;zi&#124;zong&#124;zou&#124;zu&#124;zuan&#124;zui&#124;zun&#124;zuo”; $_DataValue = “-20319&#124;-20317&#124;-20304&#124;-20295&#124;-20292&#124;-20283&#124;-20265&#124;-20257&#124;-20242&#124;-20230&#124;-20051&#124;-20036&#124;-20032&#124;-20026&#124;-20002&#124;-19990&#8243;. “&#124;-19986&#124;-19982&#124;-19976&#124;-19805&#124;-19784&#124;-19775&#124;-19774&#124;-19763&#124;-19756&#124;-19751&#124;-19746&#124;-19741&#124;-19739&#124;-19728&#124;-19725&#8243;. “&#124;-19715&#124;-19540&#124;-19531&#124;-19525&#124;-19515&#124;-19500&#124;-19484&#124;-19479&#124;-19467&#124;-19289&#124;-19288&#124;-19281&#124;-19275&#124;-19270&#124;-19263&#8243;. “&#124;-19261&#124;-19249&#124;-19243&#124;-19242&#124;-19238&#124;-19235&#124;-19227&#124;-19224&#124;-19218&#124;-19212&#124;-19038&#124;-19023&#124;-19018&#124;-19006&#124;-19003&#8243;. “&#124;-18996&#124;-18977&#124;-18961&#124;-18952&#124;-18783&#124;-18774&#124;-18773&#124;-18763&#124;-18756&#124;-18741&#124;-18735&#124;-18731&#124;-18722&#124;-18710&#124;-18697&#8243;. “&#124;-18696&#124;-18526&#124;-18518&#124;-18501&#124;-18490&#124;-18478&#124;-18463&#124;-18448&#124;-18447&#124;-18446&#124;-18239&#124;-18237&#124;-18231&#124;-18220&#124;-18211&#8243;. &#8230; <a href="http://ishere.cn/2011/12/13/php%e5%b0%86%e6%b1%89%e5%ad%97%e8%bd%ac%e6%8d%a2%e6%88%90%e6%8b%bc%e9%9f%b3%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b1%bb.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>&lt;?php</p>
<p>class pinyin{<br />
/**<br />
* 将字符串转化为拼音<br />
* EDIT.JENA.20111213<br />
*/<br />
public static function _($_String, $_Code=&#8217;gb2312&#8242;) {<br />
$_DataKey =”a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha”.<br />
“|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|”.<br />
“cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er”.<br />
“|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui”.<br />
“|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang”.<br />
“|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang”.<br />
“|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue”.<br />
“|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne”.<br />
“|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen”.<br />
“|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang”.<br />
“|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|”.<br />
“she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|”.<br />
“tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu”.<br />
“|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you”.<br />
“|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|”.<br />
“zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo”;</p>
<p>$_DataValue = “-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990&#8243;.<br />
“|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725&#8243;.<br />
“|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263&#8243;.<br />
“|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003&#8243;.<br />
“|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697&#8243;.<br />
“|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211&#8243;.<br />
“|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922&#8243;.<br />
“|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468&#8243;.<br />
“|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664&#8243;.<br />
“|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407&#8243;.<br />
“|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959&#8243;.<br />
“|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652&#8243;.<br />
“|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369&#8243;.<br />
“|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128&#8243;.<br />
“|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914&#8243;.<br />
“|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645&#8243;.<br />
“|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149&#8243;.<br />
“|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087&#8243;.<br />
“|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658&#8243;.<br />
“|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340&#8243;.<br />
“|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888&#8243;.<br />
“|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585&#8243;.<br />
“|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847&#8243;.<br />
“|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055&#8243;.<br />
“|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780&#8243;.<br />
“|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274&#8243;.<br />
“|-10270|-10262|-10260|-10256|-10254&#8243;;<br />
$_TDataKey = explode(&#8216;|&#8217;, $_DataKey);<br />
$_TDataValue = explode(&#8216;|&#8217;, $_DataValue);</p>
<p>//array_combine:创建一个数组，用一个数组的值作为其键名，另一个数组的值作为其值<br />
//PHP_VERSION:表示PHP的版本<br />
$_Data = (PHP_VERSION&gt;=&#8217;5.0&#8242;) ? array_combine($_TDataKey, $_TDataValue) : self::_Array_Combine($_TDataKey, $_TDataValue);<br />
//arsort:对数组进行逆向排序并保持索引关系<br />
//reset:将数组的内部指针指向第一个单元<br />
arsort($_Data);<br />
reset($_Data);</p>
<p>if($_Code != &#8216;gb2312&#8242;) $_String = self::_U2_Utf8_Gb($_String);#假如编码不是gb2312,则启用utf-8<br />
$_Res = ”;<br />
for($i=0; $i&lt;strlen($_String); $i++) {<br />
$_P = ord(substr($_String, $i, 1));<br />
if($_P&gt;160) {<br />
$_Q = ord(substr($_String, ++$i, 1));<br />
$_P = $_P*256 + $_Q &#8211; 65536;<br />
}<br />
$_Res .= self::_Pinyin($_P, $_Data);<br />
}<br />
return preg_replace(“/[^a-z0-9]*/i”, ”, $_Res);<br />
}</p>
<p>private static function _Pinyin($_Num, $_Data) {<br />
if($_Num&gt;0 &amp;&amp; $_Num&lt;160 )<br />
return chr($_Num);<br />
elseif($_Num&lt;-20319 || $_Num&gt;-10247)<br />
return ”;<br />
else {<br />
foreach($_Data as $k=&gt;$v) {<br />
if($v&lt;=$_Num)<br />
break;<br />
}<br />
return $k;<br />
}<br />
}</p>
<p>private static function _U2_Utf8_Gb($_C) {<br />
$_String = ”;<br />
if($_C &lt; 0&#215;80) {<br />
$_String .= $_C;<br />
}<br />
elseif($_C &lt; 0&#215;800) {<br />
$_String .= chr(0xC0 | $_C&gt;&gt;6);<br />
$_String .= chr(0&#215;80 | $_C &amp; 0x3F);<br />
}<br />
elseif($_C &lt; 0&#215;10000) {<br />
$_String .= chr(0xE0 | $_C&gt;&gt;12);<br />
$_String .= chr(0&#215;80 | $_C&gt;&gt;6 &amp; 0x3F);<br />
$_String .= chr(0&#215;80 | $_C &amp; 0x3F);<br />
}<br />
elseif($_C &lt; 0&#215;200000) {<br />
$_String .= chr(0xF0 | $_C&gt;&gt;18);<br />
$_String .= chr(0&#215;80 | $_C&gt;&gt;12 &amp; 0x3F);<br />
$_String .= chr(0&#215;80 | $_C&gt;&gt;6 &amp; 0x3F);<br />
$_String .= chr(0&#215;80 | $_C &amp; 0x3F);<br />
}<br />
return @iconv(&#8216;UTF-8&#8242;, &#8216;GB2312//IGNORE&#8217;, $_String);<br />
}</p>
<p>/**<br />
* 等价PHP5版本的array_combine函数<br />
*/<br />
private static function _Array_Combine($_Arr1, $_Arr2) {<br />
for($i=0; $i&lt;count($_Arr1); $i++) $_Res[$_Arr1[$i]] = $_Arr2[$i];<br />
return $_Res;<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p><a href="http://ishere.cn/wp-content/uploads/2011/12/cls_pinyin.zip">点击下载cls_pinyin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2011/12/13/php%e5%b0%86%e6%b1%89%e5%ad%97%e8%bd%ac%e6%8d%a2%e6%88%90%e6%8b%bc%e9%9f%b3%e7%9a%84%e6%93%8d%e4%bd%9c%e7%b1%bb.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下安装ZendOptimizer3.3.9后页面无法显示〔已解决〕</title>
		<link>http://ishere.cn/2010/06/17/linux%e4%b8%8b%e5%ae%89%e8%a3%85zendoptimizer3-3-9%e5%90%8e%e9%a1%b5%e9%9d%a2%e6%97%a0%e6%b3%95%e6%98%be%e7%a4%ba%e3%80%94%e5%b7%b2%e8%a7%a3%e5%86%b3%e3%80%95.html</link>
		<comments>http://ishere.cn/2010/06/17/linux%e4%b8%8b%e5%ae%89%e8%a3%85zendoptimizer3-3-9%e5%90%8e%e9%a1%b5%e9%9d%a2%e6%97%a0%e6%b3%95%e6%98%be%e7%a4%ba%e3%80%94%e5%b7%b2%e8%a7%a3%e5%86%b3%e3%80%95.html#comments</comments>
		<pubDate>Thu, 17 Jun 2010 03:02:51 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[APC冲突]]></category>
		<category><![CDATA[ZendOptimizer3.3.9]]></category>

		<guid isPermaLink="false">http://ishere.cn/?p=531</guid>
		<description><![CDATA[ZendOptimizer发布了新版本3.3.9　for Linux，于是乎及时跟进。 症状：成功安装后，phpinfo()显示正常，但是网站页面却打不开，显示“访问的页面不存在或输入网址有误，请确认” 。 解决方案：与已安装APC缓存模块有冲突，设置apc.enabled = 0，问题解决。 参考资料：http://kb.zend.com/index.php?View=entry&#38;EntryID=150]]></description>
			<content:encoded><![CDATA[<p>ZendOptimizer发布了新版本3.3.9　for Linux，于是乎及时跟进。</p>
<p>症状：成功安装后，phpinfo()显示正常，但是网站页面却打不开，显示“访问的页面不存在或输入网址有误，请确认” 。</p>
<p>解决方案：与已安装APC缓存模块有冲突，设置apc.enabled = 0，问题解决。</p>
<p>参考资料：http://kb.zend.com/index.php?View=entry&amp;EntryID=150</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2010/06/17/linux%e4%b8%8b%e5%ae%89%e8%a3%85zendoptimizer3-3-9%e5%90%8e%e9%a1%b5%e9%9d%a2%e6%97%a0%e6%b3%95%e6%98%be%e7%a4%ba%e3%80%94%e5%b7%b2%e8%a7%a3%e5%86%b3%e3%80%95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php ini_set post_max_size,upload_max_filesize修改方法</title>
		<link>http://ishere.cn/2010/06/17/php-ini_set-post_max_sizeupload_max_filesize%e4%bf%ae%e6%94%b9%e6%96%b9%e6%b3%95.html</link>
		<comments>http://ishere.cn/2010/06/17/php-ini_set-post_max_sizeupload_max_filesize%e4%bf%ae%e6%94%b9%e6%96%b9%e6%b3%95.html#comments</comments>
		<pubDate>Thu, 17 Jun 2010 03:02:02 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ini_set]]></category>

		<guid isPermaLink="false">http://ishere.cn/?p=529</guid>
		<description><![CDATA[ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;); ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;); echo &#8216;max_execution_time = &#8216; . ini_get(&#8216;max_execution_time&#8217;) ; echo &#8216;memory_limit = &#8216; . ini_get(&#8216;memory_limit&#8217;) ; echo &#8216;post_max_size = &#8216; . ini_get(&#8216;post_max_size&#8217;); echo &#8216;upload_max_filesize = &#8216; . ini_get(&#8216;upload_max_filesize&#8217;); ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;); ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;); 注意: post_max_size,upload_max_filesize用下面的方法是修改不了的. ini_set(&#8216;post_max_size&#8217;,&#8217;1024M&#8217;); ini_set(&#8216;upload_max_filesize&#8217;,&#8217;1024M&#8217;); 正确做法是用.htaccess文件: php_value upload_max_filesize 50M php_value post_max_size &#8230; <a href="http://ishere.cn/2010/06/17/php-ini_set-post_max_sizeupload_max_filesize%e4%bf%ae%e6%94%b9%e6%96%b9%e6%b3%95.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;);<br />
ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;);<br />
echo &#8216;max_execution_time = &#8216; . ini_get(&#8216;max_execution_time&#8217;) ;<br />
echo &#8216;memory_limit = &#8216; . ini_get(&#8216;memory_limit&#8217;) ;<br />
echo &#8216;post_max_size = &#8216; . ini_get(&#8216;post_max_size&#8217;);<br />
echo &#8216;upload_max_filesize = &#8216; . ini_get(&#8216;upload_max_filesize&#8217;);<br />
ini_set(&#8216;max_execution_time&#8217;,&#8217;10&#8242;);<br />
ini_set(&#8216;memory_limit&#8217;,&#8217;1024M&#8217;);</p>
<p>注意: post_max_size,upload_max_filesize用下面的方法是修改不了的.<br />
ini_set(&#8216;post_max_size&#8217;,&#8217;1024M&#8217;);<br />
ini_set(&#8216;upload_max_filesize&#8217;,&#8217;1024M&#8217;);</p>
<p>正确做法是用.htaccess文件:<br />
php_value upload_max_filesize 50M<br />
php_value post_max_size 100M</p>
<p>前提是该站点在httpd.conf中配置了：<br />
AllowOverride All</p>
<p>补充：<br />
其实在php文档里有说明upload_max_filesize的可修改范围是PHP_INI_PERDIR。PHP_INI_PERDIR的意思是域内指令可以在php.ini、httpd.conf或.htaccess文件中修改。PHP_INI_SYSTEM 域内指令可以在php.ini和httpd.conf文件中修改所以upload_max_filesize用int_set是无法修改的。只有可修改范围是PHP_INI_ALL的才可以用int_set修改。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2010/06/17/php-ini_set-post_max_sizeupload_max_filesize%e4%bf%ae%e6%94%b9%e6%96%b9%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash+PHP文件上传，自定义样式，浏览器兼容，跨域上传</title>
		<link>http://ishere.cn/2010/06/17/flashphp%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%ef%bc%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%b7%e5%bc%8f%ef%bc%8c%e6%b5%8f%e8%a7%88%e5%99%a8%e5%85%bc%e5%ae%b9%ef%bc%8c%e8%b7%a8%e5%9f%9f%e4%b8%8a%e4%bc%a0.html</link>
		<comments>http://ishere.cn/2010/06/17/flashphp%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%ef%bc%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%b7%e5%bc%8f%ef%bc%8c%e6%b5%8f%e8%a7%88%e5%99%a8%e5%85%bc%e5%ae%b9%ef%bc%8c%e8%b7%a8%e5%9f%9f%e4%b8%8a%e4%bc%a0.html#comments</comments>
		<pubDate>Thu, 17 Jun 2010 03:01:09 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Flash Uploader]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://ishere.cn/?p=527</guid>
		<description><![CDATA[原文参见：http://www.cnblogs.com/kingthy/archive/2008/10/08/flex_file_uploader.html 我这里所做的修改：同一页面中可多次调用FLASH，解决IE，FIREFOX,CHROME,OPERA浏览器传值兼容问题，另外提供可跨域上传的解决办法。 ————————————————- 2010-5-21 更新：默认语言为英文，将错误提示工作交给JS，根据错误类型自定义错误信息。 /* *当Flash出现错误时（如上传文件）将触发此事件。 *error拥有两个属性 *error.type 错误类型 *error.value 错误信息 */ __SWFUpload_OnError = function(objID, error){ switch(error.type){ case &#8216;size&#8217;: alert(&#8216;文件大小超出限制：&#8217;+error.value); break; default: alert(error.value); break; } __SWFUpload_GetMovie(objID).__SWFUpload_ResetUpload(); } 示例文件下载(Ver 1.1)：Flex.FileUploader.1.1]]></description>
			<content:encoded><![CDATA[<p>原文参见：http://www.cnblogs.com/kingthy/archive/2008/10/08/flex_file_uploader.html</p>
<p>我这里所做的修改：同一页面中可多次调用FLASH，解决IE，FIREFOX,CHROME,OPERA浏览器传值兼容问题，另外提供可跨域上传的解决办法。<br />
————————————————-<br />
2010-5-21 更新：默认语言为英文，将错误提示工作交给JS，根据错误类型自定义错误信息。<br />
/*<br />
*当Flash出现错误时（如上传文件）将触发此事件。<br />
*error拥有两个属性<br />
*error.type 错误类型<br />
*error.value 错误信息<br />
*/<br />
__SWFUpload_OnError = function(objID, error){<br />
switch(error.type){<br />
case &#8216;size&#8217;:<br />
alert(&#8216;文件大小超出限制：&#8217;+error.value);<br />
break;<br />
default:<br />
alert(error.value);<br />
break;<br />
}<br />
__SWFUpload_GetMovie(objID).__SWFUpload_ResetUpload();<br />
}</p>
<p>示例文件下载(Ver 1.1)：Flex.FileUploader.1.1</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2010/06/17/flashphp%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%ef%bc%8c%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%b7%e5%bc%8f%ef%bc%8c%e6%b5%8f%e8%a7%88%e5%99%a8%e5%85%bc%e5%ae%b9%ef%bc%8c%e8%b7%a8%e5%9f%9f%e4%b8%8a%e4%bc%a0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP:header详解-页面刷新，页面跳转…</title>
		<link>http://ishere.cn/2010/06/17/phpheader%e8%af%a6%e8%a7%a3-%e9%a1%b5%e9%9d%a2%e5%88%b7%e6%96%b0%ef%bc%8c%e9%a1%b5%e9%9d%a2%e8%b7%b3%e8%bd%ac%e2%80%a6.html</link>
		<comments>http://ishere.cn/2010/06/17/phpheader%e8%af%a6%e8%a7%a3-%e9%a1%b5%e9%9d%a2%e5%88%b7%e6%96%b0%ef%bc%8c%e9%a1%b5%e9%9d%a2%e8%b7%b3%e8%bd%ac%e2%80%a6.html#comments</comments>
		<pubDate>Thu, 17 Jun 2010 02:38:24 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[header]]></category>

		<guid isPermaLink="false">http://ishere.cn/?p=524</guid>
		<description><![CDATA[header() 函数会传送一个标题讯息给浏览器。因为这些讯息都遵循 HTTP 的规范, 因此浏览器会依据这些讯息做适当之响应。 header()格式:��int header ( string 标头宣告文字 [, bool 置换 [, int http回应码]]) –[标头宣告文字] 的内容就是传给浏览器的标题文字内容。 –[置换] 是布尔型态的参数。 设定为 True 时, 当有二的相同型态的标题讯息宣告时, 后面的讯息将会覆盖前一个讯息。 –第三个参数会让 HTTP 回应码给指定的值。 Location Refresh Content-type Expires（意思为终止） Last-Modified等。 Location – 浏览器显示指定的网页。 格式: header(“Location: http://绝对地址”); Location &#8230; <a href="http://ishere.cn/2010/06/17/phpheader%e8%af%a6%e8%a7%a3-%e9%a1%b5%e9%9d%a2%e5%88%b7%e6%96%b0%ef%bc%8c%e9%a1%b5%e9%9d%a2%e8%b7%b3%e8%bd%ac%e2%80%a6.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>header() 函数会传送一个标题讯息给浏览器。因为这些讯息都遵循 HTTP 的规范, 因此浏览器会依据这些讯息做适当之响应。</p>
<p>header()格式:��int header ( string 标头宣告文字 [, bool 置换 [, int http回应码]])</p>
<p>–[标头宣告文字] 的内容就是传给浏览器的标题文字内容。</p>
<p>–[置换] 是布尔型态的参数。 设定为 True 时, 当有二的相同型态的标题讯息宣告时, 后面的讯息将会覆盖前一个讯息。</p>
<p>–第三个参数会让 HTTP 回应码给指定的值。</p>
<p>Location</p>
<p>Refresh</p>
<p>Content-type</p>
<p>Expires（意思为终止）</p>
<p>Last-Modified等。</p>
<p>Location – 浏览器显示指定的网页。</p>
<p>格式: header(“Location: http://绝对地址”);</p>
<p>Location 的地址必须是一个绝对地址。</p>
<p>Refresh</p>
<p>Refresh – 更新网页。</p>
<p>格式如下:��header(“Refresh : N ; URL=网址”)</p>
<p>–N 代表更新时间, 时间单位为秒。 URL 为更新后连结的网址。 如果省略 URL 就表示更新网页本身。</p>
<p>Content-type</p>
<p>Content-type – 定义网页内容的类型。</p>
<p>格式: Content-Type��= “Content-Type:” media-type</p>
<p>举例如下:</p>
<p>Header(“Content-type: text/html; charset=big5″) 设定网页内容为big5</p>
<p>Header(“Content-type: image/gif”) 设定网页内容为gif格式的图片</p>
<p>Header(“Content-type: application/pdf”) 设定网页内容为pdf档</p>
<p>Cache Control – Cache 的控制。</p>
<p>Cache Control 大致可以分成几种类型</p>
<p>设定过期时间。 当时间超过指定时间就表示网页内容已经失效。 其格式如下</p>
<p>Expires = “Expires:” HTTP-date</p>
<p>例 如: header(“Expires: Fri, 31 Oct 2003 18:00:00 GMT”); 表示2003年10月31日星期五 18时。</p>
<p>header(“Expires: Wed, 30 Jun 2004 09:00:00 GMT”); 表示2004年6月30日星期三 9时。</p>
<p>Last-Modified = “Last-Modified” “:” HTTP-date</p>
<p>例如 header(“Last-Modified: Wed, 01 Jan 2003 12:00:00 GMT”); 上次修改时间2003年1月1日12时</p>
<p>Cache Control</p>
<p>no-cache 使得服务器的数据可以传送到远程的使用者, 而不会被暂存 (cache) 起来。</p>
<p>no-store 是预防不良的版本或者是敏感的信息被保留下来。</p>
<p>must-revalidate 是指必须要再评估信息, 如果暂存 (cached) 的数据是无效的则让服务器与使用者端联机</p>
<p>Date 是说明数据内容的建立日期及时间。 其格式如下: Date = “Date:” HTTP-date</p>
<p>范例: header(“Date: Sun, 15 Feb 2004 08:00:00 GMT”); 建立日期是2004年2月15日8时。</p>
<p>使用 header() 函数认证</p>
<p>基本的认证就是使用账号密码窗体输入HTTP 认证。</p>
<p>窗体认 证：</p>
<p>&lt;?php</p>
<p>if (($_POST['name'] != “john”) or ($_POST['passwd'] != “1234″)):</p>
<p>?&gt;</p>
<p>&lt;html&gt;</p>
<p>&lt;title&gt;登入画面&lt;/title&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;B&gt;未输入账号或密码, 或账号,密码不正确 &lt;/B&gt;&lt;p&gt;</p>
<p>&lt;form action=&lt;?php echo $_SERVER['PHP_SELF'] ?&gt; method=post&gt;</p>
<p>账号 &lt;input type=text name=name value=”请输入账号” size=10&gt;&lt;p&gt;</p>
<p>密码 &lt;input type=password name=passwd size=10&gt;&lt;p&gt;</p>
<p>&lt;input type=submit value=” 登入 “&gt;</p>
<p>&lt;input type=reset value=” 清除 “&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>&lt;?php</p>
<p>else:</p>
<p>echo “登入成功 …..&lt;p&gt;”;</p>
<p>echo “您登入的账号是 “.$_POST['name'].”&lt;br&gt;”;</p>
<p>echo “您使用的密码是 “.$_POST['passwd'];</p>
<p>endif</p>
<p>?&gt;</p>
<p>HTTP认证</p>
<p>&lt;?php</p>
<p>if (empty($_SERVER['PHP_AUTH_USER'])) {</p>
<p>header(“Content-type: text/html; charset=big5″);</p>
<p>header(‘WWW-Authenticate: Basic realm=”认证范围”‘);</p>
<p>header(‘HTTP/1.0 401 Unauthorized’);</p>
<p>echo ‘请输入正确的账号及密码, 不可以取消!’;</p>
<p>exit;</p>
<p>} else {</p>
<p>echo “您登入的账号是 “.$_SERVER['PHP_AUTH_USER'].”&lt;br&gt;”;</p>
<p>echo “您使用的密码是 “.$_SERVER['PHP_AUTH_PW'].”&lt;p&gt;”;</p>
<p>$correctName=”john”;</p>
<p>$correctpwd=”1234″ ;</p>
<p>if (($_SERVER['PHP_AUTH_USER'] != $correctName) or</p>
<p>($_SERVER['PHP_AUTH_PW'] !=$correctpwd)){</p>
<p>echo “登入失败, 请开启新的浏览器重新登入”;</p>
<p>}else{</p>
<p>echo “登入成功…..”;</p>
<p>}</p>
<p>}</p>
<p>?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2010/06/17/phpheader%e8%af%a6%e8%a7%a3-%e9%a1%b5%e9%9d%a2%e5%88%b7%e6%96%b0%ef%bc%8c%e9%a1%b5%e9%9d%a2%e8%b7%b3%e8%bd%ac%e2%80%a6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP发邮件标题与内容乱码的解决方法</title>
		<link>http://ishere.cn/2009/12/30/php%e5%8f%91%e9%82%ae%e4%bb%b6%e6%a0%87%e9%a2%98%e4%b8%8e%e5%86%85%e5%ae%b9%e4%b9%b1%e7%a0%81%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95.html</link>
		<comments>http://ishere.cn/2009/12/30/php%e5%8f%91%e9%82%ae%e4%bb%b6%e6%a0%87%e9%a2%98%e4%b8%8e%e5%86%85%e5%ae%b9%e4%b9%b1%e7%a0%81%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95.html#comments</comments>
		<pubDate>Wed, 30 Dec 2009 05:55:48 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[email]]></category>

		<guid isPermaLink="false">http://www.ishere.cn/?p=516</guid>
		<description><![CDATA[先用函数base64_encode() — 使用 MIME base64 对数据进行编码 标题字符串前加编码类型例如： =?UTF-8?B? 标题字符串后加：?= 邮件header指明Content-type: text/html; charset=utf-8，这样就能防止邮件正文乱码 $to         = &#8216;zhoz@example.com&#8217;; $subject   = “=?UTF-8?B?”.base64_encode(&#8216;邮件标题&#8217;).”?=”; $headers   = &#8216;MIME-Version: 1.0&#8242; . “rn”; $headers .= &#8216;Content-type: text/html; charset=utf-8&#8242; . “rn”; // Additional headers $headers .= &#8216;To: zhoz &#60;zhoz@example.com&#62;&#8217; . &#8230; <a href="http://ishere.cn/2009/12/30/php%e5%8f%91%e9%82%ae%e4%bb%b6%e6%a0%87%e9%a2%98%e4%b8%8e%e5%86%85%e5%ae%b9%e4%b9%b1%e7%a0%81%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>先用函数base64_encode() — 使用 MIME base64 对数据进行编码<br />
标题字符串前加编码类型例如： =?UTF-8?B?<br />
标题字符串后加：?=<br />
邮件header指明Content-type: text/html; charset=utf-8，这样就能防止邮件正文乱码</p>
<div class="code">$to          = &#8216;zhoz@example.com&#8217;;<br />
$subject    = “=?UTF-8?B?”.base64_encode(&#8216;邮件标题&#8217;).”?=”;<br />
$headers    = &#8216;MIME-Version: 1.0&#8242; . “rn”;<br />
$headers .= &#8216;Content-type: text/html; charset=utf-8&#8242; . “rn”;<br />
// Additional headers<br />
$headers .= &#8216;To: zhoz &lt;zhoz@example.com&gt;&#8217; . “rn”;<br />
$headers .= &#8216;From: Admin &lt;admin@example.com&gt;&#8217; . “rn”;<br />
$headers .= &#8216;Reply-To: zhoz &lt;zhoz@example&gt;&#8217; . “rn”;<br />
mail($to, $subject, $message, $headers);</div>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2009/12/30/php%e5%8f%91%e9%82%ae%e4%bb%b6%e6%a0%87%e9%a2%98%e4%b8%8e%e5%86%85%e5%ae%b9%e4%b9%b1%e7%a0%81%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 错误之引号中使用变量</title>
		<link>http://ishere.cn/2009/09/03/php-%e9%94%99%e8%af%af%e4%b9%8b%e5%bc%95%e5%8f%b7%e4%b8%ad%e4%bd%bf%e7%94%a8%e5%8f%98%e9%87%8f.html</link>
		<comments>http://ishere.cn/2009/09/03/php-%e9%94%99%e8%af%af%e4%b9%8b%e5%bc%95%e5%8f%b7%e4%b8%ad%e4%bd%bf%e7%94%a8%e5%8f%98%e9%87%8f.html#comments</comments>
		<pubDate>Thu, 03 Sep 2009 15:24:42 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ishere.cn/?p=510</guid>
		<description><![CDATA[当看到错误提示 syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING 这个提示，是提示变量使用的问题。 而我出现的是，语句中使用了数组，导致失败。下面看看失败的代码； &#60;?php echo “我是数组，$n['x']“; ?&#62; 这样即时双引号是可以解析变量的，但是素组这样的，写法是没办法解析。修改成下面就可以了！ &#60;?php echo “我是数组，{$n['x']}”; ?&#62; 加上花括号{}可以让语句识别这里面是动态的。]]></description>
			<content:encoded><![CDATA[<p>当看到错误提示<br />
syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING<br />
这个提示，是提示变量使用的问题。<br />
而我出现的是，语句中使用了数组，导致失败。下面看看失败的代码；<br />
&lt;?php<br />
echo “我是数组，$n['x']“;<br />
?&gt;<br />
这样即时双引号是可以解析变量的，但是素组这样的，写法是没办法解析。修改成下面就可以了！<br />
&lt;?php<br />
echo “我是数组，{$n['x']}”;<br />
?&gt;<br />
加上花括号{}可以让语句识别这里面是动态的。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2009/09/03/php-%e9%94%99%e8%af%af%e4%b9%8b%e5%bc%95%e5%8f%b7%e4%b8%ad%e4%bd%bf%e7%94%a8%e5%8f%98%e9%87%8f.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP初学者头疼问题总结[Usefull]</title>
		<link>http://ishere.cn/2008/04/23/phpchuxuezhetoutengwentizongjieusefull.html</link>
		<comments>http://ishere.cn/2008/04/23/phpchuxuezhetoutengwentizongjieusefull.html#comments</comments>
		<pubDate>Thu, 24 Apr 2008 01:10:52 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Get]]></category>
		<category><![CDATA[PHP Session]]></category>
		<category><![CDATA[Post]]></category>
		<category><![CDATA[Session]]></category>

		<guid isPermaLink="false">http://www.aobodo.com/?p=153</guid>
		<description><![CDATA[【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到 当然也可以修改自动全局变量为开(php.ini改为register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。 【2】Win32下apache2 用get方法传递中文参数会出错 test.php?a=你好&#38;b=你也好 传递参数是会导致一个内部错误 解决办法:”test.php?a=”.urlencode(你好).”&#38;b=”.urlencode(你也好) &#8230;&#8230;&#8230;&#8230;. 【3】win32下的session不能正常工作 php.ini默认的session.save_path = /tmp 这显然是linux下的配置，win32下php无法读写session文件导致session无法使用 把它改成一个绝对路径就可以了，例如session.save_path = c:windowstemp 【4】显示错误信息 当php.ini 的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提 示，解决办法是探测或者屏蔽 例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo 【5】Win32下mail()不能发送电子邮件 在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件 修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器 【6】初装的mysql如果没有设置密码，应该使用 &#8230; <a href="http://ishere.cn/2008/04/23/phpchuxuezhetoutengwentizongjieusefull.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>【1】页面之间无法传递变量 get,post,session在最新的<span class="ReplaceKeyword">php</span>版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到<br />
当然也可以修改自动全局变量为开(php.ini改为register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。<br />
【2】Win32下apache2 用get方法传递中文参数会出错<br />
test.php?a=你好&amp;b=你也好<br />
传递参数是会导致一个内部错误<br />
解决办法:”test.php?a=”.urlencode(你好).”&amp;b=”.urlencode(你也好)<br />
&#8230;&#8230;&#8230;&#8230;.</p>
<p>【3】win32下的session不能正常工作<br />
php.ini默认的session.save_path = /tmp<br />
这显然是<span class="ReplaceKeyword">linux</span>下的配置，win32下php无法读写session文件导致session无法使用<br />
把它改成一个绝对路径就可以了，例如session.save_path = c:windowstemp<span id="more-358"></span><br />
【4】显示错误信息<br />
当php.ini 的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提 示，解决办法是探测或者屏蔽<br />
例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo<br />
【5】Win32下mail()不能发送电子邮件<br />
在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件<br />
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)<br />
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器<br />
【6】初装的<span class="ReplaceKeyword">mysql</span>如果没有设置密码，应该使用<br />
update mysql.user set pass<span class="ReplaceKeyword">word</span>=”yourpassword” where user=”root”<br />
修改密码<br />
【7】header already sent<br />
这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：1，你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！<br />
【8】更改php.ini后没有变化<br />
重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置<br />
【9】php在2003上面安装（ISAPI的安装方法恳请高手指教）<br />
PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装<br />
步骤一，先<a href="http://www.php.net/">www.php.net</a>下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了，并能够访问。 安装好以后，在默认网站&#8211;&gt;应用程序配置<br />
步骤二：点击 web服务扩展 &#8211;&gt;新建web服务扩展.<br />
步骤三： 扩展名&#8211;&gt;php,然后添�<br />
步骤四：找到php.exe的路径添加上去。<br />
步骤五： 确定就可以了！<br />
步骤六： 选择php的服务扩展，然后点击允许。<br />
【10】<br />
有时候sql语句不起作用，对<span class="ReplaceKeyword">数据库</span>操作失败<br />
最简便的调试方法，echo那句sql，看看变量的值能得到不<br />
【11】include和require的区别<br />
两者没有太大的区别，如果要包含的文件不存在，include提示notice，然后继续执行下面的语句，require提示致命错误并且退出<br />
据我测试，win32平台下它们都是先包含后执行，所以被包含文件里最好不要再有include或require语句，这样会造成目录混乱。或许*nux下情况不同，暂时还没测试<br />
如果一个文件不想被包含多次可以使用include_once或require_once## 读取，写入文档数据<br />
function r($file_name) {<br />
$filenum=@fopen($file_name,”r”);<br />
@flock($filenum,LOCK_SH);<br />
$file_data=@fread($filenum,filesize($file_name));<br />
@fclose($filenum);<br />
return $file_data;<br />
}<br />
function w($file_name,$data,$method=”w”){<br />
$filenum=@fopen($file_name,$method);<br />
flock($filenum,LOCK_EX);<br />
$file_data=fwrite($filenum,$data);<br />
fclose($filenum);<br />
return $file_data;<br />
}</p>
<p>【12】isset()和empty()的区别<br />
两者都是测试变量用的<br />
但是isset()是测试变量是否被赋值，而empty()是测试一个已经被赋值的变量是否为空<br />
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示<br />
如果一个变量被赋空值，$foo=”"或者$foo=0或者 $foo=false,那么empty($foo)返回真，isset($foo)也返回真，就是说赋空值不会注销一个变量。<br />
要注销一个变量，可以用 unset($foo)或者$foo=NULL<br />
【13】mysql查询语句包含有关键字<br />
php查询mysql的时候，有时候mysql表名或者列名会有关键字<br />
这时候查询会有错误。例如表名是order,查询时候会出错<br />
简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别<br />
例如select * from `order`<br />
【14】通过HTTP协议一次上传多个文件的方法<br />
有两个思路，是同一个方法的两种实现。具体程序还需自己去设计<br />
1,在form中设置多个文件输入框，用数组命名他们的名字，如下：<br />
&lt;form action=”" method=post&gt;<br />
&lt;input type=file name=usefile[]&gt;<br />
&lt;input type=file name=usefile[]&gt;<br />
&lt;input type=file name=usefile[]&gt;<br />
&lt;/form&gt;<br />
这样，在服务器端做以下测试<br />
echo “&lt;pre&gt;”;<br />
print_r($_FILES);<br />
echo “&lt;/pre&gt;”;</p>
<p>1,在form中设置多个文件输入框，但名字不同，如下：<br />
&lt;form action=”" method=post&gt;<br />
&lt;input type=file name=usefile_a&gt;<br />
&lt;input type=file name=usefile_b&gt;<br />
&lt;input type=file name=usefile_c&gt;<br />
&lt;/form&gt;<br />
在服务器端做同样测试：<br />
echo “&lt;pre&gt;”;<br />
print_r($_FILES);<br />
echo “&lt;/pre&gt;”;</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2008/04/23/phpchuxuezhetoutengwentizongjieusefull.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript用DOM解释XML[转]</title>
		<link>http://ishere.cn/2006/12/30/javascript-dom-xml.html</link>
		<comments>http://ishere.cn/2006/12/30/javascript-dom-xml.html#comments</comments>
		<pubDate>Sat, 30 Dec 2006 07:15:48 +0000</pubDate>
		<dc:creator>jena</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://news.aobodo.com/?p=98</guid>
		<description><![CDATA[在DOM眼中，HTML跟XML一样是一种树形结构的文档，&#60;html&#62;是根（root）节点，&#60;head&#62;、&#60;title&#62;、&#60;body&#62;是&#60;html&#62;的子（children）节点，互相之间是兄弟（sibling）节点；&#60;body&#62;下面才是子节点&#60;table&#62;、&#60;span&#62;、&#60;p&#62;等等。如下图： 这个是不是跟XML的结构有点相似呢。不同的是，HTML文档的树形主要包含表示元素、标记的节点和表示文本串的节点。 HTML文档的节点 DOM下，HTML文档各个节点被视为各种类型的Node对象。每个Node对象都有自己的属性和方法，利用这些属性和方法可以遍历整个文档树。由于HTML文档的复杂性，DOM定义了nodeType来表示节点的类型。这里列出Node常用的几种节点类型： 接口 nodeType常量 nodeType值 备注 Element Node.ELEMENT_NODE 1 元素节点 Text Node.TEXT_NODE 3 文本节点 Document Node.DOCUMENT_NODE 9 document Comment Node.COMMENT_NODE 8 注释的文本 DocumentFragment Node.DOCUMENT_FRAGMENT_NODE 11 document片断 Attr Node.ATTRIBUTE_NODE 2 节点属性 DOM树的根节点是个Document对象，该对象的documentElement属性引用表示文档根元素的Element对象（对于HTML文档，这个就是&#60;html&#62;标记）。Javascript操作HTML文档的时候，document即指向整个文档，&#60;body&#62;、&#60;table&#62;等节点类型即为Element。Comment类型的节点则是指文档的注释。具体节点类型的含义，请参考《Javascript权威指南》，在此不赘述。 Document定义的方法大多数是生产型方法，主要用于创建可以插入文档中的各种类型的节点。常用的Document方法有： 方法 描述 createAttribute() 用指定的名字创建新的Attr节点。 createComment() 用指定的字符串创建新的Comment节点。 &#8230; <a href="http://ishere.cn/2006/12/30/javascript-dom-xml.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><coolcode lang="javascript" linenum="on"><br />
<script language="JavaScript">
<!–
var doc = new ActiveXObject("Msxml2.DOMDocument"); //ie5.5+,CreateObject("Microsoft.XMLDOM")</p>
<p>//加载文档
//doc.load("b.xml");</p>
<p>//创建文件头
var p = doc.createProcessingInstruction("xml","version='1.0' encoding='gb2312'");</p>
<p>//添加文件头
doc.appendChild(p);</p>
<p>//用于直接加载时获得根接点
//var root = doc.documentElement;</p>
<p>//两种方式创建根接点
// var root = doc.createElement("students");
var root = doc.createNode(1,"students","");</p>
<p>//创建子接点
var n = doc.createNode(1,"ttyp","");</p>
<p>//指定子接点文本
//n.text = " this is a test";</p>
<p>//创建孙接点
var o = doc.createElement("sex");
o.text = "男"; //指定其文本</p>
<p>//创建属性
var r = doc.createAttribute("id");
r.value="test";</p>
<p>//添加属性
n.setAttributeNode(r);</p>
<p>//创建第二个属性
var r1 = doc.createAttribute("class");
r1.value="tt";</p>
<p>//添加属性
n.setAttributeNode(r1);</p>
<p>//删除第二个属性
n.removeAttribute("class");</p>
<p>//添加孙接点
n.appendChild(o);</p>
<p>//添加文本接点
n.appendChild(doc.createTextNode("this is a text node."));</p>
<p>//添加注释
n.appendChild(doc.createComment("this is a commentn"));</p>
<p>//添加子接点
root.appendChild(n);</p>
<p>//复制接点
var m = n.cloneNode(true);</p>
<p>root.appendChild(m);</p>
<p>//删除接点
root.removeChild(root.childNodes(0));</p>
<p>//创建数据段
var c = doc.createCDATASection("this is a cdata");
c.text = "hi,cdata";
//添加数据段
root.appendChild(c);</p>
<p>//添加根接点
doc.appendChild(root);</p>
<p>//查找接点
var a = doc.getElementsByTagName("ttyp");
//var a = doc.selectNodes("//ttyp");</p>
<p>//显示改接点的属性</p>
<p>for(var i= 0;i<a.length;i++)
{
alert(a[i].xml);
for(var j=0;j<a[i].attributes.length;j++)
{
alert(a[i].attributes[j].name);
}
}</p>
<p>//修改节点,利用XPATH定位节点
var b = doc.selectSingleNode("//ttyp/sex");
b.text = "女";</p>
<p>//alert(doc.xml);</p>
<p>//XML保存（需要在服务端，客户端用FSO）
//doc.save();</p>
<p>//查看根接点XML
if(n)
{
alert(n.ownerDocument.xml);
}</p>
<p>//–>
</script></coolcode></p>
<p>在DOM眼中，HTML跟XML一样是一种树形结构的文档，<code>&lt;html&gt;</code>是根（root）节点，<code>&lt;head&gt;</code>、<code>&lt;title&gt;</code>、<code>&lt;body&gt;</code>是<code>&lt;html&gt;</code>的子（children）节点，互相之间是兄弟（sibling）节点；<code>&lt;body&gt;</code>下面才是子节点<code>&lt;table&gt;</code>、<code>&lt;span&gt;</code>、<code>&lt;p&gt;</code>等等。如下图：</p>
<p>这个是不是跟XML的结构有点相似呢。不同的是，HTML文档的树形主要包含表示元素、标记的节点和表示文本串的节点。</p>
<p>HTML文档的节点</p>
<p>DOM下，HTML文档各个节点被视为各种类型的Node对象。每个Node对象都有自己的属性和方法，利用这些属性和方法可以遍历整个文档树。由于HTML文档的复杂性，DOM定义了nodeType来表示节点的类型。这里列出Node常用的几种节点类型：</p>
<p>接口<br />
nodeType常量<br />
nodeType值<br />
备注</p>
<p>Element<br />
Node.ELEMENT_NODE<br />
1<br />
元素节点</p>
<p>Text<br />
Node.TEXT_NODE<br />
3<br />
文本节点</p>
<p>Document<br />
Node.DOCUMENT_NODE<br />
9<br />
document</p>
<p>Comment<br />
Node.COMMENT_NODE<br />
8<br />
注释的文本</p>
<p>DocumentFragment<br />
Node.DOCUMENT_FRAGMENT_NODE<br />
11<br />
document片断</p>
<p>Attr<br />
Node.ATTRIBUTE_NODE<br />
2<br />
节点属性</p>
<p>DOM树的根节点是个Document对象，该对象的documentElement属性引用表示文档根元素的Element对象（对于HTML文档，这个就是<code>&lt;html&gt;</code>标记）。Javascript操作HTML文档的时候，document即指向整个文档，<code>&lt;body&gt;</code>、<code>&lt;table&gt;</code>等节点类型即为Element。Comment类型的节点则是指文档的注释。具体节点类型的含义，请参考《Javascript权威指南》，在此不赘述。</p>
<p>Document定义的方法大多数是生产型方法，主要用于创建可以插入文档中的各种类型的节点。常用的Document方法有：</p>
<p>方法<br />
描述</p>
<p>createAttribute()<br />
用指定的名字创建新的Attr节点。</p>
<p>createComment()<br />
用指定的字符串创建新的Comment节点。</p>
<p>createElement()<br />
用指定的标记名创建新的Element节点。</p>
<p>createTextNode()<br />
用指定的文本创建新的TextNode节点。</p>
<p>getElementById()<br />
返回文档中具有指定id属性的Element节点。</p>
<p>getElementsByTagName()<br />
返回文档中具有指定标记名的所有Element节点。</p>
<p>对于Element节点，可以通过调用getAttribute()、setAttribute()、removeAttribute()方法来查询、设置或者删除一个Element节点的性质，比如<br />
<table>标记的border属性。下面列出Element常用的属性：</p>
<p>属性<br />
描述</p>
<p>tagName<br />
元素的标记名称，比如<code>&lt;p&gt;</code>元素为P。HTML文档返回的tabName均为大写。</p>
<p>Element常用的方法：</p>
<p>方法<br />
描述</p>
<p>getAttribute()<br />
以字符串形式返回指定属性的值。</p>
<p>getAttributeNode()<br />
以Attr节点的形式返回指定属性的值。</p>
<p>getElementsByTabName()<br />
返回一个Node数组，包含具有指定标记名的所有Element节点的子孙节点，其顺序为在文档中出现的顺序。</p>
<p>hasAttribute()<br />
如果该元素具有指定名字的属性，则返回true。</p>
<p>removeAttribute()<br />
从元素中删除指定的属性。</p>
<p>removeAttributeNode()<br />
从元素的属性列表中删除指定的Attr节点。</p>
<p>setAttribute()<br />
把指定的属性设置为指定的字符串值，如果该属性不存在则添加一个新属性。</p>
<p>setAttributeNode()<br />
把指定的Attr节点添加到该元素的属性列表中。</p>
<p>Attr对象代表文档元素的属性，有name、value等属性，可以通过Node接口的attributes属性或者调用Element接口的 getAttributeNode()方法来获取。不过，在大多数情况下，使用Element元素属性的最简单方法是getAttribute()和 setAttribute()两个方法，而不是Attr对象。</p>
<p>使用DOM操作HTML文档</p>
<p>Node对象定义了一系列属性和方法，来方便遍历整个文档。用parentNode属性和childNodes[]数组可以在文档树中上下移动；通过遍历childNodes[]数组或者使用firstChild和nextSibling属性进行循环操作，也可以使用lastChild和 previousSibling进行逆向循环操作，也可以枚举指定节点的子节点。而调用appendChild()、insertBefore()、 removeChild()、replaceChild()方法可以改变一个节点的子节点从而改变文档树。</p>
<p>需要指出的是，childNodes[]的值实际上是一个NodeList对象。因此，可以通过遍历childNodes[]数组的每个元素，来枚举一个给定节点的所有子节点；通过递归，可以枚举树中的所有节点。下表列出了Node对象的一些常用属性和方法：</p>
<p>Node对象常用属性：</p>
<p>属性<br />
描述</p>
<p>attributes<br />
如果该节点是一个Element，则以NamedNodeMap形式返回该元素的属性。</p>
<p>childNodes<br />
以Node[]的形式存放当前节点的子节点。如果没有子节点，则返回空数组。</p>
<p>firstChild<br />
以Node的形式返回当前节点的第一个子节点。如果没有子节点，则为null。</p>
<p>lastChild<br />
以Node的形式返回当前节点的最后一个子节点。如果没有子节点，则为null。</p>
<p>nextSibling<br />
以Node的形式返回当前节点的兄弟下一个节点。如果没有这样的节点，则返回null。</p>
<p>nodeName<br />
节点的名字，Element节点则代表Element的标记名称。</p>
<p>nodeType<br />
代表节点的类型。</p>
<p>parentNode<br />
以Node的形式返回当前节点的父节点。如果没有父节点，则为null。</p>
<p>previousSibling<br />
以Node的形式返回紧挨当前节点、位于它之前的兄弟节点。如果没有这样的节点，则返回null。</p>
<p>Node对象常用方法：</p>
<p>方法<br />
描述</p>
<p>appendChild()<br />
通过把一个节点增加到当前节点的childNodes[]组，给文档树增加节点。</p>
<p>cloneNode()<br />
复制当前节点，或者复制当前节点以及它的所有子孙节点。</p>
<p>hasChildNodes()<br />
如果当前节点拥有子节点，则将返回true。</p>
<p>insertBefore()<br />
给文档树插入一个节点，位置在当前节点的指定子节点之前。如果该节点已经存在，则删除之再插入到它的位置。</p>
<p>removeChild()<br />
从文档树中删除并返回指定的子节点。</p>
<p>replaceChild()<br />
从文档树中删除并返回指定的子节点，用另一个节点替换它。</p>
<p>接下来，让我们使用上述的DOM应用编程接口，来试着操作HTML文档。</p>
<p>A、遍历文档的节点</p>
<p>DOM把一个HTML文档视为树，因此，遍历整个树是应该是家常便饭。跟之前说过的一样，这里我们提供两个遍历树的例子。通过它，我们能够学会如何使用childNodes[]和firstChile、lastChild、nextSibling、previousSibling遍历整棵树。</p>
<p>例子1&ndash; sample3_1.htm：</p>
<p>这个例子使用了childNodes[]和递归方式来遍历整个文档，统计文档中出现的Element元素总数，并把Element标记名全部打印出来。需要特别注意的是，在使用DOM时，必须等文档被装载完毕再执行遍历等行为操作文档。sample3_1.htm具体代码如下：</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>var elementName = ""; //全局变量，保存Element标记名，使用完毕要清空</p>
<p>function countTotalElement(node) { //参数node是一个Node对象</p>
<p>var total = 0;</p>
<p>if(node.nodeType == 1) { //检查node是否为Element对象</p>
<p>total++; //如果是，计数器加1</p>
<p>elementName = elementName + node.tagName + "rn"; //保存标记名</p>
<p>}</p>
<p>var childrens = node.childNodes; //获取node的全部子节点</p>
<p>for(var i=0;i<childrens.length;i++) {</p>
<p>total += countTotalElement(childrens[i]); //在每个子节点上进行递归操作</p>
<p>}</p>
<p>return total;</p>
<p>}</p>
<p></script></p>
<p></head></p>
<p><body></p>
<p><a href="javascript:void(0)"</p>
<p>onClick="alert('标记总数：' + countTotalElement(document) + ‘rn全部标记如下：rn' + elementName);elementName=";">开始统计</a></p>
<p></body></p>
<p></html></coolcode></p>
<p>运行效果如下：</p>
<p>例子2 &ndash; sample3_2.htm：</p>
<p>接下来使用firstChile、lastChild、nextSibling、previousSibling遍历整个文档树。修改一下countTotalElement函数，其他跟sample3_1.htm一样：</p>
<p><coolcode lang="javascript" linenum="on"><br />
function countTotalElement(node) { //参数node是一个Node对象</p>
<p>var total = 0;</p>
<p>if(node.nodeType == 1) { //检查node是否为Element对象</p>
<p>total++; //如果是，计数器加1</p>
<p>elementName = elementName + node.tagName + "rn"; //保存标记名</p>
<p>}</p>
<p>var childrens = node.childNodes; //获取node的全部子节点</p>
<p>for(var m=node.firstChild; m!=null;m=m.nextSibling) {</p>
<p>total += countTotalElement(m); //在每个子节点上进行递归操作</p>
<p>}</p>
<p>return total;</p>
<p>}</coolcode></p>
<p>B、搜索文档中特定的元素</p>
<p>在使用DOM的过程中，有时候需要定位到文档中的某个特定节点，或者具有特定类型的节点列表。这种情况下，可以调用Document对象的getElementsByTagName()和getElementById()方法来实现。</p>
<p>document.getElementsByTagName()返回文档中具有指定标记名的全部Element节点数组（也是NodeList类型）。Element出现在数组中的顺序就是他们在文档中出现的顺序。传递给getElementsByTagName()的参数忽略大小写。比如，想定位到第一个<code>&lt;table&gt;</code>标记，可以这样写：document.getElementsByTagName("table")[0]。例外的，可以使用document.body定位到<code>&lt;body&gt;</code>标记，因为它是唯一的。</p>
<p>getElementsByTagName()返回的数组取决于文档。一旦文档改变，返回结果也立即改变。相比，getElementById() 则比较灵活，可以随时定位到目标，只是要实现给目标元素一个唯一的id属性值。这个我们在《AJAX开发简略》的"级联菜单"例子中已经使用过了。</p>
<p>Element对象也支持getElementsByTagName()和getElementById()。不同的是，搜索领域只针对调用者的子节点。</p>
<p>C、修改文档内容</p>
<p>遍历整棵文档树、搜索特定的节点，我们最终目的之一是要修改文档内容。接下来的三个例子将使用Node的几个常用方法，来演示如何修改文档内容。</p>
<p>例子3 &mdash; sample4_1.htm：</p>
<p>这个例子包含三个文本节点和一个按钮。点击按钮后，三个文本节点和按钮的顺序将被颠倒。程序使用了Node的appendChild()和removeChild()方法。</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>function reverseNode(node) { // 颠倒节点node的顺序</p>
<p>var kids = node.childNodes; //获取子节点列表</p>
<p>var kidsNum = kids.length; //统计子节点总数</p>
<p>for(var i=kidsNum-1;i>=0;i–) { //逆向遍历子节点列表</p>
<p>var c = node.removeChild(kids[i]); //删除指定子节点，保存在c中</p>
<p>node.appendChild(c); //将c放在新位置上</p>
<p>}</p>
<p>}</p>
<p></script></p>
<p></head></p>
<p><body></p>
<p>第一行</p>
<p>第二行</p>
<p>第三行</p>
<p>
<input type="button" name="reverseGo" value="颠倒"</p>
<p>onClick="reverseNode(document.body)"></p>
<p></body></p>
<p></html></coolcode></p>
<p>例子4&ndash; sample4_2.htm：</p>
<p>例子1通过直接操作body的子节点来修改文档。在HTML文档中，布局和定位常常通过表格<code>&lt;table&gt;</code>来实现。因此，例子4将演示操作表格内容，将表格的四个单元行顺序颠倒。如果没有使用<code>&lt;tbody&gt;</code>标签，则<code>&lt;table&gt;</code>把全部的<code>&lt;tr&gt;</code>当做是属于一个子节点<code>&lt;tbody&gt;</code>，所以我们采用数组缓存的方式，把行数据颠倒一下。这个例子同时也演示了如何使用DOM创建表格单元行。</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>function reverseTable() {</p>
<p>var node = document.getElementsByTagName("table")[0]; //第一个表格</p>
<p>var child = node.getElementsByTagName("tr"); //取得表格内的所有行</p>
<p>var newChild = new Array(); //定义缓存数组，保存行内容</p>
<p>for(var i=0;i<child.length;i++) {</p>
<p>newChild[i] = child[i].firstChild.innerHTML;</p>
<p>}</p>
<p>node.removeChild(node.childNodes[0]); //删除全部单元行</p>
<p>var header = node.createTHead(); //新建表格行头</p>
<p>for(var i=0;i<newChild.length;i++) {</p>
<p>var headerrow = header.insertRow(i); //插入一个单元行</p>
<p>var cell = headerrow.insertCell(0); //在单元行中插入一个单元格</p>
<p>//在单元格中创建TextNode节点</p>
<p>cell.appendChild(document.createTextNode(newChild[newChild.length-i-1]));</p>
<p>}</p>
<p>}</p>
<p></script></p>
<p></head></p>
<p><body></p>
<table width="200" border="1" cellpadding="4" cellspacing="0">
<tr>
<td height="25">第一行</td>
</tr>
<tr>
<td height="25">第二行</td>
</tr>
<tr>
<td height="25">第三行</td>
</tr>
<tr>
<td height="25">第四行</td>
</tr>
</table>
<p></p>
<input type="button" name="reverse" value="开始颠倒" onClick="reverseTable()">
<p></body></p>
<p></html></coolcode></p>
<p>例子5 &mdash; sample4_3.htm：</p>
<p>正如我们在Node节点介绍部分所指出的那样，appendChild()、replaceChild()、removeChild()、insertBefore()方法会立即改变文档的结构。下面的例子包含两个表格，我们试着把表格二的内容替换表格一的内容。</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>function replaceContent() {</p>
<p>var table1 = document.getElementsByTagName("table")[0];</p>
<p>var table2 = document.getElementsByTagName("table")[1];</p>
<p>var kid1 = table1.firstChild.firstChild.firstChild; //定位到
<td>节点</p>
<p>var kid2 = table2.firstChild.firstChild.firstChild; //定位到
<td>节点</p>
<p>var repKid = kid2.firstChild; //定位到表格二
<td>内含的TextNode节点</p>
<p>try {</p>
<p>//用表格二的单元格内容替换表格一的单元格内容，表格二变成没有单元格内容</p>
<p>kid1.replaceChild(repKid,kid1.firstChild);</p>
<p>//下面注释如果开放，将出现object error，因为表格二已经被改变</p>
<p>//kid2.replaceChild(kid1.firstChild,kid2.firstChild);</p>
<p>}catch(e){</p>
<p>alert(e);</p>
<p>}</p>
<p>}</p>
<p></script></p>
<p></head></p>
<p><body></p>
<table width="200" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>表格一</td>
</tr>
</tbody>
</table>
<p></p>
<table width="200" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>表格二</td>
</tr>
</tbody>
</table>
<p></p>
<input type="button" name="replaceNode" value="替换" onClick="replaceContent()">
<p></body></p>
<p></html></coolcode></p>
<p>注意，当执行kid1.replaceChild(repKid,kid1.firstChild);的时候，table2的子节点已经被转移到 table1了，table2已经没有子节点，不能再调用table2的子节点。看看代码的注释，试着运行一下，应该就知道文档是怎么改变的了。</p>
<p>D、往文档添加新内容</p>
<p>在学会遍历、搜索、修改文档之后，我们现在试着网文档添加新的内容。其实没有什么新意，只是利用我们上述提到的Node的属性和方法而已，还是操作<code>&lt;table&gt;</code>标记的内容。有新意的是，我们要实现一个留言簿。是的，留言簿，你可以往里面留言，只是不能刷新噢。</p>
<p>例子6 &ndash; sample5_1.htm：</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>function insertStr() {</p>
<p>var f = document.form1;</p>
<p>var value = f.str.value;</p>
<p>if(value!="") {</p>
<p>// 从最终的TextNode节点开始，慢慢形成
<tbody>结构</p>
<p>var text = document.createTextNode(value); //新建一个TextNode节点</p>
<p>var td = document.createElement("td"); //新建一个td类型的Element节点</p>
<p>var tr = document.createElement("tr"); //新建一个tr类型的Element节点</p>
<p>var tbody = document.createElement("tbody"); //新建一个tbody类型的Element节点</p>
<p>td.appendChild(text); //将节点text加入td中</p>
<p>tr.appendChild(td); //将节点td加入tr中</p>
<p>tbody.appendChild(tr); //将节点tr加入tbody中</p>
<p>var parNode = document.getElementById("table1"); //定位到table上</p>
<p>parNode.insertBefore(tbody,parNode.firstChild); //将节点tbody插入到节点顶部</p>
<p>//parNode.appendChild(tbody); //将节点tbody加入节点尾部</p>
<p>}</p>
<p>}</p>
<p></script></p>
<p></head></p>
<p><body></p>
<form name="form1" method="post" action="">
<input name="str" type="text" id="str" value="">
<input name="insert" type="button" id="insert" value="留言" onClick="insertStr()">
</form>
<table width="400" border="1" cellspacing="0" cellpadding="0" id="table1">
<tbody>
<tr>
<td height="25">网友留言列表：</td>
</tr>
</tbody>
</table>
<p></body></p>
<p></html></coolcode></p>
<p>我们之前说过，<code>&lt;table&gt;</code>的子节点是<code>&lt;tbody&gt;</code>，<code>&lt;tbody&gt;</code>的子节点才是<code>&lt;tr&gt;</code>，<code>&lt;tr&gt;</code>是<code>&lt;td&gt;</code>的父节点，最后<code>&lt;td&gt;</code>内部的TextNode节点。所以，往<code>&lt;table&gt;</code>增加单元格行要逐级形成，就像往树里面添加一个枝桠一样，要有叶子有径。看看，这个留言簿是不是很简单啊。这个例子同时也演示了往<code>&lt;table&gt;</code>表格标记里面增加内容的另一种方法。</p>
<p>E使用DOM操作XML文档</p>
<p>在数据表示方面，XML文档更加结构化。DOM在支持HTML的基础上提供了一系列的API，支持针对XML的访问和操作。利用这些API，我们可以从XML中提取信息，动态的创建这些信息的HTML呈现文档。处理XML文档，通常遵循"加载XML文档&agrave;提取信息&agrave;加工信息&agrave;创建HTML文档"的过程。下面的例子演示了如何加载并处理XML文档。</p>
<p>这个例子包含两个JS函数。loadXML()负责加载XML文档，其中既包含加载XML文档的2级DOM代码，又有实现同样操作的 Microsoft专有API代码。需要提醒注意的是，文档加载过程不是瞬间完成的，所以对loadXML()的调用将在加载文档完成之前返回。因此，需要传递给loadXML()一个引用，以便文档加载完成后调用。</p>
<p>例子中的另外一个函数makeTable()，则在XML文档加载完毕之后，使用最后前介绍过的DOM应用编程接口读取XML文档信息，并利用这些信息形成一个新的table表格。</p>
<p>例子7 &mdash; sample6_1.htm：</p>
<p><coolcode lang="html" linenum="on"><br />
<html></p>
<p><head></p>
<p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p>
<p><script language="javascript"></p>
<p>function loadXML(handler) {</p>
<p>var url = "employees.xml";</p>
<p>if(document.implementation&#038;&#038;document.implementation.createDocument) {</p>
<p>var xmldoc = document.implementation.createDocument("", "", null);</p>
<p>xmldoc.onload = handler(xmldoc, url);</p>
<p>xmldoc.load(url);</p>
<p>}</p>
<p>else if(window.ActiveXObject) {</p>
<p>var xmldoc = new ActiveXObject("Microsoft.XMLDOM");</p>
<p>xmldoc.onreadystatechange = function() {</p>
<p>if(xmldoc.readyState == 4) handler(xmldoc, url);</p>
<p>}</p>
<p>xmldoc.load(url);</p>
<p>}</p>
<p>}</p>
<p>function makeTable(xmldoc, url) {</p>
<p>var table = document.createElement("table");</p>
<p>table.setAttribute("border","1");</p>
<p>table.setAttribute("width","600");</p>
<p>table.setAttribute("class","tab-content");</p>
<p>document.body.appendChild(table);</p>
<p>var caption = "Employee Data from " + url;</p>
<p>table.createCaption().appendChild(document.createTextNode(caption));</p>
<p>var header = table.createTHead();</p>
<p>var headerrow = header.insertRow(0);</p>
<p>headerrow.insertCell(0).appendChild(document.createTextNode("姓名"));</p>
<p>headerrow.insertCell(1).appendChild(document.createTextNode("职业"));</p>
<p>headerrow.insertCell(2).appendChild(document.createTextNode("工资"));</p>
<p>var employees = xmldoc.getElementsByTagName("employee");</p>
<p>for(var i=0;i<employees.length;i++) {</p>
<p>var e = employees[i];</p>
<p>var name = e.getAttribute("name");</p>
<p>var job = e.getElementsByTagName("job")[0].firstChild.data;</p>
<p>var salary = e.getElementsByTagName("salary")[0].firstChild.data;</p>
<p>var row = table.insertRow(i+1);</p>
<p>row.insertCell(0).appendChild(document.createTextNode(name));</p>
<p>row.insertCell(1).appendChild(document.createTextNode(job));</p>
<p>row.insertCell(2).appendChild(document.createTextNode(salary));</p>
<p>}</p>
<p>}</p>
<p></script></p>
<link href="css/style.css" rel="stylesheet" type="text/css">
<p></head></p>
<p><body onLoad="loadXML(makeTable)"></p>
<p></body></p>
<p></html></coolcode></p>
<p>供读取调用的XML文档 &ndash; employees.xml：</p>
<p><coolcode lang="xml" linenum="on"><br />
<?xml version="1.0" encoding="gb2312"?></p>
<p><employees></p>
<p><employee name="J.Doe"></p>
<p><job>Programmer</job></p>
<p><salary>32768</salary></p>
<p></employee></p>
<p><employee name="A.Baker"></p>
<p><job>Sales</job></p>
<p><salary>70000</salary></p>
<p></employee></p>
<p><employee name="Big Cheese"></p>
<p><job>CEO</job></p>
<p><salary>100000</salary></p>
<p></employee></p>
<p></employees></coolcode></p>
<p>处理XML文档</p>
<p>脱离XML文档的AJAX是不完整的。在本部分未完成之前，有读者说AJAX改名叫AJAH（H应该代表HTML吧）比较合适。应该承认，XML文档在数据的结构化表示以及接口对接上有先天的优势，但也不是所有的数据都应该用XML表示。有些时候单纯的文本表示可能会更合适。下面先举个AJAX处理返回XML文档的例子再讨论什么时候使用XML。</p>
<p>7.5.1、处理返回的XML</p>
<p>例子8 &mdash; sample7_1.htm：</p>
<p>在这个例子中，我们采用之前确定的AJAX开发框架，稍微修改一下body内容和processRequest的相应方式，将先前的employees.xml的内容读取出来并显示。</p>
<p>body的内容如下：</p>
<p><coolcode lang="html" linenum="on"><br />
<input type="button" name="read" value="读取XML" onClick="send_request('employees.xml')"></coolcode></p>
<p>processRequest()方法修改如下：</p>
<p>// 处理返回信息的函数</p>
<p><coolcode lang="javascript" linenum="on"><br />
function processRequest() {</p>
<p>if (http_request.readyState == 4) { // 判断对象状态</p>
<p>if (http_request.status == 200) { // 信息已经成功返回，开始处理信息</p>
<p>var returnObj = http_request.responseXML;</p>
<p>var xmlobj = http_request.responseXML;</p>
<p>var employees = xmlobj.getElementsByTagName("employee");</p>
<p>var feedbackStr = "";</p>
<p>for(var i=0;i<employees.length;i++) { // 循环读取employees.xml的内容</p>
<p>var employee = employees[i];</p>
<p>feedbackStr += "员工：" + employee.getAttribute("name");</p>
<p>feedbackStr +=</p>
<p>" 职位：" + employee.getElementsByTagName("job")[0].firstChild.data;</p>
<p>feedbackStr +=</p>
<p>" 工资：" + employee.getElementsByTagName("salary")[0].firstChild.data;</p>
<p>feedbackStr += "rn";</p>
<p>}</p>
<p>alert(feedbackStr);</p>
<p>} else { //页面不正常</p>
<p>alert("您所请求的页面有异常。");</p>
<p>}</p>
<p>}</p>
<p>}</coolcode></p>
<p>运行一下，看来效果还不错：</p>
<p>7.5.2、选择合适的XML生成方式</p>
<p>现在的web应用程序往往采用了MVC三层剥离的设计方式。XML作为一种数据保存、呈现、交互的文档，其数据往往是动态生成的，通常由 JavaBean转换过来。由JavaBean转换成XML文档的方式有好几种，选择合适的转换方式往往能达到事半功倍的效果。下面介绍两种常用的方式，以便需要的时候根据情况取舍。</p>
<p>A、类自行序列化成XML</p>
<p>类自行序列化成XML即每个类都实现自己的toXML()方法，选择合适的API、适当的XML结构、尽量便捷的生成逻辑快速生成相应的XML文档。显然，这种方式必须要求每个类编写专门的XML生成代码，每个类只能调用自己的toXML()方法。应用诸如JDOM等一些现成的API，可以减少不少开发投入。例子9是一个利用JDOM的API形成的toXML()方法。</p>
<p>例子9 &mdash; toXml() 的 JDOM 实现 &mdash; Employ类的toXml()方法：</p>
<p><coolcode lang="javascript" linenum="on"><br />
public Element toXml() {</p>
<p>Element employee = new Element("employee");</p>
<p>Employee.setAttribute("name",name);</p>
<p>Element jobE = new Element("job").addContent(job);</p>
<p>employee.setContent(jobE);</p>
<p>Element salaryE = new Element("salary").addContent(salary);</p>
<p>employee.setContent(salaryE);</p>
<p>return employee;</p>
<p>}</coolcode></p>
<p>JDOM提供了现成的API，使得序列化成XML的工作更加简单，我们只需要把toXML()外面包装一个Document，然后使用 XMLOutputter把文档写入servlet就可以了。toXml()允许递归调用其子类的toXML()方法，以便生成包含子图的XML文档。</p>
<p>使用类自行序列化成XML的方式，要每个类都实现自己的toXML()方法，而且存在数据模型与视图耦合的问题，即要么为每个可能的视图编写独立的toXML()方法，要么心甘情愿接收冗余的数据，一旦数据结构或者文档发生改变，toXML()就要做必要的修改。</p>
<p>B、页面模板生成XML方式</p>
<p>一般的，可以采用通用的页面模板技术来生成XML文档，这个XML文档可以符合任何需要的数据模型，供AJAX灵活的调用。另外，模板可以采用任何标记语言编写，提高工作效率。下面是一个采用Struts标签库编写的XML文档，输出之前提到的employees.xml：</p>
<p>Sample8_2.jsp：</p>
<p><coolcode lang="java" linenum="on"><br />
<%@ page contentType="application/xml; charset=gb2312" import="Employee"%></p>
<p><%@ page import="java.util.Collection,java.util.ArrayList"%></p>
<p><?xml version="1.0"?></p>
<p><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %></p>
<p><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%></p>
<p><%</p>
<p>Employee em1 = new Employee();</p>
<p>em1.setName("J.Doe");</p>
<p>em1.setJob("Programmer");</p>
<p>em1.setSalary("32768");</p>
<p>Employee em2 = new Employee();</p>
<p>em2.setName("A.Baker");</p>
<p>em2.setJob("Sales");</p>
<p>em2.setSalary("70000");</p>
<p>Employee em3 = new Employee();</p>
<p>em3.setName("Big Cheese");</p>
<p>em3.setJob("CEO");</p>
<p>em3.setSalary("100000");</p>
<p>Collection employees = new ArrayList();</p>
<p>employees.add(em1);</p>
<p>employees.add(em2);</p>
<p>employees.add(em3);</p>
<p>pageContext.setAttribute("employees",employees);</p>
<p>%></p>
<p><employees></p>
<p><logic:iterate name="employees" id="employee"></p>
<p><employee name="<bean:write name='employee' property='name'/>"></p>
<p><job><bean:write name="employee" property="job"/></job></p>
<p><salary><bean:write name="employee" property="salary"/></salary></p>
<p></employee></p>
<p></logic:iterate></p>
<p></employees></coolcode></p>
<p>采用页面模板生成XML方式，需要为每个需要的的数据模型建立一个对立的JSP文件，用来生成符合规范的XML文档，而不能仅仅在类的toXML()方法中组织对象图来实现。不过，倒是可以更加方便的确保标记匹配、元素和属性的顺序正确以及XML实体正确转义。</p>
<p>参考资料中Philip McCarthy的文章还描述了一种Javascript对象标注的生成方式，本文在此不赘述。有兴趣的读者可以自行查看了解。</p>
<p>7.5.3、如何在使用XML还是普通文本间权衡</p>
<p>使用XML文档确实有其方便之处。不过XML文档的某些问题倒是要考虑一下，比如说延迟，即服务器不能立即解析XML文档成为DOM模型。这个问题在一定程度上会影响AJAX要求的快速反应能力。另外，某些情况下我们并不需要使用XML来表示数据，比如说数据足够简单成只有一个字符串而已。就好像我们之前提到的数据校验和级联菜单的例子一样。所以，个人认为在下面这些情况下可以考虑使用XML来作为数据表示的介质：</p>
<p>l 数据比较复杂，需要用XML的结构化方式来表示</p>
<p>l 不用考虑带宽和处理效率支出</p>
<p>l 与系统其他API或者其他系统交互，作为一种数据中转中介</p>
<p>l 需要特定各式的输出视图而文本无法表示的</p>
<p>总之，要认真评估两种表示方式的表示成本和效率，选择合适的合理的表示方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://ishere.cn/2006/12/30/javascript-dom-xml.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

