FHEM Forum

Verschiedenes => Off-Topic => Thema gestartet von: Ma_Bo am 28 Juli 2017, 18:08:08

Titel: Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 28 Juli 2017, 18:08:08
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: DeeSPe am 28 Juli 2017, 20:48:56
Geht das nicht per cron Job?
Wozu ist FHEM nötig?
Und wozu PHP?

Gruß
Dan
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 28 Juli 2017, 21:22:01
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.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: DeeSPe am 28 Juli 2017, 21:29:51
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 28 Juli 2017, 21:31:12
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.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: DeeSPe am 28 Juli 2017, 21:35:42
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: DeeSPe am 28 Juli 2017, 22:24:03
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";
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 29 Juli 2017, 10:48:57
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.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 01 August 2017, 00:01:59
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.

Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Christoph Morrison am 01 August 2017, 10:59:16
Leider bekomme ich beim aufruf der PHP, die failed Meldung.

Was sagt mysqli::$error_list (http://php.net/manual/de/mysqli.error-list.php) wenn failed ausgegeben wird?
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 01 August 2017, 11:23:01
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 01 August 2017, 11:26:39
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 01 August 2017, 11:34:44
google?
http://php.net/manual/de/mysqli.error-list.php (http://php.net/manual/de/mysqli.error-list.php)
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 01 August 2017, 11:55:44
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 01 August 2017, 12:26:20
Aus dem Beitrag:
print_r($mysqli->error_list);
Allerdings copy&paste ungetestet
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag 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 ::)
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 01 August 2017, 13:06:00
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`)) ) )
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: CoolTux am 01 August 2017, 13:35:05
serverTime) >= 62") === true)

Frage nur aus Neugier da für mich ungewöhnlich. Müssen es wirklich 3 = sein?
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: nils_ am 01 August 2017, 13:44:49
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
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag 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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 01 August 2017, 13:58:05
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: CoolTux am 01 August 2017, 14:03:13
http://www.gurkcity.de/blog/Loeschen-von-Datenbanktabellen-in-MySQL5-schlaegt-fehl-41.html


Das ist das was ich für den einfachsten Weg für einen nicht DB Kenner gefunden habe.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 01 August 2017, 14:43:37
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 ....
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Christoph Morrison am 01 August 2017, 21:06:29
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.

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 (https://github.com/tananaev/traccar-web/issues/267) geführt.

Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: CoolTux am 01 August 2017, 21:17:15
Definitiv hilfreich.
Würde mich freuen wenn das Endergebnis hier gepostet wird.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 01 August 2017, 21:29:02
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.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 05 August 2017, 22:27:13
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();

Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: nils_ am 07 August 2017, 09:38:31
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 ;) )
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Wernieman am 07 August 2017, 10:16:31
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 ....
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Christoph Morrison am 07 August 2017, 18:26:26
Ich raff es nicht, wie kann ich denn folgende Befehlsfolge in dein Script einbauen:

Zitat
mysqli::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 (http://php.net/mysqli_multi_query). Probiere es mal mit der.
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: Ma_Bo am 07 August 2017, 19:06:21
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
Titel: Antw:Suche PHP Script um SQL Datenbank Einträge zu löschen
Beitrag von: nils_ am 09 August 2017, 09:35:51
Zitat
und 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:
Ansonsten geht dann mehr kaputt als gewünscht....