Ob Datensatz schon existiert!
Cedrixxx
- datenbank
1 Patrick Figel0 dedlfix
0 Jonathan0 Horst0 Patrick Figel0 Horst
1 Vinzenz Mai
0 Tom
Hay,
ich habe ein kleines php-Script und will testen, ob ein gewisser Datensatz schon existiert. Ich habe schon viele Vorschläge, aber keiner hat funktioniert. Hier ist das Script:
<?
// ueberpruefen, ob username schon existiert!
$db_host = "localhost";
$db_user = "web252";
$db_pwd = "geheim";
mysql_connect($db_host,$db_user,$db_pwd);
mysql_select_db("usr_web252_1");
// Sql-Befehl
$username = $_POST['username'];
$sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";
// Befeh ausführen
if ($resultat = mysql_query($sql_befehl)) {
echo "Der Username ist schon vergeben!";
mysql_close();
exit;
}
mysql_close();
?>
Irgendwie gibt es auch die Meldung, dass der Datensatz existiert, wenn er in Wirklichkeit nicht existiert. Kann Jemand bitte meinen Code verbessern und ihn hier posten??? Wäre sehr nett.
MfG
Cedric N.
mysql_query() gibt false nicht etwa zurück, wenn kein Datensatz gefunden wurde, sondern wenn es einen Fehler gab.
Verwendet mysql_num_rows() o.ä., da kannst du dann einfach überprüfen, ob mysql_num_rows($resultat) > 0 ist.
echo $begrüßung;
mysql_query() gibt false nicht etwa zurück, wenn kein Datensatz gefunden wurde, sondern wenn es einen Fehler gab.
Verwendet mysql_num_rows() o.ä., da kannst du dann einfach überprüfen, ob mysql_num_rows($resultat) > 0 ist.
Wenn man nur die Anzahl der Datensätze ermitteln möchte, ist mysql_num_rows() nicht der richtige Weg, obwohl er zum Ergebnis führt. Um die Anzahl der Datensätze ermitteln zu können, muss PHP diese zunächst vom DBMS auslesen, sie also zu sich übertragen. Dies macht es bei jedem Aufruf von mysql_query() unbemerkt im Hintergrund. Vergleiche mysql_unbuffered_query(). Sie dann nach einer Nur-Zählung wegzuwerfen verbraucht nur unnötig Ressourcen.
Um Datensätze zu zählen, sollte man besser SELECT COUNT(*) AS anzahl FROM ... verwenden. Dabei entsteht eine Ergebnisdatenmenge von einer einzigen Zeile, die man auf dem üblichen Weg abfragen kann.
echo "$verabschiedung $name";
Hallo Cedrixxx,
$username = $_POST['username'];
$sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";
Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?
Jonathan
Hi,
$username = $_POST['username'];
$sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?
Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?
Viele Grüße,
Horst
Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?
Mit mysql_real_escape_string().
$sql_befehl = "SELECT * FROM members WHERE userNAME='".mysql_real_escape_string($username)."'";
Hi,
Mit mysql_real_escape_string().
$sql_befehl = "SELECT * FROM members WHERE userNAME='".mysql_real_escape_string($username)."'";
Ja danke!
Viele Grüße auch an Vinzenz und die Anderen,
Horst
Hallo
$username = $_POST['username'];
$sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?
Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?
Zum Beispiel mit
$sql_befehl = "SELECT userNAME FROM members WHERE userNAME = ". [link:http://www.php.net/manual/de/function.mysql-real-escape-string.php@title=mysql_real_escape_string]($_POST['username']);
Daten sind stets kontextgemäß zu maskieren. Natürlich sollten dabei derzeit noch die unsäglichen Magic Quotes berücksichtigt werden, so wie es auf der Handbuchseite von mysql_real_escape_string() steht.
Freundliche Grüße
Vinzenz
Hello,
Wie ich sehe, wurde Deine Frge bisher nicht beantwortet...
<?php ### keine short-open-tags benutzen!
// ueberpruefen, ob username schon existiert!
$db_host = "localhost"; ### diese Daten sollten später ausgelagert werden
$db_user = "web252"; ### möglichst in eine Datei außerhalb des Doc-Root
$db_pwd = "geheim"; ### und dann mit require_once() zugeladen werden
$con = mysql_connect($db_host,$db_user,$db_pwd); ### Den Link-Identifier (Handle) benötigt
### man später noch!
if (!$con) ### Keine Verbindung zum Datenbankserver verfügbar
{
html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
exit; ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
}
$db = mysql_select_db("usr_web252_1"); ## Auch diesen Link-Identifier könnte
## man später noch brauchen
if (!$db) ### Keine Verbindung zur angeforderten Datenbank
{
html_ausgebe($fehlermeldung, "Die angeforderte Datenbank ist nicht auffindbar: ");
exit; ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
}
// Sql-Befehl
$username = mysql_real_excape_string($_POST['username']); ### nagic_quotes_gpc sind aus
### Die Datenübernahme sollte man nicht mitten im Script machen, sondern gleich am Anfang
### dort können dann ggf. auch Maskierungen (Magic Quotes) gleich entfernt werden, falls
### das "Feature" eingeschaltet ist
$fieldlist = "id\_menbers
, userName
"; ### oder was man wirklich braucht
### bitte keine Queries auf '*' durchführen, wenn Du nicht wirklich ALLE Spalten benötigst
$sql_befehl = "SELECT $fieldlist FROM members
WHERE userNAME
='$username'";
// SQL-Query ausführen
if ($resultat = mysql_query($sql_befehl))
{
if(mysql_num_rows($resultat) > 0)
{
mysql_close($con);
html_ausgabe($fehlermeldung, "Der Username ist schon vergeben!";
exit;
}
}
else ### es konnte keine Abfrage durchgeführt werden
{
mysql_close($con);
html_ausgabe($fehlermeldung, mysql_error($con));
exit;
}
### hier normal weiterarbeiten.
### nicht vergessen: Resultset wieder freigeben, wenn man es nicht mehr braucht
?>
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Oke, danke viel mal, werde es gerade testen!
Hab schon viele Foren gesehen, aber das hier ist wohl eines der Besten. Vielen Dank
Cedrixxx
Hallo Cedrixxx!
^^^
Ah, hast Du auch eine Logitech-Tastatur bei der abwechselnd die xxx- oder die +-Taste klemmen?
Gestern war +, heute ist es wieder xxxxx (wie man sieht) ;)
Viele Grüße aus Frankfurt/Main,
Patrick
Nein, eigentlich nicht. Also wenn mal Cedri+++ oder so stand, dann wars nicht ich.
Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)
Gruss
CedrixXx (besser? =) )
Hallo Cedrixxx!
Also wenn mal Cedri+++ oder so stand, dann wars nicht ich.
Nein, ich meinte bei _meiner_ Logitech spinnte gester die +-Taste, heute ist es wieder die xxxx-Taste ;)
Somit brauche ich nur Cedrixxxx mit nur einem X zu tippen und erhalte Deinen Nick (ja, manchmal kommt noch ein xx dazu) ;)
Mir ist aber lieber, dass wie heute das xxxx spinnt, denn das + braucht man beim Proggen öfters, und da heißt es aufpassen!
Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)
Bei mir wird es die letzte Logitech gewesen sein: die erlauben sich einfach zu viel, wie die [Einf]-Taste aus dem POS1/BILD/ENDE-Block einfach entfernt und wo anders, fast unsichtbar, platziert zu haben. Stattdessen hat die Taste eine Uhr und ein Taschenrecher, wer braucht denn sowas (die Uhrzeit habe ich in der Systray immer im Blickfeld und calc.exe ist eh besser als ein Rechner auf der Tastatur)?
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo Patrick,
Nein, ich meinte bei _meiner_ Logitech spinnte gester die +-Taste, heute ist es wieder die xxxx-Taste ;)
Somit brauche ich nur Cedrixxxx mit nur einem X zu tippen und erhalte Deinen Nick (ja, manchmal kommt noch ein xx dazu) ;)
das ist bei meiner Tastatur (Generalkeys) der Fall, wenn die Akkus fast leer sind. Erst werden einfach ein paar Buchstaben "vergessen" (ist Mist, wenn man sich seinen Text nicht nochmal durchliest), dann klemmt auf einmal eine gerade betätigte Taste. Der Buchstabe wird dann so lange wiederholt, bis man die Akkus herausnimmt.
Wenn ich also mal einen Text mit fehlenden Buchstaben hier schreibe, war einfach der Akku fast leer. ;-)
Bei mir wird es die letzte Logitech gewesen sein: die erlauben sich einfach zu viel, wie die [Einf]-Taste aus dem POS1/BILD/ENDE-Block einfach entfernt und wo anders, fast unsichtbar, platziert zu haben. Stattdessen hat die Taste eine Uhr und ein Taschenrecher, wer braucht denn sowas (die Uhrzeit habe ich in der Systray immer im Blickfeld und calc.exe ist eh besser als ein Rechner auf der Tastatur)?
Das ist natürlich blöd, weil man sich ja doch an die normale Tastenanordnung gewöhnt hat. Da verzweifle ich immer, wenn ich mal mit dem Notebook arbeiten muss.
Viele Grüße
Jörg
Hallo Jörg!
Der Buchstabe wird dann so lange wiederholt, bis man die Akkus herausnimmt.
Akkus scheinen aber nicht leer zu sein, und das jeweilige Zeichen wird nur ein paar Mal wiederholt: xxxxx xxxx xxxx xxxx xxxx. Und heute ist definitv xxxxx betroffen ;)
Da verzweifle ich immer, wenn ich mal mit dem Notebook arbeiten muss.
Da verzweifle ich nicht, da fluche ich ;)
Viele Grüße aus Frankfurt/Main,
Patrick
Re!
Und heute ist definitv xxxxx betroffen ;)
Heute ist es das ßßßß. Wie süßßßß!
Viele Grüße aus Frankfurt/Main,
Patrick
Guten Morgen,
Und heute ist definitv xxxxx betroffen ;)
Heute ist es das ßßßß. Wie süßßßß!
hmmmmmmmmmmm … ;-)
Viele Grüße
Jörg
Hi,
Und heute ist definitv xxxxx betroffen ;)
ist das ein neuer Pr0n-Sender, "Defini-TV XXX"?
*scnr*
Schönen Sonntag noch!
O'Brien
Hi,
Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)
wieso tut _die_ Tastatur _seinen_ Dienst?
Derartige Formulierungen fallen mir in letzter Zeit imer häufiger, sogar in den Printmedien, auf. :-(
Schönen Sonntag noch!
O'Brien
Hallo,
danke viel Mal für dieses Script.
Funktioniert Tadellos!
Merci MfG
CedrixXx
Guten Morgen Tom!
Wie ich sehe, wurde Deine Frge bisher nicht beantwortet...
Wie ich sehe bist du noch nicht ganz munter ... :-)
if (!$con) ### Keine Verbindung zum Datenbankserver verfügbar
{
html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
exit; ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
}
Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn. Der Anwender, der sie zu lesen bekommt kann sowieso nichts damit anfangen, geschweige denn am Zustand was ändern. Eine unspezifische Vertröstmeldung und eine Benachrichtigung des Administrators (z.B. per Mail) wäre in meinen Augen sinnvoller. (Das muss man ja nicht in aller Schönheit hier darstellen, aber die Fehlerbehandlung in der Richtung anzudeuten fände ich sinnvoller.)
$db = mysql_select_db("usr_web252_1"); ## Auch diesen Link-Identifier könnte
## man später noch brauchen
mysql_select_db() gibt ein booleschen Wert zurück, keinen Linkidentifier. Aber es schadet nicht, den Linkidentifier vom Connect hier explizit als Argument anzugeben (dito bei mysql_query()).
echo "$verabschiedung $name";
Hello,
Wie ich sehe bist du noch nicht ganz munter ... :-)
*gähn*
if (!$con) ### Keine Verbindung zum Datenbankserver verfügbar
{
html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
exit; ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
}Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn.
Es hat wohl Sinn, grundsätzlich eine valide HTML-Seite auszugeben und dem Client keinen losen String mit "die()" entgegenzuschleudern.
In dieser Seite sollten dann auch geeignete Rücklinks zum Projekt enthalten sein und eine kleine Erkläreung/ Entschuldigung, warum der User die angefragte Leisttung nicht erhalten hat.
$db = mysql_select_db("usr_web252_1"); ## Auch diesen Link-Identifier könnte
## man später noch brauchenmysql_select_db() gibt ein booleschen Wert zurück, keinen Linkidentifier.
Danke, das stimmt wohl ;-)
Aber abfragen sollte man das Ergebnis schon, dafür ist es nämlich da!
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
echo $begrüßung;
Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn.
Es hat wohl Sinn, grundsätzlich eine valide HTML-Seite auszugeben und dem Client keinen losen String mit "die()" entgegenzuschleudern.
Ja, da stimme ich mit dir überein. die() ist schlechter, benutzerunfreundlicher Stil. Die Meldung in den sonst üblichen Seitenaufbau zu integrieren, so dass auch die Menüs, Fußzeilen und dergleichen zu sehen sind, ist wesentlich angenehmer für den Anwender.
In dieser Seite sollten dann auch geeignete Rücklinks zum Projekt enthalten sein und eine kleine Erkläreung/ Entschuldigung, warum der User die angefragte Leisttung nicht erhalten hat.
Den Benutzer interessieren aber die Details des Datenbankabfragefehlers nicht. Er muss im Prinzip noch nicht mal wissen, dass eine Datenbank im Spiel ist. Er kann bei dieser Art von Fehler nichts weiter ausrichten, weswegen er auch keine Details benötigt. Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)
echo "$verabschiedung $name";
Hello,
Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)
Da stimme ich Dir nun wieder zu.
HTTP ud seine Entwicklungsstufe nebst HTML-Spezifikationen sind immer noch arg verbesserungswürdig.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Moin!
Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)
Da stimme ich Dir nun wieder zu.
HTTP ud seine Entwicklungsstufe nebst HTML-Spezifikationen sind immer noch arg verbesserungswürdig.
500 Internal Server Error paßt doch perfekt.
- Sven Rautenberg
Hello,
[...] aber diesen HTTP-Statuscode scheint es nicht zu geben.)
500 Internal Server Error paßt doch perfekt.
Man soll ja auch bloß nicht zuviel verraten,
lieber wieder ein paar bunte Bilder mitschicken ;-)
Aber einen passenden Rücklink sollte man dem User schon mitsenden.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Moin!
500 Internal Server Error paßt doch perfekt.
Man soll ja auch bloß nicht zuviel verraten,
lieber wieder ein paar bunte Bilder mitschicken ;-)
Welchen Menschen interessiert denn der HTTP-Statuscode? Das ist ein Maschinencode für Maschinen. Für den Menschen ist der HTTP-Body relevant.
- Sven Rautenberg
Hello,
Man soll ja auch bloß nicht zuviel verraten,
lieber wieder ein paar bunte Bilder mitschicken ;-)Welchen Menschen interessiert denn der HTTP-Statuscode? Das ist ein Maschinencode für Maschinen. Für den Menschen ist der HTTP-Body relevant.
Sag ich doch ;-)
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom