Search code examples
phpflickr

Why won't the images that are grabbed from flickr display?


I'm in the proccess of learning the flickr api, while using it in a project, and have got a problem... I have it where flickr retrieves the photo data (shown below)

enter image description here

but it doesn't display the images themselves... I think this is due to the fact that it's not building the <img /> tags with the src=" " info below is the code that I'm attempting to use...

(my class.flickr.php code file)

class Flickr{

    private $flickr_key;
    private $flickr_secret;
    private $format = 'json';

    // Setting up flickr_key and flickr_secret
    public function __construct( $flickr_key ) {

        $this->flickr_key = $flickr_key;
    }

    public function searchPhotos( $query = '', $tags = '' ){ // Begin searchPhotos 

        $urlencoded_tags = array( 'animals', 'design', 'phones');

        if ( !empty( $args )) {

            $tags_r = explode( ',', $tags );
            foreach ( $tags_r as $tag ) {

                $urlencoded_tags[] = urlencode( $tag );
            }
        }

        // Construct the url
        $url  = 'http://api.flickr.com/services/rest/?';
        $url .= 'method=flickr.photos.search';
        $url .= '&text=' . urlencode( $query );
        $url .= '&tags=' . implode( ',', $urlencoded_tags );
        $url .= '&sort=relevance';
        $url .= '&safe_search=1';
        $url .= '&content_type=4';
        $url .= '&api_key=' . $this->flickr_key;
        $url .= '&format' . $this->format;
        $url .= '&per_page=10';

        // Calling url using curl
        $curl = curl_init();

        curl_setopt_array( $curl, array(

            CURLOPT_TIMEOUT => 120,
            CURLOPT_URL => $url,            
        ));

        if ( !curl_exec( $curl )) {

            die ( 'Error: "' . curl_error( $curl ) . '" - Code: ' . curl_errno( $curl ));
        }

        // Get search results
        $result = file_get_contents( $url );

        // Remove the unneccessary strings that wraps the result returned from the API
        $json = substr( $result, strlen( "jsonFlickrApi("), strlen( $result ) - strlen( "jsonFlickrApi(") - 1 );

        $photos = array();
        $data = json_decode( $json, true );

        // Check if the status didn't fail
        if ( $data['stat'] != 'fail' ) {

            /** Return only the data for the photos 
                as that's the only thing that we need
            */
            $photos = $data['photos']['photo'];
            return $photos;
        } else {

            return false;       
        }
    } // end searchPhotos

}

(my method call which I use in my page template file)

<?php // Flickr search photos test

require_once( 'class.flickr.php' );

global $flickr_key;

$flickr = new Flickr( 'this_is_my_api-key_placeholder...' );

$query = "Event Photo Uploadr";

$results = $flickr->searchPhotos( $query, $tag );
if ( !empty( $results )) {

    foreach( $results as $photo ) {

        $src = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . '/' . $photo['id'] . '_' . $photo['secret'] . '.jpg';
        ?>

        <img  src="<?php echo $src; ?>"/>

    <?php }                 
}

As I said I'm new to flickr api... I've been blessed to make it thus far (thanks to stackoverflow, Wordpress Answers and developer friends), so any useful input is GREATLY appreciated! ;)


Solution

  • Okay, this is going to sound silly, but, the real problem was I was missing a =. I'm not joking, I had this $url .= '&format' . $this->format; (which made the api, by default return xml) should be this $url .= '&format=' . $this->format; (this is the proper way to grab my $format var). I also cleaned up my code a bit...

    (main flickr functionality file)

    <?php
    
    class Flickr{
    
    private $flickr_key;
    private $flickr_secret;
    private $format = 'json';
    
    // Setting up flickr_key and flickr_secret
    public function __construct( $flickr_key ) {
    
        $this->flickr_key = $flickr_key;
    }
    
    public function searchPhotos( $query = '', $tags = '' ){ // Begin searchPhotos 
    
        $urlencoded_tags = array( 'animals', 'design', 'phones');
    
        if ( !empty( $args )) {
    
            $tags_r = explode( ',', $tags );
            foreach ( $tags_r as $tag ) {
    
                $urlencoded_tags[] = urlencode( $tag );
            }
        }
    
        // Construct the url
        $url  = 'http://api.flickr.com/services/rest/?';
        $url .= 'method=flickr.photos.search';
        $url .= '&text=' . urlencode( $query );
        $url .= '&tags=' . implode( ',', $urlencoded_tags );
        $url .= '&sort=relevance';
        $url .= '&safe_search=1';
        $url .= '&content_type=4';
        $url .= '&api_key=' . $this->flickr_key;
        $url .= '&format=' . $this->format;
        $url .= '&per_page=10';
    
        // Get search results
        $result = file_get_contents( $url );
    
        // Remove the unnecessary strings that wraps the result returned from the API
        $json = substr( $result, strlen( "jsonFlickrApi(" ), strlen( $result ) - strlen( "jsonFlickrApi(" ) - 1 );
    
        $photos = array();
        $data = json_decode( $json, true );
    
        // Check if the status didn't fail
        if ( $data['stat'] != 'fail' ) {
    
            // Return only the data for the photos as that's the only thing that we need
            $photos = $data['photos']['photo'];
            return $photos;
    
        } else {
    
            return false;       
        }
    } // end searchPhotos
    
    }
    

    The only things that I changed in my method call was adding an alt tag, like so alt="<?php echo $photo['title']?>", and adding a error messege to the else statement, echo "Failed to construct url successfully";.