Afo*_*mes 2 php json curl freebase mql
我需要为任何给定的电影提取制作公司和发行公司的信息,我正在使用Freebase.发生我从未使用过JSON,也不知道如何将查询与我的PHP文件集成.
我一直在阅读的教程一点也不清楚,所以我总是来这里得到我一直得到的帮助!:)
所以...我需要提取的信息是这个Freebase查询编辑器
我所拥有的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";
Run Code Online (Sandbox Code Playgroud)
谁能在这里给我一个帮助?提前致谢!
欣赏它很多,顺便说一下圣诞快乐:)
编辑 @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 )
Run Code Online (Sandbox Code Playgroud)
现在......我如何将数据从那里带到我可以使用的数组中?
这段代码不起作用,因为我得到了未定义的索引
//print_r($resultarray);
//$produtoraarray = $resultarray["q1"]["result"]["production_companies"];
//print_r($produtoraarray);
//$produtorarray = $resultarray["q1"]["result"][];
//$freebaseserver = "http://sandbox.freebase.com";
Run Code Online (Sandbox Code Playgroud)
您的查询返回错误,因为它缺少一些重要的细节.你写过:
$simplequery = array('name'=>$moviename,
'type'=>"/film/film",
'production_companies'=>array('name'=>null));
Run Code Online (Sandbox Code Playgroud)
对应于以下MQL查询:
{
"name": "The Matrix",
"type": "/film/film",
"production_companies": {
"name": null
}
}
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为通常有不止一个具有给定名称的电影,并且也可能涉及多个制作公司.要在MQL中正确处理这些情况,您需要将production_companies属性以及数组中的完整查询包装起来,以指示您希望查询的那些部分有多个结果.在MQL中看起来像这样:
[{
"name": "The Matrix",
"type": "/film/film",
"production_companies": [{
"name": null
}]
}]
Run Code Online (Sandbox Code Playgroud)
并在您的代码中将转换为这样的东西:
$notsosimplequery = array(array('name'=>$moviename,
'type'=>"/film/film",
'production_companies'=>array(array('name'=>null))));
Run Code Online (Sandbox Code Playgroud)
您还应该考虑使用新的MQL读取服务,该服务更快,并且对每天可以进行的查询数量有更高的限制.