PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datensatz automatisch aus DB löschen


TRC120
14.07.2009, 15:44:30
Hi
Ich habe über das Registrierungs script einen aktivierungslink eingebaut. Jetzt hätte ich an Euch mal die frage, wie man das machen kann, das die Benutzerdaten des Benutzers der sich nach 14 Tagen nicht aktiviert hat automatisch wieder aus der Datenbank gelöscht werden.

TRC120
14.07.2009, 16:17:14
Ich habe jetzt eine einfache sql delet abfrage gemacht, funtionier auch, aber wo bestimme ich jetzt die Zeit, und wo baut man das am besten ein, damit es automatisch und unsichbar arbeitet.

$anfrage = "DELETE FROM userdaten WHERE aktiv = 'inaktiv'";

$ergebnis = $db -> query($anfrage); // Senden an Dabenbank

if ($db -> affected_rows > 0)
{
echo $db -> affected_rows." Datensätze wurden gelöscht!<br>";
}
else
{
echo "Keine Datensätze gelöscht!<br>";
}

DokuLeseHemmung
14.07.2009, 18:13:36
Und, woher willst du die Zeit nehmen?

TRC120
14.07.2009, 18:21:13
Naja die zeit kann ich mir ja aus den Userdaten nehmen die werden bei der registrierung mit gesetzt.
Oder liege ich da falsch ?

registrie.php

$vname = $_POST['vname'];
$nname = $_POST['nname'];
$benutzername = $_POST['benutzername'];
$email = $_POST['email'];
$anschrift = $_POST['anschrift'];
$plz = $_POST['plz'];
$ort = $_POST['ort'];
$telefon = $_POST['telefon'];
$icq = $_POST['icq'];
$home = $_POST['home'];
$passwort = $_POST['passwort'];
$passwort_md5 = md5($passwort);
$passwortoff = $_POST['passwortoff'];
$berechtigung = "User";
$aktiv = "inaktiv";
$registerDate = date('Y-m-d H:i:s');
$lastvisitDate = date('Y-m-d H:i:s');

DokuLeseHemmung
14.07.2009, 18:27:10
Woher soll ich das wissen?
Und wieso hältst du die Tabellenstrukur geheim?


DELETE FROM userdaten
WHERE
`lastvisitDate` > DATE_SUB(NOW(), INTERVAL 2 WEEK)
AND
`aktiv` = 'inaktiv'

TRC120
14.07.2009, 19:18:21
????? Tabellenstrukur geheim ????
Was meinst du damit ? Wenn du das ganze script meinst, das ist nicht geheim, wollte nur nicht die ganze länge reinstellen.
Kann ich aber gerne noch machen wenn es hilft.
Sorry wegen der Zeit, war nicht so gemeint, ist mir schon klar das du das nicht wissen kannst, nicht böse sein.

Danke jedenfalls für deine Antwort, werde das mal testen.

DokuLeseHemmung
14.07.2009, 19:34:23
Bei allen SQL Abfragen muß man die Struktur der betreffenden Tabellen kennen, sonst ist es unmöglich vernünftig zu helfen. Es interessiert das Tabellen CREATE Statement. Und evtl ein paar praxisnahe Testdaten.

Dein Script ist dabei erstmal völlig wurscht, Du hast ja ein SQL und kein PHP Problem, oder?

Du gehst doch auch nicht zu deinem Autoschrauber und sagtst: Motor springt nicht an.
Er fragt: Was ist das für ein Fahrzeug?
Du sagst: Rot!
Er fragt: Welcher Hersteller? Modell?
Du sagst: PKW

So kommt keine fruchtbare Beziehung zu Stande. Nach 5 solcher Frage-Antwort Spielchen wird dir dein Autoschrauber sagen: Es wäre ganz nett wenn Sie meine Werkstatt verlassen würden.

TRC120
14.07.2009, 20:43:57
Hi

Jetzt ist mir klar, was du meinst, wird jedoch eine weile dauern, da ich nicht weis wie man die anzeigen und auslesen kann, muss erst googlen. *schäm*

DokuLeseHemmung
14.07.2009, 20:53:38
phpmyadmin -->> (zur Tabelle laufen) -->> exportieren

TRC120
14.07.2009, 21:11:34
Danke dir

CREATE TABLE `userdaten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vname` varchar(20) COLLATE latin1_general_ci NOT NULL,
`nname` varchar(50) COLLATE latin1_general_ci NOT NULL,
`benutzername` varchar(40) COLLATE latin1_general_ci NOT NULL,
`anschrift` varchar(40) COLLATE latin1_general_ci NOT NULL,
`plz` mediumint(10) NOT NULL,
`ort` varchar(32) COLLATE latin1_general_ci NOT NULL,
`telefon` varchar(30) COLLATE latin1_general_ci NOT NULL,
`icq` varchar(30) COLLATE latin1_general_ci NOT NULL,
`home` varchar(50) COLLATE latin1_general_ci NOT NULL,
`email` varchar(50) COLLATE latin1_general_ci NOT NULL,
`passwort` varchar(35) COLLATE latin1_general_ci NOT NULL,
`berechtigung` varchar(12) COLLATE latin1_general_ci NOT NULL,
`aktiv` varchar(12) COLLATE latin1_general_ci NOT NULL,
`registerDate` date NOT NULL,
`lastvisitDate` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
KEY `nname` (`benutzername`,`telefon`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Ich hoffe das ist das richtige.

DokuLeseHemmung
14.07.2009, 21:23:54
Ja, das war gemeint.
Und soweit ich sehen kann ist mein Statement dann evtl. korrekt. Zumindest wenn in lastvisitDate das drin steht was ich erwarte.
(Weil Datenbeispiele zum testen fehlen weiterhin)

PS:
Da "`aktiv` varchar(12)" ja nur 2 Werte annehmen kann, wäre SET evtl. der angemessenere Datentype.

TRC120
14.07.2009, 21:34:06
Danke dir vielmals für deine Hilfe. werde das ganze jetzt mal über xampp offline testen und die zeit mal auf eine stunde setzten.

Vorerst mal herzlichsten Dank

Crisps
15.07.2009, 08:24:04
`plz` mediumint(10) NOT NULL,
Postleitzahlen bitte immer als varchar oder char abspeichern. Da es Postleitzahlen mit führenden Nullen gibt (soweit ich mich erinnern kann sind das Dresden und Leipzig), würden diese bei mediumint (und anderen int-typen) ohne diese Null abgespeichert.

Außerdem gibt es in einigen Ländern Postleitzahlen/codes die auch Buchstaben und andere Zeichen enthalten.

TRC120
15.07.2009, 09:47:55
@ Crisps Danke habe ich geändert.

@ DokuLeseHemmung also mit dem befehl "DELETE FROM userdaten WHERE `lastvisitDate` > DATE_SUB(NOW(), INTERVAL 2 WEEK) AND`aktiv` = 'inaktiv'";
löscht er mir die inaktiven einträge sofort und alle.

Damir
15.07.2009, 10:09:27
Hi,

ist eigentlich ganz einfach.

1.) Setze ein Zeitstempel wann der User sich registriert hat.

2.) Dann benötigst du einen CronJob, der jeden Tag oder jede Stunde/Minute automatisch aufgerufen hat und der dann ein Skript von dir anpingt, der dann den oder die Datensätze löscht.

Es gibt im Internet auch kostenlose CronJobs, falls du keinen bei dir hast oder es gibt auch kostenpflichtige Cronjobs, die vom Umfang wesentlich flexibler als die Kostenlosen sind.

Kannst ja mal hier bei uns schauen:
http://cronjob.selfphp.de/

Kannst gerne auch eine Demo-Zugang nehmen, der auch übrigens automatisch nach 14 Tagen gelöscht wird wenn du ihn nicht weiter willst;-)

Damir

DokuLeseHemmung
15.07.2009, 12:00:45
löscht er mir die inaktiven einträge sofort und alle.
Du hast meine letzten Postings nicht aufmerksam gelesen!

Also noch mal:

1: Und, woher willst du die Zeit nehmen?

2: Es interessiert das Tabellen CREATE Statement. Und evtl ein paar praxisnahe Testdaten.

3: Und soweit ich sehen kann ist mein Statement dann evtl. korrekt. Zumindest wenn in lastvisitDate das drin steht was ich erwarte.
(Weil Datenbeispiele zum testen fehlen weiterhin)

E macht keinen Sinn "das tuts nicht" zu heulen, wenn du weiterhin wesentliche Aspekte des Problems geheim hältst. So und jetzt habe ich wirklich die Lust verloren dir die Würmer einzeln aus der Nase zu ziehen.

TRC120
15.07.2009, 14:22:07
Leider stehe ich am Anfang von php und mysql und habe leider keine ahnung was mit

ein paar praxisnahe Testdaten oder mit woher willst du die Zeit nehmen gemeint ist, beziehungsweise wo und wie ich diese daten herbekomme.

Jedenfalls Danke für das was du mir bisher geholfen hast.
Werde schon irgentwie zum Ziel kommen und möchte euch nicht weiter nerven.

DokuLeseHemmung
15.07.2009, 14:37:17
Also nochmal (aber in ganz langsam):

Du hast bisher verraten:
Das CREATE Statement, sehr schön! Damit kann man schon was anfangen.

Du hast gezeigt wie du die Daten zusammenstoppelst:
$registerDate = date('Y-m-d H:i:s');
$lastvisitDate = date('Y-m-d H:i:s');

Das sagt mir, dass in lastvisitDate ein gültiges Datum stehen sollte. Tuts aber wohl nicht, denn dann würde mein Statement das richtige tun und alle Datensätze älter als 2 Wochen löschen. Sofern aktiv auf inaktiv gesetzt ist.

Und die Testdaten bekommst du auch daher, wo du das Create Statement gefunden hast.

TRC120
15.07.2009, 17:49:02
Also wenn ich in mysql auf den Weg userdaten/exportieren/ok gehe, bekomme ich diese ausgabe.
-- phpMyAdmin SQL Dump
-- version 3.1.3.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 15. Juli 2009 um 16:45
-- Server Version: 5.1.33
-- PHP-Version: 5.2.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Datenbank: `trc`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `userdaten`
--

CREATE TABLE IF NOT EXISTS `userdaten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vname` varchar(20) COLLATE latin1_general_ci NOT NULL,
`nname` varchar(50) COLLATE latin1_general_ci NOT NULL,
`benutzername` varchar(40) COLLATE latin1_general_ci NOT NULL,
`anschrift` varchar(40) COLLATE latin1_general_ci NOT NULL,
`plz` varchar(10) COLLATE latin1_general_ci NOT NULL,
`ort` varchar(32) COLLATE latin1_general_ci NOT NULL,
`telefon` varchar(30) COLLATE latin1_general_ci NOT NULL,
`icq` varchar(30) COLLATE latin1_general_ci NOT NULL,
`home` varchar(50) COLLATE latin1_general_ci NOT NULL,
`email` varchar(50) COLLATE latin1_general_ci NOT NULL,
`passwort` varchar(35) COLLATE latin1_general_ci NOT NULL,
`berechtigung` varchar(12) COLLATE latin1_general_ci NOT NULL,
`aktiv` varchar(12) COLLATE latin1_general_ci NOT NULL,
`registerDate` date NOT NULL,
`lastvisitDate` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
KEY `nname` (`benutzername`,`telefon`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=33 ;

--
-- Daten für Tabelle `userdaten`
--

INSERT INTO `userdaten` (`id`, `vname`, `nname`, `benutzername`, `anschrift`, `plz`, `ort`, `telefon`, `icq`, `home`, `email`, `passwort`, `berechtigung`, `aktiv`, `registerDate`, `lastvisitDate`) VALUES
(1, 'Gerhard', '', 'BullDog13', '', '0', 'Wien', '', '238-430-126', 'http://www.touring-racing-cars.at', 'BullDog13@gmx.net', '1048b4edd37741b70efd42874451d0a3', 'Admin', 'aktiv', '2009-07-05', '2009-07-05'),
(33, '', '', 'aron', '', '', '', '', '', '', 'test@gmx.at', '6512bd43d9caa6e02c990b0a82652dca', 'User', 'inaktiv', '2009-07-15', '2009-07-15');


das ist alles was er mir anzeigt, wenn ich das mache.

DokuLeseHemmung
15.07.2009, 18:13:58
Danke!!
Jetzt kann ich sehen, was WIRKLICH in deiner DB steht.

Ein kleiner gemeiner Fehler hat sich in mein Statement ein geschlichen!
habe > und < vertauscht

So muss es:

DELETE FROM userdaten
WHERE `lastvisitDate` < DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK)
AND`aktiv` = 'inaktiv'

Hätte ich früher drauf kommen können, aber dein Spruch:
löscht er mir die inaktiven einträge sofort und alle.
hat mich von der Rolle gebracht.
Er hat nicht alle gelöscht, sonden nur die jünger als 14 Tage...

TRC120
15.07.2009, 18:43:59
@ DokuLeseHemmung

Danke nochmals für deine Mühe, jetzt klappt es wunderbar.
Als Neuling ist das alles so, als wenn man im Wald steht und keine Bäume mehr sieht.

Jetzt weis ich auch, wieso Menschen wie du (nehme ich mal an ) das programieren so lange lerne. Das Gebiet ist ja riesen groß.

mfg. Gerhard