JSON с PHP CURL - PullRequest
       25

JSON с PHP CURL

1 голос
/ 27 октября 2011

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

</p> <pre><code> // 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);

Когда я вывожу все, что я получаю:

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

Вот пример того, что выводит php-файл "collection.php? User = 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:

</p> <pre><code> 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); }

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

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

Ответы [ 3 ]

3 голосов
/ 27 октября 2011

Что ж, результат, возвращаемый 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 голосов
/ 27 октября 2011

Если вы установите для второго параметра в json_decode значение true, он вернет объект в виде массива.

0 голосов
/ 27 октября 2011

Вы получаете хеш-объект, который 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"
    }
]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...