0

我已经修改了一些代码以通过 MySQL 查询填充下拉选择框,并且我的最终“结果”需要附加到新的“搜索”URL。

var result = $("select#model option:selected").html();
$.post (location.href="advanced_search.php?" + "keywords=" + result, function(data){;

我的问题是result包括我需要转换为的空格+,所以:

/advanced_search.php?keywords=2001-2004 Honda Civic TypeR

需要阅读:

/advanced_search.php?keywords=2001-2004+Honda+Civic+TypeR

我整个晚上都在寻找解决方案,但是我很难找到可以用我有限的技能实现的东西!

4

5 回答 5

5

使用datajQuery 的 AJAX 方法的参数,你不需要转义任何东西——这一切都将由 jQuery 为你完成。

此外,此查询可能应该是 GET,而不是 POST。当您分配给location.href您时,会导致新 URL 的页面重新加载,而不是真正的 AJAX 请求。

var result = $("select#model option:selected").html();
$.get("advanced_search.php", {
     keywords: result
}, function() { ... });

恕我直言,几乎没有充分的理由手动创建 POST 或 GET 参数 - 使用键/值对对象要简单得多。

于 2012-10-16T23:36:00.020 回答
1
location.href="advanced_search.php?" + "keywords=" + result

应该是

location.href="advanced_search.php?keywords=" + encodeURIComponent(result)

因为 ifresult包含一个#then ,它将成为片段的一部分而不是查询参数的一部分。 encodeURIComponent将正确地转义一个字符串,以便您的服务器result在您询问“keywords”GET 参数的值时返回。

正如 Mozilla 的文档所解释的那样

为避免对服务器的意外请求,您应该对将作为 URI 的一部分传递的任何用户输入的参数调用 encodeURIComponent。例如,用户可以键入"Thyme &time=again"变量注释。不使用encodeURIComponent这个变量会给出comment=Thyme%20&time=again. 请注意,与号和等号标记了一个新的键值对。


如果您已经构建了 URL,那么

encodeURI('/advanced_search.php?keywords=2001-2004 Honda Civic TypeR')

== '/advanced_search.php?keywords=2001-2004%20Honda%20Civic%20TypeR'

内置encodeURI函数接受一个字符串并将所有不能出现在 URL 中的字符替换为 % 编码的等效字符。

通过将特定字符的每个实例替换为表示字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码统一资源标识符 (URI)(对于由两个“代理”组成的字符,只有四个转义序列人物)。

任何服务器都应将%20URL 视为等同于在 URL的路径部分之外工作的+除外。%20

如果出于某种原因,您确实需要+,那么在 encodeURI 之后,应该可以安全地替换%20+因此。

var myUrl = '/advanced_search.php?keywords=2001-2004 Honda Civic TypeR';
encodeURI(myUrl).replace(/%20/g, '+')
于 2012-10-16T23:35:24.620 回答
1

您希望encodeURIComponent它不仅可以替换空格,还可以替换任何其他可能导致问题的内容。

..."keywords=" + encodeURIComponent( result )
于 2012-10-16T23:36:46.947 回答
1

我建议您稍微重新访问您的代码,因为发布数据但只是通过 QueryString 发送信息(URL 中的 ? 之后的所有内容)有点忽略了这一点。

您应该在对象中发送关键字,如下所示:

var result = $("select#model option:selected").html();
$.post("advanced_search.php", { keywords: result }, function(data){
    // success callback code goes here
});

如果您的 PHP 查找 $_POST['keywords'],当 $post 由 jQuery 执行时,您应该在其中找到您的数据。

通过 QueryString 发送它是不可撤销的,但在这种情况下,你真的应该按照以下方式做一些事情:

var result = $("select#model option:selected").html();
$.get("advanced_search.php", 
    { keywords: result }, 
    function(data){
        // success callback code goes here
    });

但是,您应该习惯于正确地发布数据,因为通过查询字符串发送数据既不安全,而且由于编码和 URL 长度限制而容易出现问题。

此外,这引出了一个问题:为什么要从标签内编码 HTML?你为什么不简单地在你的 中放一个简单的键,像这样:

<select id="model">
    <option value="key1">2001-2004 Honda Civic TypeR</option>
    <option value="key2">2005-2008 Honda Civic TypeR</option>
    <option value="key3">2009-2012 Honda Civic TypeR</option>
    <option value="key4">2013-2015 Honda Civic TypeR</option>
</select>

var result = $("select#model option:selected").val();
$.post("advanced_search.php", { keywords: result }, function(data){
    // success callback code goes here
});

运行查询也应该更简单,考虑到您可以缩短值并且不需要对编码/解码值进行任何处理,除非您没有每个选择选项的键,在这种情况下,我想我理解你正在采取的方法。

于 2012-10-16T23:40:31.820 回答
-2

只是.replace(/ /g,'+')它,虽然我必须承认我对你的代码到底在做什么感到困惑。

于 2012-10-16T23:30:37.533 回答