$id einmal unkonditional als Feld markieren.
In Deinem code-Ausschnitt ist nicht zu erkennen, ob Du das tust.
Wenn nicht, erzeugt php beim ersten Schleifendurchlauf bei
$id[] = $row['id']; eine Warnung, da $id nicht definiert ist, setzt es dann aber auf den Typ array.
Wird die Schleife aber nicht durchlaufen -weil die Abrfrage keine Datensätze zurückliefert- bleibt $id undefiniert. Beim Aufruf von shuffle() erzeugt das wieder eine Warnung, aber php nimmt dann für $id den Wert null an. Und shuffle(null); liefert genau die angegebene Warnung. Wenn Du allerdings diese siehst, solltest Du auch die vorangegangenen sehen und die Ausgabe sollte dann auch anders sein - aber print_r gibt bei null nichts aus; Du könntest es also übersehen haben.
PHP-Code:
$id = array();
for ($i = 0; $i < mysql_num_rows($ergebnis); $i++)
{
$row = mysql_fetch_array($ergebnis);
$id[] = $row['id'];
}
print_r($id); //korrektes Array, auch bei Warnung!!
$sl = false;
while (!$sl)
{
shuffle($id);
print_r($id); //korrektes Array, auch bei Warnung!!
//SQL-Abfrage
if (mysql_num_rows($ergebnis)==0)
$sl=true;
}