Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8527[/thread]

Aus einem String ein ' entfernen



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
jojod
 2006-11-24 11:51
#71959 #71959
User since
2006-11-24
8 Artikel
BenutzerIn
[default_avatar]
Hallo Community

Ich benutze ein Script welches in Perl geschrieben ist. Welches ich allerdings von einem Kollegen bekommen habe der in ferner Zukunft nicht erreichbar ist. Folglich hab ich net wirklich viel Ahnung von Perl.
Ich habe folgendes problem und hoffe ihr könnt mir dabei helfen:
Also der Teil des Scripts soll eine Fehlermeldung in eine Datenbank einlesen. Nun habe ich das Problem das eine Fehlermeldung die ich bekomme ein ' enthält... Sprich der gesamte string funktioniert nicht mehr.

Code: (dl )
1
2
3
4
sub Fehler_eintragen {
print "Neuer Fehler $_[0] \n" if defined $opt_v;
$dbh->do("insert into Fehler(Fehler) values ('" . $_[0] . "');"); Fehler("Fehler Neuer Fehler: $DBI::errstr", 0) if $DBI::err;
}


nun zu meiner Frage: wie kann ich den String vorher auf ein ' kontrollieren um selbiges durch ein leerzeichen zu ersetzen??

Für eine Antwort wär ich euch sehr dankbar

gruß

jojo
renee
 2006-11-24 11:56
#71960 #71960
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest es nicht ersetzen, sondern ein anderes Feature von CPAN:DBI verwenden: die ?-Schreibweise.

Code: (dl )
1
2
3
4
sub Fehler_eintragen {
print "Neuer Fehler $_[0] \n" if defined $opt_v;
$dbh->do("insert into Fehler(Fehler) values (?);", undef, $_[0]); Fehler("Fehler Neuer Fehler: $DBI::errstr", 0) if $DBI::err;
}


Damit werden "Sonderzeichen" wie eben das ' extra gequotet.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jojod
 2006-11-24 13:07
#71961 #71961
User since
2006-11-24
8 Artikel
BenutzerIn
[default_avatar]
Hey...

thx für die sehr schnelle Antwort... Habs natürlich gleich ausprobiert...
Hat leider nicht so funktioniert wie es sollte; Deswegen mehr informationen über das Script:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# Knoten
       if (($_[0]==0) || ($_[0]==1)) {
               %hKnoten = ();                  # Hash leeren

               # Tabelle Knoten abfragen
               $sql = "SELECT Knoten.KID, Knoten.Name from Knoten;";
               $sth = $dbh->prepare($sql); Fehler("Fehler Hash Knoten: $DBI::errstr", 0) if $DBI::err; # SQL-Befehl zur Datenbank schicken
               $sth->execute(); Fehler("Fehler Hash Knoten: $DBI::errstr", 0) if $DBI::err;            # SQL-Befehl ausführen

               # Ergebnis abholen und in Datei ausgeben
               while (@fields = $sth->fetchrow_array()) {
                       # Hash erstellen
                       $hKnoten{"$fields[1]"}=$fields[0];
               }

               $sth->finish();
       }

       # Priority
       if (($_[0]==0) || ($_[0]==2)) {
               %hPriority = ();                        # Hash leeren

               # Tabelle Priority abfragen
               $sql = "SELECT Priority.PID, Priority.Priority from Priority;";
               $sth = $dbh->prepare($sql); Fehler("Fehler Hash Priority: $DBI::errstr", 0) if $DBI::err;       # SQL-Befehl zur Datenbank schicken
               $sth->execute(); Fehler("Fehler Hash Priority: $DBI::errstr", 0) if $DBI::err;          # SQL-Befehl ausführen

               # Ergebnis abholen und in Datei ausgeben
               while (@fields = $sth->fetchrow_array()) {
                       # Hash erstellen
                       $hPriority{"$fields[1]"}=$fields[0];
               }

               $sth->finish();
       }

       # Fehler
       if (($_[0]==0) || ($_[0]==3)) {
               %hFehler = ();                  # Hash leeren

               # Tabelle Fehler abfragen
               $sql = "SELECT Fehler.FID, Fehler.Fehler from Fehler;";
               $sth = $dbh->prepare($sql); Fehler("Fehler Hash Fehler: $DBI::errstr", 0) if $DBI::err; # SQL-Befehl zur Datenbank schicken
               $sth->execute(); Fehler("Fehler Hash Fehler: $DBI::errstr", 0) if $DBI::err;            # SQL-Befehl ausführen

               # Ergebnis abholen und in Datei ausgeben
               while (@fields = $sth->fetchrow_array()) {
                       # Hash erstellen
                       $hFehler{"$fields[1]"}=$fields[0];
               }

               $sth->finish();
       }

       # Karten
       if (($_[0]==0) || ($_[0]==4)) {
               %hKarten = ();                  # Hash leeren

               # Tabelle Karten abfragen
               $sql = "SELECT Karten.KTyp, Karten.Typ from Karten;";
               $sth = $dbh->prepare($sql); Fehler("Fehler Hash Karten: $DBI::errstr", 0) if $DBI::err; # SQL-Befehl zur Datenbank schicken
               $sth->execute(); Fehler("Fehler Hash Karten: $DBI::errstr", 0) if $DBI::err;            # SQL-Befehl ausführen

               # Ergebnis abholen und in Datei ausgeben
               while (@fields = $sth->fetchrow_array()) {
                       # Hash erstellen
                       $hKarten{"$fields[1]"}=$fields[0];
               }

               $sth->finish();
}

Diese Funktionen sind die Hauptfunktionen für die anderen Teilfunktionen(so denk ich zumindest das es funktioniert..):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
sub Knoten_eintragen {
       print "Neuer Knoten $_[0] \n" if defined $opt_v;
       $dbh->do("insert into Knoten(Name, TID, new) values ('" . $_[0] . "', 0, 1);"); Fehler("Fehler Neuer Knoten: $DBI::errstr", 0) if $DBI::err;
}

sub Priority_eintragen {
       print "Neue Priority $_[0] \n" if defined $opt_v;
       $dbh->do("insert into Priority(Priority) values ('" . $_[0] . "');"); Fehler("Fehler Neue Priorität: $DBI::errstr", 0) if $DBI::err;
}

sub Fehler_eintragen {
     print "Neuer Fehler $_[0] \n" if defined $opt_v;
     $dbh->do("insert into Fehler(Fehler) values (?);", undef, $_[0]); Fehler("Fehler Neuer Fehler: $DBI::errstr", 0) if $DBI::err;
}

#sub Fehler_eintragen {
#        print "Neuer Fehler $_[0] \n" if defined $opt_v;
#        $dbh->do("insert into Fehler(Fehler) values ('" . $_[0] . "');"); Fehler("Fehler Neuer Fehler: $DBI::errstr", 0) if $DBI::err;
#}

sub Karte_eintragen {
       print "Neuer Kartentyp $_[0] \n" if defined $opt_v;
       $dbh->do("insert into Karten(Typ) values ('" . $_[0] . "');"); Fehler("Fehler Neuer Kartentyp: $DBI::errstr", 0) if $DBI::err;
}

sub Datum_eintragen {
       print "Neues Datum $_[0] \n" if defined $opt_v;
       $dbh->do("insert into Datum(Datum) values ('" . $_[0] . "');"); Fehler("Fehler Neues Datum: $DBI::errstr", 0) if $DBI::err;
}

wenn ich den original-code nehme(sprich das auskommentierte benutze) bekomme ich so eine Fehlermeldung:
Code: (dl )
1
2
Neuer Fehler Can't find stats collector
DBD::mysql::db do 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 't find stats collector')' at line 1 at /database/scripts/Alarme/Alarme_Einlesen_lab.perl line 435.

/database/scripts/Alarme/Alarme_Einlesen_lab.perl line 435 ist folgende:
Code: (dl )
$dbh->do("insert into Fehler(Fehler) values ('" . $_[0] . "');"); Fehler("Fehler Neuer Fehler: $DBI::errstr", 0) if $DBI::err;


Wenn ich deine Lösung einfüge kommt folgende Fehlermeldung:
Code: (dl )
1
2
3
Neue Priority Slot Sync Loss
DBD::mysql::db do failed: Duplicate entry '255' for key 1 at /database/scripts/Alarme/Alarme_Einlesen_lab.perl line 430.
Fehler Neue Priorität: Duplicate entry '255' for key 1

/database/scripts/Alarme/Alarme_Einlesen_lab.perl line 430 ist folgende:
Code: (dl )
$dbh->do("insert into Priority(Priority) values ('" . $_[0] . "');"); Fehler("Fehler Neue Priorität: $DBI::errstr", 0) if $DBI::err;


war das verständlich und habt ihr ne idee warum des net geht, bzw. was man sonst noch machen kann??

jojo
renee
 2006-11-24 13:13
#71962 #71962
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Meine Variante funktioniert schon, aber es existiert schon ein entsprechender Eintrag in der Tabelle. Dann kann auch das Perl-Skript nichts daran ändern...

Schau Dir die Tabelle mal an (über Kommandozeile oder phpMyAdmin) und schau welche Daten da drin stehen. Wie ist die Tabelle aufgebaut? Was ist der Schlüssel? Was wird an die Funktion Fehler_eintragen übergeben? Ist es wirklich das was Du erwartest?

In dem Skript sollte allgemein die ?-Notation von CPAN:DBI verwendet werden.

Es sieht auch so aus, als wäre kein Wiki:[tt]use strict;[/tt] in dem Skript...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jojod
 2006-11-24 14:23
#71963 #71963
User since
2006-11-24
8 Artikel
BenutzerIn
[default_avatar]
also... use strict ist nicht mit eingebaut;

In der Tabelle stehen vor dem Einlesen keine Daten. Die ist immer gelöscht. Also funktioniert vlt. die Abfrage nicht was er machen muss wenn da was drin steht....

An die Funktion Fehler_eintragen wird in dem einen fall "Can't find stats collector" und im anderen fall "Slot Sync Loss" übergeben;
die frage die ich nicht exakt beantworten kann ist die, in welcher reihenfolge die funktionen aufgerufen werden;
ich denke das sie der reihenfolge nach wie sie im quelltext stehen aufgerufen werden; also zu erst Priority und dann Fehler
die frage die ich mir stell: wenn der code unverändert ist macht er den priority-teil ja auch ohne fehler; wenn ich nun deine variante benutze hab ich den eindruck das er scho vorher fehler macht wo er keine gemacht hatte und dein modifizierten teil weglässt, überspringt oder sonst was mit macht.

wie alt ist denn diese ?-Notation von CPAN:DBI?? ich mein des script is doch scho a weng älter und vlt. ist dies eine neue variante. da ich den verfasser von dem script kenne und ich der meinung bin er hat des aus nem bestimmten grund so gemacht hat; oder gibt es zwischen den beiden varianten keinen unterschied?

gruß
renee
 2006-11-24 14:52
#71964 #71964
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was sagt denn ein
Code: (dl )
perl -MDBI -e 'print $DBI::VERSION'
? (Bei Windows die ' durch " ersetzen).

Was für ein Spaltentyp ist denn "Fehler" in der Tabelle "Fehler"? Ist Fehler.FID autoincrement?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2006-11-24 14:55
#71965 #71965
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zeig auch mal wie die Funktion Fehler_eintragen aufgerufen wird...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jojod
 2006-11-24 15:09
#71966 #71966
User since
2006-11-24
8 Artikel
BenutzerIn
[default_avatar]
[quote=renee,24.11.2006, 13:52]Was sagt denn ein
Code: (dl )
perl -MDBI -e 'print $DBI::VERSION'
? (Bei Windows die ' durch " ersetzen).
[/quote]

1.52

Quote
Was für ein Spaltentyp ist denn "Fehler" in der Tabelle "Fehler"? Ist Fehler.FID autoincrement?


Field: Fehler
type: char(35)
Null:
Key: MUL
Default:
Extra:

zusätzliche Spalte:

Field: FID
Type: smallint(6) unsigned
Null:
Key: PRI
Default:
Extra: auto_increment
jojod
 2006-11-24 15:11
#71967 #71967
User since
2006-11-24
8 Artikel
BenutzerIn
[default_avatar]
[quote=renee,24.11.2006, 13:55]Zeig auch mal wie die Funktion Fehler_eintragen aufgerufen wird...[/quote]

# Wenn ID der Priority nicht bekannt => Priority in Datenbank eintragen
       if (not defined $hPriority{"$arZeile[2]"}) {
               Priority_eintragen("$arZeile[2]");
               DB_Schluessel(2);       # Priority-Hash neu erstellen
       }
       $arAusgabe[2]=$hPriority{"$arZeile[2]"};        # Priority

       # Wenn ID des Fehlers nicht bekannt => Fehler in Datenbank eintragen
       if (not defined $hFehler{"$arZeile[3]"}) {
               Fehler_eintragen("$arZeile[3]");
               DB_Schluessel(3);       # Fehler-Hash neu erstellen
       }
       $arAusgabe[3]=$hFehler{"$arZeile[3]"};          # Fehler


des ganze steht in einer foreach-schleife
renee
 2006-11-24 15:30
#71968 #71968
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mmmhh.... Das sieht eigentlich alles so aus als müsste es klappen. Ihr habt auch eine ganz neue DBI-Version.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-11-24 11:51.