我有一个带有文本框和按钮的简单表单,我的目标是让异步请求(jQuery:$.ajax)将文本发送到服务器(PHP / mysql a la Joomla),以便可以添加到数据库表.
这是从客户端发送数据的javascript:
var value= $('#myvalue').val();
$.ajax( {
type: "POST",
url: "/administrator/index.php",
data: { option: "com_mycomponent",
task: "enterValue",
thevalue: value,
format: "raw"},
dataType: "text",
success: reportSavedValue
} );
当用户输入其中包含空格的文本时,会出现问题.我收到的$_POST变量删除了所有空格,因此如果用户输入“This string has spaces”,服务器将获得值“Thisstringhasspaces”.
我一直在谷歌搜索,并找到了我需要使用encodeURIComponent的大量参考.所以我试过了,但现在我从$_POST获得的价值是“This20string20has20spaces”.
因此,它似乎按照我期望的方式对其进行编码,只是将百分号符号剥离而不是空格,并留下十六进制数字.
我真的很困惑.似乎这种问题在网络上随处可见并得到解答,并且到处都是encodeURIComponent被誉为银弹.但显然我正在与不同种类的lycanthrope作斗争.有没有人有什么建议?
解决方法:
事实证明,我没有意识到我正在执行额外的过滤.因为这一切都是通过Joomla运行的,所以我使用的是JRequest :: getCmd(‘thevalue’)而不是$_POST [‘theValue].事实证明,这个函数可以过滤掉所有那些麻烦的字符,比如’%’.
所以最终的解决方案是在客户端上使用encodeURIComponent,就像在Web上一致建议的那样:
var value = encodeURIComponent($('#myvalue').val());
在服务器上,为getVar()交换getCmd(),它允许更多地控制过滤,结合urldecode():
$value = urldecode(JRequest::getvar('thevalue', JREQUEST_ALLOWHTML));
再次,非常感谢Karim79和Cesar.我称你为Harker和Helsing – 我的英雄们!