PHP while Schleife einmalig ausführen - bei leerer DB?

Hallo PHP Profis,

wie kann man eine PHP while Schleife einmalig ausführen auch wenn die Datenbank kein Ergebnis ausliest?

while ($chat = $stmt->fetch(PDO::FETCH_ASSOC)) {
}

Vielen Dank,
Chris

http://php.net/manual/de/control-structures.do.while.php

Vielen Dank.

Damit hab ich`s ausprobiert, jedoch gibt das nur einen Fehlermeldung:
$i = 0;
do {
$i++;
} while (($chat = $stmt->fetch(PDO::FETCH_ASSOC))||($i == 1));

Gibt`s Vorschläge?

Moin,

das find ich tholl (Auszug aus Deinem Link):

Seit PHP 5.3.0 ist es möglich, statt dieses Hacks den goto-Operator zu verwenden.

Wer sich noch erinnert, was wir in den 70ern alles angestellt haben, um den GOTO plattzumachen, dem kommen jetzt die Tränen.

Gruß Ralf

aha und wie lautet die?

probier doch mal

do
{

[...]

$chat = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$chat)
break;



}
while (0)

Danke Ralf,

aber goto funktioniert in einer Schleife nicht.

Sry es gibt doch keine Fehlermeldung aber die Seite bricht zusammen.

Wenn die DB Ausgabe im do { } erfolgt macht diese dann keine Schleife sondern wird nur einmal ausgegeben?

Hi Chris,

warum machst du es nicht so:

$chat = $stmt->fetch(PDO::FETCH_ASSOC);
if(empty($chat)){
   ....zeige was auch immer
} else {
   ... führe was auch immer aus
}

Aha. Die Seite bricht zusammen.

Wurde dir nicht immer wieder und wieder gesagt, dass du Probleme vernünftig und nachvollziehbar erklären sollst?

In the contrary! Sie macht Durchläufe, solange aus der Datenbank was kommt. Wenn nichts mehr kommt, wird am break; abgebrochen. CAVE: Da ist ein Ausrufezeichen in meinem Beispiel-if.

Wie ich es verstanden habe, hat er eine Schleife, die mindestens einmal durchlaufen werden soll. Dein Beispiel lässt den armen Tor wieder im Dunkeln, weil es sein Problem eben dann doch nicht löst, so ganz ohne Schleife.

Außerdem… Nachdem die Daten aus der Datenbank geholt wurden, will er vermutlich was anderes machen, als wenn gar nichts kommt.

Zudem öffnet dein Beispiel Tür und Tor für Copy&Paste-Redundanzen, wenn man nicht verstanden hat, dass Codestruktur relevant ist.

Wenn du der Meinung bist, die offizielle Dokumentation ist falsch, dann liegt der Fehler mit höchster Wahrscheinlichkeit bei dir.

Moin,

PHP kenne ich nicht, aber es sollte doch möglich sein, in die Abbruchbedingung ein OR zu schreiben:

  Einmalig = true
  Do
    ...
    Einmalig = False
  While (NocheinSatz OR Einmalig = True)

Gruß Ralf

ps: Wieso gibt es in PHP kein Until?

Manchmal sollte ich sorgfältiger lesen - der Do while ist der Until, und damit braucht’s die Variable Einmalig natürlich nicht. Warum benutzt der UP das Konstrukt nicht?

Weil es entweder eine Fehlermeldung gibt oder die Seite zusammenbricht. Hat er doch eindeutig gesagt.

Mal im Ernst. Erst dachte ich:

Und nach der ersten Antwort von Chris war klar: Der Typ lernt es einfach nicht. Seit über einem Jahr fragt er hier kostenlose PHP-Hilfe für seinen tollen Fachkräfteshop an und immer wieder sind es unklare Fragestellungen und hingewurstelte Fehlerbeschreibungen.

Und immer geht es bei ihm nicht so, wie es in Beispielen oder gar der offiziellen Doku mundgerecht beschrieben ist. Aber das liegt niemals an seiner wirren Art, die wesentliche Details verschweigt. NEIN! Das liegt an dem dummen Experten, der zu blöde ist, seine Fragen gleich richtig zu beantworten.

Deshalb gibt es von mir nur noch Antworten auf genau die Fragen die er stellt. Und zwar nicht als komplette Beispiele, sondern nur noch als einfach hinkopierte Fragmente. Wenn er sich keine Mühe gibt (MINIMALBEISPIEL!) geb ich mir auch keine.

Ich frage mich halt, was das für ein Fachkräfteshop sein soll, in dem es nicht eine einzige PHP-Fachkraft gibt, die sich ein Chris leisten kann.

Hallo XXD,

das Skript gehört für einen chat daher soll das leere Chat Window / ohne Content am Anfang angezeigt werden.
Während der Chat / mit Content später angezeigt werden soll.

do {
} while ($chat = $stmt->fetch(PDO::FETCH_ASSOC)
Der PHP Ansatz ist schon der Richtige.

Andere Ansätze würden den Code nur wiederholen.

Lg,
Chris

Danke für die AW.
Diese ist dann auch verwendet worden.