2011-10-27 2 views
1

У меня возникли проблемы с использованием cURL и JSON для печати некоторых результатов JSON на моей странице. Вот мой код, как он стоит прямо сейчас ...JSON с PHP cURL

// create curl resource 
    $ch = curl_init(); 

    // set url 
    curl_setopt($ch, CURLOPT_URL, "http://www.wardgraphics.com/moviepickr/collection.php?user=1"); 

    //return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    // $output contains the output string 
    $output = json_decode(curl_exec($ch)); 

    foreach($output AS $movie) { 

    // echo the output 
    echo "<p>This movie title is: " . $movie->overview . "</p>"; 

    } 

    // close curl resource to free up system resources 
    curl_close($ch); 

Когда я Ouput все я получаю:

Warning: Invalid argument supplied for foreach() in /data/26/2/45/90/2371416/user/2602457/htdocs/moviepickr/tester.php on line 15

вот пример того, что быть выводимый файл PHP «коллекция ? .php пользователь = 1" :

{"title":"Shaun of the Dead","released":"2004-09-24","trailer":"http://www.youtube.com/watch?v=CfBewQPFdKE","runtime":95,"overview":"Shaun of the Dead is a humorous homage to Zombie movies from director Edgar Wright; an outrageous romantic comedy with zombies.","poster":"http://cf1.imgobject.com/posters/089/4e816b465e73d6767f000089/shaun-of-the-dead-cover.jpg"}

connection.php файл:

header('Content-type: application/json'); 

mysql_connect('serv', 'user', 'password'); 
mysql_select_db('name'); 

include('databasefile.php'); 

//'json' is set as default return format 

$tmdb = new TMDb('key'); 

$check_collection = mysql_query("SELECT * FROM collections WHERE user_id = '$_REQUEST[user]' ORDER BY id"); 
while ($looped = mysql_fetch_assoc($check_collection)) { 


$id = $looped[movie_id]; 

//Search Movie with other return format than the default 

$json_movies_result = $tmdb->getMovie($id); 

// Convert JSON to array of objects 

$movies = json_decode($json_movies_result); 

foreach ($movies AS $movie) 

{ 

    foreach($movie->posters as $poster) 

    { 

     if ($poster->image->size == 'cover') { 

     $poster_url = $poster->image->url; 

     } 

    } 

    $id = $movie->id; 

    $json_extra = $tmdb->getMovie($id); 

    $extra_info = json_decode($json_extra); 

    foreach($extra_info AS $extra) 

    { 

     // convert json results into new php array 

     $collection_array = array("title" => $movie->original_name, "released" => $movie->released, "trailer" => $extra->trailer, "runtime" => $extra->runtime, "overview" => $movie->overview, "poster" => $poster_url); 

    } 

} 

echo json_encode($collection_array); 

} 

Это может быть просто для тех из вас, которые знают ваши вещи, дайте мне знать, если она есть.

Спасибо тонну!

+0

Это единственный результат, который у вас есть. Либо удалите foreach. Или проверьте результат ('is_array'), если этот API в противном случае действительно вернет список. – mario

+0

Не передавайте результаты скручивания непосредственно в json_decode. Если в curl есть какой-либо сбой, он вернет логическую скорость, которую вы затем расшифруете, и попробуйте включить foreach. Никогда не предполагайте, что вызов завитка преуспел - всегда проверяйте наличие сбоя. –

ответ

3

Ну, результат, возвращаемый wardgraphics.com, является объектом, а не массивом. Поэтому вы не можете делать foreach на нем (если вы не реализуете интерфейс итератора). Попробуйте распечатать только $output->overview

Я посмотрел ваш выход coolection.php. Все, что вам нужно сделать, это поместить все фильмы в массив, прежде чем закодировать его в JSON, например.

$movies = array(); 
$movies[] = $movie1; 
$movies[] = $movie2; 
$movies[] = $movie3; 
echo json_encode($movies); 

вместо

echo json_encode($movie1); 
echo json_encode($movie2); 
echo json_encode($movie3); 

Если вы не имеете доступа к coolection.php вы можете получить отдельные объекты путем разделения выходного напр:

$objects = explode('}', $output); 
foreach ($objects as $object){ 
    $movie = json_decode($object.'}'); 
    echo "<p>This movie title is: " . $movie->overview . "</p>"; 
} 

Это не совершенна, как это метод будет терпеть неудачу, если какие-либо данные внутри объекта JSON содержат символ «}». Чтобы быть в безопасности, лучше использовать регулярные выражения здесь с надлежащей проверкой на экраны.

Вот изменен код вашего файла PHP:

header('Content-type: application/json'); 
mysql_connect('serv', 'user', 'password'); 
mysql_select_db('name'); 

include('databasefile.php'); 
//'json' is set as default return format 
$tmdb = new TMDb('key'); 
$check_collection = mysql_query("SELECT * FROM collections WHERE user_id = '$_REQUEST[user]' ORDER BY id"); 
$allMovies = array(); // Initializing a variable to hold all movies 
while ($looped = mysql_fetch_assoc($check_collection)) { 
    $id = $looped[movie_id]; 
    //Search Movie with other return format than the default 
    $json_movies_result = $tmdb->getMovie($id); 
    // Convert JSON to array of objects 
    $movies = json_decode($json_movies_result); 
    foreach ($movies AS $movie) 
    { 
     foreach($movie->posters as $poster) 
     { 
      if ($poster->image->size == 'cover') { 
       $poster_url = $poster->image->url; 
      } 
     } 
     $id = $movie->id; 
     $json_extra = $tmdb->getMovie($id); 
     $extra_info = json_decode($json_extra); 
     foreach($extra_info AS $extra) 
     { 
      // convert json results into new php array 
      $collection_array = array("title" => $movie->original_name, "released" => $movie->released, "trailer" => $extra->trailer, "runtime" => $extra->runtime, "overview" => $movie->overview, "poster" => $poster_url); 
     } 
    } 
    $allMovies[] = $collection_array; // adding movie to the array of all movies 
} 
echo json_encode($allMovies); // printing json encoded array of all movies 

Теперь вы можете использовать свой первоначальный сценарий для отображения результатов.

+0

Вот что такое мой массив collection.php: $ collection_array = array ("title" => $ movie-> original_name, "released" => $ movie-> выпущено, "trailer" => $ extra-> трейлер, «runtime» => $ extra-> runtime, «overview» => $ movie-> overview, «poster» => $ poster_url); –

+0

@Brian и этот массив содержит только один фильм. Но вы сразу возвращаете несколько фильмов. Поэтому вам нужно добавить все эти фильмы в массив, прежде чем закодировать его в JSON. Если вы разместите код из коллекции.php, я смогу показать вам, что именно я имею в виду. – Ivan

+0

Я опубликовал полный код для collection.php, который был выше в моем оригинально отредактированном сообщении. Ура! –

0

Вы получаете хеш-объект, который PHP интерпретирует как объект, а не список. Меняйте collection.php вернуть

[ 
    { 
     "title":"Shaun of the Dead", 
     "released":"2004-09-24", 
     "trailer":"http://www.youtube.com/watch?v=CfBewQPFdKE", 
     "runtime":95, 
     "overview":"Shaun of the Dead is a humorous homage to Zombie movies from director Edgar Wright; an outrageous romantic comedy with zombies.", 
     "poster":"http://cf1.imgobject.com/posters/089/4e816b465e73d6767f000089/shaun-of-the-dead-cover.jpg" 
    } 
] 

Обратите внимание на [ и ]

0

Если установить 2-й параметр в json_decode к истинным, он будет возвращать объект как массив.