tbaddade / redaxo_watson

Suchagent für REDAXO 4.5 + 5
MIT License
30 stars 9 forks source link

Funktioniert nicht mit reservierte MySQL Keywords, fehlendes Escaping #49

Closed alxndr-w closed 4 years ago

alxndr-w commented 5 years ago

image

tbaddade commented 5 years ago

Funktioniert nicht unter Subdomains ohne www.

wie genau sieht diese bei dir aus?

Bei uns klappt diese Kombination https://projekt.arbeitsdomain.de

Du könntest auch mal das hier aufrufen /redaxo/index.php?page=watson&watson_query=Test

Eventuell erhälst du einen Fehler.

alxndr-w commented 5 years ago
Error while executing statement " SELECT id, name AS name FROM rex_dance_voucher_order WHERE (to LIKE "%Test%") OR (euro LIKE "%Test%") OR (name LIKE "%Test%") OR (street LIKE "%Test%") OR (zip LIKE "%Test%") OR (city LIKE "%Test%") OR (phone LIKE "%Test%") OR (email LIKE "%Test%") OR (kname LIKE "%Test%") OR (iban LIKE "%Test%") OR (blz LIKE "%Test%") OR (message LIKE "%Test%") ORDER BY id LIMIT 20"! SQLSTATE[42000]: Syntax error or access violation: 1064 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 'to LIKE "%Test%") OR (euro LIKE "%Test%") OR (name LIKE "%Test%") OR (street LIK' at line 1

Es gibt kein Feld to

Ich habe das Phänomen bisher tatsächlich nur in Seiten, die nicht www. als Subdomain haben. Evtl. funktioniert bei dir / bei euch automatisch www.projekt.arbeitsdomain.de - aber vielleicht hast du recht, und das ist hier ein anderer Fehler.

tbaddade commented 5 years ago

Das to Feld müsste in deiner YForm Tabelle existieren, da Watson die Felder von YForm abholt.

Kannst du mal diese Zeile hier anpassen https://github.com/tbaddade/redaxo_watson/blob/master/lib/Watson/Foundation/Command.php#L126

Alt

$w[] = $field.' LIKE "%'.$command_part.'%"';

Neu

$w[] = '`'.$field.'` LIKE "%'.$command_part.'%"';

Und danach die obige Url direkt aufrufen.

alxndr-w commented 5 years ago

Dann bekomme ich

Error while executing statement " SELECT a.id, a.clang_id, CONCAT(a.id, "|", a.clang_id) as bulldog FROM rex_article AS a WHERE (`a.id` LIKE "%Test%") OR (`a.name` LIKE "%Test%") GROUP BY bulldog LIMIT 20"! SQLSTATE[42S22]: Column not found: 1054 Unknown column 'a.id' in 'where clause'

ich korrigiere mich: to ist auf jeden Fall vorhanden, ich habe in der falschen Tabelle geschaut.

tbaddade commented 5 years ago

Ok dann müsste das anders gelöst und Watson umgebaut werden … Aber es liegt an deinem Feld to … Siehe https://dev.mysql.com/doc/refman/5.7/en/keywords.html#keywords-5-7-detailed-T

staabm commented 5 years ago

ich vermute du brauchst sowas

if (strpos($field, '.') !== false) {
  $field = '`' .str_replace('.', '`.`, $field). '`';
} else {
  $field = '`'. $field .'`';
}

ich denke hier in deinem like fehlt noch weiteres escaping $command_part = str_replace(['_', '%'], ['\_', '\%'], $command_part);

Ungetestet!

dpf-dd commented 4 years ago

Ich habe das Issue heute entdeckt und kann den Fehler exakt wie Alex beschrieben hat bestätigen. Bei mir triggert einer Column "alter" den Fehler...

staabm commented 4 years ago

Funktioniert der vorgeschlagene fix ein Kommentar weiter oben für dich?

dpf-dd commented 4 years ago

Düdüm. Ich hatte vergessen die Backticks unten in der Zeile rauszunehmen, nachdem ich deinen Fix eingebaut hatte. Jetzt haut es hin und Watson funktioniert wieder! :) Danke! Das passst so und ich verstehe sogar den Fehler und was deine zwei Zeilen dagegen tun. Genial. Warum ist der Issue dann hier eigentlich noch offen? Soll ich eine PR draus machen?

Danke!

staabm commented 4 years ago

Gerne einen PR machen.

Das issue ist offen weil noch niemand einen Fix bereitgestellt hat (und der fix bisher nicht getestet war - sondern eher geraten).

tbaddade commented 4 years ago

Das issue ist offen weil noch niemand einen Fix bereitgestellt hat (und der fix bisher nicht getestet war - sondern eher geraten).

Hatte den Fix schon seit einer Weile Lokal drin wohl nur vergessen zu committen. Sorry dafür.