2012-01-23 11 views
1

ユーザーは、俳優リストから俳優をクリックする必要があります。既存の映画のタイトルが削除され、選択した俳優に関する映画のタイトルのみが表示されます。Jsonがリストボックスの「未定義」値を取得する

私の "dvdtitle"リストボックスは、アクタが選択された後、 "Undefined"のリストを受け取ります。しかし、私はjson_encodeの応答データを$('#actor').text(data)と確認して、それを正しいものにしました。

[{"503":"Caught In The Crossfire"}, 
{"690":"Dead Man Running"}, 
{"1064":"Get Rich Or Die Trying"}, 
{"1145":"Gun"},{"1254":"Home of The Brave"}, 
{"2184":"Righteous Kill"}, 
{"2519":"Streets Of Blood"}, 
{"3273":"Twelve"}] 

私は何が間違っているのか分かりません。

//getactors.php 
include("includes/connection.php"); 

$q = $_POST['input']; 
$final_array = array(); 

$resultActor = mysql_query("SELECT id, title, plot, catagory, release_date, rated FROM dvd WHERE actors LIKE '%".$q."%' "); 

while($rowActor = mysql_fetch_array($resultActor)) { 
    $final_array [] = array($rowActor['id'] => $rowActor['title']); 
} 

echo json_encode($final_array); 


// JavaScript Document 
$('#actorsname').click(function(){ 

    var actorValue = $('#actorsname option:selected').text(); 
    $.ajax({ 
     type: "POST", 
     url: 'getactors.php', 
     data: {input: actorValue}, 
     cache: false, 
     datatype: "json", 
     success: function(data) { 
      $('#dvdtitle option').each(function(i, option) { 
       $(option).remove(); // Empty DVD Listbox 
      }); 

      $('#actor').text(data); // to visualy check my json Data 

      $.each(data, function(i, j) { 
       var row = "<option value=\"" + i.value + "\">" + j.text + "</option>"; 
       $(row).appendTo("select#dvdtitle"); 
      }); 
     } 
    }); 
}); 
+4

あなたのクエリは[SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)に対して脆弱です。 – paislee

+0

現在の要素のインデックスであるiのプロパティ 'value'をオブジェクトに要求していません – Dalen

+0

@Dalen、どうすればpaisleeに助けになるのか説明する準備をしてください。 – mowwwalker

答えて

-2

dataは、オブジェクトの配列です。 iの値がオブジェクトのインデックスであり、jがオブジェクトです。ここで

$.each(x, function(i, j){ 
    $.each(j, function(k, v){ 
     var row = "<option value=\"" + k + "\">" +v+ "</option>";     
     $(row).appendTo("select#dvdtitle"); 
    }); 
    }); 

あなたはより多くの情報のためのjQueryのドキュメントを参照してくださいすることができますhttp://api.jquery.com/jQuery.each/

+1

これはどのように役立ちますか? – paislee

+0

@paislee、私は最初彼に問題を話し、自分でそれに取り組むことができた。私は彼のやるべきことに私の答えを更新しました。 – mowwwalker

+0

最初の文章は問題ありません。 – paislee

4

問題は、あなたのAjaxのように映画のIDを持つ一つのキー/値のペアを含むオブジェクトを返しているということですキーとムービータイトルを値として使用します。これにより、検索するIDをループするeachがわからないため、データの取得がより困難になります。

理想的には、あなたはJSONは、この方法の代わりにフォーマットされていると思います:あなたはJSONは「タイトルを「ID」を使用しているためj.idj.titleを使用してeachループでデータを取得できるようになる

[ 
    {"id":503,"title":"Caught In The Crossfire"}, 
    {"id":690,"title":"Dead Man Running"} 
] 

"キーとして。しかし、あなたはそれを組織化していないので、オブジェクトの各キー/値ペアをループする必要があります。

$final_array[] = array(
    'id' => $rowActor['id'], 
    'title' => $rowActor['title'] 
); 

そしてj.idj.title(例えばVAR行= "<option value=\"" + j.id + "\">" + j.title + "</option>";)を使用します。

理想的には、これにあなたのPHPを変更したいと思います。

次に、PHPコードを変更しない例を示します。 この例は、上記の例に基づいています。 data変数は、Ajaxリクエストで受け取ったものです。

// This is the data retrieved using Ajax. 
var data = [{"503":"Caught In The Crossfire"},{"690":"Dead Man Running"},{"1064":"Get Rich Or Die Trying"},{"1145":"Gun"},{"1254":"Home of The Brave"},{"2184":"Righteous Kill"},{"2519":"Streets Of Blood"},{"3273":"Twelve"}]; 

// Loop through each object in the data array. 
$.each(data, function(key, movie) 
     { 
      // Because the ID is a key and the title a value, we can't determine the ID/title unless we loop through each one of the key/value pairs in the object. Each movie only has one key/value pair so this won't be a problem. 
      $.each(movie, function(id, title) 
        { 
         $('<option />').attr('value', id).text(title).appendTo('select#dvdtitle') 
        }); 
     }); 

jsFiddle:http://jsfiddle.net/j7HGr/

私はそれが理にかなって願っています。

PS:$q=$_POST['input'];mysql_real_escape_stringに変更してSQLインジェクションを防止することもできます。

+0

ねえ、私の答えにはうんざりした何かがありますか?私は、あなたが言ったことのjavascriptの部分を伝えようとしていましたが、私はある時点で挫折したようです。 – mowwwalker

+0

@Walkerneo、あなたはそれが正しいと思った。 JSONを変更する方が良い方法かもしれないと、おそらくあなたは説明を見落としていました。 –

+0

私はそれを念頭に置いておく必要があります。 – mowwwalker

関連する問題