我有一个使用Ajax的Drupal Web应用程序;有时,Ajax函数需要将字符串作为参数传递给Drupal函数
$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value),
当值包含斜杠时,无法从作为
的Drupal函数中识别 function get_value($value) {
print urldecode($value);
例如,如果传递的字符串是ABC / 123,则get_value仅打印ABC
如何解决这个问题,从PHP / Drupal传递斜杠并获取整个字符串?
答案 0 :(得分:6)
使用%2f
代替/
:
$.ajax({url: "index.php?q=get_value" + "%2f" + encodeURIComponent(value),
[reference],见第2.2节
或者,更可读的替代方案:
$.ajax({url: "index.php?q=" + encodeURIComponent("get_value/"+value),
答案 1 :(得分:2)
你的问题是Drupal将斜杠解释为路径分隔符,因此它将get_value / val1 / val2 / val3中的第一个参数提取为$ value ...你可以让Drupal拆分参数,但你需要重新组合它们。以下是Drupal7的一个例子。
在你的菜单系统中,你必须确保drupal将使用所有参数回调你的get_value函数:
function mymodule_menu {
$items['get_value'] = array(
'page callback' => 'mymodule_get_value',
);
return $items;
}
然后重新组合动态的参数数量:
function mymodule_get_value() {
$args = func_get_args();
$value = implode('/', $args);
// do what you need with $value here
}
希望这有帮助!
答案 2 :(得分:1)
也许我在这里遗漏了一些东西,但你不能只是连接你的查询字符串并将其传递给ajax
函数吗?也许你可以使用parse_url()。
您的get_value()
可能是个问题。从PHP的urdecode()手册:“superglobals $ _GET和$ _REQUEST已经被解码。在$ _GET或$ _REQUEST中的元素上使用urldecode()可能会产生意想不到的危险结果。”
答案 3 :(得分:1)
如果这是你的确切代码,那么你有一个语法错误(一个额外的引用),第一行应该是:
$.ajax({url: "index.php?q=get_value/" + encodeURIComponent(value),
答案 4 :(得分:1)
你能否提供一些关于PHP函数在哪里的更多细节 - 它是否在Drupal自定义模块中?如果它在自定义模块中,您是否在get_value路径中使用menu_hook?另外,你使用的是哪个版本的Drupal?另一件事是你可以用Drupal.encodeURIComponent(Drupal 6)或Drupal.encodePath(Drupal 7)替换encodeURIComponent。
答案 5 :(得分:1)
了解您的路由系统正在做什么会有所帮助,首先,您在调试时会看到什么?
function get_value($value) {
var_dump($value);
print urldecode($value);
您可以尝试的另一个选项是传递带有双引号的变量,因此它们被解释为字符串。
$.ajax({url: "index.php?q=get_value/\"" + encodeURIComponent(value) + "\"",
答案 6 :(得分:1)
在对URL进行解码之前,您应该检查PHP函数的$ value参数是否包含斜杠之后的部分。
解决此问题的一种方法是在编码之前替换字符串中的斜杠,然后在PHP中解码后将其替换回来。这是一个用回车符替换斜杠的示例:(你应该使用一个字符串,否则你的字符串中找不到)
$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value.replace("/", "\r")),
用PHP代码来反转这个:
function get_value($value) {
print str_replace("\r", "/", urldecode($value));
您可能需要尝试其他一些字符(您也可以使用字符序列而不是单个字符)并查看哪些有效。剥离URL编码斜杠的逻辑也可能剥离其他字符。