Problem mit Schleifen ! Kann jemand helfen ?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Problem mit Schleifen ! Kann jemand helfen ?

Beitrag von Condor »

Hallo,
vielleicht kann mir ja jemand hier bei meinem problem helfen. Ich hab ein Problem mit einer
Schleife und kann den Fehler nicht finden. Zu meinem Problem: Meine DB (kunden) sieht so aus:

Code: Alles auswählen


| kd_id | ap | porto |
----------------------
|  101  | 34 |       |
|  102  | 52 |       |
|  103  | 17 |       |

kd_id ist die Kunden-ID, ap ist der Artikelpreis und porto ist das Porto. Jetzt soll eine
Schleife in die DB gehen und alle kunden nacheinander durchgehen und gucken wer einen ap
über 50 hat. Wer einen ap über 50 hat soll eine 0 die Spalte porto bekommen. Wer aber unter
50 ap hat, der soll eine 8 in die Spalte porto bekommen. Wie mache ich das ? Ich habe hier
folgendes Probescript:

Code: Alles auswählen

<? include("open.php"); ?>
<?
$sql = "SELECT * FROM kunden";
$result = mysql_query($sql, $conn);
if ($result) {
   $number = mysql_num_rows($result);
   echo "<P>Es sind $number Datensätze gelesen worden.";
   echo "<TABLE BORDER=0>";
   while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

      if ($row['ap'] > 50) {
          $sql2 = "UPDATE kunden SET porto = '0'";
                  $result2 = mysql_query($sql2, $conn);
          } elseif ($row['ap'] < 50) {
                            $sql3 = "UPDATE kunden SET porto = '8'";
                            $result3 = mysql_query($sql3, $conn);
              } else {
                 $sql4 = "UPDATE kunden SET porto = '4'";
                          $result4 = mysql_query($sql4, $conn);
                          }
   }
   echo "</TABLE>";
} else {
   echo "<P>".mysql_error($conn);
}
mysql_close($conn);
?>

Was oder wie muss ich das Script verändern, damit das so funktioniert wie ich es beschrieben habe ? Könnte mir da jemand
helfen ? Ich danke euch schonmal im voraus. Ciao.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

So sieht's a) schöner aus und b) funktioniert's wie gewollt. (hoffentlich ;-))

Code: Alles auswählen

<?php
include('open.php');

$sql = 'SELECT * FROM kunden'; 
$result = mysql_query($sql, $conn); 

if ($result)
{ 
   $number = mysql_num_rows($result); 
   echo '<p>Es sind $number Datensätze gelesen worden.</p>'; 
   echo '<table border="0">'; 
   while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
   { 
      $sql2 = 'UPDATE kunden SET porto = \'';
      if ($row['ap'] > 50)
      { 
         $sql2 .= '0'; 
      }
      elseif ($row['ap'] < 50)
      { 
         $sql2 .= '8';
      }
      else // $row['ap'] = 50
      { 
         $sql2 .= '4'; 
      }
      $sql2 .= '\' WHERE kd_id = ' . $row['kd_id'];
      $result2 = mysql_query($sql2, $conn); 
   }
   echo '</table>'; 
}
else
{ 
   echo '<p>' . mysql_error($conn) . '</p>'; 
} 
mysql_close($conn); 
?>
Wenn du die Ausgabe nicht brauchst, kannst du das auch deutlich eleganter lösen:

Code: Alles auswählen

<?php
include('open.php');

$sql = 'UPDATE kunden SET porto = 0 WHERE ap > 50'; 
if ( ! ($result = mysql_query($sql, $conn)));
{
   echo '<p>' . mysql_error($conn) . '</p>'; 
}
$sql = 'UPDATE kunden SET porto = 4 WHERE ap = 50'; 
if ( ! ($result = mysql_query($sql, $conn)));
{
   echo '<p>' . mysql_error($conn) . '</p>'; 
}
$sql = 'UPDATE kunden SET porto = 8 WHERE ap < 50'; 
if ( ! ($result = mysql_query($sql, $conn)));
{
   echo '<p>' . mysql_error($conn) . '</p>'; 
}

mysql_close($conn); 
?>
Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hallo,
danke. Es funktioniert wunderbar. Ich hätte da aber noch eine andere Frage an dich, die
eigentlich nichts mit dieser DB zutun hat. Es geht um ein anderes Script. Ich habe
folgende DB (tabelle):

Code: Alles auswählen

| spiel_id | team_a_id | team_b_id | tore_a | tore_b | punkte_a | punkte_b |
----------------------------------------------------------------------------
|    1     |     1     |     2     |   3    |    1   |    3     |    0     |
|    2     |     2     |     4     |   2    |    3   |    0     |    3     |
|    3     |     3     |     1     |   2    |    2   |    1     |    1     |
Zur Erläuterung: Das Team mit der ID 1 hat gegen das Team mit der ID 2 gespielt und gewonnen.
Im dritten Spiel hat das Team mit der ID 1 ein Unentschieden gemacht. Jetzt sollen die
Punkte zusammen gezählt werden. Mein Problem ist aber, das ich das nur einzel für punkte_a
und punkte_b mache. Es soll ja aber überall nachgesehen werden wo das Team mit der ID 1
gespielt hat um danach alle Punkte zusammen zu zählen. In diesem Fall wäre es ja 4 Punkte.
Wie mache ich das ? Hast du da einen Vorschlag. Ich kann das nur mit 2 Anfragen, habe aber
danach probleme mit dem addieren. Kannst du mir da bitte helfen ?
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Du musst das in zwei Schritten machen:

Code: Alles auswählen

SELECT Sum(punkte_a) AS Summe
FROM tabellenname
WHERE team_a_id = xy
tabellenname musst du noch durch den Namen der Tabelle ersetzen und xy jeweils durch die ID des Teams. Du erhälst dann mit der Abfrage unter 'Summe' die Summe der Punkte, wo Team xy als Team A läuft.
Mit

Code: Alles auswählen

SELECT Sum(punkte_b) AS Summe
FROM tabellenname
WHERE team_b_id = xy
erhälst du dann die Summe, wo Team xy als Team B läuft. Wenn du beide Werte addierst, erhälst du das gewünschte Ergebnis.

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Gast

Beitrag von Gast »

Hallo PhilippK,
vielen dank für deine Hilfe. Ich hab das auch in 2 schritten versucht. Das Script hat funktioniert, nur das die Punkte falsch ausgerechnet wurden. Deshalb war ich mir nicht sicher ob ich das richtig in 2 Schritten mache, ich dachte vielleicht muss die SELECT Anweisung professioneller aussehen. Naja, vielen dank nochmals. Ich hoffe das du mir das nicht übelnimmst, das du dich mit solchen Anfängern rumschlagen musst wie mich. Ciao.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Versuchs mal damit:

Code: Alles auswählen

SELECT sum(if(team_a_id=X, punkte_a, punkte_b)) FROM tabelle WHERE team_a_id=X OR team_b_id=X
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hallo Pyramide und PhillipK,
es funktioniert soweit so gut. Aber eine Sache hätte ich da noch. Ich möchte die addierten Punkte jetzt in die Tabelle tab2
schreiben. Wie "Update" ich jetzt tab 2 ? tab2 sieht nämlich so aus:

Code: Alles auswählen

| team_id | tore | punkte | 
--------------------------- 
|    1    |      |        | 
|    2    |      |        | 
|    3    |      |        | 
Das Problem was ich habe ist, das ich ja in der tab1 jeweils team_a_id und team_b_id habe, aber in der tab2 nur team_id. Ich
habs den ganzen Tag versucht aber entweder es tut sich gar nichts, es kommt ne Fehlermeldung oder sonst was. Kannst du mir
dabei helfen. Das wäre auch das letzte mal, danach störe ich dich nie wieder. Bitte hilf mir noch das letzte mal. Bis dann.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Die einzelnen Datensätze mit den Team-IDs existieren in der Tabelle schon?

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hi,
was meinst du genau. In der tab1 stehen ja team_a_id und team_b_id. In beiden Spalten kann ja das gleiche Team enthalten sein. In der tab2 möchte ich jetzt seperat die Punkte für jedes Team speichern, wobei das Problem besteht woher das Script wissen soll das team_a_id und team_b_id sozusagen zusammengehören wenn z.B das team mit der id 1 vorhanden ist. In meinem obigen beispiel ist ja das team mit der id einmal in der spalte team_a_id und einmal in team_b_id. Es müssten also 4 Punkte in die tab2 in die spalte punkte wo die team_id gleich 1 ist. Und damit komme ich irgendwie nicht zu recht.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Die Frage ist, ob du in der Tabelle einen vorhandenen Datensatz ändern (SQL: UPDATE...) oder einen neuen hinzufügen (SQL: INSERT INTO...) musst.

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Antworten

Zurück zu „Coding & Technik“