2

特定の映画の制作会社と配給会社の情報を引き出す必要があり、これには Freebase を使用しています。JSON を使用したことがなく、クエリを PHP ファイルに統合する方法がわかりません。

私が読んでいるチュートリアルは、これについてまったく明確ではないので、いつものように、私はいつも助けを得るためにここに来ます! :)

だから...私が引き出す必要がある情報は、このFreebase Query Editorです

そして、私が持っているPHPはこれです(コメントされた行は、間違っていると確信している行、および/またはここでは成功しなかったチュートリアルの行です:

$moviename = "The Matrix";

// [{ "name": "The Matrix", "type": "/film/film", "production_companies": [{ "name": null }], "distributors": [{ "distributor": [{ "name": null }] }] }]
$simplequery = array('name'=>$moviename, 'type'=>"/film/film", 'production_companies'=>array('name'=>null));

//{"id":"/topic/en/philip_k_dick", "/film/writer/film":[]}
//$simplequery = array('id'=>$_POST["freebasewriter"], 'name'=>null, '/film/writer/film'=>array(array('name'=>null, 'id'=>null)));

$queryarray = array('q1'=>array('query'=>$simplequery));
$jsonquerystr = json_encode($queryarray);

#run the query
$apiendpoint = "http://sandbox.freebase.com/api/service/mqlread?queries";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$apiendpoint=$jsonquerystr");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$jsonresultstr = curl_exec($ch);
curl_close($ch); 

$jsonquerystr = urlencode(json_encode($queryarray) );

//print_r($resultarray);
//$produtoraarray = $resultarray["q1"]["result"]["production_companies"];
//print_r($produtoraarray);
//$produtorarray = $resultarray["q1"]["result"][];
//$freebaseserver = "http://sandbox.freebase.com";

ここで誰か助けてくれませんか?前もって感謝します!

それを大いに感謝し、ところでメリークリスマス:)

EDIT @Yanir Shahakの回答が役に立ちました。今、私はこれを取得しています:

Array ( [code] => /api/status/ok [q1] => Array ( [code] => /api/status/error [messages] => Array ( [0] => Array ( [code] => /api/status/error/mql/result [info] => Array ( [count] => 3 [result] => Array ( [0] => Array ( [name] => Warner Bros. Entertainment ) [1] => Array ( [name] => Village Roadshow Pictures ) [2] => Array ( [name] => Silver Pictures ) ) ) [message] => Unique query may have at most one result. Got 3 [path] => production_companies [query] => Array ( [name] => The Matrix [production_companies] => Array ( [error_inside] => . [name] => ) [type] => /film/film ) ) ) ) [status] => 200 OK [transaction_id] => cache;cache02.sandbox.sjc1:8101;2011-12-24T02:01:34Z;0004 ) 

さて...そこからデータを取り出して、使用できる配列にするにはどうすればよいですか?

未定義のインデックスを取得するため、このコードは機能しません

//print_r($resultarray);
//$produtoraarray = $resultarray["q1"]["result"]["production_companies"];
//print_r($produtoraarray);
//$produtorarray = $resultarray["q1"]["result"][];
//$freebaseserver = "http://sandbox.freebase.com";
4

2 に答える 2

5

いくつかの重要な詳細が欠落しているため、クエリはエラーを返しています。あなたが書いた:

$simplequery = array('name'=>$moviename, 
                     'type'=>"/film/film", 
                     'production_companies'=>array('name'=>null));

これは、次の MQL クエリに対応します。

{
  "name": "The Matrix", 
  "type": "/film/film", 
  "production_companies": {
    "name": null
  }
}

多くの場合、同じ名前の映画が複数あり、複数の制作会社が関与している可能性があるため、これは失敗します。MQL でこれらのケースを適切に処理するには、product_companies プロパティと完全なクエリを配列でラップして、クエリのこれらの部分に対して複数の結果が予想されることを示す必要があります。MQL では、次のようになります。

[{
  "name": "The Matrix", 
  "type": "/film/film", 
  "production_companies": [{
    "name": null
  }]
}]

そして、次のようなコードに変換されます:

$notsosimplequery = array(array('name'=>$moviename, 
                                'type'=>"/film/film",
                                'production_companies'=>array(array('name'=>null))));

また、より高速で、1 日に作成できるクエリ数の制限がより高い新しい MQL 読み取りサービスの使用を検討する必要があります。

于 2011-12-26T07:16:43.410 に答える
2

あなたがしなければならないのは、次のものを置き換えることだけです:

$jsonquerystr = json_encode( $queryarray );

と:

$jsonquerystr = urlencode( json_encode( $queryarray ) );

どうやら、cURLはあなたのためにそれをしないので、cURLを使用してAPIサーバーにそれらを送信する前に、json文字列の特殊文字をエンコードする必要があります...

結果が返されると、XML によく似たデータ (属性と値) を表す別の方法である JSON (JavaScript Object Notation) の形式になります。json をデコードし (クエリを送信したときに JSON をエンコードしたことに注意してください)、結果を次のようにオブジェクトとして使用する必要があります。

$data = json_decode( $jsonresultstr );
foreach ( $data->q1->messages[ 0 ]->info->result as $company )
{
    echo( $company->name . "<br/>" );
}
于 2011-12-24T01:35:29.357 に答える