我有一个通过GET提交的表单,其中一个隐藏字段提交了一个类别ID列表,以逗号(1,2,3)分隔。
当获取查询到达页面时,逗号将被%2C
转义。
我无法对解析这些值的PHP进行更改,并且它们必须保留逗号。
总结:?category=1,2,3
有效,而?category=1%2C2%2C3
没有。
如何阻止编码?
编辑以解决评论,简化,但给出了要点:
<form method="get" action="something.php">
<input type="hidden" name="category" value="1,2,3">
<input type="submit">
</form>
答案 0 :(得分:1)
使用Javascript手动编码查询字符串?有点难看,但看起来它是唯一的选择。
答案 1 :(得分:0)
创建3个隐藏字段,其名称为“category”,值为1,2和3。
答案 2 :(得分:0)
不要阻止编码,而是考虑在收到字符串时对其进行解码。这是一个例子(使用java):
public class Encoden { public static void main(String[] args) { String encodedValue; String value = "a, b, c"; String unencodedValue; try { encodedValue = URLEncoder.encode(value, "UTF-8"); } catch (UnsupportedEncodingException exception) { encodedValue = null; System.out.print("encoding exception: "); System.out.println(exception.getMessage()); } try { unencodedValue = URLDecoder.decode(encodedValue, "UTF-8"); } catch (UnsupportedEncodingException exception) { unencodedValue = null; System.out.print("decoding exception: "); System.out.println(exception.getMessage()); } System.out.print("Original: "); System.out.println(value); System.out.print("Encoded: "); System.out.println(encodedValue); System.out.print("Decoded: "); System.out.println(unencodedValue); } }
我刚注意到了php标签。虽然我不知道php,但我确信它将有一种方法来编码和解码HTML字符串值。
修改强> 根据注释,尝试渲染CDATA块中隐藏的值。我不知道这是否会奏效,只是把它扔出去。这是一个例子:
<input type="hidden" name="blam" value="<![CDATA[1, 2, 3]]>"/>
答案 3 :(得分:0)
“停止”的问题在于编码是HTTP标准的一部分 - 你“不应该”让它停止,因为它是构建HTTP的基础的一部分。 RFC2396描述了URI中允许和不允许的字符:
2.2。保留字符
许多URI包含由某些组成或由其分隔的组件 特殊字符。这些字符称为“保留”,因为
它们在URI组件中的使用仅限于它们的保留
目的。如果URI组件的数据与
发生冲突 保留目的,然后必须在之前转义冲突的数据 形成URI。reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
由于这个事实,当使用GET提交表单时,用户代理将根据此规范对值进行编码。
您的解决方案在于
1)更改表单以使用POST方法,将对$_GET
的引用更改为php中的$_POST
2)在使用数据之前调用urldecode(docs)($_GET['my_value'] = urldecode($_GET['my_value']);
)
3)使用元素数组将其作为数组提交给服务器
<input name="myElement[]" value="1" />
<input name="myElement[]" value="2" />
<input name="myElement[]" value="3" />
在PHP方面,$_GET['myElement']
将等于array(1,2,3)