Seite 1 von 3

Problem mit Schleifen ! Kann jemand helfen ?

Verfasst: 14.11.2003 01:15
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.

Verfasst: 14.11.2003 01:32
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

Verfasst: 14.11.2003 18:01
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 ?

Verfasst: 15.11.2003 20:57
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

Verfasst: 15.11.2003 22:59
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.

Verfasst: 16.11.2003 01:26
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

Verfasst: 16.11.2003 20:05
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.

Verfasst: 16.11.2003 20:07
von PhilippK
Die einzelnen Datensätze mit den Team-IDs existieren in der Tabelle schon?

Gruß, Philipp

Verfasst: 16.11.2003 20:14
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.

Verfasst: 16.11.2003 20:15
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