Zum Inhalt springen

Löschen mehrerer Daten

Erstellt am 26. Oktober 2010 · 4 Antworten · letzte Antwort am 27. Oktober 2010

Tags: Datenbank, Frage

ChristoferKoenig ·

Hallo Community,

wie stelle ich es unter der Typo3 API am besten an mehrere Datensätze auf einmal zu löschen die einem bestimmten Muster (... LIKE "'.$name.'%"' ) folgen. Folgendes Beispiel löscht einen Datensatz:

                        $delete_questions = $GLOBALS['TYPO3_DB']->exec_DELETEquery(
						'user_agu_hazard_assessment_questions_mm',	// FROM
						'uid_local = '.$lastID.' AND answer = "no" AND uid_foreign LIKE "'.$name.'%"' 	// WHERE
                                                );

Ich könnte in einer 2. Abfrage davor ermitteln welche Werte es genau sind und diese dann z.B. mit IN, oder count() in einer while-Schleife löschen. Das wäre umständlich. Geht das einfacher?

igorshmigor ·

Wenn du

'uid_local = '.$lastID.' AND

rausnimmst, dann müssten doch mehrere Daten gelöscht werden.
Oder sollte schon noch nach bestimmten uid_locals geprüft werden?
Da wir nicht wissen, welchen Kriterien die uid_locals der zu löschenden Tabellenreihen entsprechen müssen, ist es schwer, dir bei diesem Part zu helfen.

ChristoferKoenig ·

@igorshmigor ja es soll noch nach einer uid_local geprüft werden. Es ist eine Tabelle mit MM-Beziehung die Daten mit mehreren identischen uid_locals enthält, wovon alle einer uid_local mit einer bestimmten Zeichenfolge der uid_foreign gelöscht werden sollen. Der Primärschlüssel uid_local kommt also mehrfach vor, was nur in einer MM-Tabelle möglich ist. Beispiel:

uid_local uid_foreign

...
12 06
12 06.01
12 07
12 07.01
12 07.02
12 07.02.01
...

Aufgabe: Lösche alle Datensätze der Uid_local 12 ('uid_local = '.$lastID.') die mit der Zeichenfolge 07 (AND uid_foreign LIKE "'.$name.'%"') beginnt.

Meine konstruierte Löschfunktion löscht nur den ersten Datensatz. Die DB-Funktion muss also mehrfach ausgeführt werden. Um zu wissen wie oft müsste ich nach meinem Verständnis z.B. mit cont() abfragen wieviele Daten es gibt damit ich der while-Schleife eine Bedingung mitgeben kann.

igorshmigor ·

Hmmm, eigentlich müsste er mehr als einen Datensatz löschen. Im Source Code der API ist kein Limit eingebaut. Hast du schonmal versucht, ausgeben zu lassen, wie die gesamte von $GLOBALS['TYPO3_DB']->DELETEquery erstellte Abfrage aussieht, um diese dann beispielsweise in phpMyAdmin zu testen?

exec_DELETEquery macht ja nichts weiter als:

mysql_query($this->DELETEquery($table, $where), $this->link);

und DELETEquery liefert vereinfacht ausgedrückt folgendes zurück:

$query = 'DELETE FROM ' . $table .  ' WHERE ' . $where );

Ich wüsste nicht, wie da eine Beschränkung auf einen einzigen Datensatz zustande kommen könnte.

ChristoferKoenig ·

@igorshmigor Du hast recht, ich habe da in meiner Extension noch eine andere ältere Funktion gefunden die da lautet:

$res = $GLOBALS['TYPO3_DB']->exec_DELETEquery('user_agu_hazard_assessment_questions_mm', 'uid_local ='.$user_agu_pi2['showUid']);

und die löscht alle Daten mit der geforderten Bedingung und nicht nur einen einzelnen Datensatz. Ok, ist auch eigentlich logisch das die Funktion so arbeitet. Na dann besten Dank noch für Deine Zeit, da bin ich ja schon mal ein Stückchen weiter gekommen 😉