How to use the same shortcode with different attribute values on same page

There is nothing wrong with your code when it comes to attributes (except maybe that having $attts and $atts makes the code much harder to read than it needs to be).

I reduced your code to this test case:

function display($atts){
    ob_start();

    $attts = shortcode_atts( array(
        'id' => '2',
    ), $atts, 'Adds' );

    echo $attts['id'];

    return ob_get_clean();
}
add_shortcode( 'Adds', 'display' );

When I added the shortcode to a page the correct id attributes were echoed.

This means that the problem must exist in your data. Either $display['id'] or $display['upload_image'] are not what you expect them to be or $ad_display isn’t.

Without being able to see your actual data, it’s impossible to be more precise than that. So to answer your question “How to use the same shortcode with different attribute values on same page”, the answer is that you can do it and your code is written correctly to do it. Your issue is specific to your data.

Some additional pointers unrelated to the question:

  • display() is far too generic a name for a function. Prefix it or namespace it with something specific to your project to avoid conflicts.
  • It’s “ads”, not “adds”.
  • Why not just query the specific ID you’re looking for instead of querying all the data for every shortcode and then looping through it to find a match?