Homepage selbermachen 7.852 Themen, 35.619 Beiträge

MySQL / PHP Job -> Datensätze löschen (@ Xafford)

Heinz_Malcher / 14 Antworten / Baumansicht Nickles

Hallo mal wieder Xafford,
ein PHP Laie braucht mal wieder fachmännischen Rat:

ich bastel zur Zeit an einem Projekt, in dem User Ihre Meinungen schreiben können. Da ich keine Lust habe, IP SPerren aufzubauen, sondern eher auf die Vernunft der User apelliere (zumindset solange kein unfug getrieben wird) wollte ich eine Art JOB in das PHP Script einbauen.

ich dachte zunächst an eine art:
delete from xxx where eintrag=\'$xxxx\'

aber die variable $xxxx fehlt mir ja in diesem falle hmmm

Wie mache ich das am besten? Zum beispiel soll das Script bei jedem durchlauf doppelte einträge löschen

bei Antwort benachrichtigen
xafford Heinz_Malcher „MySQL / PHP Job -> Datensätze löschen (@ Xafford)“
Optionen

hm...bald muß ich für das consulting hier kassieren bei dir ;o)..
also ich denke mal du willst die datenbank aufräumen und das automatisch. das solltest du aus mehreren gründen nicht über php, sondern über die datenbank selbst machen. der erste grund ist die planbarkeit. du kannst nur schlecht einen job mit einem php-script erstellen auf dem system, das automatisch erfolgt. ein weiterer grund ist die laufdauer so eines scriptes. der webserver setzt für php-scripte fast immer ein zeitlimit um den server vor rechenzeitfressern zu schützen. wenn du über die datenbank eine abfrage nach doppelten einträgen laufen lassen willst dann ist das eine langwierige geschichte, da die datenbank fast jeden datensatz mit fast jedem anderen vergleichen muß, das kann die laufzeit des scriptes locker überschreiten, wodurch unter umständen die ausführung abgebrochen wird. geschickter wäre ein batch-job direkt auf der kommandozeile in sql, den du über cron oder at (je nach OS) zu bestimmten zeiten in denen keine last auftritt, laufen lässt.
ich muß aber eigentlich gestehen, daß ich nicht so genau verstanden habe, was du eigentlich filtern willst: doppelte eintragungstexte (sprich flooding), doppelte namen, etc und was die variable sein soll.
ich vermute mit der variable meinst du den jeweiligen eintrag der doppelt ist, oder? meine kenntnisse in datenbankverwaltung sind leider auch nicht die besten, aber es gibt meines wissens interne algorithmen zum auffinden doppelter einträge bei den meisten DBMS und auch algorithmen für komplette vergleichsdurchläufe durch datenbanken. man könnte zwar so etwas auch in php schreiben, aber wie erwähnt, es ist eine langwierige und ressourcenfressende geschichte und noch mehr, wenn es über externe scriptsprachen laufen soll.
ich versuche mich nächste woche mal schlau zu machen.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Heinz_Malcher xafford „hm...bald muß ich für das consulting hier kassieren bei dir o .. also ich...“
Optionen

Hi, oje, was kostest du denn ??
:-))

Ja, ich will meine DB vor floodern schützen. Das heisst, also einfach doppelte einträge filtern. Da jeder Datensatz mit eigentlich jedem verglichen werden muss, ist das denke ich mit meinen PHP Kenntnissen schlecht bis garnicht möglich.

Wie genau schalte ich solche Jobs in der DB?

bei Antwort benachrichtigen
meisterv2k Heinz_Malcher „Hi, oje, was kostest du denn ?? :- Ja, ich will meine DB vor floodern schützen....“
Optionen

Ich denke, dass ihr beide auf dem falschen Weg zur Lösung des Problems mit den doppelten Einträgen seid. Die Frage ist nicht die, wie ich die doppelten Einträge wieder lösche, sondern die, wie ich doppelte Einträge gar nicht erst entstehen lasse. Das lässt sich einfach erreichen, indem man einfach den Primärschlüssel über alle Felder legt.
Ein Beispiel:
Für die Kommentar deiner Nutzer würden in der DB eine Tabelle mit den Feldern Nutzername, Betreff und Kommentar existieren.
Die Tabellendefinition würde dann folgendermaßen aussehen:
CREATE TABLE kommentare (
nutzername VARCHAR(255),
betreff VARCHAR(255),
kommentar TEXT,
PRIMARY KEY ( nutzername , betreff , kommentar ) )

Ich hoffe, das hilft dir bei der Lösung deines Problems.

bei Antwort benachrichtigen
Heinz_Malcher meisterv2k „Ich denke, dass ihr beide auf dem falschen Weg zur Lösung des Problems mit den...“
Optionen

das würde aber auch bedeuten, dass niemand zu irgendeiner anderen zeit dann nochmal mit seinem selben namen posten kann, das mit dem primary key über den kommentar ist aber eine gute idee

gruss heinz

bei Antwort benachrichtigen
meisterv2k Heinz_Malcher „das würde aber auch bedeuten, dass niemand zu irgendeiner anderen zeit dann...“
Optionen

Das stimmt so nicht. Der Primärschlüssel über die drei im Bsp. angegebenen Felder bedeutet, dass die Kombination aus diesen drei Feldern einmalig sein muß. Man kann also sehr wohl unter seinem Nutzernamem noch andere Beiträge posten, nur keine mit identischem Inhalt. Auf der anderen Seite kann der selbe Inhalt unter verschiedenen Nutzernamen veröffentlicht werden.

bei Antwort benachrichtigen
Heinz_Malcher meisterv2k „Das stimmt so nicht. Der Primärschlüssel über die drei im Bsp. angegebenen...“
Optionen

danke für den tipp, werde mich ranmachen. Das schaut nach 3 mausklickst und ich hab mich auf 3 wochenenden eingestellt :-)

Gruss heinz

bei Antwort benachrichtigen
xafford meisterv2k „Ich denke, dass ihr beide auf dem falschen Weg zur Lösung des Problems mit den...“
Optionen

zum einen hast du recht, es ist besser soetwas gleich von anfang an zu verhindern, aber in dem fall hat das einen entschiedenen nachteil. es macht das posten selbst immens langsam und die datenbank um einiges größer. je mehr indexe du hast, desto größer wird der verwaltungsaufwand der datenbank und so langsamer wird sie. in dem fall würde ich eher zu einem batchjob in der nacht raten. wenn die datenbank einen index über große textfelder legen muß wird das suchen in der datenbank höllelangsam, da alle schlüssel ausgewertet werden, das zwingt die performance extrem in die knie, gerade bei mysql, postgre wäre da wohl einen tick schneller oder oracle ;o)

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
meisterv2k xafford „zum einen hast du recht, es ist besser soetwas gleich von anfang an zu...“
Optionen

Ich mußte gerade feststellen, das man bei MySQL übherhaupt keinen Primärschlüssel über TEXT- und BLOB-Felder legen kann. Tut mir leid, da habe ich mich halt geirrt.
Als Alternative würde ich vorschlagen, vor dem Einfügen eines neuen Datensatzes eine Abfrage durchzuführen, ob der einzufügende Datensatz mit gleichem Inhalt schon einmal existiert und in dann ggf. einfach nicht noch einmal einfügen.

bei Antwort benachrichtigen
Heinz_Malcher meisterv2k „Ich mußte gerade feststellen, das man bei MySQL übherhaupt keinen...“
Optionen

können vor lachen :-)))

wie mache ich das möglichst ohne zuviel rechnerpower zu verbrauchen

Gruss heinz

bei Antwort benachrichtigen
meisterv2k Heinz_Malcher „können vor lachen :- wie mache ich das möglichst ohne zuviel rechnerpower zu...“
Optionen

Bezogen auf das anfängliche Bsp, wobei die neu einzufügenden Werte in den Variablen $nutzername , $betreff und $kommentar übergeben werden, würde ich folgende Abfrage vorschlagen:
mysql_query("SELECT COUNT(*) FROM kommentare WHERE nutzername='".$nutzername."' AND betreff='".$betreff."' AND kommentar='".$kommentar."'");

Wenn die Abfrage einen Wert größer Null liefert, dann existiert der Datensatz bereits.

bei Antwort benachrichtigen
Heinz_Malcher meisterv2k „Bezogen auf das anfängliche Bsp, wobei die neu einzufügenden Werte in den...“
Optionen

vielen dank meister ;-) Das rettet mir den Sonntag

bei Antwort benachrichtigen
Heinz_Malcher xafford „zum einen hast du recht, es ist besser soetwas gleich von anfang an zu...“
Optionen

Nu halte mal de balle flach :-))

Oracle?? Ich kann gerade mal in eine DB schreiben und wieder ausgeben :-))

Da werd ich noch einige jahre brauchen

bei Antwort benachrichtigen
Borlander Heinz_Malcher „MySQL / PHP Job -> Datensätze löschen (@ Xafford)“
Optionen
einfach doppelte einträge filtern
Warum willst Du die später aus der DB läschen? Überprüf doch gleich beim Eintragen, ob der Text schon mal drin ist. Wenn ja wird eben kein neuer Datensatz eingefügt.


//erst mal überprüfen, ob der Text schon drin ist:
$result = mysql_query("select * from xxx where eintrag=\'$text\'", $link);
//Wenn keine Datensätze gefunden werden, dann wird der Text eingetragen.
if ( mysql_num_rows($result)==0 )
  mysql_query("INSERT ...", $link);



CU Borlander
bei Antwort benachrichtigen
Heinz_Malcher Borlander „ Warum willst Du die später aus der DB läschen? Überprüf doch gleich beim...“
Optionen

Danke für den Tipp,
hab ihn angewandt

bei Antwort benachrichtigen