Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Perl] Ausgelagertes Statement füllen - execute()

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe das erste Mal ein Perl-Programm geschrieben, in welchem ich ein SQL-Statement auslagere. Mit execute() habe ich die Möglichkeit Übergabeparameter zu übergeben, welche die "?" in meinem Statement ersetzen.

Nun habe ich allerdings ein Problem:

Bei "where bla IN (?)" werden für das Fragezeichen natürlich beliebig viele Eingaben getätigt, welche ich in dem Perl in eine Variable schreibe (z.B. werden 4 Zahlen eingegeben und ich schreibe die getrennet mit Komma in eine Variable "12, 34, 45, 67"). Nun führt er mir das Statement jedoch nicht aus und ich bekomme beim execute() einen Fehler.

"Data is not a numeric-literal."

Der Datentyp in der Datenbank ist Integer.

Hat irgendjemand eine Idee, wie ich das Problem umgehen kann?

Ich habe eben auch das Problem, dass ich mir das fehlerhafte Statement nicht anzeigen lassen kann - weder in der Datenbank noch über irgendeine Umleitung durch das execute().

Danke im voraus und viele Grüße.

Das Problem wird sein, dass numerische Werte erwartet werden, durch das Quoting allerdings ein String entsteht. Was durch das "execute" entsteht, kannst Du Dir über einen kleinen Umweg ausgeben lassen, denn "execute" quotet nicht anders als die "quote"-Methode:

my $foo = "12, 34, 45, 67";
print STDERR "where bla IN (" . $foo . ")";[/php]

Ich habe leider keine Idee, wie man dies sauber lösen könnte. Daher würde ich spontan dazu tendieren, das Statement auf Händen und Füßen zu basteln:

[php]my @foo = (12, 34, 45, 67);
print STDERR "WHERE bla IN (" . join(", ", map {int($_)} @foo) . ")";

  • Autor

Hi habbeda,

danke erstmal für deine Denkanstöße - ich hab schon gar keine Antwort mehr erwartet.

Das Problem selbst war mir von Anfang an klar, aber ich hab mir gedacht, dass ein so weit verbreitetes Modul wie DBI eigentlich eine Möglichkeit bieten müsste, damit umzugehen. Denn es wird doch eventuell andere Entwickler geben, bei denen dieses Problem schon aufgestoßen ist.

Ich hab zuerst auch gedacht, dass mir vielleicht die trace()-Methode weiterhelfen könnte, aber die gibt mir auch nur das Statement mit den ? aus, wenn ich den Level auf 1 oder 2 erhöhe.

Das allgemeine Problem ist, dass ich das Test-Skript natürlich mit einem ausgelagertem Statement ausgeführt habe. Allerdings werde ich in Zukunft keinen Einfluss mehr auf das Statement haben, da das nur an meinen Teil übergeben wird. Deswegen wäre es eben schön gewesen, wenn es für das execute() eine Möglichkeit gegeben hätte. Nun durchlaufe ich das eingebundene Statement umständlich und suche nach den "?".

Habe leider erfolglos gesucht und experimentiert, wie man DBI hier ggf. überreden könnte. Meine letzte Hoffnung war noch "bind_param", um die Übergabe einer Liste mit gewünschtem Effekt zu ermöglichen. Doch leider spricht die Doku eine eindeutige Sprache: ein Platzhalter, ein Wert. Leider muss ich noch ein paar Wochen von meinem Arbeitsplatz fernbleiben - wenn ich aber wieder dort bin (und mich hoffentlich noch an das Problem erinnere), werde ich mal unsere Spezialisten fragen. Erscheint mir ebenfalls etwas unwahrscheinlich, dass noch nie jemand mit diesem Problem zu kämpfen hatte. Für Google fehlen mir zumindest die passenden Stichworte...

  • Autor

Danke für deine Mühen.

Google haben wir in dieser Hinsicht auch schon "vergewaltigt", aber nichts passendes für das Problem gefunden. Auch unsere Entwickler konnten uns dabei nicht weiterhelfen - ich bin ja eigentlich mehr im Service angesiedelt.

Natürlich läuft das Skript nun, aber man macht sich über ungelöste Probleme eben doch immer seine Gedanken ;)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.