Php 提交表单时不要转义特殊字符

Php 提交表单时不要转义特殊字符,php,html,forms,escaping,Php,Html,Forms,Escaping,我有一个表单通过GET提交,其中一个隐藏字段提交一个类别ID列表,以逗号(1,2,3)分隔 当get查询到达它要访问的页面时,逗号将被转义为%2C 我无法对解析这些值的PHP进行更改,它们必须保留逗号 总之:?category=1,2,3有效,而?category=1%2C2%2C3无效 如何防止逗号被编码 编辑以处理注释,简化,但提供了要点: <form method="get" action="something.php"> <input type="hidden" nam

我有一个表单通过GET提交,其中一个隐藏字段提交一个类别ID列表,以逗号(1,2,3)分隔

当get查询到达它要访问的页面时,逗号将被转义为
%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>


< /代码> < p>创建3个隐藏字段,其名称为“类别”和不同的值1, 2和3。

,而不是阻止编码,考虑在接收字符串时对其进行解码。下面是一个示例(使用java):

公共类编码 { 公共静态void main(字符串[]args) { 字符串编码值; String value=“a,b,c”; 字符串未编码的值; 尝试 { encodedValue=urlcoder.encode(值,“UTF-8”); } 捕获(不支持DencodingException异常) { encodedValue=null; 系统输出打印(“编码异常:”); System.out.println(exception.getMessage()); } 尝试 { unencodedValue=urldecker.decode(encodedValue,“UTF-8”); } 捕获(不支持DencodingException异常) { unencodedValue=null; 系统输出打印(“解码异常:”); System.out.println(exception.getMessage()); } 系统输出打印(“原件”); 系统输出打印项次(值); 系统输出打印(“编码:”); System.out.println(encodedValue); 系统输出打印(“解码:”); System.out.println(未编码的值); } } 我刚刚注意到php标签。虽然我不懂php,但我确信它将有一种对HTML字符串值进行编码和解码的方法

编辑: 根据注释,尝试呈现CDATA块中隐藏的值。我不知道这是否有效,只是把它扔出去。以下是一个例子:


使用Javascript手动编码查询字符串?有点难看,但它似乎是唯一的选择。

停止编码的问题在于编码是HTTP标准的一部分-您“不应该”停止编码,因为它是HTTP构建基础的一部分。描述URI中允许和不允许的字符:

2.2。保留字符

许多URI包含由、或由、分隔的组件 特殊字符。这些字符称为“保留”,因为
它们在URI组件中的使用仅限于保留的
目的。如果URI组件的数据与 保留目的,则冲突数据必须在 形成URI

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","
因此,当使用GET提交表单时,用户代理将根据此规范对值进行编码

你的解决之道在于两者之中

1) 将表单更改为使用POST方法,将php中对
$\u GET
的引用更改为
$\u POST

2) 在使用数据之前对其调用urldecode()(
$\u GET['my\u value']=urldecode($\u GET['my\u value']);

3) 使用元素数组将其作为数组提交给服务器

<input name="myElement[]" value="1" />
<input name="myElement[]" value="2" />
<input name="myElement[]" value="3" />


在PHP方面,
$\u GET['myElement']
将等于
数组(1,2,3)

我试过了,结果是:?category=1&category=2&category=3您是如何形成查询的,提交是如何完成的?不能使用post,web服务只接受GET.writed web服务。更改为表单标记的onsubmit方法以创建您的查询字符串和window.open或window.location.href。谢谢,我考虑过这一点,但遗憾的是,我无法对接收方进行修改。您可以在页面呈现端进行更改吗?到那时已经太晚了,因为为块提取数据的模型已经忽略了正在提交的类别列表。所谓“呈现端”,我指的是呈现提交给“不变”接收端的表单。
<input name="myElement[]" value="1" />
<input name="myElement[]" value="2" />
<input name="myElement[]" value="3" />