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

Ma_Bo

Hallo Leute,
ich suche eine Möglichkeit mit Hilfe von FHEM eine PHP Seite aufzurufen um dann in einer MYSQL Datenbank Einträge zu löschen.

Die PHP Seite per FHEM aufrufen klappt, nur fehlen mir die richtigen Einträge.

Habe schon viel probiert, leider ohne Erfolg, hier einer meiner Versuche:

<?php
    
//Verbindung zur Datenbank herstellen

    
mysql_connect("localhost""Benutzer12345","Passwort12345") or die ("Verbindung nicht moeglich");
    
mysql_select_db("traccar") or die ("Datenbank existiert nicht");
 
//Eintraege die aelter als 62 Tage sind loeschen
$loesch "DELETE FROM positions WHERE DATEDIFF( NOW( ) , serverTime ) >=62";
$ergebnis mysql_query($loesch);

exit;



?>



Vielleicht hat ja einer eine Idee oder kennt sich aus und kann mir helfen.

Es sollen alle Einträge die älter als z.B. 62 Tage sind gelöscht werden, die Zeit zum vergleichen steht in "serverTime"

Grüße Marcel
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.

DeeSPe

Geht das nicht per cron Job?
Wozu ist FHEM nötig?
Und wozu PHP?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Ma_Bo

Würde auch per cron gehen...
FHEM ist nicht zwingend nötig, aber wenn es geht, würde ich es gerne umsetzen...

Muss auch nicht unbedingt PHP sein, bin für Anregungen und Wege offen...

Grüße Marcel


Tapatalk mit Handy geschrieben, 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.

DeeSPe

Zitat von: Ma_Bo am 28 Juli 2017, 21:22:01
FHEM ist nicht zwingend nötig, aber wenn es geht, würde ich es gerne umsetzen...

Dann würde sich eine Funktion in der 99_myUtils.pm anbieten die dann per at regelmäßig gestartet werden kann.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Ma_Bo

Zitat von: DeeSPe am 28 Juli 2017, 21:29:51
Dann würde sich eine Funktion in der 99_myUtils.pm anbieten die dann per at regelmäßig gestartet werden kann.

Gruß
Dan

Hättest du da ggfs. ein Beispiel?


Tapatalk mit Handy geschrieben, 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.

DeeSPe

Zitat von: Ma_Bo am 28 Juli 2017, 21:31:12
Hättest du da ggfs. ein Beispiel?

Nö, so aus dem Ärmel nicht.
Aber man könnte sich z.B. das DbLog Modul ansehen wie dort ein Datenbank Connect gemacht wird.
Da erfährt man sicher auch wie man ein SQL Statement ausführt.

So schwierig kann das nicht sein würde ich sagen.
Aber wie gesagt, wenn es nicht dringend nötig ist in FHEM umzusetzen, ist ein Shell Skript und ein cron Job sicher einfacher und schneller.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

#6
Wenn Deine Webseite funktioniert, dann spricht eigentlich nichts dagegen diese mit GetFileFromURL() "abzuholen".

Gruß
Dan

EDIT: Sofern Du Herr über das PHP Skript bist kannst Du damit auch eigene Rückgabewerte definieren und diese z.B. in ein dummy Device schreiben.
my $ret = GetFileFromURL("http://meine.schoene.website");
fhem "setreading dummy state $ret";
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Ma_Bo

FHEM läuft auf dem selben System.
Ich werd mich kommende Woche mal genauer darum kümmern.

In Perl wäre auch super, aber erstmal Danke für eure Hinweise.

Gruß Marcel


Tapatalk mit Handy geschrieben, 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: haus-automatisierung.com am 29 Juli 2017, 10:35:08
Hi,

also erstmal sieht das gar nicht so falsch aus. Allerdings würde ich


  • mysqli_connect statt mysql_connect verwenden - sonst klappt dein Script irgendwann nicht mehr
  • Einmal ein SELECT ausführen, um zu schauen ob überhaupt alles richtig selektiert wird "SELECT * FROM positions WHERE DATEDIFF(NOW(), serverTime) >= 62" - kommen da Ergebnisse?
  • Liegt das Script auf einem ganz anderen System als FHEM? Ansonsten würde ich mir den Weg über einen Webserver sparen und direkt per cli das php-Script ausführen.
  • Oder sogar komplett in Perl die DB-Verbindung aufbauen und die Einträge löschen (wie schon gesagt wurde).


<?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 {
    echo 
'failed';
}

$mysqli->close();



Hi,
also bei dem Befehl ( "SELECT * FROM positions WHERE DATEDIFF(NOW(), serverTime) >= 62" ) kommen Ergebnisse.

Leider bekomme ich beim aufruf der PHP, die failed Meldung.

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.

Christoph Morrison

Zitat von: Ma_Bo am 01 August 2017, 00:01:59
Leider bekomme ich beim aufruf der PHP, die failed Meldung.

Was sagt mysqli::$error_list wenn failed ausgegeben wird?

Wernieman

Anstatt perl/php geht es sogar mit der Kommandozeile und "mysql" .... viele Wege führen nach Rom.

Ich würde Dir empfehlen, es "einfach zu halten", also direkt ohne Webzugriff (eben bei php per php-cli). Dann kannst Du auch besser debuggen.

Dafür bräuchte man, wie erwähnt, die mysqli::$error_list
- 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

Ma_Bo

Klingt für euch alle plausibel, aber wie baue ich das bei mir ein?
Wie genau bekomme ich die mysqli::$error_list?

Dankende Grüße
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.

Wernieman

- 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

Ma_Bo

Sorry, versteh ich auf die schnelle nicht.

Werde mich die Tage dann wohl erst einmal damit beschäftigen müssen.

Grüße und Danke für eure Hinweise
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.

Wernieman

Aus dem Beitrag:
print_r($mysqli->error_list);

Allerdings copy&paste ungetestet
- 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

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.

Ma_Bo

Danke euch erst einmal.

Ich werde mich erst einmal mit den Grundlagen von SQL beschäftigen müssen, bevor ich das angehe.

Ziel ist, eine Datenbank, die durch das Programm TRACCAR: https://www.traccar.org bzw. durch die WEBUI von Litvak V3.1: http://traccar.litvak.su/installation.html
angelegt wurde aktuell zu halten.

Da alle 5 Sekunden 3 Geräte in die Datenbank schreiben und ich so viel an Daten nicht brauche, möchte ich alle Einträge, welche älter als 2 Monate sind löschen lassen.

Da ich mich mit Datenbanken nicht wirklich auskenne und ich, damals als ich das ganze installiert habe, einfach an die Beschreibung gehalten habe und alles wunderbar geklappt hat, habe ich mich auch nicht weiter mit Datenbanken usw. beschäftigt.

Daher kann ich auch keine genauen Auskünfte über Aufbau usw. der Datenbank geben.
Man möge mir meine Unwissenheit verzeihen.

Die Befehlsfolgen und Versuche, die ich hier gepostet habe, habe ich auch nur aus dem Internet und habe versucht, diese auszuführen.

Das Programm Traccar läuft auf einem eigenen NUC, auf dem auch ein FHEM läuft, über das ich eigentlich das PHP Script aufrufen wollte, natürlich wäre auch ein Shellscript oder sonstwas möglich, aber das mit dem PHP war (warum auch immer, ich weiss nicht warum ich auf die Idee kam) meine erste Idee.

Ich finde es super, das ihr helfen wollt, kann aber auch verstehen, dass ihr keine Ratschläge oder Beispielcode nennen könnt/wollt ohne weitere Infos,  leider weiß ich nicht wie ich diese Infos geben kann, ausser ihr sagt mir, was ich wo für diese Infos eingeben muss/kann.

Grüße Marcel
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_

Zitatund ich so viel an Daten nicht brauche, möchte ich alle Einträge, welche älter als 2 Monate sind löschen lassen.
hast du denn performance probleme??
oder wird die datenbank riesengroß??
oder einfach nur weil darum? ;)

da es nunmal abhängigkeiten zwischen den einzelnen tabellen in deiner datenbank gibt, ist das mit dem löschen nicht einfach damit getan aus einer der tabellen (vermutlich die mit drölfzigtausendmillionen einträgen) etwas rauszulöschen, denn Wernieman sagte es bereits:
Zitat von: Wernieman am 07 August 2017, 10:16:31
Ansonsten geht dann mehr kaputt als gewünscht....

viele Wege in FHEM es gibt!