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
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...
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?
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.
*grmpf*