[PHP/MySQL]Datenbanken
-
mittels mysql_fetch_* liest du immer nur eine zeile aus dem recordset aus.
lies dir doch mal n tutorial zu PHP/MySQL durch...
-
hmm... hab dazu nix gefunden... ahja, kann mir jemand sagen, was an dem Code wieder falsch ist?!
<?php session_start(); $db = mysql_connect(); $sql = "SELECT passwort FROM user WHERE id='$id'"; $res = mysql_query($sql, $db); $pw = mysql_fetch_row($res); print ("<a href=forum.php>Forum</a> ::|:: <a href=logout.php>Logout</a> ::|:: <a href=member.php>Member</a> ::|:: <a href=profil.php>Profil</a> </td></tr><tr><td>"); if ($pw[0] != $pwalt) { print ("Falsches Passwort!<br><br><a href=chp.php>Zurück</a>"); } else if ($pwneu == "") { print ("Kein Passwort angegeben!<br><br><a href=chp.php>Zurück</a>"); } else if ($pwneu != $pwneuwdh) { print ("Passwörter stimmen nicht überein!<br><br><a href=chp.php>Zurück</a>"); } else { $sql1="UPDATE user SET passwort='$pwneu' WHERE id='$id'"; mysql_query($sql1, $db); print ("Passwort geändert! <br><br> <a href=forum.php>Zum Forum</a>"); } ?>
-
Original erstellt von MasterDeath:
hab dazu nix gefunden...schlichtweg eine lüge! google findet hier etwa 355.000 (in worten: dreihundertfünfundfünfzigtausend) treffer, und gleich auf der 1. seite sind 3 brauchbare tuts!
zu deinem problem: versuch mal hinter die queries ein ; zu hängen. also etwa so:
$query = "Update user SET password='$neu' WHERE id='$id';";
btw: du musst umbedingt sicherheitskontrollen bei den strings durchführen, die du in deinen query packst. überleg mal, was ist, wenn ich in $neu folgendes reinschreib: "mypwd' WHERE id=0;"...
-
"mypwd' WHERE id=0;"...
ID ist ein String und den kennt nur der User selbst und der Admin (also ich ;)) kann da als einziger reingucken
Aber zu meinem eigentlichen Problem: wenn das nicht mit mysql_fetch_* geht, dann welchen Befehl soll ich stattdessen nehmen? mysql_result?
Ahja, das mit dem ";" hat geklappt, thx
[ Dieser Beitrag wurde am 14.05.2003 um 13:31 Uhr von MasterDeath editiert. ]
-
Original erstellt von MasterDeath:
[QB]ID ist ein String und den kennt nur der User selbst und der Admin (also ich ) kann da als einziger reinguckenglaubst du... wenn ich in so nem system hacken will, hab ich gleich 1 oder 2 namen herrausen
wenn id ein string ist, dann wirds halt bei admin logischer weise admin heissen, also mach ich einfach aus dem id=0 ein id='admin' und hab die table geändert. die überprüfung, die du machen musst, ist allein die, dass du ' und " durch \' und \" ersetzen musst (oder irgendwie rausfiltern) damit man den query nicht vorzeitig nach seinen wünschen umbauen kann.zu deinem andauernden problem: lies doch endlich mal eins von diesen tuts. noch ein kleiner tip:
while ($row = mysql_fetch_row($result)) { ... }
holt solang ein result, bis alle auf den query zutreffenden zeilen da waren. wenn du nur die erste willst, dann brauchst nur einmal zu machen. also müsste dein dings funktionieren. lass dir halt mal debug mässig alle strings und queries ausgeben, bevor du was machst damit
-
Ist dann jetzt alles klar?
-
ok, jetzt hab ich's verstanden
-
id als string ist ja lahm wie sau...
eine id hat immer ein int zu sein, sonst tut sich mysql so schwer bei index...
-
ich mach meine ids immer mit md5 - also 32 Zeichen lang und alle Hex-Zeichen
Nimmst du für sowas dann immer einen int, oder wie sehen bei dir ids aus?
-
Original erstellt von flenders:
Nimmst du für sowas dann immer einen int, oder wie sehen bei dir ids aus?id ist bei mir der index (und eigentlich habe ich es noch nie anders gesehen)
id ist int auto_increment primary_keywas für IDs meinst du?
-
ich verwende so IDs oft zum verknüpfen von Einträgen (z.B. eine cat_id und bei Produkten dann eine id und ein Feld mit cat, in dem dann steht, aus welcher Kategorie es ist)
-
das machen wir immer mit int (meistens tiny int)
int ist einfach das schnellste - und die id ist ja egal, die braucht man ja nur zum verküpfen - also muss die keinen aussagekräftigen namen haben...
sollte ich wirklich mal den namen brauchen - kann ich n join machen.
aber meistens interessiert der name der kategorie ja nicht.und ein varchar(32) ist wirklich lahm im vergleich zu einem int.
vorallem: womit begründest du den overhead?mit int ist es ideal - du machst auto_increment und schwupps brauchst du dich von der programmiertechnischen seite nicht mehr darum kümmern, denn die datenbank erledigt es für dich immer nur unique ids zu haben, eine passende id zu wählen und zusätzlich noch extrem schnelles lookup.
und wo liegen die vorteile bei einem varchar(32) mit md5?
-
sie sind fälschungssicherer (werden häufig per URI übergeben), also halt nicht ganz so leicht manipulierbar
Hab es mir irgendwie von den Session-IDs her so angwöhnt und bei meinen Projekten kam es bisher noch nie so sehr auf Geschwindigkeit an[ Dieser Beitrag wurde am 14.05.2003 um 17:30 Uhr von flenders editiert. ]
-
Original erstellt von flenders:
sie sind fälschungssicherer sind (werden häufig per URI übergeben), also halt nicht ganz so leicht manipulierbarwir machen da lieber eine sicherheitsabfrage ob der user diese daten sehen darf.
das ist schnellerer und sicherer.beispiel:
thread_id
wenn der user den thread nicht sehen darf, wird ihm ne fehlerseite gezeigt.das einzige wo wir das mit md5 machen ist bei der id für downloads - da nicht jeder zugriff auf alle downloads hat und die downloads ja nicht direkt mit dem beitrag (bei uns) assoziiert sind.
aber generell ist es keine gute idee
nachtrag:
geschwindigkeit ist gerade im web signifikant
und was machst du wenn der user trotzdem auf die id draufkommt (zB bruteforce, oder hat es beim vorbeigehen bei einem kumpel gesehen oder jemand hat die URL einfach copy & paste irgendwo hingespeichert)da musst du zusätzlich also auch noch checken ob der user zugriff hat - das kommt doch alles viel zu teuer...
[ Dieser Beitrag wurde am 14.05.2003 um 17:37 Uhr von Shade Of Mine editiert. ]
-
jo, wäre wohl besser / sicherer - werd's mir für die Zukunft merken