2011-12-24 3 views
2

Мне нужно вытащить информацию о производственной компании и дистрибьюторской компании для любого фильма, и я использую Freebase для этого. Случается, что я никогда не использовал JSON и не знаю, как интегрировать запрос с моим файлом PHP.PHP и JSON Query для извлечения данных из Freebase

Учебники, которые я читал, отнюдь не понятны, поэтому я всегда сюда приезжаю, чтобы получить помощь, которую я всегда получаю! :)

Итак ... Информация мне нужно вытащить это Freebase Query Editor

И PHP у меня есть это (комментируемые линии являются линиями, я уверен, что это неправильно и/или линии от обучающая я следовал, не Sucess here:

$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"; 
+0

Я отредактировал свой ответ, чтобы вы меняли. – Yaniro

ответ

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, вам необходимо обернуть свойство production_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)))); 

Вы должны также рассмотреть возможность использования new MQL Read Service который быстрее и имеет более высокие лимиты на сколько запросы, которые вы можете сделать в день.

+0

Как раз сейчас я заметил, что использовал свой ответ, чтобы решить свою проблему месяц назад, не принимая его здесь! Готово! ура –

2

Все, что вам нужно сделать, это заменить:

$jsonquerystr = json_encode($queryarray); 

С:

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

Видимо, вы должны кодировать специальные символы в строке json перед отправкой их на сервер API с использованием cURL, поскольку cURL не сделает это за вас. .

Когда вы вернете свой результат, он будет представлен в виде JSON (JavaScript Object Notation), который является другим способом представления данных (атрибуты & значений), подобно XML. Вы должны декодировать JSON (обратите внимание, что при отправке запроса вы кодировали JSON) и использовать результат в качестве объекта типа так:

$data = json_decode($jsonresultstr); 
foreach ($data->q1->messages[ 0 ]->info->result as $company) 
{ 
    echo($company->name . "<br/>"); 
} 
Смежные вопросы