<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[php.ini 的 arg_separator.output 设置]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 05 Jan 2012 06:56:41 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	来自微博客：<br/>agentzh：今天经过一位熟悉 PHP 的 ngx_lua 用户的提点，我才知道 W3C 标准建议服务器支持使用分号字符（;）作为查询串（query string）中的参数对分隔符。PHP 支持通过 arg_separator 配置指令修改此分隔符：http://t.cn/SiBspe 看来有必要在 ngx_lua 中也引入一条 lua_arg_separator 配置指令了，呵呵。<br/><br/>两篇来自网络的文章说明此事即可。如下：<br/>http_build_query是用来生成URL请求字符串的函数,很简单.不过今天却出现了一点小意外,在本机安装公司社区时,出现了无法登录的情况.但在测试服务器正常.经过地毯式排错,找到问题代码(仅演示,屏蔽敏感内容):<br/><textarea name="code" class="html" rows="15" cols="100">
$Args = array(
“usr” =&gt; “touchboy”,
“pwd” =&gt; “123456″,
“ip” =&gt; “127.0.0.1″,
“src” =&gt; “account”
);
$query= http_build_query( $Args );

</textarea><br/><br/>测试服务器得到结果为:<br/>usr=touchboy&amp;pwd=123456&amp;ip=127.0.0.1&amp;src=account<br/>而我本地结果为:<br/>usr=touchboy&amp;pwd=123456&amp;ip=127.0.0.1&amp;src=account<br/>中间的连接符出现了差异,服务器为正常的”&amp;”,而我本地却是转义后的”&amp;”,最终导致本地提交数据错误.<br/>查看手中的PHP手册,http_build_query一节对此问题只字未提.所以想到的补救方法就只有用htmlspecialchars_decode($query)还原连接符.不过始终觉得可疑,为什么两台机子结果不一样.开始怀疑是linux(服务器)和windows(本机)的差异,但经过对另一台windows机子的测试,结果正常.后就怀疑是环境配置的问题,经过一番google,果然真相大白.问题元凶在php.ini配置中一行:<br/>[/codes]arg_separator.output = “&amp;”[/codes]<br/>将arg_separator.output定义为”&amp;”,重启apache,问题解决!<br/>顺带说下PHP手册的问题,因我用的手册是之前比较经典的《PHP5中文手册文档版》(2006-11-05编译),2年半以前的东东,内容应该停留在PHP 5.1.0的阶段.很多内容已经滞后了.之后下载了陈浩(Haohappy)的《PHP中文手册》(2009-02-15编译),查看http_build_query一节,发现里面出现一行相关提示:<br/><textarea name="code" class="html" rows="15" cols="100">
Note: 用 arg_separator.output 来分隔参数。 </textarea><br/>到官方查看最新手册,发现里面有更详尽阐述,说明在5.1.2版增加了$arg_separator 参数可以解决此问题.看来中文的手册滞后还是很严重,5.1.2应该是一年前发布的,而2009-02-15编译的最新中文手册仍未收录相关内容.<br/>简而言之,遇到PHP函数故障,节省时间的最好解决方法:<br/>1.第一时间到PHP官方查找答案.<br/>2.保证自己手中的PHP手册是最新的.<br/>=========================================================================<br/>php通过curl提交数据，需要开启curl功能，在php.ini文件中取消注释<br/><br/>;extension=php_curl.dll<br/>改为<br/>extension=php_curl.dll<br/>重启apache服务器生效。<br/><br/>使用php的curl模块获取或者提交数据都是很方便的，但是使用中遇到了这样的一个问题：提交数据时出错，服务器返回400错误。<br/><br/>下面先给出一个通过curl提交数据的php文件示例：<br/>直接传递数组时，一切正常，但是将数组编码后，服务器返回出错信息<br/><br/>HTTP Status 400 – Syntactically incorrect<br/><br/>Description: The request sent by the client was syntactically incorrect ().<br/><br/>经过对比测试，可以看到编码前的参数<br/><br/>Array ( [username] =&gt; test-user [password] =&gt; 789cbe0407840b1c2041cb33452ff60f19bf58cc [timestamp] =&gt; 1314842207975 )<br/><br/>经过http_build_query编码后的参数<br/><br/>username=test-user&amp;password=789cbe0407840b1c2041cb33452ff60f19bf58cc&amp;timestamp=1314842207975<br/><br/>正是编码后的这个连接符&amp;导致的问题<br/><br/>在php.ini文件有如下的配置项：<br/><br/>; The separator used in PHP generated URLs to separate arguments.<br/>; PHP’s default setting is “&amp;”.<br/>; http://php.net/arg-separator.output<br/>; Example:<br/>arg_separator.output = “&amp;”<br/><br/>在xampp中，php默认的配置是启用的<br/><br/>;arg_separator.output = “&amp;”<br/><br/>将其注释后重启服务器，不再报错。<br/><br/>不修改php全局配置也可以，在php脚本里设置一下就行<br/><br/>ini_set(‘arg_separator.output’, ‘&amp;’);<br/><br/>注意：小心与&nbsp;&nbsp; HTML&nbsp;&nbsp; 实体相匹配的变量。像&nbsp;&nbsp; &amp;amp、&amp;copy&nbsp;&nbsp; 和&nbsp;&nbsp; &amp;pound&nbsp;&nbsp; 都将被浏览器解析，并使用实际实体替代所期待的变量名。这是明显的混乱，W3C&nbsp;&nbsp; 已经告诫人们好几年了。参考地址：http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2&nbsp;&nbsp; PHP&nbsp;&nbsp; 通过&nbsp;&nbsp; arg_separator&nbsp;&nbsp; .ini&nbsp;&nbsp; 指令，支持将参数分割符变成&nbsp;&nbsp; W3C&nbsp;&nbsp; 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用&nbsp;&nbsp; &amp;amp;&nbsp;&nbsp; 代替&nbsp;&nbsp; &amp;&nbsp;&nbsp; 作为分隔符。你不需要为此修改&nbsp;&nbsp; PHP&nbsp;&nbsp; 的&nbsp;&nbsp; arg_separator。让它仍为&nbsp;&nbsp; &amp;，而仅使用&nbsp;&nbsp; htmlentities(urlencode($data))&nbsp;&nbsp; 对你的&nbsp;&nbsp; URL&nbsp;&nbsp; 进行编码。&nbsp;&nbsp;<br/><br/><br/>我想问的就是如何把url中的?替换成其他的，比如替换成@，而php仍然能正常接受变量。<br/><br/>比如&nbsp;&nbsp;<br/>http://localhost/test.php?@a=b<br/>在test.php中我依然可以用<br/>$_GET[ &#039;a &#039;]取得a的值=b<br/><br/>==============================================================================<br/><br/>来源：http://flyash.itcao.com/post_1065.html<br/>http://www.etang.info/php-it/Default.aspx?__tencentip=10.16.64.112&amp;__tencentid=1&amp;__tencentrawurl=http://www.etang.info/php-it/http_build_query.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] php.ini 的 arg_separator.output 设置]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>