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

jQuery の AJAX メソッドのパラメーターを使用dataすれば、何もエスケープする必要はありません。すべて jQuery によって実行されます。

さらに、このクエリはおそらくPOST ではなく GET であるはずです。に割り当てるとlocation.href、真の AJAX 要求ではなく、新しい URL のページのリロードが発生します。

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

私見では、手動で POST または GET パラメータを作成する正当な理由はほとんどありません。キーと値のペアのオブジェクトを使用する方がはるかに簡単です。

于 2012-10-16T23:36:00.020 に答える
1

データをPOSTしているので、コードを少しだけ再検討することをお勧めしますが、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の長さの制限により問題が発生しやすいため、データのPOSTに適切に慣れておく必要があります。

また、これは疑問を投げかけます:なぜタグ内から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 に答える
1
location.href="advanced_search.php?" + "keywords=" + result

おそらくあるはずです

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

ifresultに then が含まれている#ため、クエリ パラメータの一部ではなく、フラグメントの一部になります。 「キーワード」GETパラメーターの値を要求したときにencodeURIComponentサーバーが返すように、文字列を適切にエスケープします。result

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 エンコードを表す 1、2、3、または 4 つのエスケープ シーケンスで置き換えることにより、Uniform Resource Identifier (URI) をエンコードします (2 つの「サロゲート」で構成される文字の場合は 4 つのエスケープ シーケンスのみになります)。文字)。

すべてのサーバーは、URLを、URL のパス部分の外側で機能することを除いて%20同等のものとして扱う必要があります。+%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 に答える
-2

それだけ.replace(/ /g,'+')ですが、あなたのコードが正確に何をしているのか混乱していることを認めなければなりません。

于 2012-10-16T23:30:37.533 に答える