MariaDB und IPS-PHP - INSERT macht Probleme

Hallo miteinander …

Ich bin derzeit gerade dabei, IPS 5.0 auf einem neuen RPI 3+ mit Stretch in Betrieb zu nehmen. Installation hat soweit alles super funktioniert. Anstelle von MySQL möchte ich jetzt MariaDB verwenden. Funktioniert eigentlich auch … aber leider aus IPS nicht ganz !?

Wenn ich - wie bisher gewohnt - ein INSERT im IPS-PHP absetze, erhalte ich folgende Fehlermeldung:

insert failed, error: Column count doesn’t match value count at row 1

Wenn ich das selbe PHP-Script in der Raspbian Konsole ausführe, oder auch aus dem Editor „Geany“ erhalte ich keine Meldung, und der Insert hat definitiv funktioniert.
Übrigens, SELECT Statements gehen auch im IPS PHP.

Hat vielleicht jemand eine Idee woran das liegen, oder wie ich das Problem eingrenzen könnte ?

Ach so, noch eine Sache: Ich hatte zuerst IPS normal installiert, und danach erst PHP (PHP 7.2.9-1 (cli) (built: Aug 19 2018 06:56:13)

Vielen Dank vorab für Eure hilfreichen Vorschläge.
Gruß
Martin

IPS bringt ein eigenes PHP mit.
Egal was du sonst so installiert hast.
Beispielcode?

Michael

MariaDB funktioniert mit dem normalen mysqli-Interface.

Ich habe bei mir MariaDB auf einer Synology-NAS laufen und und schreibe / lese Daten von IPS (auf Raspi und Ubuntu)

Ein Simple-Interface siehe hier

gruss
demel

@demel42
Danke für Deinen Hinweis mit dem „Simple-Interface“.
Ich habe diese MySQL Instanz genommen und ein Insert wie gewohnt gemacht, und hierbei offenbarte sich der eigentliche Fehler.
Ich habe nämlich in dem einzutragenden Datensatz auch zwei float-Variablen. Diese beiden Variablen sind zuvor ganz normal definiert worden (z.B. $At = 9.99; und $Af = 88.8; ). Die Scriptausgabe zeigte dann:
insert into tab_test (At, Af) values (9,99, 88,8 ) : Column count doesn’t match value count at row 1
Warum im IPS-PHP dieses Verhalten auftritt, und im „normalen“ PHP nicht, kann ich nicht erklären. Ich kann aber damit umgehen, wenn ich in der values Definition diese Variablen in Hochkomma setze.
Unter IPS 4.2 und MySQL ist dieses Verhalten so nicht aufgetreten.

Danke also nochmals.
Gruß
Martin

Du bist Kandidat 495 welcher, auf die von PHP automatisch vorgenommene Konvertierung in die jeweilige local, reingefallen ist.
Und ja, das passiert auch bei einem Cast zu String.
Mit sprintf(’%F’, $Value) bekommt man einen String mit Punkt.
Was willst du den eigentlich in die DB schreiben?
Kennst du dies?

Würde mich interessieren ob es auch mit MariaDB funktioniert.
Michael

Das liegt daran, das mit IPS 5 die lANG Einstellung des Systems korrekt gesetzt und ausgewertet wird (also i.d.R. DE und damit ist der Dezimaltrenner ein , (Komma).
Die MySQL erwatetet wie viele ander Interface (z.B bei vielel url’s englische Notation, also ein . (Punkt).
Float’s muss man entsprevhend wandwln, z.B. mit der PHP-Funktion number_format

demel

Hallo, da bin wieder … bin gestern leider nicht zum Antworten gekommen.

@demel24
Danke für den Hinweis mit der PHP-Funktion number_format. Die kannte ich nicht. Damit klappt die Formatierung und der INSERT jetzt problemlos.
Wenn ich aber bedenke, dass man in IPS V5 jetzt eine weitere Funktion verwenden „muss“, nur weil die „Lang“ Einstellung richtig gesetzt und ausgewertet wird, während ich im „normalen“ PHP das nicht benötige, dann frage ich mich doch, ob ich diese „Lang“ bewusst falsch setzten könnte. Ich habe zwar nur ca. 10 Scripte, die in die DB schreiben, aber ich könnte sie ggf. unverändert weiter benutzen !?

@Nall-chan
Ich nutze MySQL bzw. jetzt wohl MariaDB, um alle Werte meines „smart home“ zu speichern. Dazu gehören alle Verbräuche, die Heizung, PV-Anlage alle Räume usw. Ich bin MySQL schon seit vielen Jahren gewohnt, und dann bleibt man meistens dabei, auch wenn diese DB-Systeme für diesen Zweck wahrscheinlich oversized sind. Meine gesamten grafischen Auswertungen beziehen sich dabei immer auf die entsprechenden Tabellen oder Views.

„MySQL Archiv für IP-Symcon“ kenne ich bislang nicht. Klingt aber interessant. Werde das demnächst wohl mal ausprobieren. Ich weiß aber noch nicht, wann ich dazu komme.Ich „muss“ jetzt erst mal den Umstieg von IPS V4.2 unter „Jessie“ und MySQL auf den neuen RPI mit „Stretch“ und MariaDB machen.

Danke nochmal für Eure Hilfe.
LG
Martin

Sprache setzen geht in IPS nicht über Setlocal. Weil es alle PHP Script beeinflusst.
Vom Grundsatz macht PHP das aber imho richtig, wenn man den eigentlichen Einsatzzweck in Verbindung mit einem Webserver bedenkt.
Michael

Nein, das geht nicht. Die Funktion zum setzten von locale-Variablen ist setlocale(), die ist Ber in IPS 5 absichtlich so überlagert, das man sie nicht aufrufen kann.
Der Grund ist klar: bisher war es ein gewisses Mischmasch, was in php benutzt wurde, jetzt kann man sich drauf verlassen, das LANG und die LC_-Variablen genau so gesetzt sind wie der Rechner eingerichtet ist.

demel

Wäre es dann nicht einfacher den RPI auf LANG = EN zu setzen, da ich ansonsten auf diesem RPI keine anderen Anwendungen habe die zwingend auf DE angewiesen sind ? Ich glaube ich werde das mal ausprobieren.

LG
Martin

Das kannst Du mache, dann sind die Texte (auch in IPS) aber englisch - beim Modulen, sofern diese eine Übersetzung via lokale.json haben.

Ich würde es nicht machen, ich sehe auch nicht den großen Aufwand sich da einmal drauf einzustellen. Aber jeder wie er mag.

demel

Hallo demel42,

bei läuft ebenfalls SQL MariaDB mit deineem Simple-Interface auf einer Synology-NAS auf Port 3307
Bekomme aber immer Error 2002
Rechte sind alle gesetzt
IPS Vers. 5.1 auf WIN 2012 Server

Hast Du eventuell eine Erklärung

Hallo,

so pauschal ist es etwas schwierig, aber ich erinnere mich, das ich damals auch ziemlich gebastelt habe.

Man muss mysql erstmal sagen, das es Kontakt „von aussen“ zulässt.

Ich Benutzer das Paket „adminer“ um die MariaDB auf der Synology zu administrieren.

Da anmelden (Benutzer root und das normale Admin-Passwort der Synology), dann die DB auswählen, Server -> Datenbank -> Rechte und dort den Benutzer mit % (Zugriff aller IP-Adresse auf die DB) konfigurieren.

Screenshot 2018-10-30 um 18.18.49.png

Und so ist das bei mir eingestellt

Screenshot 2018-10-30 um 18.22.49.png

Port 3006

Port 3006 ist lt. Internet MariaDB5, 3007 wäre MariaDB10 …

Und natürlich muss der Firewall auf der Synology einen Zugriff vom IPS-Rechner zulassen. Weis nicht, ob Du da ein Firewall auf der Synology laufen hast?

Info auf der Synology

Gruß
demel

Hallo,

ich kann aus meiner Erfahrung folgendes dazu mitteilen, und JA, ich habe auch ziemlich herum gefrickelt bis alles soweit lief.
Bei mir läuft die MariaDB zwar auf einem RPI 3B+ mit Stretch, und ich greife u.a. von einem Windows 10 PC mittels MySQL Workbench darauf zu.
Meine Version ist: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0 und der Standard Port ist dabei 3306 !.
Für eine Verbindung ist unter Raspbian ist offensichtlich auch ein „IP-Binding“ erforderlich. In einer „/etc/mysql/my.cnf“ muss dafür folgendes eingetragen sein:
[mysqld]
bind-address = 192.168.xxx.yyy (wobei hier die IP des Servers gemeit ist.).
Gibt es unter Windows nicht auch eine my.cnf ? Damit funktioniert es bei mir, aber gewollt auch nur aus dem lokalen Netzwerk.
Das mal nur so als Tip. Ob es hilft kann ich natürlich nicht versprechen.

LG Martin

Danke für den Hinweis bin noch am testen