MyQsl Datenbankabfrage

Übersicht Ressourcen Andere Programme oder Tools

Neue Antwort erstellen

Firstdeathmaker

Betreff: MyQsl Datenbankabfrage

BeitragMi, Nov 09, 2005 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich hab mich heute auch mal drangesetzt HTML, php und damit verbunden Sql zu erlernen. Ich hab hier auf meinem Rechner einen PHP-Server mit MySql eingerichtet sodass ich das geschriebene auch direkt testen kann, aber jetzt hänge ich fest. Folgende Situation:

Ich will mit dem Script in der Datenbank "XolonEmpire" die Tabelle "gship_data" abfragen und alle Namen der dort drin gespeicherten Schiffseinträge ausgeben. Die Datenbank, die Tabelle und 2 Einträge darin habe ich mit PHPmyAdmin erzeugt, sind also vorhanden. Ich weis nur einfach überhaupt nicht, wie ich an die Namen der Schiffe rankomme, mit welchen Befehlen ich da arbeiten muss. Das Tutorial macht das irgendwie anders als ich. Bisher bin ich nur soweit gekommen, das für die zwei vorhandenen Einträge eben zweimal "Object" da steht, aber das ist ja nicht der jeweilige Schiffsname. Die Funktion "get_shiplist() ganz am Ende des Codes soll alle Schiffsnamen ausgeben.

Code: [AUSKLAPPEN]
<!doctype html public "-//W3C//DTD HTML 3.2//DE">
<html>
<head>
  <title> Xolon Empire </title>
</head>


<body background="img\bg\mainbg.jpg">
<p></p>
<center><font size="16" color="#FFC80B"> <b>Xolon Empire</b> </font></center>


<table>
  <tr>
    <td colspan="3" align="center" valign="top">
         <font color="#0064B0">
        <h1> Status </h1>
        </font>
    </td>
  </tr>
</table>

<font color="#FFC11B">
<?php
$ships=file("gdata\Ships.txt");
foreach ($ships as $s)
{
  echo "<p>Ship $s</p>";
}
connect_to_database();
get_shiplist();
?>
</font>


</body>
</html>


<?php
function connect_to_database()
{
  $conn_id = @MYSQL_CONNECT("localhost") OR DIE ("Localhost not enabled");
  @MYSQL_SELECT_DB("XolonEmpire",$conn_id) OR DIE ("Could not connect to Database");
  $result = MYSQL_QUERY("SELECT * FROM gship_data");
  $result = mysql_num_rows($result);
  echo "Schiffe in Datenbank: $result";
}
?>

<?php
function get_shiplist()
{
  $result=mysql_db_query ("XolonEmpire","select * from gship_data");
  while ($row=mysql_fetch_object($result))
  {
    $ship=$row;
    echo "<p>$ship</p>";
  }
  mysql_free_result($result);

}
?>


Edit: Hier noch ein Screen von PHPmyAdmin und den beiden Einträgen:
http://www.blitz-pasting.net/i...amp;id=627
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragMi, Nov 09, 2005 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
while ($row=mysql_fetch_object($result))
  {
    $ship=$row;
    echo "<p>" . $ship->name . "</p>";
  }


mysql_fetch_object() stellt einen Datensatz als Objekt dar. In deinem Beispiel entspricht $ship dann dem Datensatz als PHP-Objekt. Wenn du $ship direkt ausgibst steht da halt nur object. Du musst die Spaltennamen ansprechen z.B. mit $ship->Spalte1.

Eine andere Möglichkeit wäre mysql_fetch_array() Dann hast du den Datensatz in Arrayform und kannst die einzelnen Spalten über $ship["Spalte1"] ansprechen.

Firstdeathmaker

BeitragMi, Nov 09, 2005 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, dein erster Vorschlag funktioniert, dafür schonmal danke. Ich wusste nicht dass man auf die einzelnen Einträge über -> zugreifen kann.

Aber das mit dem über das Array zugreifen hab ich noch nicht kapiert/hinbekommen:

Code: [AUSKLAPPEN]
  $result=mysql_db_query ("XolonEmpire","select * from gship_data");
  $ships = MYSQL_FETCH_ARRAY(result);
  foreach ($ships as $s)
  {
   echo "<p>$Ships(name)</p>";
  }


Aber das ist wohl irgendwie falsch...
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Nov 10, 2005 1:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert eigentlich gleich wie das andere:

Code: [AUSKLAPPEN]
// Alle Zeilen durchgehen
while ($row = mysql_fetch_array($result))
{
  // Direkt auf 1 Spalte
  echo $row["name"];

  // Alle Spalten durchgehen
  foreach($row as $spalte)
  {
    echo $spalte;
  }
}

Firstdeathmaker

BeitragDo, Nov 10, 2005 8:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber warum gibt der dann jeden Eintrag doppelt an?

Code: [AUSKLAPPEN]
  $result=mysql_db_query ("XolonEmpire","select * from gship_data");
  while ($row = mysql_fetch_array($result))
  {
    foreach($row as $spalte)
    {
      echo "<p>$spalte</p>";
    }
  }
  mysql_free_result($result)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Nov 10, 2005 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast doch mehrere Zeilen in der Tabelle, dann wird für jede Zeile jede Spalte durchgegangen. Oder meinst du was anderes? Vielleicht funktioniert in diesem Fall foreach nicht so wie ich dachte. Hab den Code nicht getestet Wink

Firstdeathmaker

BeitragDo, Nov 10, 2005 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab mir das mal mit der Datenbank so übersetzt, dass man ja einmal eine Tabelle anlegen kann (Vergleichbar mit der Type-Deklaration), und dort dann Einträge reinspeichert (Vergleichbar mit BB-Objekten). Normalerweise sollte der Code den du mir ja gegeben hast, alle erstellten Objekte durchgehen und dann jede Zeile des Objektinhaltes wiedergeben. Der Fehler der jetzt auftritt ist der, dass jede Zeile doppelt widergegeben wird.

Ausgabe:
Zitat:
Decrior

Decrior

100

100

100

100

2

2

1

1
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Nov 10, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, das liegt anscheinend an der Art und Weise wie die Zeile in ein Array eingelesen wird.

mysql_fetch_array() macht die Spalten über Zahlen-Index und String-Index verfügbar. Das heisst es gibt dann $row[0], $row["Spalte1"], $row[1], $row["Spalte2"] usw..

Foreach geht dann durch alle durch (Deshalb 2 mal pro Spalte). Für den Fall mit foreach kannst du mysql_fetch_row() benutzen, wo die Spalten nur über Zahlen-Index verfügbar sind. Auf ein Objekt kann man neuerdings auch foreach anwenden. Foreach geht dann alle Objekt-Member durch, somit kannst du auch mysql_fetch_object() benutzen.

Firstdeathmaker

BeitragDo, Nov 10, 2005 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, funktioniert jetzt perfekt. Vielen Dank!
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

wunderkind

BeitragFr, Nov 11, 2005 9:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Firstdeathmaker hat Folgendes geschrieben:
Aber warum gibt der dann jeden Eintrag doppelt an?


Das liegt daran, wie du mysql_fetch_array() aufrufst!

Du kannst als zweiten Parameter angeben, wie das Array zurückgegeben werden soll:

MYSQL_ASSOC -> assoziativ
MYSQL_NUM -> mit nummeriertem Index
MYSQL_BOTH -> beides

Wobei MYSQL_BOTH die Standardoption ist, wenn du den zweiten Parameter nicht angibst.

Doku: http://de3.php.net/manual/en/f...-array.php

Firstdeathmaker

BeitragDi, Nov 15, 2005 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Und was ist wenn ich jetzt einen vom User angegebenen String in einer Variable speichere und diese dann mit dem jeweils dazu passenden Datenbankeintrag vergleichen möchte? Ich weis nicht wo bei mir hier der Syntaxfehler liegt:

Code: [AUSKLAPPEN]
<?php
$mysqlhost="localhost";
$mysqluser="xxxxxxxxxx";
$mysqlpw="xxxxxxxxx";
$datenbank="XolonEmpire";

$connect=mysql_connect($mysqlhost,$mysqluser,$mysqlpw);
$db_selected = mysql_select_db($datenbank,$connect);

if (!$db_selected)
  {
  die ('Datenbank nicht gefunden: ' . mysql_error());
  }


$sql="SELECT * FROM user WHERE (user=$UserID)";
$Player=mysql_fetch_object($sql);
$test="jogurt";
if ($UserPw == $test)
{
  echo "Password correct";
}
 
?>


Also die Tabelle heißt "user"
und in dieser Tabelle gibt es das Wertefeld "user" das ich mit der vom
Forumular übergebenen $UserID verlgeichen will. Aber irgendwie bekomme ich in der Zeile Code: [AUSKLAPPEN]
$Player=mysql_fetch_object($sql);

einen Fehler:
Zitat:
Warning: Supplied argument is not a valid MySQL result resource in c:\apache\htdocs\register.php on line 19
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDi, Nov 15, 2005 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuche es mal noch mit Apostroph oder Anführungszeichen:

Code: [AUSKLAPPEN]
$sql="SELECT * FROM user WHERE (user='$UserID')";


Je nach PHP Version und je nachdem wie der safe_mode gesetzt ist könnte es auch sein, dass $UserID gar nicht gesetzt ist und du hingegen $HTTP_GET_VARS["UserID"] oder $_GET["UserID"] verwenden musst.

Die If-Abfrage im unteren Teil stimmt auch nicht ganz. Es müsste dann sowas ähnliches stehen:

Code: [AUSKLAPPEN]
if ($Player->passwort_feld_der_db == $test)



Und als kleiner Tipp zum Schluss:
Das Passwort würde ich verschlüsseln lassen. Das kannst du mit der SQL-Funktion PASSWORD() zum Beispiel:

Code: [AUSKLAPPEN]
INSERT INTO user (passwort_feld) VALUES (PASSWORD('passwort'));


Und abfragen kannst du es dann direkt in SQL:

Code: [AUSKLAPPEN]

$sql = "SELECT * FROM user WHERE user='$UserID' AND passwort_feld=PASSWORD('$UserPass');"
$res = mysql_query($sql, $db_selected);
$num = mysql_num_rows($res) // Anzahl Zeilen die zutreffen

if ($num > 0)
{
  echo "Richtig!";
}
else
{
  echo "Falsch!";
}

Neue Antwort erstellen


Übersicht Ressourcen Andere Programme oder Tools

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group