Suche PHP Script um SQL Datenbank Einträge zu löschen

Begonnen von Ma_Bo, 28 Juli 2017, 18:08:08

Vorheriges Thema - Nächstes Thema

nils_

ungetestet!!!!


<?php

$mysqli 
= new mysqli('localhost''Benutzer12345''Passwort12345''traccar');

if (
$mysqli->connect_error) {
    die(
'Connect Error (' $mysqli->connect_errno ') ' $mysqli->connect_error);
}

if (
$mysqli->query("DELETE FROM positions WHERE DATEDIFF(NOW(), serverTime) >= 62") === true) {
    echo 
'ok';
} else {
    
print_r($mysqli->error_list);
}

$mysqli->close();



//edit:
Wernieman war schneller ::)
viele Wege in FHEM es gibt!

Ma_Bo

Zitat von: nils_ am 01 August 2017, 12:27:39
ungetestet!!!!


<?php

$mysqli 
= new mysqli('localhost''Benutzer12345''Passwort12345''traccar');

if (
$mysqli->connect_error) {
    die(
'Connect Error (' $mysqli->connect_errno ') ' $mysqli->connect_error);
}

if (
$mysqli->query("DELETE FROM positions WHERE DATEDIFF(NOW(), serverTime) >= 62") === true) {
    echo 
'ok';
} else {
    
print_r($mysqli->error_list);
}

$mysqli->close();



//edit:
Wernieman war schneller ::)

Danke, dann kommt folgende Meldung:

// Array ( [0] => Array ( [errno] => 1451 [sqlstate] => 23000 [error] => Cannot delete or update a parent row: a foreign key constraint fails (`traccar`.`events`, CONSTRAINT `events_fkey_position_id` FOREIGN KEY (`position_id`) REFERENCES `positions` (`id`)) ) )
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

CoolTux


serverTime) >= 62") === true)


Frage nur aus Neugier da für mich ungewöhnlich. Müssen es wirklich 3 = sein?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

nils_

Zitat von: Ma_Bo am 01 August 2017, 13:06:00
Danke, dann kommt folgende Meldung:

// Array ( [0] => Array ( [errno] => 1451 [sqlstate] => 23000 [error] => Cannot delete or update a parent row: a foreign key constraint fails (`traccar`.`events`, CONSTRAINT `events_fkey_position_id` FOREIGN KEY (`position_id`) REFERENCES `positions` (`id`)) ) )

na die sagt doch schon den fehler.
du willst was löschen was in einer anderen tabelle noch benutzt wird.

bisher hast du nichts zum datenbank aufbau geschrieben....

@CoolTux
Zitat von: CoolTux am 01 August 2017, 13:35:05
Frage nur aus Neugier da für mich ungewöhnlich. Müssen es wirklich 3 = sein?
ich hab mich da auch gewundert, zumindest in den beispielen war es auch so, deswegen hab ich das einfach mal so hingenommen.
beispiele: http://php.net/manual/de/mysqli.query.php
und zu === --> http://php.net/manual/de/language.operators.comparison.php
viele Wege in FHEM es gibt!

CoolTux

Ah jetzt verstehe. Mit Typenvergleich. Na hoffen wir mal das beide Werte auch vom selben Typ sind  ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wernieman

Auf jedem Fall weiß er jetzt, warum er nicht löschen kann
- kein FHEM-Problem
- Kein php-Problem
- Kein DB-Problem (Connektion)
- Ein DB-Aufbau-Problem ..... das kann nur der User selber lösen
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wernieman

Im Prinzip ja .. aber man sollte sich der Probleme bewusst sein, bevor man ohne FOREIGN_KEY_CHECKS Daten aus der DB löscht. Da ich die sonstigen Anwendungen für die DB nicht kenne, weiß ich die Seiteneffeckte nicht abzuschätzen. Es könnte sein (muß nicht), das anschließend diese Application nicht mehr will ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Christoph Morrison

Zitat von: CoolTux am 01 August 2017, 13:47:24
Ah jetzt verstehe. Mit Typenvergleich. Na hoffen wir mal das beide Werte auch vom selben Typ sind  ;D

Das war ja mein erster Verdacht, aber mysqli_query liefert bei DELETE-Statements tatsächlich nur ein Boolean zurück, wenn die Query korrekt ausgeführt wurde.

Zitat von: Ma_Bo am 01 August 2017, 13:06:00
Danke, dann kommt folgende Meldung:

// Array ( [0] => Array ( [errno] => 1451 [sqlstate] => 23000 [error] => Cannot delete or update a parent row: a foreign key constraint fails (`traccar`.`events`, CONSTRAINT `events_fkey_position_id` FOREIGN KEY (`position_id`) REFERENCES `positions` (`id`)) ) )

Eine einfache Google-Suche nach den Begriffen traccar und events_fkey_position_id hat mich zu einem für dich vermutlich hilfreichen Ergebnis geführt.


CoolTux

Definitiv hilfreich.
Würde mich freuen wenn das Endergebnis hier gepostet wird.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ma_Bo

Sobald ich wieder zu Hause bin, kann ich es testen.
Danke an alle die hier tatkräftig mithelfen.
Grüße Marcel


Tapatalk iPhone, daher kurz gehalten.
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Ma_Bo

Zitat von: nils_ am 01 August 2017, 12:27:39
ungetestet!!!!


<?php

$mysqli 
= new mysqli('localhost''Benutzer12345''Passwort12345''traccar');

if (
$mysqli->connect_error) {
    die(
'Connect Error (' $mysqli->connect_errno ') ' $mysqli->connect_error);
}

if (
$mysqli->query("DELETE FROM positions WHERE DATEDIFF(NOW(), serverTime) >= 62") === true) {
    echo 
'ok';
} else {
    
print_r($mysqli->error_list);
}

$mysqli->close();



//edit:
Wernieman war schneller ::)

Ich raff es nicht, wie kann ich denn folgende Befehlsfolge in dein Script einbauen:

SET foreign_key_checks = 0;
DELETE FROM events WHERE serverTime < DATE_ADD(NOW(), INTERVAL -3 MONTH);
DELETE FROM positions WHERE serverTime < DATE_ADD(NOW(), INTERVAL -3 MONTH);
UPDATE devices SET positionId = NULL WHERE positionId NOT IN (SELECT id FROM positions);
SET foreign_key_checks = 1;


So:

<?php

$mysqli 
= new mysqli('localhost''Benutzer12345''Passwort12345''traccar');

if (
$mysqli->connect_error) {
    die(
'Connect Error (' $mysqli->connect_errno ') ' $mysqli->connect_error);
}

if (
$mysqli->query("SET foreign_key_checks = 0;
DELETE FROM events WHERE serverTime < DATE_ADD(NOW(), INTERVAL -3 MONTH);
DELETE FROM positions WHERE serverTime < DATE_ADD(NOW(), INTERVAL -3 MONTH);
UPDATE devices SET positionId = NULL WHERE positionId NOT IN (SELECT id FROM positions);
SET foreign_key_checks = 1;"
) === true) {
    echo 
'ok';
} else {
    
print_r($mysqli->error_list);
}

$mysqli->close();


NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

nils_

also.....
bitte bitte bitte poste doch mal genauer was nicht funktioniert bzw. was du für eine fehlermeldung bekommst.
ich bin auch kein sql-experte. aber so ganz ohne informationen ist das nur raten, rätseln, glaskugel und/oder kaffeesatz lesen :)


du könntest die sql queries auch nacheinander abschicken.
es könnte sein das du dir die ganze datenbank zerhaust, und nicht alles löscht was du löschen willst.
zB. UPDATE devices SET positionId = NULL WHERE positionId NOT IN (SELECT id FROM positions);

da ich bisher den ganzen aufbau nicht verstanden habe, sieht das erstmal so aus als wenn reste (vielleicht ja auch gewünscht von dir) von devices mit leerer (NULL) positionId in der datenbank bleiben!


"kaskadierendes löschen" müsste dir evtl. weiterhelfen. (google ;) )
viele Wege in FHEM es gibt!

Wernieman

Sorry aber ohne weitere Info bezüglich DB etc. kann und werde ich nicht helfen. Ansonsten geht dann mehr kaputt als gewünscht und Hilfe ist dann nicht mehr zu erwarten.

Wenn Du so etwas vor hast, mach Dich bitte mit den Grundlagen von SQL vertraut ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Christoph Morrison

Zitat von: Ma_Bo am 05 August 2017, 22:27:13
Ich raff es nicht, wie kann ich denn folgende Befehlsfolge in dein Script einbauen:

Zitatmysqli::query -- mysqli_query — Performs a query on the database

Mit mysqli_query kann man "a", also ein (1 Ausführen vong Statement her), Statement ausführen. Das ist ein Security-Feature, damit niemand verschachtelte Queries injizieren kann. Es gibt für multiple Queries, *tusch*, eine eigene Funktion: mysqli_multi_query. Probiere es mal mit der.