Markus Trusk: MYSQL Großes Problem mit Parameterübergabe

Hallo,
Zu meinem Entsetzen musste ich feststellen, dass ich in einem Script von mir, das in eine Datenbank einliest und wo User ihre Daten mittelts eines Buttons, wieder rauslöschen können einen ärgerlichen Fehler gemacht habe.
Der Button funktioniert so, dass die User ihre Werte aus der Datenbank aufgelistet bekommen und dann einfach per Klick diese Zeile löschen können. (Kein Formular, sondern die Werte werden als Parameter and die URL gehängt)
wenn ich jetzt aber den Wert Tom&Jerry irgendwo stehen habe passiert folgendes:
?loeschen&name=Tom&Jerry

Es wird jetzt nur mehr Tom übertragen und das Script erkennt jetzt nicht mehr den richtigen Wert in der DB und löscht die Daten natürlich nicht.
Ich könnte natürlich irgendwie beim Löschen ein LIKE Tom% daraus machen, aber das würde ich gerne vermeiden, da dann auch andere Werte gelöscht werden könnten. Was kann ich da tun?

Markus Trusk.

  1. hallo

    unique id

    gruss

    --
    no strict;
    no warnings;
    Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
    1. Hi,
      wie meinst du das?

      Markus Trusk.

  2. Huhu,

    also du musst den werten eine id (unique) zuteilen, und dann einfach die werte des zugehörigen users wo id='$cgi->param(id)' löschen.

    ;-)

    gruss

    --
    no strict;
    no warnings;
    Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
    1. Hi,

      also du musst den werten eine id (unique) zuteilen, und dann einfach die werte des zugehörigen users wo id='$cgi->param(id)' löschen.

      Ja, das funktioniert sicher gut, aber in einer Datenbank, die schon etwas gefüllt ist, kann ich nicht bei jedem Wert eine ID hinschreiben, aber du hast mich vielleicht auf eine andere Möglichkeit gebracht. Das muss ich noch austesten.

      Markus Trusk.

      1. hallo
        erst : alter table derohneid add id int auto_increment

        my $q->$db->prepare("select * from derohneid")
        $q->execute;
        my $c=0;
        while(my $h=$q->fetchrow_hashref){
        $db->do("update derohneid set id=$c where feldnanhandduesindetifizierenkannst=$$h{feldnanhandduesindetifizierenkannst}");
        $c++;
        }

        so ungefähr (prog fehler mögen dank guinnes dabei sein) "updaten"

        gruss

        --
        no strict;
        no warnings;
        Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
        1. Hi,

          my $q->$db->prepare("select * from derohneid")
          $q->execute;
          my $c=0;
          while(my $h=$q->fetchrow_hashref){
          $db->do("update derohneid set id=$c where feldnanhandduesindetifizierenkannst=$$h{feldnanhandduesindetifizierenkannst}");
          $c++;
          }

          danke, aber andere Frage:
          Ich habe es jetzt dahin geändert, dass ich einfach beim Auslesen die Reihen zähle und beim löschen auch wieder die Reihen zählen will, aber ihm dann sagen will, dass er Reihe 2 löschen soll, aber wie kann ich das?
          Ich weiß jetzt welche Reihe ich will, aber wie kann ich das dem Script beibringen?

          Markus Trusk.

          1. ghallo

            du brauchst ein eindeutiges merkmal anhand dem du die spalte identifizieren kannst.

            gruss

            --
            no strict;
            no warnings;
            Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
            1. Hi,

              du brauchst ein eindeutiges merkmal anhand dem du die spalte identifizieren kannst.

              Kann ich nicht einfach sagen, er soll die 2. Zeile löschen?
              Da ich die Zeilen immer nach dem ersten Wert sortiere, und somit immer das gleiche Ergebnis bekomme, brauche ich nur eine Syntax, wie ich ihm sagen kann, er solle die 2. Zeile löschen.
              Vielleicht irgendwie so?
              if ($auslesen->rows == 2)   {
              #löschen
              }

              Markus Trusk.

              1. Hi,
                habs geschafft. Ich lese die DB einfach nochmal aus und lösche, wenn der Zähler bei der Zeilennummer angelangt ist mit:

                if ($j == $count)    {
                my $loeschen = $dbh->prepare("DELETE FROM $datenbanktab WHERE artist = ? AND title = ? AND nick = ?") or die $dbh->errstr;

                $loeschen->execute($artist,$title,$nick) or die $DBI::errstr;
                $loeschen->finish;
                }

                Markus Trusk.

                1. Hi,
                  habs geschafft. Ich lese die DB einfach nochmal aus und lösche, wenn der Zähler bei der Zeilennummer angelangt ist mit:

                  if ($j == $count)    {
                  my $loeschen = $dbh->prepare("DELETE FROM $datenbanktab WHERE artist = ? AND title = ? AND nick = ?") or die $dbh->errstr;

                  $loeschen->execute($artist,$title,$nick) or die $DBI::errstr;
                  $loeschen->finish;
                  }

                  ;-)

                  selber lernen mach schlau

                  gruss

                  --
                  no strict;
                  no warnings;
                  Selbstcode: (_*_) ^_^ ( . ) ( . ) :-(bla)
  3. wenn ich jetzt aber den Wert Tom&Jerry irgendwo stehen habe passiert folgendes:
    ?loeschen&name=Tom&Jerry

    Das hat nichts mit mySQL zu tun, du setzt den URL String falsch zusammen.

    use CGI;
    use strict;

    my $url = "url";
    my $text = 'Löschen';

    my $k = 'loeschen';
    my $v = 'Tom&Jerry';
    my @param;

    push @param, CGI::escape($k . '=' . $v);

    print CGI::a( {-href => $url . '?' . join '&', @param }, $text );

    Struppi.