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

<table border="0" width="90%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td>
<?php
        function fetch_data($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    $access_token = "xxx.xxx.xxx";
    $display_size = "standard_resolution"; 

    $number_of_images = 7;

    $result = fetch_data("https://api.instagram.com/v1/users/[user]/media/recent/?count={$number_of_images}&access_token={$access_token}");
    $result = json_decode($result);

    $images = array();
    foreach($result->data as $photo)
{
    $images[] = array(
        'url'  => $photo->images->{$display_size}->url,
        'link' => $photo->link,
    );
}
?>
<a href="<?php echo $images[0]['link']; ?>" target="new"><img src="<?php echo $images[0]['url']; ?>" border="0" height="200" width="200" /></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[1]['link']; ?>" target="new"><img src="<?php echo $images[1]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                    <td><a href="<?php echo $images[2]['link']; ?>" target="new"><img src="<?php echo $images[2]['url']; ?>" border="0" height="400" width="400" /></a></td>
                                    <td valign=top>
                                    <table border="0" width="100%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td><a href="<?php echo $images[3]['link']; ?>" target="new"><img src="<?php echo $images[3]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[4]['link']; ?>" target="new"><img src="<?php echo $images[4]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                    <td valign=top>
                                    <table border="0" width="100%" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td> <a href="<?php echo $images[5]['link']; ?>" target="new"><img src="<?php echo $images[5]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                        <tr>
                                            <td><a href="<?php echo $images[6]['link']; ?>" target="new"><img src="<?php echo $images[6]['url']; ?>" border="0" height="200" width="200" /></a></td>
                                        </tr>
                                    </table>
                                    </td>
                                </tr>
                            </table>
                            </td>
                        </tr>
                    </table>
                    </td>
                </tr>
            </table>
            </td>
        </tr>
    </table>

Поэтому, когда этот скрипт умирает, он сообщает о сбое в строке 57, которая является строкой 57.

 foreach($result->data as $photo)

Есть ли способ перейти, если эта строка выйдет из строя, а затем отобразить сообщение об ошибке, чтобы сайт не выглядел беспорядочным?

php
0
Lonely Ranger 2 Мар 2015 в 15:16

2 ответа

Лучший ответ

foreach работает только с array или objects, все остальное вызывает ошибку .
Он не вызывает исключения: окружение его блоком try/catch не будет иметь никакого эффекта.

В вашем случае вам нужно сделать так:

if (is_array  ($result->data) || 
    is_object ($result->data)) {

foreach ($result->data as $photo) {
    $images[] = array ( 'url'  => $photo->images->{$display_size}->url,
                        'link' => $photo->link); 
    // Note that i have removed a comma after $photo->link
}
}else {
    // can not loop ....
}
0
Halayem Anis 2 Мар 2015 в 12:36

Вы можете использовать интерфейс Traversable

Интерфейс Traversable : интерфейс для определения возможности обхода класса с помощью foreach.

Итак, в вашем случае до foreach:

if ($result->data instanceof Traversable) {
    // can use foreach
}
0
kitensei 2 Мар 2015 в 12:43