MySQL abfragen ....

Bash, Shell, PHP, Python, Perl, CGI
Outlaw
Posts: 1500
Joined: 2002-12-04 10:22
Location: 4. Server von rechts, 2. Reihe von oben

MySQL abfragen ....

Post by Outlaw »

Hallo Leute,

was SQL angeht, bin ich schon vorbelastet und hatte mit der Kombi Access/SQL/VB auch schon erfolgreich zu tun, was Datenbankabfragen und Programmierung angeht, auch MySQL bekomme ich noch hin. Nur mit dem PHP und MySQL tue ich mich noch schwer. Ich habe da zwar schon was am Laufen, aber es muss doch auch einfacher gehen !!

Ich habe hier folgenden Code:

Code: Select all

<?php
  include_once("Pfad zur DB Konfig");
  if($conn) {
    mysql_select_db($dbname);
    $sql = "SELECT user, points FROM wwwsame_scores ORDER BY points DESC";
    $result = mysql_query($sql, $conn);
    echo "<h5><u>Top 3 wwwsame (Men&/Game):</u>";
    echo "<table border=0>";
    $i = 1;
    while ($i < 4) {
      $row = mysql_fetch_array($result, MYSQL_ASSOC);
      echo "<tr><td><h6>$i. Platz: ";
      echo implode("<td><h6> Punkte: ",$row);
      echo "</tr>";
      $i++;
      }
      echo "</table>";
    } else {
    echo "Fehler beim Verbinden der Datenbank";
    }
   mysql_free_result($result);
   mysql_close($conn);
?>
So, wie man hier sieht, liest das Skript die DB von WWWSame (ein OnlineGame) aus und zeigt es auf meiner HomePage unter http://www.netsecond.net/game/index.php3 oben rechts neben meinem alten Logo an.

Jedoch bin ich mit dem Einfluss der Ausgabe nicht ganz zufrieden, da hier folgender Code mich etwas irritiert:

Code: Select all

echo implode("<td><h6> Punkte: ",$row);
Dieser implode Befehl soll ja den String wieder in einen Array auflösen (oder so ähnlich). Dabei Irritiert mich auch etwas die Schleife. Ok, diese muss rein, damit mir nicht alle Werte der gesamten DB angezeigt werden, sondern nur die ersten 3. Aber mir wäre es lieber, ich müsste nicht jedes mal den ganzen Datensatz übertragen, sondern ich würde lieber einzelne Felder auslesen. Aber das ist auch nicht das Problem. Mein Problem ist, daß ich die einzelnen Felder lieber eigenen Variablen zuweisen möchte, so wie hier aus einem anderen meiner Skripte:

Code: Select all

    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
      {
      $var1 = $row["Feld1"];
      $var2 = $row["Feld2"];
      $var3 = $row["Feld3"];
      $var4 = $row["Feld4"];
....
Wozu wird überhaupt die Schleife benötigt und was mache ich falsch, daß ich im 1. Skript die Variable $row nicht genauso auslesen kann, wie im 2. Beispiel. Ich kann dort irgendwie keine Felder direkt "verknüpfen", da ich nicht weiss, wie die $row[] Geschichte genau bezeichnet werden muss. Im 2. Beispiel hatte ich einfach die Feldnamen in die eckigen Klammern genommen, jedoch geht das im 1. Skript nicht, ich kann angeben, was ich will, es wird nichts an die Variablen übergeben, wenn ich welche wie im 2. Code definiere, die Variablen bleiben also leer ....

Wo mache ich einen Denkfehler und wie ist das mit der Schleife nochmal ??
:D Gruß Outi :D
husten
Posts: 12
Joined: 2002-07-08 23:00

Re: MySQL abfragen ....

Post by husten »

im ersten script steht "SELECT user, points FROM" daher werden feld1, feld2 etc nicht in der ergebnistabelle geliefert. mach einfach "SELECT * FROM" draus.

das implode macht aus dem array row einen string :)

beide schleifen in beiden scripten machen im endeffekt das gleiche in grün, oder wars dasselbe? ;) auf jedenfall wird jedesmal ein neuer datensatz der ergebnistabelle rangezogen. im ersten script wird der datensatz (array) zu einem string zusammengefasst und ausgeben, im zweiten script greifst du direkt auf die ergebnisfelder zu.

hoffe das war mit den fragen gemeint :)
Outlaw
Posts: 1500
Joined: 2002-12-04 10:22
Location: 4. Server von rechts, 2. Reihe von oben

Re: MySQL abfragen ....

Post by Outlaw »

Hallo und Danke.

Das war mir so auch klar aber wenn ich mit "*" selecte anstatt mit "user, points", dann sortiert er mir nicht nach diesen Feldern. Es muss doch eine Möglichkeit geben, die Ergebnistabelle trotzdem auszugeben, anstatt per implode einen String in eine Tabelle zu "konstruieren" ....

Ich möchte doch nur die Werte, die per implode in die Tabelle gesendet werden in entsprechende Strings übergeben und diese dann da platzieren, wo ich sie gerne hätte anstatt in dieser "doofen" Tabelle ....
:D Gruß Outi :D
robertw
Posts: 165
Joined: 2002-12-17 16:10
Location: Berlin

Re: MySQL abfragen ....

Post by robertw »

Hallo Outi!

Irgendwie kann ich Dein Problem nicht nachvollziehen. Dies liegt aber wahrscheinlich daran, dass Dein Script bis auf die Ausgabe eigentlich okay ist.

Statt mysql_fetch_array($result, MYSQL_ASSOC); könntest Du auch gleich mysql_fetch_assoc verwenden, das Ergebnis ist das gleiche.

Beide Funktionien liefern Dir das Ergebnis als assoziatives Array, Du kannst also auf die Inhalte über einzelne Variablen zugreifen, die Du per Namen nennen kannst.

Statt des Implode-Befehls kannst Du also einfach die beiden Werte ausgeben: $row['user'] und $row['points']. Du musst hier einfach die Namen verwenden, die auch in der DB benutzt werden. In Deinem Select-Statement stehen sie ja drin.

Und vielleicht noch einen Tipp für Deine SQL-Statement: Setze hinten noch ein "LIMIT 3" dran. Dann werden Dir nur die ersten drei Datensätze nach PHP übergeben, dies schont den Speicher!

Schau Dir das Beispiel hier mal an, dann sollte es klar sein.

Ich habe Dein Beispiel mal schnell überarbeitet (ungetestet!!!!) und würde es so lösen (na gut, lösen würde ich es vollkommen anders, aber dies passt zu Deinem Beispiel):

Code: Select all

<?php 
  include_once("Pfad zur DB Konfig"); 
  if($conn) { 
    mysql_select_db($dbname); 
    $sql = "SELECT user, points FROM wwwsame_scores ORDER BY points DESC LIMIT 3;"; 
    $result = mysql_query($sql, $conn); 
    echo "<h5><u>Top 3 wwwsame (Men&/Game):</u>"; 
    echo "<table border=0>"; 
    
    #
    $i = 1; 
    while ($row = mysql_fetch_assoc($result)) {
      echo "<tr><td><h6>$i. Platz: </h6></td>"; 
      echo "<td><h6>".$row['user']."</h6></td>";  
      echo "<td><h6>".$row['points']."</h6></td>";
      $i++;
    }
    #
    
    echo "</table>"; 

  }     
    echo "Fehler beim Verbinden der Datenbank"; 
  } 
  mysql_free_result($result); 
  mysql_close($conn); 
?>
Das Prinzip sollte aber eigentlich klar sein. Und ganz nebenbei habe ich noch für ein ordentliches Schliessen der HTML-Tags gesorgt. :-)

Robert
Outlaw
Posts: 1500
Joined: 2002-12-04 10:22
Location: 4. Server von rechts, 2. Reihe von oben

Re: MySQL abfragen ....

Post by Outlaw »

Hallo und danke nochmal.

Das mit dem
Statt des Implode-Befehls kannst Du also einfach die beiden Werte ausgeben: ....
hate ich ohne Erfolg probiert, es kam immer nur ein leeres Ergebnis zurück ....

Werde aber am WE nochmal testen, verm. hatte ich mich irgendwo nur verschrieben ....

Das mit den abschliessenden Tags stand in dem Buch, aus dem ich den Code zusammengebaut habe, daß diese anscheinend ignoriert werden und daher nicht nagegeben werden brauchen. Verm. liegts am implode aber ich kann nochmal nachsehen, falls es von Interesse ist.

Wenn ich im Select auf 3 limitiere, kann er dann noch sortieren ?? oder sortiert er und gibt dann nur die 3 Ergebnise aus ??
:D Gruß Outi :D
robertw
Posts: 165
Joined: 2002-12-17 16:10
Location: Berlin

Re: MySQL abfragen ....

Post by robertw »

Keine Ursache.

Das mit dem Ausgeben der Array-Variablen funktioniert defintiv, das setze ich nur ein. Du kannst auch numerische auf die Ergebnismenge zugreife, mit $row[0] und $row[1] in der Reihenfolge, wie sie im Select-Befehl stehen.

Der fetch-Befehl ist so intelligent, der baut $row sogar dann richtig auf, wenn Du mit "select *" suchst (was man aus Permformance-Gründen natürlich nicht macht).

LIMIT 3 schränkt die Ergebnismenge ein, die ausgegeben wird. Es wäre auch äußerst unlogisch, wenn die Einschränkung vor dem Sortieren gemacht wird. Die programmtechnische Ablauf sieht ungefähr so aus: select, order, limit -> $row. Wenn Du sehr viele Datensätz in Deiner Tabelle hast (so ab 100.000 aufwärts), würde ich noch ein "WHERE 1" einfügen (ja dies ist wirklich so richtig). Diese Sonderform des WHERE-Klausel zeigt dem Optimierer in MySQL, dass Du wirklich alle Datensätze willst. Aber dies nur am Rande.

Gib mal bescheid, on es geklappt hat.

Robert