Neuer Eintrag in der Datenbank, Duplikat soll vorhanden Eintrag ersetzen

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

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

    Einen Kommentar schreiben:


  • scatello
    antwortet
    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.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    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.

    Einen Kommentar schreiben:


  • scatello
    antwortet
    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.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    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#
    ​

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    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.

    Einen Kommentar schreiben:


  • scatello
    antwortet
    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.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    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.

    Einen Kommentar schreiben:


  • scatello
    antwortet
    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.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    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​

    Einen Kommentar schreiben:


  • scatello
    antwortet
    PHP-Code:
    $query "Update `".$tablename."` (`created`) values(now()) where 'id'=" $data['id'];​ 
    where 'id' da nimmst du die falschen Anführungszeichen, du musst Backticks nehmen, also `

    Das IP Adresse Feld 'ip' muss eindeutig sein.
    Also doch eine Spalte mit eindeutigen Werten. Wenn du die Spalte auf Unique setzt, dann sollte der Ansatz mit Duplicate Key funktionieren. In dem Eingangspost ist aber eine IP-Adresse doppelt zu sehen, daher bin ich nicht auf die Idee gekommen, dass diese Spalte eindeutig sein soll.
    Zuletzt geändert von scatello; 06.01.2024, 18:40.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    Hallo scatello,

    Du hast Recht. Es geht wohl nur mit Deinem Code. Allerdings bekomme ich das nicht hin. Hier nochmals meine Tabelle:
    HTML-Code:
    MariaDB [(none)]> use fail2ban;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    MariaDB [fail2ban]> show columns from fail2ban;
    +----------+---------------------+------+-----+---------+----------------+
    | Field    | Type                | Null | Key | Default | Extra          |
    +----------+---------------------+------+-----+---------+----------------+
    | id       | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | hostname | varchar(255)        | YES  | MUL | NULL    |                |
    | created  | datetime            | NO   |     | NULL    |                |
    | name     | text                | NO   |     | NULL    |                |
    | protocol | varchar(16)         | NO   |     | NULL    |                |
    | port     | varchar(32)         | NO   |     | NULL    |                |
    | ip       | varchar(64)         | NO   |     | NULL    |                |
    +----------+---------------------+------+-----+---------+----------------+
    7 rows in set (0,001 sec)
    ​
    Ich habe Deinen Code wie folgt geändert:

    PHP-Code:
    $query "select `id`, `hostname`, `name`, `protocol`, `port`, `ip` from `".$tablename."` where `hostname`='$hostname' and `name`='$name' and `protocol`='$protocol' and `port`='$port' and `ip`='$ip'";

    $result mysqli_query($link$query)
       or die(
    "MySQL-Error: " mysqli_error($link));

    $rowcount mysqli_num_rows($result);

    if (
    $rowcount)
    {
        
    $data mysqli_fetch_assoc($result);

        
    $query "Update `".$tablename."` (`created`) values(now()) where 'id'=" $data['id'];

        
    $result mysqli_query($link$query)
           or die(
    "MySQL-Error: " mysqli_error($link));
    }
    else
    {
        
    $query "INSERT INTO `".$tablename."`(`hostname`, `created`, `name`, `protocol`, `port`, `ip`) VALUES ('".addslashes($hostname)."',NOW(),'".addslashes($name)."','".addslashes($protocol)."','".addslashes($port)."','".addslashes($ip)."')";

        
    $result mysqli_query($link$query)
           or die(
    "MySQL-Error: " mysqli_error($link));
    }
    ​ 
    Das IP Adresse Feld 'ip' muss eindeutig sein. Wenn die ip wieder auftaucht müssen die anderen Werte in der Spalte geändert werden. Sonst soll ein neuer Eintrag erstellt werden.

    Es werden auch zwei Datensätze angelegt und es kommt folgende Fehlermeldung:
    HTML-Code:
    root@dsme01:/etc/fail2ban# ./fail2ban.php jailname http 80 123.123.123.124
    #!/usr/bin/php
    MySQL-Error: 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 '(`created`) values(now()) where 'id'=7' at line 1root@dsme01:/etc/fail2ban# ./fail2ban.php jailname http 80 123.123.123.124
    #!/usr/bin/php
    Ip to BAN added to DATABASEroot@dsme01:/etc/fail2ban#
    Zuletzt geändert von sharbich; 06.01.2024, 13:49.

    Einen Kommentar schreiben:


  • scatello
    antwortet
    Zitat von sharbich Beitrag anzeigen
    Das habe ich im Netz gefunden.
    Dann viel Erfolg damit. Ich sehe da keinen Hinweis, womit es bei dir funktionieren könnte.

    Einen Kommentar schreiben:


  • sharbich
    antwortet
    Guten Morgen,

    es scheint aber auch anders zu gehen. Das habe ich im Netz gefunden.
    https://stackoverflow.com/questions/...last-insert-id

    Einen Kommentar schreiben:


  • scatello
    antwortet
    Zitat von sharbich Beitrag anzeigen
    Warum geht dann "ON DUBLICATE KEY UPDATE" nicht?
    Die ID hast du doch nicht, wenn du einen Eintrag einfügen willst. Und die ID ist bei deinem Vergleich, ob es schon einen passenden Eintrag in der DB gibt, völlig wurscht, die spielt doch keine Rolle. Du müsstes beim Insert schon die richtige ID kennen, aber woher? Hast du einfach nicht.

    Einen Kommentar schreiben:

Lädt...
X