Datenbankspalte mit ALTER TABLE verkleinern; Problem mit Prefix

  • Hallo zusammen,

    ich möchte die Spalte "comment_author_IP" in der Tabelle "comments" auf Null Zeichen verkleinern.
    Das folgende Script funktioniert, berücksichtigt aber nicht den Präfix (wp_ usw.):

    Code
    global $wpdb;
    $wpdb->query('ALTER TABLE comments MODIFY comment_author_IP VARCHAR(0)');

    Wie bekomme ich den Prefix in die Anweisung rein oder wie kann ich den Tabellen-Namen mit Prefix als Variable einfügen?

    Der Code ist für ein Plugin zur Anpassung an die EU-DSGVO gedacht.

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Ein meiner Meinung nach denkbar ungünstiger Ansatz, damit schlagen dann ggf. alle möglichen Schreibversuche auf dieses Feld fehl, mit eher unabsehbaren Folgen.

    Die gesuchte Tabelle heisst standardmässig [FONT=Courier New]wp_comments[/FONT], siehe auch Database Description, das ggf. angepasste Prefix bekommt man über [FONT=Courier New]$wpdb->prefix[/FONT], siehe auch wpdb Class Reference.[FONT=Courier New][/FONT]


  • ich möchte die Spalte "comment_author_IP" in der Tabelle "comments" auf Null Zeichen verkleinern.
    Das folgende Script funktioniert, berücksichtigt aber nicht den Präfix (wp_ usw.):

    Code
    global $wpdb;
    $wpdb->query('ALTER TABLE comments MODIFY comment_author_IP VARCHAR(0)');

    Wie bekomme ich den Prefix in die Anweisung rein oder wie kann ich den Tabellen-Namen mit Prefix als Variable einfügen?

    Code
    $wpdb->query( 'ALTER TABLE ' . $wpdb->comments . ' MODIFY .... ' );


    danach funktioniert WordPress erfolgreich nicht mehr fehlerfrei ;)

    Mit offenen Augen träumen

  • Die gesuchte Tabelle heisst standardmässig [FONT=Courier New]wp_comments[/FONT], siehe auch Database Description, das ggf. angepasste Prefix bekommt man über [FONT=Courier New]$wpdb->prefix[/FONT], siehe auch wpdb Class Reference.

    $wpdb->prefix ist mir bekannt, hat mich aber nicht weiter gebracht.
    Danke für deine Hinweise.

  • Zitat

    danach funktioniert WordPress erfolgreich nicht mehr fehlerfrei

    Was geht bei dir nicht mehr? Ich habe folgende Zeilen in meinem Testweb eingefügt und es scheint alles OK zu sein:

    Code
    global $wpdb;
    $wpdb->query('ALTER TABLE cerber_traffic MODIFY ip VARCHAR(0)');
    $wpdb->query('ALTER TABLE ' . $wpdb->comments . ' MODIFY comment_author_IP VARCHAR(0)');

    @r23:
    Das hat mir gefehlt; habe ich trotz langer Suche nicht gefunden, wie man den Code einfügt:

    Zitat


    . $wpdb->comments .

    Im Grunde würde es bei beiden Tabellen auch reichen, die alten IP-Adressen zu löschen. Das ist mir mit bescheidenen SQL-Kenntnissen bisher nicht gelungen. Daher habe ich die Spaltenbreite auf Null gesetzt. Kann mal jemand testen, ob es mit dieser Methode tatsächlich Fehler gibt? Ich kann jedenfalls nichts feststellen. Die Website läuft völlig normal.
    Da ich ehrenamtlich zahlreiche Websites betreue, will ich es den Admins leichter machen. Die IPs in der DB zu löschen ist für mich kein Problem; für die betreffenden Admins (i. d. R. Senioren) schon.
    Vielen Dank für die Hilfe und Hinweise. Für eine alternative Lösung bin ich natürlich dankbar.

  • Strings aneinanderzuhängen sind aber schon sehr einfache PHP-Basics...

    PHP
    $wpdb->query('ALTER TABLE ' . $wpdb->prefix . 'comments MODIFY ...' );

    Meine Meinung zu diesem Ansatz habe ich schon geschrieben.

    Wie man Werte in einer Tabelle aktualisiert, also auch löscht, steht in der inzwischen bereits mehrfach verlinkten wpdb Class Reference bei update, in etwa also so, ungetestet:

    $wpdb->update(
    $wpdb->prefix . 'comments',
    array(
    'comment_author_IP' => ''
    )
    );

    Ergänzung: Doch noch kurz getestet, offenbar benötigt [FONT=Courier New]$wpdb->update()[/FONT] explizit auch das [FONT=Courier New]where[/FONT] Array, also alternativ einfacher so:

    PHP
    global $wpdb;
    $wpdb->query( 'UPDATE ' .$wpdb->prefix . 'comments SET comment_author_IP = "";' );

    9 Mal editiert, zuletzt von b3317133 (19. April 2018 um 23:35)

  • Ich suche erst mal selbst nach Lösungen und war damit schon Stunden beschäftigt. Erst dann, wenn ich nicht mehr weiter komme, wende ich mich an das Forum.
    Der Code

    Code
    $wpdb->update(
        $wpdb->prefix . 'comments',
        array(
            'comment_author_IP' => ''
        )
    );


    funktioniert leider nicht und bringt folgende Fehlermeldung:

    Zitat

    Fatal error: Uncaught ArgumentCountError: Too few arguments to function wpdb::update(), 2 passed in...


    Wäre für meine Zwecke genau richtig gewesen. Ich guck mal, ob ich den Fehler selbst finde.

  • Zitat

    Ergänzung: Doch noch kurz getestet, offenbar benötigt $wpdb->update() explizit auch das where Array, also alternativ einfacher so:

    Super! Das klappt nun endlich! Ich habe eine ganze Weile im Netz gesucht und kein Beispiel hat funktioniert. Dann baue ich mein Plugin so um, dass die Spalte "comment_author_IP" gelöscht wird. Nach euren Aussagen soll das der bessere Weg sein. Vielleicht vorher noch eine Abfrage rein, ob Inhalte vorhanden sind.

    @b3317133:
    Herzlichen Dank für deine Hilfe!

  • @r23:
    Klingt logisch. Dieser Code funktioniert:

    Code
    $wpdb->query( 'UPDATE ' .$wpdb->prefix . 'comments SET comment_author_IP = "";' );

    Wie ist die Syntax bei deinem Vorschlag?

  • Ich kann nicht bewerten, was nun "richtiger" ist. Der bisherige Code funktioniert jedenfalls wie gewünscht und ohne Fehlermeldungen.
    So sieht der Abschnitt in meinem Plugin aus (die jeweiligen Optionen lassen sich einzeln aktivieren):

    Code
    // IP-Adressen bei neuen Kommentaren entfernen
        if (isset($wp_h_data_protection_options['checkbox_3_2'])) { // Wenn aktiviert, lade Script
          // Alte IP-Adressen entfernen
          $wpdb->query( 'UPDATE ' .$wpdb->prefix . 'comments SET comment_author_IP = "";' );
          function wp_h_data_remove_comments_ip($comment_author_ip) {
            return '';
          }
          add_filter('pre_comment_user_ip', 'wp_h_data_remove_comments_ip');
        }
  • Nachdem der erste Teil dank eurer Hilfe wunderbar funktioniert, bleibe ich an anderer Stelle hängen. Ich will die Spalte einer Tabelle leeren, welchen keinen Prefix hat (cerber_traffic).
    Mit Prefix würde das so aussehen:

    Code
    $wpdb->query( 'UPDATE ' .$wpdb->prefix . 'cerber-traffic SET ip = "";' );

    Wie bekomme ich die Anweisung ohne (.$wpdb->prefix .) hin? Wenn ich ".$wpdb->prefix ." entferne, gibt es einen PHP-Fehler. Die Suche im Netz hat mir leider nicht weitergeholfen.
    Wie ist in diesem Fall die Syntax?
    Vielen Dank.

  • Wenn man [FONT=Courier New]' .$wpdb->prefix . '[/FONT] entfernt, ist die Syntax diese, und das ergibt keinen PHP-Fehler:

    Code
    $wpdb->query( 'UPDATE cerber-traffic SET ip = "";' );


    Wie bereits gesagt, Strings aneinanderzuhängen sind einfachste PHP-Basics, evtl. mal ein PHP-Tutorial o.ä. suchen und durchgehen.

  • Zitat

    Wie bereits gesagt, Strings aneinanderzuhängen sind einfachste PHP-Basics, evtl. mal ein PHP-Tutorial o.ä. suchen und durchgehen.


    Wenn du wüsstest, wieviele Stunden ich schon mit Tuts-Lesen verbracht habe, auch in englischen Foren...
    Erst danach frage ich im Forum nach.
    Entweder habe ich es übersehen oder es gab kein Beispiel, wie eine Spalte ohne WHERE geleert werden kann.
    Deinen Code

    Code
    $wpdb->query( 'UPDATE cerber-traffic SET ip = "";' );


    hatte ich mir auch erarbeitet, aber er funktioniert (zumindest bei dieser Tabelle) nicht.
    Dieses Rätsel habe ich nun gelöst:
    Man kann in die Tabellen des Plugins "WP Cerber" nichts einfügen. Keine Ahnung, warum das so ist. Wirkt wie ein Schreibschutz. Da ich in einigen Tabellen des Plugins aber die IP-Adressen entfernen will, bleibt mir nur meine bisherige Methode mit der Spaltenbreite. Ich setze dann die Spaltenbreite auf 3 Zeichen. Damit ist definitiv keine Rückverfolgung aufgrund der IPs möglich. Probleme mit der Spaltenbreite konnte ich bisher nicht feststellen.
    Bei anderen Tabellen, z. B. comments, kann man mit o. g. Code Änderungen vornehmen. Deshalb sind meine bisherigen Versuche gescheitert, in die Tabelle "cerber-traffic" zu schreiben.
    Vielen Dank wieder für deine Hilfe.

  • Nachtrag:
    Diese Meldung kommt beim speichern, wenn man mit phpMyAdmin Werte in der Tabelle "cerber-traffic" verändert:

    Vielleicht ist das die Ursache, dass mit PHP keine Änderungen möglich sind.

  • Ich habe bei meinem Versuch mit der o. g. Fehlermeldung direkt in die Tabelle mit phpMyAdmin geschrieben, also ohne SQL-Anweisung.

  • @b3317133
    @r23
    [size=14]MeinPlugin ist nun fertig und läuft auf einigen Websites ohne Probleme.
    Hier könnt ihr bei Interesse das "Werk" mal ansehen.
    Auf GitHub ist der Quellcode abgelegt. Das Plugin wird auch über GitHub aktualisiert.

    Mangels anderer Möglichkeiten (und nicht, weil ich die Basics nicht kennen würde) werden die betroffenen Spalten mit "ALTER TABLE" verkleinert, um den Datenschutz sicher zu stellen. Fehler sind mir bisher nicht aufgefallen. Die Ursache (habe ich schon geschrieben) liegt an den Tabellen des Plugins "WP Cerber". Der übliche SQL-Code mit $wpdb usw. funktioniert nicht (bei anderen Tabellen sehr wohl).

    Im Prinzip würde ich die Spalten lieber leeren, wenn es dazu eine Lösung gibt.

    Frage:
    Wollt ihr beiden euch das Problem mit "WP Cerber" mal näher ansehen oder soll ich einen neuen Thread aufmachen?
    [/SIZE]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!