PHP - Datenbank pflegen Teil 2

Hallo,

ich habe weiter unten schonmal ähnliches gepostet, allerdings hat sich sie Sachlage ein wenig verändert und deshalb der Übersicht halber ein neuer Thread :smile:

Ziel:
Ich will eine kleine Charakter-Datenbank für Charakter aus dem Spiel Sacred für meinen Clan erstellen. Hier sollen die User selber Chars eintragen und ändern und bestehende Chars in einer Übersicht sehen können. Beim Eintragen wird ein Passwort gesetzt, dass zum Bearbeiten nötig ist, damit jeder nur die von ihm eingetragenen Chars bearbeiten kann.

Folgendes Szenario:
Ich hab ein Formular, in das der User ein paar Daten eintragen kann. Name, Charakter, usw. und auch ein Passwort, dass er sich aussucht.
Klickt er auf „Absenden“ werden die Daten, die er eingegeben hat in eine Datenbank geschrieben und er wird auf die Übersicht weitergeleitet. Hier sind alle bisherigen Einträge aufgelistet, schön in einer Tabelle. Hinter jedem Eintrag findet man den Link „Bearbeiten“. Bei Klick auf eben diesen gelangt zu einer neuen Seite, wiederum ein kleines Formular. Hier wird ein Passwort verlangt. Dies soll natürlich eben das sein, das der User beim Eintragen festgelegt hat.
Und das ist der Moment, an dem ich stocke. Ich will natürlich jetzt, dass man den Char bearbeiten kann, neben dem man auch auf den entsprechenden Link geklickt hat.
Aber ich bin ja auf eine neue Seite gegangen. Muss ich hier die Daten erneut abrufen oder kann ich irgendwie die ID mit auf die Pass-Abfrage-Seite übergeben?

Lieben Dank im Vorraus,
Nadine

süss *g*
hihi so hab ich auch mal angefangen :smile:) nur weiter so :smile:)
Also… Du hast mehrere Möglichkeiten…
Vor allem kommt das aber nun auf Deine Datenbank-Struktur an.
Für solche Datenbanken ist es eigentlich immer eine Datenbank zu haben, die eine id mitführt, die unique und auto_increment ist…
Was bedeutet das:
unique: Jede id darf nur einmal in der Datenbank vorkommen
auto_increment: Bei jedem Eintrag wird der zuletzt gemachte Eintrag um eins erhöht und automatisch eingettragen, Du brauchst das also bei deinem sql-string nicht berücksichtigen…
soweit, sogut…

nun hat jeder Deiner Charaktere eine eindeutige id - wenn Du diese nun an Deinen Link anhängst hast Du eine eindeutige definition um welchen Charakter es sich handelt…

wie sieht das nun im code aus…

Charakter $char1 [bearbeiten](modify.php?charid=1)

Charakter $char2 [bearbeiten](modify.php?charid=2)

...

nun bekommst Du die Variable in Deinem script modify.php übergeben - je nach Apache konfiguration kannst Du sie einfach mit $charid oder mit $_GET[‚charid‘] abrufen…
Diesen Wert übernimmst Du dann für Dein mysql_query (Select from … where id=’$charid’)

Die Werte trägst Du dann per default in die input=text mit value=$wert ein…

Nun aber zum fortgeschritteneren Teil…
Du kannst cookies oder Sessions so nutzen um einen user anzumelden. Für unsichere Bereiche reicht es auch die momentane ip-Adresse des users einzutragen und ihn damit zu identifizieren, aber das ist unsicher und sollte in heiklen Bereichen vermieden werden… Sicherheitsanforderungen und Möglichkeiten bieten da sehr viele konstellationen :wink:
Vorteil dabei ist, dass Du jedem User eine für ihn optimierte Ansicht anbieten kannst… es können interessensprofile genutzt werden, oder für Dich relevant - es braucht nicht für eine änderung eine erneute Passwortabfrage…
Solltest Du sehr viele User haben solltest Du Cookies verwenden. Zum einstieg sollten Sessions aber leichter zu realisieren sein…

Wenn Du Fragen dazu hast - immer her damit :wink:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hihi so hab ich auch mal angefangen :smile:) nur weiter so :smile:)

Wolltest du dich etwa über meine ersten Gehversuche lustig machen? :wink: Ich mach ja weiter :smile:

Also… Du hast mehrere Möglichkeiten…
Vor allem kommt das aber nun auf Deine Datenbank-Struktur an.
Für solche Datenbanken ist es eigentlich immer eine Datenbank
zu haben, die eine id mitführt, die unique und auto_increment
ist…
Was bedeutet das:
unique: Jede id darf nur einmal in der Datenbank vorkommen
auto_increment: Bei jedem Eintrag wird der zuletzt gemachte
Eintrag um eins erhöht und automatisch eingettragen, Du
brauchst das also bei deinem sql-string nicht
berücksichtigen…
soweit, sogut…

Das ist bereits so organisiert. Kennen einen Datenbankler, allerdings arbeitet der nur Access. Der hat mir mal versucht so ein paar Sachen zu erklären und eines, was hängen geblieben ist, ist immer eine ID mitzuführen :wink:

nun hat jeder Deiner Charaktere eine eindeutige id - wenn Du
diese nun an Deinen Link anhängst hast Du eine eindeutige
definition um welchen Charakter es sich handelt…

wie sieht das nun im code aus…

Charakter $char1 bearbeiten

Charakter $char2 bearbeiten

Okay, verstehe ich soweit. Aber: Muss ich die IDs da per Hand eintragen? Das wäre ja doof, weil die Tabelle sich ja automatisch aus den Datenbankeinträgen generiert und ich da gar keine Hand anlegen muss. Dann man da nicht mit einer Variable $ID arbeiten, die man vorher mit aus der Datenbank geholt hat? Falls ja, wie bewerkstellige ich, dass er auch genau die ID aus der Reihe, wo man auf Bearbeiten klickt, nimmt?

nun bekommst Du die Variable in Deinem script modify.php
übergeben - je nach Apache konfiguration kannst Du sie einfach
mit $charid oder mit $_GET[‚charid‘] abrufen…
Diesen Wert übernimmst Du dann für Dein mysql_query (Select
from … where id=’$charid’)

Ja, das ist soweit wieder klar. Da werde ich sicher auch noch ein Frägelchen haben, wenn ich denn da am Basteln bin, aber da habe ich wenigstens nen Ansatz.

Die Werte trägst Du dann per default in die input=text mit
value=$wert ein…

Hmm…okay, ich habe ja anhand der ID die Werte zuvor aus dem entsprechenden Datensatz geholt, richtig?

Nun aber zum fortgeschritteneren Teil…
Du kannst cookies oder Sessions so nutzen um einen user
anzumelden. Für unsichere Bereiche reicht es auch die
momentane ip-Adresse des users einzutragen und ihn damit zu
identifizieren, aber das ist unsicher und sollte in heiklen
Bereichen vermieden werden… Sicherheitsanforderungen und
Möglichkeiten bieten da sehr viele konstellationen :wink:
Vorteil dabei ist, dass Du jedem User eine für ihn optimierte
Ansicht anbieten kannst… es können interessensprofile
genutzt werden, oder für Dich relevant - es braucht nicht für
eine änderung eine erneute Passwortabfrage…
Solltest Du sehr viele User haben solltest Du Cookies
verwenden. Zum einstieg sollten Sessions aber leichter zu
realisieren sein…

Öhm, ja, das lerne ich dann vielleicht ein einer späteren Lektion :wink: ich muss ja zugeben, ich hab mir das schon mal angeguckt, aber das scheint mir doch tatsächlich zum fortgeschritteneren Teil zu gehören und nicht zum „blutiger-anfänger-schreibt-erstes-sinnvoles-script-teil“ in dem ich mich noch befinde, oder?

Wenn Du Fragen dazu hast - immer her damit :wink:

na da waren ja wieder ein paar :wink:

Ach, bevor ichs vergesse: Danke für die Hilfe :smile:

:wink:

Wolltest du dich etwa über meine ersten Gehversuche lustig
machen? :wink: Ich mach ja weiter :smile:

niemals :smile:

Das ist bereits so organisiert. Kennen einen Datenbankler,
allerdings arbeitet der nur Access. Der hat mir mal versucht
so ein paar Sachen zu erklären und eines, was hängen geblieben
ist, ist immer eine ID mitzuführen :wink:

sehr gut :smile:

Okay, verstehe ich soweit. Aber: Muss ich die IDs da per Hand
eintragen? Das wäre ja doof, weil die Tabelle sich ja
automatisch aus den Datenbankeinträgen generiert und ich da
gar keine Hand anlegen muss. Dann man da nicht mit einer
Variable $ID arbeiten, die man vorher mit aus der Datenbank
geholt hat? Falls ja, wie bewerkstellige ich, dass er auch
genau die ID aus der Reihe, wo man auf Bearbeiten klickt,
nimmt?

sicher… das ist ja auch kein Problem… ich würde vorschlagen, dass Du die Liste so aufrufst…

$query = mysql\_query("SELECT id, charname, wasdunochsoallesbrauchst FROM charaktertabelle ORDER by charname");
while ($result=mysql\_fetch\_array($query))
 {
 echo "$result['charname'] [bearbeiten](modify.php?charid=%2524result%255B'id'%255D)
";
 }

wenn Du jetzt Deine eingeloggt/ausgeloggt technologie verwendest kannst Du da z.B. nur die bearbeiten-links anzeigen, von den Leuten, die den charakter angezeigt haben…

Ja, das ist soweit wieder klar. Da werde ich sicher auch noch
ein Frägelchen haben, wenn ich denn da am Basteln bin, aber da
habe ich wenigstens nen Ansatz.

einfach fragen :wink:

Hmm…okay, ich habe ja anhand der ID die Werte zuvor aus dem
entsprechenden Datensatz geholt, richtig?

ganz genau :wink:

Öhm, ja, das lerne ich dann vielleicht ein einer späteren
Lektion :wink: ich muss ja zugeben, ich hab mir das schon mal
angeguckt, aber das scheint mir doch tatsächlich zum
fortgeschritteneren Teil zu gehören und nicht zum
„blutiger-anfänger-schreibt-erstes-sinnvoles-script-teil“ in
dem ich mich noch befinde, oder?

das war noch nicht mal so schwer… ich arbeite zuletzt mehr mit cookies, aber wenn ich mich recht daran erinnere wäre es ein kurzes
$query = mysql_query(„select passwort from userliste where username=’$username’“);
$datenbankabfrage=mysql_fetch_array($query);
if ($passwort == $datenbankabfrage[passwort])
{
echo „login erfolgreich“
$_SESSION[loggedin] = $username;
}
im anderen Teil dann ein
if (isset($_SESSION[loggedin])) oder
if ($_SESSION[loggedin] != „“)

um zu überprüfen ob derjenige schon eingeloggt ist oder noch nicht und ob er ein login-formular braucht oder eben nicht…

Session Variablen sind eben nur variablen, die über eine weile erhalten bleiben (je nach apache konfiguration und verhalten des users -> offen lassen des Browsers). Wichtig ist aber auch dass Du dann am Anfang des Scriptes ein session_start(); schreiben musst, damit auch eine session generiert wird…

Der Unterschied zu cookies ist dass es auf dem Server liegt und somit nicht gehackt werden kann (oder zumindest sollte das so sein ^^).
Cookies liegen auf dem Client und können umgeschrieben werden, deswegen musst Du da dann cryptische Werte generieren und die mit Deinen Datenbankinhalten vergleichen um zu verifizieren, dass derjenige eingeloggt ist…
Ein weiterer Nachteil an cookies ist, dass sie gesetzt werden müssen und erst beim nächsten refresh ausgelesen werden können. Session variablen kannst Du schon im aktiven Script abfragen.

Ach, bevor ichs vergesse: Danke für die Hilfe :smile:

immer wieder gerne :wink:

Re: :wink:

sicher… das ist ja auch kein Problem… ich würde
vorschlagen, dass Du die Liste so aufrufst…

$query = mysql_query(„SELECT id, charname,
wasdunochsoallesbrauchst FROM charaktertabelle ORDER by
charname“);
while ($result=mysql_fetch_array($query))
{
echo "$result[‚charname‘] bearbeiten
";
}

also irgendwo mache ich einen fatalen Fehler. Mit diesem Code hier rufe ich die Übersicht auf:

<?php $abfrage = "SELECT ID,Name,Charakter,Charname,Level FROM hsg_user ORDER BY Name";
$ergebnis = mysql\_query($abfrage)OR die (mysql\_error()); ?\> **Name** **Charakter** **Charname** **Level** **Bearbeiten** while ($daten = mysql\_fetch\_array($ergebnis)) { ?\> echo $daten[Name]; ?\> echo $daten[Charakter]; ?\> echo $daten[Charname]; ?\> echo $daten[Level]; ?\> echo "[Bearbeiten](%255C%2522bearbeiten.php?ID=%2524daten%255B'ID'%255D%255C%2522) "; ?\> } ?\> Der Fehler ist bei dem Link zum Bearbeiten in Zeile 37, denn wenn ich das so aufrufe, bekomme ich folgende Fehlermeldung: Parse error: parse error, expecting `T_STRING' or `T\_VARIABLE' or `T\_NUM\_STRING' in /home/www/web723/html/hsguser/uebersicht.php on line 37 Wo ist der Haken, den mein laienhaftes Auge nicht findet?

Der Fehler ist bei dem Link zum Bearbeiten in Zeile 37, denn
wenn ich das so aufrufe, bekomme ich folgende Fehlermeldung:
Parse error: parse error, expecting T_STRING' or T_VARIABLE’
or `T_NUM_STRING’ in
/home/www/web723/html/hsguser/uebersicht.php on line 37

Wo ist der Haken, den mein laienhaftes Auge nicht findet?

STREICHEN, STREICHEN! Das hab ich nie gepostet *lol*. Hab den Fehler eben selbst gefunden. Es muss nicht $daten[‚ID‘], sondern $daten[ID] heissen. Is mir eben beim Post durchlesen erst aufgefallen *schäm*

Nadine

*g*
normalerweise sollte das aber auch funktionieren…
mal noch ne anmerkung…
ich bin ja generell nicht so der Freund von html durch ?> einklammern…
Aber gerade bei Deiner Tabellenstruktur frage ich mich ob es nicht leichter wäre das einfach alles in das echo mit rein zu schreiben…
sähe dann so aus:

 while ($daten = mysql\_fetch\_array($ergebnis)) { 
echo " $daten[Name] 
 $daten[Charakter] 
 $daten[Charname] 
 $daten[Level] 
[Bearbeiten](%255C%2522bearbeiten.php?ID=%2524daten%255BID%255D%255C%2522) 
";
} ?\>

sieht doch schöner aus, oder? :wink:

sieht doch schöner aus, oder? :wink:

Ja, ja, um das Aussehen kümmer ich mich, wenns funktioniert :wink: Schau mal, das ist die bearbeiten.php im Wesentlichen:

$ID = $_GET[ID];
$abfrage= „SELECT Charname,Passwort FROM hsg_user WHERE ID=$ID“;
$ergebnis = mysql_query($abfrage)OR die (mysql_error());
?>

while ($daten = mysql_fetch_array($ergebnis)) {
echo " Charakter bearbeiten: $daten[Charname] "; ?>

Passwort:

} ?>

Jetzt weiss ich nicht, wie ich weiter verfahren soll. Ich muss ja noch die Passwörter vergleichen und
Fall 1 - stimmen überein -> Weiterleiten zum Formular zum Ändern
Fall 2 - stimmen nicht -> „Das Passwort stimmt nicht“ und auf der Seite bleiben…hmm…wieder nen Hänger *grml*

Nadine

hatten wir das Thema if then else nicht schon mal?
*g*

Ja, ja, um das Aussehen kümmer ich mich, wenns funktioniert :wink:

falscher Ansatz - je einfacher zu verstehen der code ist, desto einfacher ist es diesen zu verstehen. Das mag während des codens nicht so auffallen, aaaaaber wenn Du mal ein Script bearbeitest, das schon eine weile her ist dann hast Du wieder genau das Problem :wink:

Schau mal, das ist die bearbeiten.php im Wesentlichen:

$ID = $_GET[ID];
$abfrage= „SELECT Charname,Passwort FROM hsg_user WHERE
ID=$ID“;
$ergebnis = mysql_query($abfrage)OR die (mysql_error());
?>

while ($daten = mysql_fetch_array($ergebnis)) {
echo " Charakter bearbeiten:
$daten[Charname] "; ?>

Passwort:

} ?>

Jetzt weiss ich nicht, wie ich weiter verfahren soll. Ich muss
ja noch die Passwörter vergleichen und
Fall 1 - stimmen überein -> Weiterleiten zum Formular zum
Ändern
Fall 2 - stimmen nicht -> „Das Passwort stimmt nicht“ und
auf der Seite bleiben…hmm…wieder nen Hänger *grml*

Nadine

ich würde an dieser Stelle eigentlich schon die Scripte vereinen… sprich bearbeiten.php übernimmt das editierungsformular und auch das update…
mal sehen - open brain code: :wink:

<?php //setzen der $ID<br />$ID = $\_GET[ID];
if ($ID == "") $ID = $\_POST[ID];
if ($ID == "") die ("keine id angegeben! SO KANN ICH NICHT ARBEITEN!!");

//check ob update gemacht werden soll
if ($\_POST[action] == "doit")
{
//ja -\> nimm die übermittelten Werte
$charakter = $\_POST[charakter];
$passwort = $\_POST[passwort];
$wertx = $\_POST[wertx];
//usw...
}
else 
{
//nein -\> nimm die Werte aus der Datenbank
$query = mysql\_query("SELECT \* FROM hsg\_user WHERE ID='$ID'");
$result = mysql\_fetch\_array($query);
$charakter = $result[Charakter];
$wertx = $result[wertx];
//usw...
}

//Das update wird vorgenommen
if ($\_POST[action] == "doit")
 {
 //passwortcheck
 $query=mysql\_query("SELECT Passwort from hsg\_user WHERE ID='$ID'":wink:
 $result=mysql\_fetch\_array($query);
 if ($passwort == $result[Passwort]) //passwort stimmt überein
 {
 //update und Rückgabe dass es geklappt hat (oder eben nicht)
 if (mysql\_query("UPDATE hsg\_user SET charakter='$charakter', wertx='$wertx' WHERE ID='$ID'")) echo "update erfolgreich";
 else echo "update fehlgeschlagen";
 }
 else echo "Passwort für Charakter $charakter ist fehlerhaft!"; //passwörter stimmen nicht überein
 }

//nun muss natürlich erst mal das Formular noch angegeben werden...
//Weil wir auch Variablen verwenden machen wir auch kein ?\> 
//und verwenden html, sondern machen weiter mit php ;p

echo "

Charaktername:

Passwort:

Wertx:

usw…
";
?>

so mal das konstrukt in meinem Kopf (wenn das jetzt funktionieren würde dann hab ich mir aber was verdient, gell :stuck_out_tongue_winking_eye:)

So…das Ganze ist fast fertig. Einzig an der Passwortabfrage hake ich. Und ich weiss jetzt auch warum. Der Vergleich meiner Passwörter scheint nicht hinzuhauen, angeblich wird immer das falsche Passwort eingegeben, auch wenn das sicher nicht der Fall ist.
Ich hab mir beide Werte (md5) mal ausgeben lassen. Die sind bis zu einer gewissen Stelle identisch, nur an dem eingegebenem Passwort hängt noch mehr dran. Woher kommt das? Ich poste mal nen Codeschnipsel dazu:

$ID = $HTTP_POST_VARS[„ID“];
$PW = $HTTP_POST_VARS[„Passwort“];
$Pass = md5($PW);

$abfrage = „SELECT Passwort FROM hsg_user WHERE ID=$ID“;
$ergebnis = mysql_query($abfrage)OR die (mysql_error());
while ($daten = mysql_fetch_array($ergebnis)) {
if ($Pass=="$daten[Passwort]") {
echo „Das Passwort war richtig! Glückwunsch!“;
}
else {
echo „Das Passwort war nicht richtig…angeblich!“;
}
}
?>

Riesen Dank an den, der mir sagt, was ich schon wieder falsch mache…

Nadine,
die jetzt schlafen geht

ich vermute mal
dass da ein nicht ganz richtiger Wert in der Datenbank steht… evtl hast Du beim insert den string nicht in Gänsefüsschen gesetzt, oder ein leerzeichen hintendran stehen lassen…
Gib Dir am besten an verschiedenen Werten die inhalte aus… damit kannst Du dann fehleranalyse betreiben…

Fehleranalyse habe ich ja bereits ein wenig betrieben. Wenn ich einen neuen Char in die DB schreibe mit PW „druck“, Ohne die Gänsefüsschen, und genau dieses PW eingebe zum Bearbeiten, dann ist es falsch. ich habe mir mal nur die MD5-Prüfsummen ausgeben lassen von dem PW dass in der DB steht und dem per md5 frisch verschlüsseltem neuen pw. Bei dem neuen hängen ein paar Zeichen mehr dran…warum auch immer.
Ich verzweifle.

Nadine

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Okay…Ich bin ein Noob, ich gebs ja zu, aber so ein dämlicher Fehler? Ich habe eben den Fehler entdeckt. Zu blöd, wenn man für ein MD5-verschlüsseltes Passwort eine Begrenzung von Zeichen bei 20 setzt, oder? *weglach*
Hab sonst anscheinend alles richtig gemacht. Nachher mache ich mich dann an den Teil mit dem Updaten, aber da sehe ich eigentlich keine Probleme, dass ist ja eine simple Anwendung, die ich statt der echo-Ausgabe in die If-Anweisung schreibe, ne?

Nadine

genau :smile:
viel erfolg :wink:

viel erfolg :wink:

Danke, den hatte ich und das ist unter anderem dir zu verdanken :smile:
Also nochmal ganz herlich: DANKE!

Nadine