Neu JTL Shop 4 - Plugin SQL Procedure

  • JTL-Connect 2022: Ihr habt noch kein Ticket? Jetzt schnell sichern! Die PreConnect ist bereits ausgebucht, auch für die After-Show-Party auf der Ocean Diva sind nur noch wenige Plätze verfügbar! HIER geht es zum Ticketverkauf

  • Das Stable Release von JTL-Wawi 1.6 ist startklar: HIER gehts zum Forenbeitrag

broesHPB

Mitglied
9. Dezember 2020
13
1
Ahoi!

Aktuell passe ich gerade ein Custom-Plugin für den JTL Shop 4.06 (Build 17) an und erstelle eine neue Version des Plugins mit SQL:

SQL:
DELIMITER $$

DROP PROCEDURE IF EXISTS my_procedure$$

CREATE PROCEDURE my_procedure()
BEGIN
    IF NOT EXISTS((SELECT *
                   FROM information_schema.COLUMNS c
                   WHERE c.TABLE_SCHEMA = 'datenbank_name'
                     AND c.TABLE_NAME = 'tabellen_name'
                     AND c.COLUMN_NAME = 'spalten_name')) THEN ALTER TABLE tabellen_name
        ADD spalten_name BOOL NOT NULL DEFAULT FALSE;
    END IF;
END $$

CALL my_procedure()$$

DROP PROCEDURE IF EXISTS my_procedure$$

DELIMITER ;

Ich erhalte folgenden Fehler (203 = SQL Syntax Error) im Log:
SQL Fehler beim Installieren des Plugins (XYZ): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near DELIMITER $$DROP PROCEDURE IF EXISTS my_procedure$$CREATE PROCEDURE ch at line 1

Dabei ist zu beachten, wenn ich die Query ganz normal in der Console laufen lasse, dann gibt es keinerlei Probleme.

Ich habe mir mal den betreffenden Code in admin/includes/pluginverwaltung_inc.php, insbesondere die Funktionen logikSQLDatei und parseSQLDatei, die Art und Weise wie da doppelte Tabellen verhindert werden und vermerkt werden welche Plugins welche Tabellen installiert haben ist fachlich gruselig, insbesondere mit der Logik in parseSQLDatei. Jedenfalls verhindert dieses Zerhacken der SQL-Datei, dass man komplexere Datenbank-Anfragen, z. B. über Prozeduren oder Prepared Statements über SQL-Variablen nicht nutzen kann.

Zudem habe ich die Doku zum Thema Plugins inzwischen mehrfach durchforstet, ob es da besondere Regeln für die Plugin-SQL-Dateien gibt, was man da rein schreiben darf und was nicht...

Ebenso habe ich keinen HOOK gefunden, der nach der Installation einer neuen Plugin-Version nutzbar wäre, um selbst tätig zu werden. Ich müsste jetzt selbst beim Installieren irgendwo in einer Tabelle vermerken, dass es ein Update gab und dies jetzt jedes Mal checken ob die dafür notwendigen SQL-Änderungen bereits ausgeführt wurden. Das möchte ich ungern machen.

Ist das gewollt, dass man außer DELETE, CREATE, INSERT, ALTER nichts anderes in die Plugin-SQL-Dateien schreiben kann?

Gibt es eine Alternative?

Freundliche Grüße
Hape von Bröös
 
Zuletzt bearbeitet:

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.225
257
Halle (Saale)
Das hat überhaupt nichts mit den von dir genannten Funktionen zu tun - wie du ja selbst schreibst, wird das SQL ja ausgeführt, erzeugt nur eine Fehlermeldung beim DB-Server.
Und das wiederum hat eher was mit PDO zu tun. Siehe dazu z.B. https://stackoverflow.com/questions...cedure-containing-a-delimiter-in-php-with-pdo

Das kannst du umsetzen mit einer bootstrap.php in includes/plugins/<deine_plugin_id>/version/<deine_version>/ mit diesem Inhalt:

Code:
<?php

namespace deine_plugin_id;

use Shop;

/**
 * Class Bootstrap
 */
class Bootstrap extends \AbstractPlugin
{

    public function installed()
    {
        Shop::DB()->query('DROP PROCEDURE IF EXISTS my_procedure', 4);
        Shop::DB()->queryPrepared("CREATE PROCEDURE my_procedure()
            BEGIN
                IF NOT EXISTS((SELECT *
                    FROM information_schema.COLUMNS c
                       WHERE c.TABLE_SCHEMA = :dbname
                        AND c.TABLE_NAME = 'deine_tabelle'
                        AND c.COLUMN_NAME = 'deine_column')) THEN ALTER TABLE deine_tabelle
                    ADD deine_column BOOL NOT NULL DEFAULT FALSE;
                END IF;
            END",
            ['dbname' => DB_NAME],
            4
        );
        Shop::DB()->query('CALL my_procedure()', 4);
        Shop::DB()->query('DROP PROCEDURE IF EXISTS my_procedure', 4);
    }
}

Events für Plugin-Updates gibt es ab Shop 5.

Ansonsten gilt für Shop 4-Plugins aber:
Für jede der alten Versionen kannst du einzelne SQL-Files definieren, die bei der Installation alle nacheinander ausgeführt werden.
Code:
<Version nr="100">
    <CreateDate>2017-11-07</CreateDate>
    <SQL>install.sql</SQL>
</Version>
<Version nr="101">
    <CreateDate>2018-11-07</CreateDate>
    <SQL>update101.sql</SQL>
</Version>
Da kannst du in install.sql ein CREATE TABLE schreiben und in update101.sql ein ALTER TABLE ADD COLUMN - nur halt mit der jeweiligen Beschränkung auf Tabellen, die mit "xplugin_<deine_plugin_id>" beginnen.
Sobald Version 101 frisch installiert wird, wird auch das install.sql ausgeführt. Und falls Version 100 zuvor installiert war entsprechend nur die update101.sql.
Also musst du nicht nachsehen, ob da irgendwelche Columns existieren, weil du das SQL der vorherigen Version ja definiert hast.

Falls du jedoch eine fremde Tabelle manipulieren möchtest, kann ich deine obige Frage "Ist das Absicht" tlw. mit "Ja, war es damals" beantworten.
 
  • Gefällt mir
Reaktionen: broesHPB

broesHPB

Mitglied
9. Dezember 2020
13
1
Hallo @FMoche,

danke für Dein schnelles Feedback.

Das hat überhaupt nichts mit den von dir genannten Funktionen zu tun - wie du ja selbst schreibst, wird das SQL ja ausgeführt, erzeugt nur eine Fehlermeldung beim DB-Server.
Vielleicht hab ich das missverständlich ausgedrückt: Das SQL ist in der Konsole ohne Fehler auf dem DB-Server ausführbar, aber nicht via Plugin-Installation. Es ist über Plugin-Installation mit der in der info.xml definierbaren SQL-Datei nicht möglich Prozeduren, Prepared Statements oder auch simple CREATE TABLE IF NOT EXISTS Anweisungen zu nutzen.

Das kannst du umsetzen mit einer bootstrap.php in includes/plugins/<deine_plugin_id>/version/<deine_version>/ mit diesem Inhalt:
Wird die bootstrap.php nur während der Plugin-Installation ausgeführt oder "immer", wenn das Plugin aufgerufen wird? Die Doku dazu hatte ich so verstanden, dass die bootstrap.php z. B. das Mapping für PSR Namespaces macht und daher immer aufgerufen wird? (Ich probiers einfach mal aus, danke.)

Falls du jedoch eine fremde Tabelle manipulieren möchtest, kann ich deine obige Frage "Ist das Absicht" tlw. mit "Ja, war es damals" beantworten.
Nein, das möchte ich nicht, nur Tabellen des betreffenden Plugins.

Da kannst du in install.sql ein CREATE TABLE schreiben und in update101.sql ein ALTER TABLE ADD COLUMN - nur halt mit der jeweiligen Beschränkung auf Tabellen, die mit "xplugin_<deine_plugin_id>" beginnen.
Sobald Version 101 frisch installiert wird, wird auch das install.sql ausgeführt. Und falls Version 100 zuvor installiert war entsprechend nur die update101.sql.
Also musst du nicht nachsehen, ob da irgendwelche Columns existieren, weil du das SQL der vorherigen Version ja definiert hast.
Im Normalfall wäre das auch der Gang der Dinge und durchaus auch sinnvoll so. Ich finde es persönlich praktischer und vor allem Zeit-sparender, wenn bei z. B. einem CREATE TABLE ein IF NOT EXISTS (was mitunter auch schon in der Plugin SQL zu Fehlern führte, weil dann die REGEX die den Tabellennamen in logikSQLDatei und parseSQLDatei rausfinden soll broken ist) dabei ist oder beim Ändern einer Tabelle vorher geprüft wird, ob die Änderung überhaupt notwendig ist, falls ich das Plugin mal aus Entwicklungsgründen komplett deinstallieren und neu installieren müsste. Das ist natürlich mein persönlicher Geschmack und erhebt keinen Anspruch auf allgemeine Richtigkeit.

Freundliche Grüße
Hape von Bröös
 

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.225
257
Halle (Saale)
Du kommt mit der reinen SQL-Lösung ohne PHP ja eh nicht weiter, weil du da den Datenbanknamen drin verwendest.
Abgesehen davon kann in Shop 4 problemlos in meiner SQL-Datei ein Statement wie
Code:
CREATE TABLE IF NOT EXISTS `xplugin_<meine_plugin_id>_<mein_tabellenname>`...
ausführen. Das Problem bei dir ist lediglich der Delimiter, der aus im Link genannten Gründen nicht genutzt werden kann und daher einen Syntaxfehler erzeugt.

Dass die Logikprüfung ziemlicher Mist ist steht ansonsten nicht zur Debatte - das wurde ja aus gutem Grund in Shop 5 auch entfernt und auf Migrationen umgestellt.
 
  • Gefällt mir
Reaktionen: broesHPB

broesHPB

Mitglied
9. Dezember 2020
13
1
Hallo @FMoche,

danke für das Feedback. Ich probiere heute noch Deinen Lösungsvorschlag mit der bootstrap.php aus und hoffe das klappt.

Freundliche Grüße
Hape von Bröös
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu DHL Wunschpaket Plugin JTL Shop 4 - Bestellvorgang verwehren bei fehlender Auswahl/Eingabe Plugins für JTL-Shop 0
Neu PAYPAL Plugin 2.1.2. zeigt bei JTL SHOP 5.1.4 unsere Bestellnummern nicht mehr an JTL-Shop - Fehler und Bugs 2
Neu 💙 Neues Plugin: Upload Field Extension (Uploadfelder für Formulare bereitstellen) für JTL-Shop 5 Plugins für JTL-Shop 0
Neu PAYPAL Plugin 2.1.2. zeigt bei JTL SHOP 5.1.4 unsere Bestellnummern nicht mehr an Plugins für JTL-Shop 2
Neu 💙 Neues Plugin: Lieferslot (Liefertermin/Abholzeit vereinbaren) für JTL-Shop 5 Plugins für JTL-Shop 3
Neu 💙 Neues Plugin: Liefergebiete Plus (Artikelansicht nach Postleitzahl) für JTL-Shop 5 Plugins für JTL-Shop 0
Neu 💙 Neues Plugin: Produktbewertung Plus (Kundenbewertungen mit Bildern oder Videos) für JTL-Shop 5 Plugins für JTL-Shop 6
Neu Lilfoot Plugin installiern im JTL Shop 5 Allgemeine Fragen zu JTL-Shop 8
Neu 💙 Neues Plugin: Merkmalfilter Plus (Schieberegler für Merkmalfilter) für JTL-Shop 5 Plugins für JTL-Shop 0
Neu 💙 Neues Plugin: Custom CSS & JavaScript (CSS & JS Code einfach in deinen Shop einfügen) für JTL-Shop 5 Plugins für JTL-Shop 0
Neu 💙 Neues Plugin: Cross-Selling-Sortierung-Plus (CrossSelling Alternativ-Artikel sortieren) für JTL-Shop 5 Plugins für JTL-Shop 0
Neu 💙 Neues Plugin: Galeriezoom (Zoomfunktion für Artikelbilder) für JTL-Shop 5 Plugins für JTL-Shop 5
Neu Plugin für mehrsprachigen WooCommerce Shop - JTL WaWi kompatibel - WPML? WooCommerce-Connector 2
Neu 💚 Vorbestellung nach Kundengruppen ermöglichen? Geht jetzt mit unserem neuen Plugin für JTL Shop 5 Plugins für JTL-Shop 1
Neu Paypal Checkout Plugin: Ratepay JTL Shop 5 Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 6
Neu JTL Shop 4,04 Google Fonts DSVGO Allgemeine Fragen zu JTL-Shop 3
Neu JTL Shop - Gallerieansicht (mehrere Artikel) darunter Kurzbeschreibung Installation / Updates von JTL-Shop 0
Neu Spam Mails seit Erweiterungsdownload für den JTL Shop User helfen Usern 0
Neu JTL Shop mehrere Filialen (Lager) für Selbstabholer Allgemeine Fragen zu JTL-Shop 0
Beantwortet GELÖST - Verbindungstest JTL-Wawi 1.6 -> JTL-Shop 5.1 scheitert JTL-Wawi - Fehler und Bugs 6
Neu Google Recaptcha funktioniert nicht mehr bei JTL Shop 4.05 User helfen Usern 1
Neu billardpro.de: Seit ein paar Tagen mit JTL SHop 5 mit dem Snackys Theme Shops stellen sich vor 24
Neu Shop Abgleich JTL Wawi 1.6 JTL-Wawi 1.6 1
Behebung einer kritischen Sicherheitslücke in JTL-Shop 5 Einrichtung JTL-Shop5 1
Neu Kann JTL Wawi den Bestellstatus von Online Shop überhemen ? Allgemeines zu den JTL-Connectoren 0
Neu JTL Shop 5 Bestellungen - Lieferadresse lassen sich teilweise nicht ändern in der Wawi JTL-Wawi - Fehler und Bugs 15
Neu Kann man mit JTL-Shop 5 A/B Testing durchführen? Allgemeine Fragen zu JTL-Shop 2
Neu Worker 2.0 Abgleich mit JTL Shop wird mit Fehler beendet JTL-Wawi - Fehler und Bugs 19
Neu JTL Shop 5 - alle Rechnungen aufrufen Plugins für JTL-Shop 0
Neu JTL Shop Update 5.1.3 - Datenbank Fehler: 1062 Duplicate entry 'COUNTRY_VIEW' for key 'PRIMARY' Installation / Updates von JTL-Shop 6
Neu JTL Shop 5 Kundenkonto - Erweitern JTL-Shop - Ideen, Lob und Kritik 0
Neu Coupon für Artikel mit 7% und 19% USt wie lösen? Grundsätzliches JTL Shop Problem Allgemeine Fragen zu JTL-Shop 9
Neu Problem bei Sync zwischen JTL Wawi & JTL Shop Onlineshop-Anbindung 14
Neu Umzug auf JTL Shop - wie umgehen mit Länderdomains? Installation / Updates von JTL-Shop 2
Neu JTL Shop (4.06.19) - Produktbilder werden nicht mehr generiert Allgemeine Fragen zu JTL-Shop 6
Neu JTL-Shop ohne Öffentlichkeit entwickeln Allgemeine Fragen zu JTL-Shop 17
Neu Einstellungen mehrerer JTL Shop 5 synchronisieren Allgemeine Fragen zu JTL-Shop 0
Neu PDF Anleitung im JTL-Shop 5 - Aber in hübsch mit Bildvorschau Allgemeine Fragen zu JTL-Shop 2
JTL Shop in den Facebook Shop integrieren JTL-Wawi 1.6 0
Neu JTL Shop Eingangsbestätigung automatisch die erste Seite drucken? Allgemeine Fragen zu JTL-Shop 0
Neu JTL Shop 5 / Script in header.tpl einbauen / wer kann helfen? Technische Fragen zu Plugins und Templates 2
Neu JTL Shop Anzahl der Lieferung ausblenden Allgemeine Fragen zu JTL-Shop 0
JTL Shop 5 Plugins lassen sich nicht installieren Upgrade JTL-Shop4 auf JTL-Shop5 0
Neu Guthaben für JTL Shop nicht möglich - Abfrage Standardbankverbindung? JTL-Wawi - Fehler und Bugs 3
Neu PayPal Checkout JTL Shop 5 - Log in with PayPal aktiviert oder nicht Plugins für JTL-Shop 0
Neu Manuelle Integration von PayPal Checkout für JTL Shop 4 Plugins für JTL-Shop 1
Neu DE statt Deutschland bei Bestellung aus JTL Shop 5 JTL-Wawi - Fehler und Bugs 1
Neu Die folgenden Dateien sind nicht identisch mit den Dateien der aktuellen Version von JTL-Shop. Allgemeine Fragen zu JTL-Shop 3
Neu Warning Logs mit MagicCompatibilityTrait JTL Shop 5 JTL-Shop - Fehler und Bugs 2
Neu JTL Shop 5 Export unvollständig JTL-Shop - Fehler und Bugs 0

Ähnliche Themen