Gustl: DBI - .pm - mySQL

Hallo zusammen. War 8 Tage elend krank, 40,6 Fieber, dadurch ist leider der alte Thread schon archiviert.

http://forum.de.selfhtml.org/archiv/2007/1/t143537/#m931887

Ich versuche anzuknüpfen:

Wir waren dabei zu klären wie man Methoden einbindet. Zugegeben etwas verwirrend für mich, da ich nach meinem Verständnis Methoden bisher also funktions-orientiert eingesetzt habe. Natürlich weiss ich was über Methoden, ich war nur so hundeelend krank dass ich gar nichts mehr wusste.

http://perldoc.perl.org/CGI.html#USING-THE-FUNCTION-ORIENTED-INTERFACE

Zumindest steht dort, dass Z.B: use CGI qw/:standard/; zumindest auch die Methode param einbindet, die Objekt-Orientierte Variante hat mich verwirrt, da nie verwendet.

Nun zur DBI:

Ich öffne die Verbindung zur Datenbank und generiere eine einfache Abfrage.

my $abfrage=$dbh->prepare('SELECT * FROM stammdaten') || die $DBI::errstr; $abfrage->execute; my @ergebnis=$abfrage->fetchrow_array; $abfrage->finish;

Klappt gut, ich kann die Daten ausgeben.

Dann versuche ich eine einfache Änderung des Datenbankfeldes Namens vorname in meiner Test-Tabelle stammdaten bei datensatz kdnr 100.

my $upd=$dbh->prepare("UPDATE stammdaten SET vorname=\"$vorname\" WHERE kdnr=100") || die $DBI::errstr; $upd->execute; $upd->finish;

Den parameter lese ich vorher wie immer so ein:

my $vorname=param("vorname");

Die Änderung des Feldes vorname wird korrekt durchgeführt, es erscheint auch keine Fehlermeldung.

Nun füge ich use strict; hinzu. Dies führt jetzt zu folgender Fehlermeldung:

Global symbol "@localhost" requires explicit package name at testosteron.pl line 17.

Ohne strict läufts, also sagt mein innerer Schweinehund, dann lass halt strict weg. Der kleine Mann im Ohr sagt aber, geh der Sache auf den Grund.

Den Aufruf zur Verbindung:

my $dbh=DBI->connect("DBI:mysql:myBase","myBase@localhost",'aha') or die "Fehler bei Datenbankverbindung: $!";

myBase@localhost kann ich aber nicht anders gestalten, das @ kann ich nicht maskieren, da sonst natürlich die Verbindung nicht klappt.

Nun, wo liegt jetzt der Fehler ?

Grüsse Gustl

  1. my $dbh=DBI->connect("DBI:mysql:myBase","myBase@localhost",'aha') or die "Fehler bei Datenbankverbindung: $!";

    myBase@localhost kann ich aber nicht anders gestalten, das @ kann ich nicht maskieren, da sonst natürlich die Verbindung nicht klappt.

    Quatsch, du musst das @ sogar markieren, so wie du es da stehen hast wird aus @localhost undefined bzw ein Leerstring. Das siehst du wenn du dir den Befehl mal ausgeben läßt:

    print qq( DBI->connect("DBI:mysql:myBase","myBase@localhost",'aha'));

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. print qq( DBI->connect("DBI:mysql:myBase","myBase@localhost",'aha'));

      Ja das stimmt und das ist auch normal so.

      Mit maskiertem @ "myBase@localhost" krieg ich aber keine Verbindung zur Datenbank.

      Nun, das war wahrscheinlich meine Kernfrage. Wie müsste ich die Syntax erledigen bzw. wie kann ich datenbankbenutzer@datenbankhost/server anders angeben ?

      Ich hab irgendwie das Gefühl als beisst sich der Hund hier selbst in den Schwanz.

      1. Mit maskiertem @ "myBase@localhost" krieg ich aber keine Verbindung zur Datenbank.

        und die Fehlermeldung die dir DBI ausspuckt hilft auch nicht weiter?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. und die Fehlermeldung die dir DBI ausspuckt hilft auch nicht weiter?

          DBI hat nichts gespuckt, Struppi.

          DBI::quote , über quote finde ich: das maskieren aller Sonderzeichen ausser a-z,0-9 usw. was soll er da quoten wenn im übergabe-wert keine sonderzeichen mehr drin sind ?

          interessanter ist das thema bind_values. hab ich noch nicht gefressen für was das gut sein soll.

          Gustl

          1. und die Fehlermeldung die dir DBI ausspuckt hilft auch nicht weiter?

            DBI hat nichts gespuckt, Struppi.

            Kann ich mir nicht vorstellen, woher weißt du dann, dass er nicht mit dem SQL Server verbindet?

            DBI::quote , über quote finde ich: das maskieren aller Sonderzeichen ausser a-z,0-9 usw. was soll er da quoten wenn im übergabe-wert keine sonderzeichen mehr drin sind ?

            Hast du die ausgefiltert? Das CGI Modul filtert die nicht aus.
            und was Sonderzeichen angeht, suche mal bei goolgle nach sql Injection, du wirst sicher was finden wo dir das erklärt wird.

            interessanter ist das thema bind_values. hab ich noch nicht gefressen für was das gut sein soll.

            Im Prinzip zwei Dinge, einmal wird die Funktion quote automatisch aufgerufen, ausserdem kannst du bei inserts oder updates dir das wiederholte aufrufen des prepare Statements sparen.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. DBI hat nichts gespuckt, Struppi.

              Kann ich mir nicht vorstellen, woher weißt du dann, dass er nicht mit dem SQL Server verbindet?

              achso: das hat sie schon gesagt. aber das thema ist jetzt durch ...

              DBI::quote , über quote finde ich: das maskieren aller Sonderzeichen ausser a-z,0-9 usw. was soll er da quoten wenn im übergabe-wert keine sonderzeichen mehr drin sind ?

              Hast du die ausgefiltert?

              ja wie gesagt. hab mir dazu extra mal eine vorlage mit allen sonderzeichen angefertigt. puuuh.

              interessanter ist das thema bind_values. hab ich noch nicht gefressen für was das gut sein soll.

              Im Prinzip zwei Dinge, einmal wird die Funktion quote automatisch aufgerufen, ausserdem kannst du bei inserts oder updates dir das wiederholte aufrufen des prepare Statements sparen.

              ja, bin grad dabei zu lesen und zu lernen. aber morgen weiter, sonst krieg ich wieder fieber :) mann, mich hats letzte woche so richtig reingehauen, ich dachte schon ich muss ins krankenhaus. bin aber nun wieder zu 70% fit.

              ach ja, cpan schreibt: Quote kann evtl. nicht mit allen Inputmöglichkeiten (z.B. Binärdaten) umgehen. Bzgl. Sicherheit sollte man sich nicht auf qoute verlassen.

              Gustl

            2. hab nun mit INSERT experimentiert und festgestellt bzw. nachgelesen dass fetchrow_array den nächsten datensatz listet. als ich einen zweiten datensatz eingefügt habe dachte ich doch glatt SELECT * FROM und fetchrow_array baut mir gleich ein mehrdimensionales array und gibt mir den ganzen inhalt der tabelle aus. pfiffkas, das ist wohl nicht so komfortabel als ich dachte.

              insgeheim vergleiche ich immer wieder meine erfahrungen mit pasqual und TTable. Da holt man sich die Datensätze in einer Schleife mit if eof. Wie gehts hier bzw. wie bekomme ich nun einfach alle Zeilen einer Tabelle in ein mehrdimensionales Array gepackt ?

              Nur immer die nächste Zeile auszugeben ist nicht grade sinnvoll.

              Gute Nacht: Gustl

              1. insgeheim vergleiche ich immer wieder meine erfahrungen mit pasqual und TTable. Da holt man sich die Datensätze in einer Schleife mit if eof. Wie gehts hier bzw. wie bekomme ich nun einfach alle Zeilen einer Tabelle in ein mehrdimensionales Array gepackt ?

                Einfach nicht, aber steht das nicht in der Doku?
                http://search.cpan.org/~timb/DBI/DBI.pm

                Nur immer die nächste Zeile auszugeben ist nicht grade sinnvoll.

                Naja, du musst sie ja i.d.R. auch Zeilenweise formatieren insofern schon.

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Einfach nicht, aber steht das nicht in der Doku?

                  Die ist gross. Welches Beispiel meinst Du genau ?

                  1. Einfach nicht, aber steht das nicht in der Doku?

                    Die ist gross. Welches Beispiel meinst Du genau ?

                    .. und läßt sich leider nicht Kapitelweise verlinken, aber hast du schon mal dort geschaut, wo die von dir verwendeten Funktion steht?

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. meinst du das ?

                      fetchrow_array

                      @ary = $sth->fetchrow_array;

                      Eine Alternative zu `fetchrow_arrayref'. Holt die nächsten Zeile mit Daten und speichert sie in einem Array mit den Feldwerten. Wenn keine Zeilen mehr gefunden werden, wird eine leere Liste zurückgegeben. NULL-Werte werden als 'undef' zurückgegeben.

                      "Wenn keine Zeilen mehr gefunden werden", das versteh ich nicht. Es steht ja immer nur eine Zeile drin, die naechste.

                      1. meinst du das ?

                        fetchrow_array

                        nein, entschuldigung mir war nicht klar das das so kompliziert ist. Wenn ich in dem Dokument nach fetchrow suche (mit STRG-F) komme ich an eine Stelle an der alle möglichen fetch... Methoden aufgelistet sind:
                          @row_ary  = $sth->fetchrow_array;
                          $ary_ref  = $sth->fetchrow_arrayref;
                          $hash_ref = $sth->fetchrow_hashref;

                        $ary_ref  = $sth->fetchall_arrayref;
                          $ary_ref  = $sth->fetchall_arrayref( $slice, $max_rows );

                        $hash_ref = $sth->fetchall_hashref( $key_field );

                        "Wenn keine Zeilen mehr gefunden werden", das versteh ich nicht. Es steht ja immer nur eine Zeile drin, die naechste.

                        Nein, immer die aktuelle, bis keine mehr drin steht. Was gibt es da nicht zu verstehen?

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                        1. Wenn ich in dem Dokument nach fetchrow suche (mit STRG-F) komme ich an eine Stelle an der alle möglichen fetch... Methoden aufgelistet sind:

                          Die du übrigens auch direkt verlinken kannst, da sie alle mit einem Anker versehen sind :)

                          Siechfred

                          --
                          Ich bin strenggenommen auch nur interessierter Laie. (molily)
                          Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                        2. alle möglichen fetch... Methoden aufgelistet sind:

                          ja klar das hab ich schon 100 mal gelesen.

                          also nochmal von vorn: WIKI sagt:

                          SELECT * FROM Adressen - Listet die Werte aller Spalten aus der Tabelle Adressen auf.

                          um diese Werte aller Spalten in eine @ergebnisliste zu bekommen, dachte ich ich müsste nur mit fetchrow_array diese @ergebnisliste füllen. und irgendwie stehts auch so drin in der cpan.

                          in der @ergebnisliste stehen zwar die werte aller spalten, aber nur vom ersten datensatz. das ist absolut sinnlos wenn ich die tabelle ausgeben will.

                          ich bräuchte also alle werte aller spalten aller datensäzte bzw. das ganze halt nach selektierten kriterien, also alle werte aller spalten aller datensätze von z.b: kdnr 100 bis kdnr 500 und das geordnet in einer liste-liste pro zeile, also in einem mehrdimensionalen array.

                          dann fängts an endlich auch einen sinn zu machen, bisher ists nur lehrstoff oder leer-stoff wenn du so willst.

                          und darüber find ich überhaupt nichts, weder in der cpan, noch im forumsarchiv, noch bei google etc.

                          1. alle möglichen fetch... Methoden aufgelistet sind:

                            ja klar das hab ich schon 100 mal gelesen.

                            also nochmal von vorn: WIKI sagt:

                            SELECT * FROM Adressen - Listet die Werte aller Spalten aus der Tabelle Adressen auf.

                            um diese Werte aller Spalten in eine @ergebnisliste zu bekommen, dachte ich ich müsste nur mit fetchrow_array diese @ergebnisliste füllen. und irgendwie stehts auch so drin in der cpan.

                            Nein, tut es nicht.
                            Was glaubst du machen die  fetchall_... Funktionen?

                            in der @ergebnisliste stehen zwar die werte aller spalten, aber nur vom ersten datensatz. das ist absolut sinnlos wenn ich die tabelle ausgeben will.

                            Ich bin 100% überzeugt, dass irgendwo auch ein Beispiel steht wie du alle Zeilen ausgibst.

                            in etwa so:
                            while(my $row = $sth->fetchrow_arrayref)
                            {
                            print "@$row\n";
                            }

                            und wenn du die Daten weiterverarbeiten willst, entweder mit fetchall oder du bereitest dir die Daten in der Schleife auf.

                            und darüber find ich überhaupt nichts, weder in der cpan, noch im forumsarchiv, noch bei google etc.

                            seltsam, deine Suchstrategien scheinen nicht zielführend zu sein.

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. seltsam, deine Suchstrategien scheinen nicht zielführend zu sein.

                              ja das ist mir schon länger bekannt :( bin ich wohl zu doof dazu

                      2. Vorab: Alle Ergebnis-Datensätze auf einen Schlag erhältst du via fetchall_arrayref bzw. fetchall_hashref.

                        "Wenn keine Zeilen mehr gefunden werden", das versteh ich nicht. Es steht ja immer nur eine Zeile drin, die naechste.

                        Nein, du greifst mit fetch_* nur zeilenweise auf die Ergebnisse zu, was durchaus sinnvoll ist, da du nie genau weißt, wieviele Ergebnisse zurück gegeben werden. Die fetch_*-Methoden arbeiten das Ergebnis der Abfrage ab, bis kein Ergebnisdatensatz mehr übrig ist.

                        Siechfred

                        --
                        Ich bin strenggenommen auch nur interessierter Laie. (molily)
                        Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                        1. Vorab: Alle Ergebnis-Datensätze auf einen Schlag erhältst du via fetchall_arrayref

                          Hab ich gestern schon versucht und grad noch nen syntax-fehler bemerkt, deshalb gings gestern nicht.

                          was mach ich nun damit ? ARRAY(0x83b9c14) wie drösle ich das auf ?

                          1. was mach ich nun damit ? ARRAY(0x83b9c14) wie drösle ich das auf ?

                            Bitte!!!

                            Es gibt eine Perl Doku, eine sehr grosse sogar und zumindest teilweise findest du sie sogar auf deutsch im Netz. Wir können dir nicht in diesem Rahmen Perl beibringen, dass musst du schon selber machen. Wenn du an solchen fundamentalen Dingen scheiterst, warum probierst du es nicht Schrittweise?

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. Bitte!!!

                              Es gibt eine Perl Doku.

                              Ok, Struppi, hab schon verstanden. Ich danke Dir für Deine bisherige Hilfe.

                              Ich weiss dass ich fundamentale Wissens-Lücken habe. Hätte ich die nicht, bräuchte ich auch dieses Forum nicht.

                              1. Ich weiss dass ich fundamentale Wissens-Lücken habe. Hätte ich die nicht, bräuchte ich auch dieses Forum nicht.

                                Naja, wenn du eine Frage zu einen konkreten Problem hast ist das ja kein Problem, aber du hast zuerst eine Frage zu einem Modul, dass eines der besten Dokumentierten ist (und ich finde das deine Frage sich sehr sehr einfach hätte lösen lassen).

                                Das Modul beschäftigt sich mit Datenbanken, einem nicht ganz einfachen Thema, darüber hinaus ist bekannt, dass du ein CGI Skript schreiben willst, beides zusammen ist weder einfach noch ungefährlich (wenn man bei Datenklau und solchen Sachen von Gefahr sprechen möchte).

                                und das du jetzt fragst wie du mit einer Arrayreferenz umzugehen hast (nachdem du schon eine einfach while Schleife nicht einsetzen kannst oder willst) deutet darauf hin, dass du dringend erstmal mit etwas kleineren Anfangen solltest. Perl ist keine einfache Sprache und man sollte sich auf jeden Fall die Doku mal anschauen (wenn du Perl installiert hast ist sie auch auf deinen Rechner), diese ist sehr ausführlich und umfangreich.

                                Es bringt ja nichts wegen jeder Kleinigkeit andere zu Fragen, es ist doch einfacher, wenn du weißt wo du nachschauen kannst und wenn du etwas nicht verstehst z.b. hier nochmal nachfragst. Aber, wie schon gesagt, wir können dir doch nicht die Grundlagen von Perl beibringen. Übrigens sind ist das Perl Kapitel in selfhtml auch nicht zu verachten.

                                Struppi.

                                --
                                Javascript ist toll (Perl auch!)
                          2. Vorab: Alle Ergebnis-Datensätze auf einen Schlag erhältst du via fetchall_arrayref
                            Hab ich gestern schon versucht und grad noch nen syntax-fehler bemerkt, deshalb gings gestern nicht.

                            Ich habe dir mal ein funktionierendes Beispiel hochgeladen:

                            Für den Zugriff auf Referenzen siehe:

                            In letzterem findest du übrigens auch die Begründung, warum man stets use strict verwenden sollte.

                            Siechfred

                            --
                            Ich bin strenggenommen auch nur interessierter Laie. (molily)
                            Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                            1. Die Frage ist ob Gustl hier überhaupt versteht, dass er eine Arrayreferenz hat und was die Ausgabe von Data::Dumper bedeutet.

                              Für den Zugriff auf Referenzen siehe:

                              auf jeden Fall ist dass seine Lektüre für Heute ;-)

                              Struppi.

                              --
                              Javascript ist toll (Perl auch!)
                              1. Die Frage ist ob Gustl hier überhaupt versteht, dass er eine Arrayreferenz hat und was die Ausgabe von Data::Dumper bedeutet.

                                Och, ich finde Beispielcodes immer sehr hilfreich, insbesondere dann, wenn man ein so komplexes Thema mit so wenig Code darstellen kann :)

                                Für den Zugriff auf Referenzen siehe:
                                auf jeden Fall ist dass seine Lektüre für Heute ;-)

                                Eventuell sollte über die Anschaffung von Büchern nachgedacht werden, bei mir stehen das Perl-Kochbuch und CGI-Anwendungen mit Perl im Bücherregal. Viele halten Programmieren mit Perl für die Perl-Bibel, in Abhängigkeit vom Kenntnisstand könnte sich zuvor ein Einstieg mit Hilfe von Einführung in Perl lohnen.

                                Bücher haben den Vorteil, dass sie offline verfügbar sind, dass man in ihnen herumkritzeln kann und - für Gustl offenbar wichtig - in Deutsch vorliegen.

                                Siechfred

                                --
                                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                                Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                                1. Die Frage ist ob Gustl hier überhaupt versteht, dass er eine Arrayreferenz hat und was die Ausgabe von Data::Dumper bedeutet.

                                  1.) Ja. 2.) Nein.

                                  Eventuell sollte über die Anschaffung von Büchern nachgedacht werden

                                  Ich hab ein Bücherregal und da steht auch einiges drin von php über perl und html nach javascript, auch c und obj-pascal, algorithmen etc. Ich lese sie nur nicht, dafür ist irgendwie nie richtig Zeit.

                                  Bücher haben den Vorteil, dass sie offline verfügbar sind, dass man in ihnen herumkritzeln kann und - für Gustl offenbar wichtig - in Deutsch vorliegen.

                                  Bücher haben den Nachteil, dass man keinen Suchbegriff eingeben kann.

                                  Was Referenzen auf Arrays oder Hashes angeht, nun ich hab sie noch nie gebraucht und mein Hirn weigert sich irgendwie den Sinn zu sehen, dass fetch_ Referenzen erzeugt die man dann erst aufwendig umarbeiten muss um die Daten anständig weiterverarbeiten zu können.

                                  Ihr könnt gerne auch wieder direkt mit mir reden, ich bewundere sowieso die Geduld die Ihr beide mit mir aufbringt, komme mir aber schon blöd vor wenn "über" mich gesprochen wird.

                                  Egal, ich hab die Daten nun so wie ich sie haben wollte vorliegen, in einer liste-liste.

                                  Gustl

                                  1. Was Referenzen auf Arrays oder Hashes angeht, nun ich hab sie noch nie gebraucht und mein Hirn weigert sich irgendwie den Sinn zu sehen, dass fetch_ Referenzen erzeugt die man dann erst aufwendig umarbeiten muss um die Daten anständig weiterverarbeiten zu können.

                                    Referenzen ob Arrays; Hashes oder auf Objekte sind extrem wichtig nicht nur in Perl. Einmal kannst du diese als Parameter einer Funktion übergeben und die Orginaldaten bearbeiten, anderseits sind sie Speichersparend da nicht jedesmla eine Kopie angelegt werden muss, was u.U. sehr viel sein kann.

                                    Und aufwenig bearbeiten musst du doch gar nicht sie liegen als eine Referenz auf eine Liste vor, die du auch z.b. direkt mit foreach durchlaufen kannst

                                    Irgendwo fehlt dir da wirklich was für's Verständnis, Referenzen in Perl sind kaum Schwieriger als normale Skalare.

                                    Ihr könnt gerne auch wieder direkt mit mir reden, ich bewundere sowieso die Geduld die Ihr beide mit mir aufbringt, komme mir aber schon blöd vor wenn "über" mich gesprochen wird.

                                    Ja, tut mir leid, macht man nicht, sorry.

                                    Geduld lernt man hier, das stimmt ;-)

                                    Struppi.

                                    --
                                    Javascript ist toll (Perl auch!)
                                  2. Bücher haben den Nachteil, dass man keinen Suchbegriff eingeben kann.

                                    Es gibt ein Schlagwortregister. Und das Perl-Kochbuch ist sehr schön nach Themenkomplexen sortiert.

                                    Was Referenzen auf Arrays oder Hashes angeht, nun ich hab sie noch nie gebraucht und mein Hirn weigert sich irgendwie den Sinn zu sehen, dass fetch_ Referenzen erzeugt die man dann erst aufwendig umarbeiten muss um die Daten anständig weiterverarbeiten zu können.

                                    Du musst nichts umarbeiten, lediglich die Schreibweise für den Zugriff ist anders:

                                    my @arr = ('foo', 'bar', 'baz');  
                                    my $ref = \@arr;  
                                    # Ausgabe des ersten Arrayelementes  
                                    # direkter Zugriff auf das Array  
                                    print $arr[0], "\n";  
                                    # Zugriff via Referenz  
                                    print $ref->[0];
                                    

                                    Ihr könnt gerne auch wieder direkt mit mir reden, ich bewundere sowieso die Geduld die Ihr beide mit mir aufbringt, komme mir aber schon blöd vor wenn "über" mich gesprochen wird.

                                    Naja, du warst auf einmal so still :)

                                    Siechfred

                                    --
                                    Ich bin strenggenommen auch nur interessierter Laie. (molily)
                                    Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                                    1. Naja, du warst auf einmal so still :)

                                      Siechfred

                                      Na zuerst war ich mit meiner Frau im Cafe, dann gabs was anderes zu erledigen und nun faszinieren mich natürlich die neuen Möglichkeiten mit DBI und mySQL > Dank Euch :)

                                      Morgen muss ich die Surmschäden an meinem Haus beseitigen und da ich Funkamateur bin habe ich (hatte ich) eine immens grosse Antennenanlage auf dem Dach, die is jetzt nach 10 Jahren endlich hin, aber total :(

                                      http://www.dl1dgl.de/brokenwings

                                      Was mich noch interessieren würde: Muss ich beim Schreiben in die Datenbank irgendwelche FLock´s setzen ? Also ein User schreibt einen neuen Datensatz und zur gleichen Zeit macht z.B. ein anderer ein Update eines anderen Datensatzes in der selben Tabelle. Das war ja mit den csv-Direktzugriffen ohne FLock; nicht zu regeln, da war dann plötzlich die Datei leer etc. Diese Probleme gibts mit einer SQL-Datenbank nicht, oder ?

      2. Mit maskiertem @ "myBase@localhost" krieg ich aber keine Verbindung zur Datenbank.

        Wie heißt der User? Tatsächlich 'myBase@localhost', oder eher 'myBase'? Das von dir beschriebene Verhalten jedenfalls stützt diese Annahme.

        Nun, das war wahrscheinlich meine Kernfrage. Wie müsste ich die Syntax erledigen bzw. wie kann ich datenbankbenutzer@datenbankhost/server anders angeben ?

        So geht's richtig:

        my $driver = 'mysql';  
        my $host = 'localhost';  
        my $database = 'myDB';  
        my $user = 'Gustl';  
        my $password = 'geheim';  
        my $dbh = DBI->connect("DBI:$driver:$database:$host", $usr, $pwd) || die "No connection: $DBI::errstr";
        

        Du solltest zudem unbedingt meinen Hinweis beherzigen, bei jeder Datenbankaktion mögliche Fehler abzufangen. Dies betrifft insbesondere dein execute.

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
        1. So geht's richtig:

          my $dbh = DBI->connect("DBI:mysql:mybase:localhost","mybase", 'aha') || die "No connection: $DBI::errstr";

          Du solltest zudem unbedingt meinen Hinweis beherzigen, bei jeder Datenbankaktion mögliche Fehler abzufangen. Dies betrifft insbesondere dein execute.

          AHA - Erlebnis :) Ja so gehts richtig. Hab das user@localhost wohl aus nem schlechten Beispiel gezogen. Jetzt klappts auch logischerweise mit use strict -> wohldanndochfürwasgutist.

          Ok, ich verwende || die $DBI::errstr bei execute und bei connect.

          Nun gehts weiter mit den Platzhaltern und den bind_werten lernen. Das hab ich noch nicht gecheckt.

          Gustl

          1. Nun gehts weiter mit den Platzhaltern und den bind_werten lernen. Das hab ich noch nicht gecheckt.

            Ist eigentlich auch keine Hexerei, du notierst beim Vorbereiten der Abfrage anstelle der Variablen ein '?' und übergibst execute die Werte (ist auch alles mit Beispielen in der Dokumentation erklärt). Der Vorteil ist das automagische Anwenden von quote, das du dann logischerweise nicht mehr verwenden musst und darfst.

            Einen weiteren Vorteil hat dir Struppi schon genannt, nämlich das mehrfache Verwenden des gleichen Statements. Simples Beispiel (ohne Fehlerabfrage):

            my $sth = $dbh->prepare("SELECT spalte FROM tabelle WHERE spalte1 = ?");  
            # erste Abfrage nach foo  
            $sth->execute("foo");  
            while ( @row = $sth->fetchrow_array() ) {  
              # tu was  
            }  
            # und nochmal mit bar  
            $sth->execute("bar");  
            while ( @row = $sth->fetchrow_array() ) {  
              # tu was  
            }
            

            Ansonsten findest du auch einiges zu Perl, MySQL und DBI.pm im Forumsarchiv.

            Siechfred

            --
            Ich bin strenggenommen auch nur interessierter Laie. (molily)
            Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
            1. erste Abfrage nach foo

              $sth->execute("foo");

              Was hats mit dem foo, bar und baz auf sich ? Was heisst das ?

              1. Was hats mit dem foo, bar und baz auf sich ? Was heisst das ?

                Das waren nur Beispiele, ich kenne deine Daten ja nicht :)

                Letztlich wird durch das execute in das mit prepare vorbereitete SQL-Statement an Stelle der Fragezeichen das eingefügt, was du als Argumente übergibst. Auf mein Beispiel bezogen würde durch:

                $sth->execute("foo");

                das SQL-Statement zu

                SELECT spalte FROM tabelle WHERE spalte1 = 'foo'

                werden und dir so alle Ergebnisse liefern, für die spalte1 den Wert 'foo' hat. Ach ja, und zu foo gibt's was in der wikipedia.

                Siechfred

                --
                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                1. Was hats mit dem foo, bar und baz auf sich ? Was heisst das ? Ach ja, und zu foo gibt's was in der wikipedia.

                  lach, tatsache ist ich konnte wohl nicht glauben dass die 3 verwendeten ausdrücke wirklich gar nichts zu sagen haben. hab das noch nie vorher gehört.

  2. my $upd=$dbh->prepare("UPDATE stammdaten SET vorname=\"$vorname\" WHERE kdnr=100") || die $DBI::errstr; $upd->execute; $upd->finish;

    Den parameter lese ich vorher wie immer so ein:

    my $vorname=param("vorname");

    Und was du hier machst ist hochgefährlich. Du läßt Code von aussen ungeprüft und ungefiltert in den SQL Befehl einfliessen, damit öffnest du das Tor für SQL Injections.

    Du musst zumindest die Funktion DBI::quote() anwenden, besser arbeitest du mit Platzhaltern

    http://search.cpan.org/~timb/DBI/DBI.pm#Placeholders_and_Bind_Values

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Und was du hier machst ist hochgefährlich. Du läßt Code von aussen ungeprüft und ungefiltert in den SQL Befehl einfliessen, damit öffnest du das Tor für SQL Injections.

      Ja Struppi, das weiss ich und ich entferne natürlich vor der Verarbeitung alle Sonderzeichen. Hab das im Thread weggelassen, da es für meine Frage nicht relevant ist. Und ein reiner Wert aus Buchstaben bzw. ein anderer aus Zahlen kann keinen Schaden anrichten denke ich. Lieg ich da richtig ?

      Gustl

      1. Ja Struppi, das weiss ich und ich entferne natürlich vor der Verarbeitung alle Sonderzeichen. Hab das im Thread weggelassen, da es für meine Frage nicht relevant ist. Und ein reiner Wert aus Buchstaben bzw. ein anderer aus Zahlen kann keinen Schaden anrichten denke ich. Lieg ich da richtig ?

        Ja, aber da du CGI::param() verwendest, verwendest du unkontrollierbare Werte.

        Struppi.

        --
        Javascript ist toll (Perl auch!)