Quesito più difficile di quanto pensassi dunque più interessante.

Prova questo (non testato).

Codice PHP:
<?php
$forn_accettati 
= array("pippo"); 
$numero_elementi count($forn_accettati);
// l'articolo deve avere tutti i fornitori della lista - quindi una INNER JOIN per fornitore funziona da AND => fornitore 1 and fornitore 2 etc...
$innerClause "";
foreach(
$forn_accettati as $chiave => $valore)
{
 
$innerClause .= " INNER JOIN tab_prodotti tp$chiave ON (op.id_prodotto = tp$chiave.id_prodotto) and tp$chiave.fornitore = '$valore' ";
}
// il numero dei fornitori per l'articolo deve essere pari al numero di fornitori nella lista
$whereClause " WHERE EXISTS(SELECT COUNT(*) FROM tab_prodotti tpx WHERE op.id_prodotto = tpx.id_prodotto HAVING COUNT(*) = $numero_elementi)";
// con la prima clausola siamo sicuri di prendere un articolo "aperto" sù tutti i fornitori
// con la seconda scartiamo gli articoli che hanno più fornitori del numero di fornitori della lista
$query "SELECT id_ordini from tab_ordini to INNER JOIN ordini_prodotti op ON(to.ordine_id = op.ordine_id)"
         
$innerClause $whereClause;