Error in configdb

Begonnen von LuckyLuis, 18 Oktober 2015, 23:43:13

Vorheriges Thema - Nächstes Thema

LuckyLuis

Hallo,

habe eben auf configDB umgestellt und es auch ohne große Probleme (vielleicht in der Modulhilfe noch ein kleiner Hinweis auf die SQL-Berechtigungen ;-)) in Betrieb nehmen. Allerdings bekomme ich folgende Fehlermeldung bei einem "configdb list":

2015.10.18 23:36:40 1: PERL WARNING: DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\' ORDER BY lower(device),command DESC' at line 1 at configDB.pm line 907.
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\' ORDER BY lower(device),command DESC' at line 1 at configDB.pm line 907.
2015.10.18 23:36:40 1: PERL WARNING: Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle database=fhem;host=nas;port=3306 at configDB.pm line 907.

Nutze MySQL 5.1.73 auf meinem NAS.

Danach ist FHEM abgeschmiert.

Ideen?

LuckyLuis

betateilchen

Mit den aktuellen Modulversionen



configDB.pm       9452 2015-10-14 09:16:30Z betateilchen
98_configdb.pm    8691 2015-06-04 17:26:00Z betateilchen



kann ich den Fehler nicht reproduzieren. Das macht die Sache schwierig...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

LuckyLuis

Hi,

die beiden von Dir genannten Versionen habe ich auch im Einsatz.
Habe mir mal kurz den Code angeschaut und anschließend das Query-Log vom MySQL-Server aktiviert:

Die Abfrage im Source-Code (ab Zeile 894):

my ($search,$searchversion,$dsearch) = @_;
return 'Syntax error.' if(!(defined($search)));
my $fhem_dbh = _cfgDB_Connect;
my ($sql, $sth, @line, $row, @result, $ret, $text);
$sql  = "SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid ";
$sql .= "WHERE v.version = '$searchversion' AND command not like '#create%' ";
# 2015-10-14 - changed, forum #42190
$sql .= "AND device like '$search%' ESCAPE '\\' " if($dsearch);
$sql .= "AND (device like '$search%' ESCAPE '\\' OR P1 like '$search%' ESCAPE '\\' OR P2 like '$search%' ESCAPE '\\') " if(!$dsearch);
# $sql .= "AND device like '$search%' " if($dsearch);
# $sql .= "AND (device like '$search%' OR P1 like '$search%' OR P2 like '$search%') " if(!$dsearch);
$sql .= "ORDER BY lower(device),command DESC";


Die Query wie sie bei mySQL ankommt:


SELECT command, device, p1, p2 FROM fhemconfig as c join fhemversions as v ON v.versionuuid=c.versionuuid WHERE v.version = '0' AND command not like '#create%' AND device like '%%' ESCAPE '\' ORDER BY lower(device),command DESC


Wenn ich das "ESCAPE '\'" rausschmeisse, geht es.

Hilft das evtl. bei der Fehlersuche?

Danke!

VG

LuckyLuis

PS: Bei PHP nutze ich ein Try-Catch für mySQL-Zugriffe. Gibt es das auch für Perl?

rapster

Seltsam eigtl. sollte das bei mysql keine Fehler produzieren...

@Betateilchen, evtl. kannst du das ESCAPE auf SQLITE-only beschränken?
MySQL verwendet \ automatisch als escape-char wie ich die reference verstehe.
Bei SQLITE muss es explizit beim LIKE mit angegeben werden.

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!