MyQsl Datenbankabfrage
Übersicht

![]() |
FirstdeathmakerBetreff: MyQsl Datenbankabfrage |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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!"; } |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group