php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.05.2008, 20:10  
Benutzer
 
Registriert seit: 11.05.2008
Beiträge: 71
PHP-Kenntnisse:
Fortgeschritten
prestige
prestige eine Nachricht über ICQ schicken
Standard Account --> löschen

Hallo,

Ich hätte da mal eine Frage an euch. Ich habe einen Login + Registrierungsscript, die astrein funktionieren.

Doch die User sollen sich ja auch löschen können. Ich komme hier aber leider nicht mehr weiter. Schaut bitte mal den script (PHP) an.

PHP-Code:
<?php
// Session starten
session_start ();

// Datenbankverbindung aufbauen
$connectionid mysql_connect ("localhost""phostXXX""PW");
if (!
mysql_select_db ("phostXXX"$connectionid))
{
  die (
"Keine Verbindung zur Datenbank");
}

$sql1 "SELECT ".
        
"ID, username".//vielleicht noch mehr
        
"FROM ".
        
"benutzerdaten ".
        
"WHERE ".
     
"(Nickname like '".$_REQUEST["name"]."') AND ".
     
"(Kennwort = '".md5 ($_REQUEST["pwd"])."')";

$sql2 "DELETE ".
        
"FROM ".
        
"benutzerdaten ".
        
"WHERE ".
     
"(Nickname like '".$_REQUEST["name"]."') AND ".
     
"(Kennwort = '".md5 ($_REQUEST["pwd"])."')";
session_destroy();
?>

Ausserdem bräuchte ich noch eine kleine "if-Schlaufe", die überprüft ob der User gelöscht wurde.

Danke schon mal im Voraus.
__________________
Genau das wollte ich auch gerade sagen ^^
prestige ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 11.05.2008, 21:14  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Und ewig grüßt die if-Schlaufe
nikosch ist offline  
Alt 12.05.2008, 11:34  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard

1.
Man löscht normalerweise NIE einen User aus der Datenbank, sondern setzt nur den Wert eines Feldes. (Bspw. aktiv = '0')
Wenn Du ein größeres System mit Logs und anderen Verbindungen hast, kann sich das Löschen eines Eintrags bei Benutzern oder ähnlich wichtigen Tabellen ganz, ganz böse auswirken.




2.
Wieso benutzt Du LIKE in Deinen SQLs? Mal abgesehen davon, dass LIKE für eine Datenbank einer der schlimmsten Befehle ist (Stichwort: Performance), solltest Du den Nicknamen des Benutzers genau kennen, den Du löschen willst:

Code:
$sql = "DELETE FROM benutzerdaten WHERE Nickname = '" . $_REQUEST["name"] . "'";
Da wir aber ja sowieso nicht wirklich löschen wollen, solltest Du ein zusätzliches Feld "aktiv" erstellen und folgenden SQL ausführen:

Code:
$sql = "UPDATE benutzerdaten SET aktiv = '0' WHERE Nickname = '" . $_REQUEST["name"] . "'";



3.
Ein Nickname sollte (wenn es sich auch gleichzeitig um den Loginnamen handelt) auf jeden Fall absolut eindeutig sein. Deshalb ist die zusätzliche Einschränkung "...AND Kennwort..." hinfällig.




4.
Mein persönlicher Geschmack: Tabellennamen und -felder sollten grundsätzlich klein geschrieben werden.




5.
Um nun herauszufinden, ob ein User "gelöscht" wurde und ob damit bspw. sein Nickname als Loginname wieder verwendet werden darf:

Code:
$sql = "SELECT id FORM benutzerdaten WHERE Nickname = '" . $_REQUEST["name"] . "' AND aktiv = '0'";
(Funktioniert natürlich nur, wenn Du ein Feld "id" in der Tabelle hast, aber davon ist mal auszugehen, denn JEDE Tabelle sollte ein eindeutiges Feld als Primärschlüssel haben, sofern man keinen zusammengesetzten Schlüssel nutzt.)




6.
Du solltest Dir schon im Klaren darüber sein, ob Du Daten per GET oder POST bekommst und nicht "stumpf" $_REQUEST nutzen. Das kann ebenfalls mal sehr böse enden.




7.
Code:
$sql1 = "SELECT ". 
        "ID, username".//vielleicht noch mehr 
        "FROM ". 
        "benutzerdaten ". 
        "WHERE ".
Hinter "username" fehlt auf jeden Fall auf Leerzeichen, damit der SQL ausgeführt werden kann...


Ich hoffe, ich konnte helfen.

cya
vollkommenegal ist offline  
Alt 12.05.2008, 11:43  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von vollkommenegal
1.
Man löscht normalerweise NIE einen User aus der Datenbank, sondern setzt nur den Wert eines Feldes. (Bspw. aktiv = '0')
Wenn Du ein größeres System mit Logs und anderen Verbindungen hast, kann sich das Löschen eines Eintrags bei Benutzern oder ähnlich wichtigen Tabellen ganz, ganz böse auswirken.
Das ist nicht richtig. Wenn der User _seine Daten_ löschen möchte oder von dir verlangt sie zu löschen dann hast du sie auch wirklich zu löschen.

Das es in größeren Systemen nicht damit getan ist einfach den Eintrag in der Benutzer-Tabelle zu löschen sondern auch noch Einträge in etlichen verknüpften Tabellen ist dein Problem und deine Aufgabe.
Was sich da "ganz böse" auswirken kann ist mir schleierhaft. Du musst dir halt vorher Gedanken machen was du, (evtl. in welcher Reihenfolge) löschen musst...
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 12.05.2008, 11:51  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard

Na ja, wir müssen da schon etwas differenzieren: Handelt es sich um eine Firma, also um Daten von Kunden, die Ware bestellt/bezahlt haben, so ist das Löschen auf gar keinen Fall möglich. (Nicht zuletzt, weil solche Daten zwecks Prüfung durch das Finanzamt 10 Jahre lang aufgewahrt werden müssen.)

Handelt es sich bei dem System bspw. um ein Forum könnte man den Datensatz dahingehend updaten, dass man zwar die personenbezogenen Daten löscht (Name, Adresse usw.), aber der Nickname bestehen bleibt, denn das ist kein Datum (Einzahl von Daten!), aus dem "personenbezogenen Daten"-Bereich und somit datenschutz-technisch nicht relevant.

Mit "ganz böse" meine ich halt, dass Verbindungen nicht mehr korrekt sind und ins Leere laufen, was ich nun einmal als nicht besonders gut empfinde. (Ist aber wohl eine persönliche Meinung. Ich hab halt mal gelernt, dass Daten konsistent sein müssen und Link-Leichen für die Produktivität, Stabilität und Sicherheit eines Systems nicht förderlich sind.)

cya
vollkommenegal ist offline  
Alt 12.05.2008, 14:25  
Benutzer
 
Registriert seit: 11.05.2008
Beiträge: 71
PHP-Kenntnisse:
Fortgeschritten
prestige
prestige eine Nachricht über ICQ schicken
Standard Danke

Hallo, danke für die vielen Tipps.

Es ist so, dass sich das Login nur auf private Personen im Jugendalter
ca. (12- 17 J) bei mir einloggen.

Man kann sich bei mir nur löschen, wenn man sich angemeldet(eingeloggt ist) hat.

Wenn ich noch ein java script mit: alert ("Wollen sie sich wirklich löschen")
einbaue, kann ich doch die Daten ganz löschen oder?

Man hat mir noch geraten den Benutzername zu behalten, weil wenn der weg ist, kann es zu Verwirrungen kommen.

Ich verwende für diesen script die --> methode="post".


Nun zum script allgemein.

Wäre das jetzt richtig so ??


PHP-Code:
<?php
// Session starten
session_start ();

// Datenbankverbindung aufbauen
$connectionid mysql_connect ("localhost""phost105706""fabweb92");
if (!
mysql_select_db ("phost105706"$connectionid))
{
  die (
"Keine Verbindung zur Datenbank");
}
$sql1 "UPDATE benutzerdaten SET Aktiv = '0' WHERE Nickname = '" $_REQUEST["name"] . "'";
session_destroy();
if (
$sql2 "SELECT id FORM benutzerdaten WHERE Nickname = '" $_REQUEST["name"] . "' AND Aktiv = '0'")
{
echo 
"Benutzer erfolgreich gelöscht";
}
else
{
echo 
"Ein Fehler ist aufgetreten.";
}
?>
In der db habe ich natürlich noch das Feld "Aktiv" angelegt.

Es steht zwar nachher im Browser "Benutzer erfolgreich..." aber man kann sich noch weiter einloggen.

Der Grund : Die Zeile "Aktiv" verändert sich nicht dh. sie bleibt leer.
Könntest du mir mal den Code für die Tabelle noch sagen? Die Tabelle ist im Moment so aufgebaut

Code:
CREATE TABLE benutzerdaten (
  Id Int(11) NOT NULL auto_increment,
  Nickname VarChar(50) NOT NULL default '',
  Kennwort VarChar(50) NOT NULL default '',
  Nachname VarChar(50) NOT NULL default '',
  Vorname VarChar(50) NOT NULL default '',
  Alte VarChar(50) NOT NULL default '',
  Ort VarChar(50) NOT NULL default '',
  Plz VarChar(50) NOT NULL default '',
  PRIMARY KEY (Id)
)
__________________
Genau das wollte ich auch gerade sagen ^^
prestige ist offline  
Alt 12.05.2008, 17:37  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard Re: Danke

Zitat:
Zitat von habbohighs
Der Grund : Die Zeile "Aktiv" verändert sich nicht dh. sie bleibt leer. Könntest du mir mal den Code für die Tabelle noch sagen? Die Tabelle ist im Moment so aufgebaut

1.
Erstens heißt das nicht "Zeile", sondern Feld oder Tabellenfeld und zweitens sehe ich in der "CREATE TABLE"-Anweisung kein Feld "Aktiv", was mich zu der Frage bringt: Wie oder wo siehst Du, dass sich das Feld "Aktiv" nicht verändert bzw. leer bleibt?




2.
Da Du (was völlig richtig ist) nur mit Passwort-Hashes arbeitest, kannst Du beim Passwort-Feld mit VARCHAR(32) arbeiten, denn ein MD5-Hash wird immer nur genau 32 Zeichen lang sein.




3.
Du musst nach der Deklarierung von $sql1 natürlich auch den QUERY an die Datenbank schicken und den SQL damit ausführen:
Code:
$result = mysql_query($sql, $connectionid);



4.
Wenn Du abfragst, ob der Result (also das Ergebniss) Deines Queries TRUE war, reicht das für die Bestätigung aus, dass der Benutzer nun gelöscht wurde:
Code:
$sql1 = "UPDATE benutzerdaten SET Aktiv = '0' WHERE Nickname = '" . $_REQUEST["name"] . "'";
$result = mysql_query($sql1, $connectionid);
if ($result)
{
    session_destroy(); 
    echo "Benutzer erfolgreich gelöscht";
}
else
{
    echo "Ein Fehler ist aufgetreten.";
}

Wenn Du aber schon unbedingt $sql2 ausführen willst, musst Du auch hierfür den SQL an die Datenbank senden:
Code:
$result = mysql_query($sql2, $connectionid);
Hier die Tabelle, so wie ich sie in etwa machen würde. Einiges würde ich noch ändern, denn statt dem "Alter" würde ich natürlich das Geburtsdatum speichern. Aber ansonsten kann man damit erst einmal arbeiten, denke ich. (Man muss ja auch etwas haben, was man mal optimieren kann. )

Code:
CREATE TABLE benutzerdaten ( 
  id Int(11) NOT NULL auto_increment, 
  nickname VarChar(50) NOT NULL default '', 
  kennwort VarChar(32) NOT NULL default '', 
  nachname VarChar(50) NOT NULL default '', 
  vorname VarChar(50) NOT NULL default '', 
  alte VarChar(50) NOT NULL default '', 
  ort VarChar(50) NOT NULL default '', 
  plz VarChar(10) NOT NULL default '', 
  aktiv Char(1) NOT NULL default '', 
  PRIMARY KEY (id) 
)
Falls Du das so übernehmen willst: Nicht vergessen, die Felder in Deinem PHP-Code klein zu schreiben, sonst könnte es zu Problemen kommen!

cya
vollkommenegal ist offline  
Alt 12.05.2008, 17:46  
Benutzer
 
Registriert seit: 11.05.2008
Beiträge: 71
PHP-Kenntnisse:
Fortgeschritten
prestige
prestige eine Nachricht über ICQ schicken
Standard

Danke für deine Antwort.

Was die "benutzernamen" Tabelle betrifft, (hätte ich villeicht noch erwänen sollen) habe ich die gleichen Angaben genommen, ohne danach diese PHP Datei zu aktualisieren. .

Ich werde deine Tipps befolgen und nochmals den script anpassen

Danke du hast mir sehr geholfen.
__________________
Genau das wollte ich auch gerade sagen ^^
prestige ist offline  
Alt 12.05.2008, 18:01  
Erfahrener Benutzer
 
Registriert seit: 27.08.2004
Beiträge: 239
vollkommenegal
Standard

Zitat:
Zitat von habbohighs
Danke du hast mir sehr geholfen.
Immer gern.

cya
vollkommenegal ist offline  
Alt 12.05.2008, 19:04  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard Re: Danke

Zitat:
Zitat von habbohighs
Man kann sich bei mir nur löschen, wenn man sich angemeldet(eingeloggt ist) hat.
Und warum baust Du dann Dein SQL Statement aus Requestparametern? Dann kann ja jeder eingeloggte User fremde Datensätze löschen.

Schreib nach dem Login den User in die Session und benutze fortan Sessiondaten.
nikosch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Account löschen? CIX88 Board-Support 6 31.07.2008 00:44
User Account freischalten per Email Link litterauspirna PHP Tipps 2008 7 17.05.2008 21:40
Account gelöscht phpdummi Off-Topic Diskussionen 8 08.09.2007 12:57
Account gelöscht? louis Off-Topic Diskussionen 54 03.08.2006 00:18
php email account PHP Tipps 2006 1 03.03.2006 12:46
ftp account erstellen in confixx umgebung PHP-Fortgeschrittene 5 15.02.2006 20:41
FTP Account via php erstellen pehape Server, Hosting und Workstations 9 14.01.2006 10:50
FTP Account per PHP erstellen lassen PHP-Fortgeschrittene 1 27.09.2005 20:45
[Erledigt] Mit Yahoo Mess. mit Usern auf Website ohne account chatten PHP-Fortgeschrittene 10 18.09.2005 22:02
mail account anlegen mack|dawg PHP Tipps 2005 5 30.05.2005 21:49
Datenbank weg? Account gelöscht, aber Daten vorhanden! Datenbanken 3 21.04.2005 12:29
[Erledigt] Möchte jemand einen GMail Account? Off-Topic Diskussionen 23 06.01.2005 17:18
account nach klick in mail auf confirm-link freischalten PHP-Fortgeschrittene 7 11.09.2004 21:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
yahoo account löschen, delete mitglied php, php profil löschen script, user löschen php mit bestätigungsmail, nicknamen löschen bei php, mitglied löschen php script, account löschen php, \where \. \(nickname . $_request[\name\].\\')\;, sql user soll profil löschen können

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:22 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.