Neuer Eintrag in der Datenbank, Duplikat soll vorhanden Eintrag ersetzen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Zitat von scatello Beitrag anzeigen
    Also doch eine Spalte mit eindeutigen Werten. Wenn du die Spalte auf Unique setzt, dann sollte der Ansatz mit Duplicate Key funktionieren.
    Ich habe in meiner Tabelle die Spalte IP nun auf Unique gesetzt. Siehe Anlage. Die Abfrage habe ich wie folgt geändert:
    PHP-Code:
    $query "INSERT INTO `".$tablename."`(`hostname`, `created`, `name`, `protocol`, `port`, `ip`) VALUES ('".addslashes($hostname)."',NOW(),'".addslashes($name)."','".addslashes($protocol)."','".addslashes($port)."','".addslashes($ip)."') ON DUBLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`), `hostname` = :$hostname, `name` = :$name, `protocol` = :$protocol, `port` = :$port, `ip` = :$ip"
    Leider erhalte ich immer noch Fehlermeldungen:
    HTML-Code:
    root@dsme01:/etc/fail2ban# ./fail2ban.php jailname http 80 123.123.123.124
    #!/usr/bin/php
    Error: INSERT INTO `fail2ban`(`hostname`, `created`, `name`, `protocol`, `port`, `ip`) VALUES ('dsme01',NOW(),'jailname','http','80','123.123.123.124') ON DUBLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`), `hostname` = :dsme01, `name` = :jailname, `protocol` = :http, `port` = :80, `ip` = :123.123.123.124<br>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DUBLnano fail2ban.phphostname` = :dsme01, `name...' at line 1​

    Kommentar


    • #17
      Zuerst einmal ein Hinweis:

      Wenn man das so schreibt:
      PHP-Code:
      $query "INSERT INTO
                  `
      $tablename`
                   (`hostname`,
                    `created`,
                    `name`,
                    `protocol`,
                    `port`,
                    `ip`)
                  VALUES
                  ('" 
      addslashes($hostname) . "',
                    NOW(),'" 
      .
                    
      addslashes($name) . "',
                    '" 
      addslashes($protocol) . "',
                    '" 
      addslashes($port) . "',
                    '" 
      addslashes($ip) . "'
                  )
                  ON DUBLICATE KEY
                    UPDATE
                      `id` = LAST_INSERT_ID(`id`),
                      `hostname` = :
      $hostname,
                      `name` = :
      $name,
                      `protocol` = :
      $protocol,
                      `port` = :
      $port,
                      `ip` = :
      $ip";  ​ 
      ist das zwar mehr Tipparbeit, aber das ist besser zu lesen, als wenn man alles in eine endlos lange Zeile schreibt.

      Dann:
      Wieso willst du die ID updaten? Das ist doch Quatsch.
      Wenn ich addslashes sehe, gehe ich davon aus, dass du keine Prepare Statements benutzt, also sind :$hostname, :$name, :$protocol, :$port und :$ip die falsche schreibweise.
      Außerdem ist es auch nicht erforderlich, die IP zu aktualisieren, denn die ist ja sowieso die gleiche.

      Kommentar


      • #18
        Hallo scatello,

        ich habe jetzt die id und ip rausgenommen. Leider schlägt die Abfrage immer noch mit Fehler auf:
        HTML-Code:
        root@dsme01:/etc/fail2ban# ./fail2ban.php jailname http 80 123.123.123.124
        #!/usr/bin/php
        Error: INSERT INTO
                    `fail2ban`
                     (`hostname`,
                      `created`,
                      `name`,
                      `protocol`,
                      `port`,
                      `ip`)
                    VALUES
                    ('dsme01',
                      NOW(),'jailname',
                      'http',
                      '80',
                      '123.123.123.124'
                    )
                    ON DUBLICATE KEY
                      UPDATE
                        `hostname` = :dsme01,
                        `name` = :jailname,
                        `protocol` = :http,
                        `port` = :80<br>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DUBLICATE KEY
                      UPDATE
                        `hostname` = :dsme01,
        ​
        Ich hatte mich an folgende Beschreibung orientiert.
        https://medium.com/terales-engineeri...t-410ee63b4463
        Zuletzt geändert von sharbich; 08.01.2024, 09:59.

        Kommentar


        • #19
          Hier findest du eine gute Beschreibung: https://mariadb.com/kb/en/insert-on-...te-key-update/
          Achte auf die Beispiele, dann sollte dir klar werden, wo dein Problem liegt.

          Kommentar


          • #20
            Hallo scatello,

            ich weiß ich muss das Problem selbst lösen. Wenn ich auf die Beispiele schaue dann wird immer der Werd id mit angegeben. Dieser wird aber in meiner Tabelle automatisch generiert, wenn ein neuer Eintrag erstellt wird. Ich beginne ja mit einem neuen Eintrag, weil meine Datenbank leer ist. Es sind ja noch keine Werte in der Datenbank und trotzdem schlägt der qurey fehl.

            Kommentar


            • #21
              Hallo scatello,

              ich bin leider kein Entwickler der Code fest ist. Ich muss die Flügel streichen. mit dem unteren Code funktioniert es nicht es kommt eine Fehlermeldung.

              Dieser Code funktioniert. Es wird ein neuer Eintrag angelegt:
              PHP-Code:
              $query "INSERT INTO
                          `"
              .$tablename."`
                            (`hostname`,
                             `created`,
                             `name`,
                             `protocol`,
                             `port`,
                             `ip`)
                            VALUES
                            ('"
              .addslashes($hostname)."',
                            NOW(),
                            '"
              .addslashes($name)."',
                            '"
              .addslashes($protocol)."',
                            '"
              .addslashes($port)."',
                            '"
              .addslashes($ip)."')"
              Dieser Code funktioniert nicht. Bei einer leeren Datenbank wird noch nicht mal der erste Eintrag angelegt, obwohl kein Datensatz vorhanden ist.
              PHP-Code:
              $query "INSERT INTO
                          `"
              .$tablename."`
                          VALUES
                          ('"
              .addslashes($hostname)."',
                          NOW(),
                          '"
              .addslashes($name)."',
                          '"
              .addslashes($protocol)."',
                          '"
              .addslashes($port)."',
                          '"
              .addslashes($ip)."')
                          ON DUBLICATE KEY UPDATE
                            hostname = '
              $hostname',
                            name = '
              $name',
                            protocol = '
              $protocol',
                            port = '
              $port',
                            ip = '
              $ip'";
              ​ 
              Ich habe versucht anhand der obigen Beschreibung von Dir die Abfrage zu erstellen leider ohne Erfolg. Ich gebe auf. Hier die Fehlermeldung:
              HTML-Code:
              root@dsme01:/etc/fail2ban# ./fail2ban.php jailname http 80 123.123.123.124
              #!/usr/bin/php
              Error: INSERT INTO
                          `fail2ban`
                          VALUES
                          ('dsme01',
                          NOW(),
                          'jailname',
                          'http',
                          '80',
                          '123.123.123.124')
                          ON DUBLICATE KEY UPDATE
                            hostname = 'dsme01',
                            name = 'jailname',
                            protocol = 'http',
                            port = '80',
                            ip = '123.123.123.124'<br>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DUBLICATE KEY UPDATE
                            hostname = 'dsme01',
                            name = ...' at line 10root@dsme01:/etc/fail2ban#
              ​

              Kommentar


              • #22
                Code:
                INSERT INTO
                       `fail2ban`
                            (`hostname`,
                             `created`,
                             `name`,
                             `protocol`,
                             `port`,
                             `ip`)
                        VALUES
                            ('dsme01',
                              NOW(),
                              'jailname',
                              'http',
                              '80',
                              '200.200.2.2')
                        ON DUPLICATE KEY UPDATE
                              `hostname` = 'dsme01',
                              `created`=now()​,
                              `name` = 'jailname',
                              `protocol` = 'http',
                              `port` = '80'
                ON DUBLICATE KEY UPDATE -> ON DUPLICATE KEY UPDATE
                Zuletzt geändert von scatello; 08.01.2024, 13:11.

                Kommentar


                • #23
                  Lieber scatello,

                  ein Dankeschön. Das war es. Wobei ich noch unter DUPLICATE KEY UPDATE die `ip` mit aufgenommen habe. Der Vollständigkeitshalber:
                  PHP-Code:
                  $query "INSERT INTO
                                `"
                  .$tablename."`
                                        (`hostname`,
                                         `created`,
                                         `name`,
                                         `protocol`,
                                         `port`,
                                         `ip`)
                                    VALUES
                                        ('"
                  .addslashes($hostname)."',
                                          NOW(),
                                        '"
                  .addslashes($name)."',
                                        '"
                  .addslashes($protocol)."',
                                        '"
                  .addslashes($port)."',
                                        '"
                  .addslashes($ip)."')
                                    ON DUPLICATE KEY UPDATE
                                        `hostname` = '
                  $hostname',
                                        `created` = NOW(),
                                        `name` = '
                  $name',
                                        `protocol` = '
                  $protocol',
                                        `port` = '
                  $port',
                                        `ip` = '
                  $ip'";
                  ​ 
                  DANKESCHÖN.

                  Kommentar


                  • #24
                    Zitat von sharbich Beitrag anzeigen
                    Wobei ich noch unter DUPLICATE KEY UPDATE die `ip` mit aufgenommen habe
                    Warum? Die IP wird doch sowieso nicht aktualisiert, die bleibt doch gleich. Es gibt daher keinen sinnvollen Grund diese beim Update ebenfalls zu setzen.

                    Und dann solltest du noch addslashes durch dies ersetzen: https://www.php.net/manual/de/mysqli...ape-string.php
                    Zuletzt geändert von scatello; 08.01.2024, 15:37.

                    Kommentar


                    • #25
                      Danke, stimmt mit der IP. Das andere schaue ich mir noch an.
                      Zuletzt geändert von sharbich; 08.01.2024, 16:29.

                      Kommentar

                      Lädt...
                      X