[GastForen Archiv Perl und CGI Adressenscript für Intern-Bereich

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Archiv - Archivierte Foren
Themen
Beiträge
Moderatoren
Letzter Beitrag

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

17. Feb 2004, 18:27
Beitrag # 16 von 38
Beitrag ID: #70931
Bewertung:
(4383 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hanü,
wie sieht das Änderungsformular aus?
Wie sehen die Spaltennamen Deiner Tabelle aus (Groß-Kleinschreibung beachten)?

Was mir erstmal auffällt:

WHERE Username = '$Name'
WHERE name = '$Name'

Wie heißt denn die Spalte nun richtig, die die Benutzernamen der eingeloggten User enthält?

Ist der Benutzername unique also eindeutig (es darf keine doppelten Benutzernamen geben) ?

Gruß Sabine


als Antwort auf: [#64448]
(Dieser Beitrag wurde von SabineP am 17. Feb 2004, 18:36 geändert)
X

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

18. Feb 2004, 08:31
Beitrag # 17 von 38
Beitrag ID: #70993
Bewertung:
(4383 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Die Spalte heißt 'Username', hab das geändert - funzt trotzdem noch nicht. Es gibt keine doppelten Einträge bei Username und ID.

Am Änderungsformular liegt's nicht, ich hab den Fehler gefunden!: Hab den SQL-Befehl mal mit dem von PHPmyAdmin verglichen, da werden die Namen der Spalten/Felder noch in schräge Gänsefüße gesetzt (wie heißen die eigentlich). So funktionierts:

("UPDATE `adressen` SET `NeuerName`='$i05', `Email_1`='$i06', `Email_2`='$i07', [..], `Sonstiges`='$i39', `LastChange`='$Aenderungsdatum' WHERE `Username`='$Name' ");

Jetzt frag ich mich, warum der erste SQL-Befehl trotzdem (ohne diese ``) funktioniert?!

Und ein Problem gibt es trotzdem noch: Wenn die Besucher Anführungszeichen ""''``´´ in die Felder eingeben versagt das Script, weil die SQL-DB das nicht mag. Ne Idee wie man das umgehen oder verhindern kann?

Ansonsten nochmal RIESEN DANK für die ganze Hilfe!!!!!!!!!!


als Antwort auf: [#64448]
(Dieser Beitrag wurde von Hanü am 18. Feb 2004, 08:37 geändert)

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

18. Feb 2004, 10:35
Beitrag # 18 von 38
Beitrag ID: #71013
Bewertung:
(4383 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

diese ` Backticks werden nur benötigt, wenn Du Sonderzeichen oder reservierte Wörter verwendest im Spaltenname:
http://www.mysql.de/.../Reserved_words.html

Beachten Sie, dass, falls der Bezeichner ein reserviertes Wort ist oder Sonderzeichen enthält, er bei der Benutzung immer in ` angegeben sein muss.
http://www.mysql.de/doc/de/Legal_names.html

Um Probleme bei der Eingabe von ""''``´´ zu verhindern schreibst Du für alle Variablen $irgendwas ein Fragezeichen in die SQL-Anweisung.
Dadurch werden auch sogenannte SQL-Injektionen (Benutzer tippen SQL-Anweisungen ins Textfeld ein) verhindert.
Die Variablen schreibst Du dann in der richtigen Reihenfolge in die Klammern hinter execute(hierhin).

Beispiel:

my $query = $db->prepare ("UPDATE adressen SET NeuerName=?, Email_1=?, Email_2=?, [..], Sonstiges=?, LastChange=? WHERE Username=?);
print $db->errstr; #Errorstring
$query->execute($i05, $i06, $i07, [..], $i39, $Aenderungsdatum, $Name);

Gruß Sabine
[Netscape 4 ist mein Freund]


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

18. Feb 2004, 14:23
Beitrag # 19 von 38
Beitrag ID: #71070
Bewertung:
(4383 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das funktioniert so nicht?!
Hab das jetzt so versucht:

my $query = $dbh->prepare ("UPDATE `login` SET `NeuerName`='?', [..], `Sonstiges`='?', `LastChange`='?' WHERE `Username`='?' ");
print $dbh->errstr; #Errorstring
$query->execute($i05, [..], $i39, $Aenderungsdatum, $Name);

und so:
my $query = $dbh->prepare ("UPDATE `login` SET `NeuerName`=?, [..], `Sonstiges`=?, `LastChange`=? WHERE `Username`=? ");
print $dbh->errstr; #Errorstring
$query->execute($i05, [..], $i39, $Aenderungsdatum, $Name);

und so:
my $query = $dbh->prepare ("UPDATE login SET NeuerName=?, [..], Plaene=?, LastChange=? WHERE Username=? ");
print $dbh->errstr; #Errorstring
$query->execute($i05, [..], $i39, $Aenderungsdatum, $Name);

Hat alles nicht funktioniert. Gilt der Bindestrich "-" als Sonderzeichen? Weil... so reservierte Namen verwende ich eigentlich nicht. Nur der Bindestrich - und Underline _

Der Satz
Zitat Ein Name muss aus alphanumerischen Zeichen des aktuellen Zeichensatzes bestehen und darf darüber hinaus `_' und `$' enthalten.

verbietet den Bindestrich, wenn ich das richtig sehe. Also ändern?

(NeuerName, Email_1, Email_2, Website, ICQ, AIM, YIM, MSNM, H-Strasse, H-PLZ, H-Wohnort, H-Land, H-Tel1, H-Tel2, H-Mobil, H-Fax, H-Bemerkung, Z-Strasse, Z-PLZ, Z-Wohnort, Z-Land, Z-Tel1, Z-Tel2, Z-Mobil, Z-Fax, Z-Bemerkung, Familienstand, Partner, Kinder, Werdegang, Job-aktuell, Job-wo, Plaene, Sonstiges, LastChange, Username)


als Antwort auf: [#64448]
(Dieser Beitrag wurde von Hanü am 18. Feb 2004, 14:33 geändert)

Adressenscript für Intern-Bereich

Anonym
Beiträge gesamt: 22827

18. Feb 2004, 14:46
Beitrag # 20 von 38
Beitrag ID: #71074
Bewertung:
(4383 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Deine letzte Variante wäre richtig.

und so:
my $query = $dbh->prepare ("UPDATE login SET NeuerName=?, [..], Plaene=?, LastChange=? WHERE Username=? ");
print $dbh->errstr; #Errorstring
$query->execute($i05, [..], $i39, $Aenderungsdatum, $Name);

Nimm mal die Bindestriche aus dem Spaltenname raus. Der Bindestrich ist das Minuszeichen zum Rechnen.

Wenn es dann immer noch nicht geht müssen wir mal noch ein paar Errorstrings ausgeben.

Gruß Sabine


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

18. Feb 2004, 15:15
Beitrag # 21 von 38
Beitrag ID: #71079
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Es lag tatsächlich an dem Bindestrich/Minuszeichen! Die Änderungen werden jetzt übernommen, auch Einträge mit "´`' werden übernommen und im der Profilansicht korrekt angezeigt...

Nur beim Änderungsformular wieder nicht. Ich hab das mal getestet: In ein Feld "test" eingetragen und gespeichert. Im Profil wird es richtig angezeigt. Klick ich dann auf 'Daten ändern' ist das Feld im Formular jedoch leer. Im Quellcode steht es aber so drin: value=""test""

Da muss man wohl im aenderungsformular.pl was ändern, im Bereich:

my $Abfrage=$dbh->prepare("SELECT * FROM adressen WHERE Username = '$Name'");
$Abfrage->execute();
while (@Datensatz=$Abfrage->fetchrow_array) {
($F01, $F02, $F03,[..] $F40)=@Datensatz;

nur was? Muss man das irgendwie mit Backslash \ machen?


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

18. Feb 2004, 16:59
Beitrag # 22 von 38
Beitrag ID: #71097
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

an die Sonderzeichen habe ich noch gar nicht gedacht.

Die Abfrage für das Änderungsformular:

my $Abfrage=$dbh->prepare("SELECT Spaltenüberschriften, mit, Komma, getrennt FROM adressen WHERE Username = ? ");
$Abfrage->execute($Name);
my @Datensatz = $Abfrage->fetchrow_array();

($F01, $F02, $F03,[..] $F40) = @Datensatz;

#Sonderzeichen escapen
@Datensatz = map CGI::escapeHTML($_), @Datensatz;

Die while-Schleife habe ich mal gestrichen, weil ja nur ein Datensatz selektiert wird.
Und SELECT * eignet sich nur zu Testzwecken.

Das Escapen der Sonderzeichen ist für die Anzeige des Datensatzes auch nützlich, also nicht nur beim Änderungsformular.
@Datensatz = map CGI::escapeHTML($_), @Datensatz;

Gruß Sabine


als Antwort auf: [#64448]
(Dieser Beitrag wurde von SabineP am 18. Feb 2004, 17:03 geändert)

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

19. Feb 2004, 11:47
Beitrag # 23 von 38
Beitrag ID: #71214
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Dieses escapen verursachte wieder einen Fehler, weil ich das Modul Strict und CGI im aenderungsformular.pl nicht eingebunden hatte. Nachdem ich das gemacht hab kamen wieder zig Fehlermeldungen, weil das "my" hier fehlte: (my $F01, my $F02, [..], my $F40) = @Datensatz;

Hab ich korrigiert. Jetzt kommt keine Fehlermeldung, aber es hat sich auch nichts geändert zu vorher. Wenn ein Eintrag "test" vorhanden ist, wird er im Quelltext immernoch als value=""test"" dargestellt und das Feld ist im Browser leer.

Warum soll ich nochmal dieses Escape-Teil in der normalen Ansicht (details.pl) einfügen? Die funktioniert doch eigentlich, da wird auch das "test" oder das Wort kommt's (mit Apostroph) richtig in die Seite eingebunden und angezeigt

Gruß Hanü


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

19. Feb 2004, 12:27
Beitrag # 24 von 38
Beitrag ID: #71227
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

schreib mal das escapeHTML gleich nach dieser Zeile:

my @Datensatz = $Abfrage->fetchrow_array();

#Sonderzeichen escapen
@Datensatz = map CGI::escapeHTML($_), @Datensatz;

Angenommen in der Datenbank steht <test> anstatt "test",
dann kann die Zelle mit dem Eintrag <test> in der normalen Ansicht nicht angezeigt werden.

mit
@Datensatz = map CGI::escapeHTML($_), @Datensatz;

wird aus den beiden spitzen Klammer im HTML-Code &lt; und &gt;
und aus " wird &quot;

Gruß Sabine


als Antwort auf: [#64448]
(Dieser Beitrag wurde von SabineP am 19. Feb 2004, 12:28 geändert)

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

19. Feb 2004, 13:05
Beitrag # 25 von 38
Beitrag ID: #71236
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So fuktionierts. Kann ich eigentlich dieses "use strict;"-Modul beim Änderungsformular auch weglassen? So wie ich das jetzt beim details.pl gesehen habe, brauch ich für das
@Datensatz = map CGI::escapeHTML($_), @Datensatz;
nur "use CGI;" Dann bräuchte ich nämlich dieses "my" nicht immer eingeben?!

Und noch eine Frage habe ich: Muss man bei diesen Scripts drauf achten, ob sie Multiuser-fähig sind? Also von mehreren Leuten gleichzeitig benutzt werden können, ohne dass die Daten in der Datenbank gelöscht werden? Ich kann mir das eigentlich nur für das aenderung.pl vorstellen, weil dieses das einzige Script ist, das Daten in die DB schreibt.
aenderungsformular.pl und details.pl lesen nur und zeigen die Daten dann an?!

Gruß Andreas


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

19. Feb 2004, 14:13
Beitrag # 26 von 38
Beitrag ID: #71258
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Du kannst das my auch vor die Klammer schreiben:

my ($F01, $F02, $F03,[..] $F40) = @Datensatz;

use strict; sollte man eigentlich in jedem Perl-Script verwenden, um Fehler zu vermeiden.

Das Script kann von beliebig vielen Usern gleichzeitig verwendet werden,
auch dem mySQL-Server ist es egal wieviele User gerade ihre Daten ändern.

Gruß Sabine



als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

19. Feb 2004, 14:57
Beitrag # 27 von 38
Beitrag ID: #71268
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kann man das auch bei der Datumsermittlung so schreiben:
my (undef, $min, $hour, $mday, $mon, $year, $wday, undef, undef) = localtime(time);
[Nachtrag: Ja, man kann, habs eben ausprobiert]

Wenn die while-Schleife rausfällt, ist dann $Abfrage->finish; noch erforderlich? (genauso bei $query->finish;?)

Gruß Hanü


als Antwort auf: [#64448]
(Dieser Beitrag wurde von Hanü am 19. Feb 2004, 15:24 geändert)

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

19. Feb 2004, 16:47
Beitrag # 28 von 38
Beitrag ID: #71301
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hanü,

$Abfrage->finish; und $query->finish;
brauchst Du in Deinem Script nicht,

beides wird überflüssig durch
$dbh->disconnect;

Gruß Sabine


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

Hanü
Beiträge gesamt: 219

26. Feb 2004, 20:53
Beitrag # 29 von 38
Beitrag ID: #72293
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi, einige Leute haben sich beschwert und ich hab es auch schon gemerkt: Manchmal werden die Daten nach einer Änderung nicht übernommen sondern komplett gelöscht!? Mir ist es aufgefallen, als ich die Eingabe in einem Feld leer lies, um diesen einen Eintrag zu löschen. Leider war dann der komplette Datensatz gelöscht!?

Ansonsten funktioniert alles wunderbar!
Viele Grüße Hanü


als Antwort auf: [#64448]

Adressenscript für Intern-Bereich

SabineP
Beiträge gesamt: 7586

26. Feb 2004, 21:32
Beitrag # 30 von 38
Beitrag ID: #72300
Bewertung:
(4373 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü, wie sieht denn jetzt das Script für das
Änderungs-Formular und das Update-Script aus?

Gruß Sabine



als Antwort auf: [#64448]
X