Beiträge von cottton

    Was mache ich falsch?


    Alles. Sorry, ist aber so.
    Eine Passwortabfrage - also die Prüfung auf das richtige Passwort - gehört nicht in den Browser - wie hier im Fall Javascript.
    Javascript ist für jeden einsehbar.
    Mit while/do-while -Schleifen sollte man sowas auch nicht machen.

    Hab da noch paar Sachen für Dich:
    - transactions
    - optimize table
    - query log

    Transaktionen:
    Das Prinzip ist einfach. Du willst 2 Aktionen durchführen: löschen, und updaten.
    Wenn das eine nicht geht, soll das andere nicht sein.
    Dafür gibts Rollback.

    Wenn Du ohne PHP arbeitest (also die Queries direkt auf dem Server ausführst), dann siehe hier: http://dev.mysql.com/doc/refman/5.7/en/commit.html
    ROLLBACK siehe: http://stackoverflow.com/a/9327843

    Falls Du mysqli_ nutzt, dann siehe hier: http://php.net/manual/de/mysqli.begin-transaction.php
    Und im Falle PDO: http://php.net/manual/de/pdo.begintransaction.php

    Optimize table kann ich gerade nur von innodb sprechen
    Wenn Du viele (hunderte/tausende) Datensätze gelöscht hast, dann kann wird es sein, dass die Tabelle größer wird, oder gleich groß bleibt.
    Warum? Es wurde ja gelöscht.
    Ja, aber innodo Tabelle sammeln Daten zur Wiederherstellung, falls was schief geht (und das ist gut).
    Wendest Du nun "OPTIMIZE TABLE mytablename;" an, dann reorganisiert der Server die Tabelle. Die nicht mehr benötigten Daten werden entfernt.
    (hatte das Problem mal mit einer Tabelle die ~10 GB groß war, und nach dem Löschen um die 30 GB :D)

    Query log
    Du sagtest, dass Du aus einer Tabelle löschst, und in der anderen Tabelle wird gleich mit gelöscht.
    Um genau zu sehen, was da alles passiert, kannst Du die Query log einschalten.
    Dadurch siehst Du jede Query, die ausgeführt wird.
    Aber Vorsicht beim laufenden Betrieb -- wenn Du nen Server hast, der 20 Queries per sec bekommt, dann bekommst Du 20 Queries (oder mehr) geschrieben.
    Am besten auf einem Testsystem nutzen, auf dem nur Deine Aktionen ausgeführt werden


    So kannst Du schön sehen, was noch alles passiert, wenn Du einen User löschst. Evtl siehst Du dann, was Du noch in die neue Tabelle schreiben/kopieren musst -- als Backup.

    Dann gibt es bei den Tabellen sicherlich schon die Verknüpfung per Fremdschlüssel.
    Das ist gut.

    Was Du jetzt egitl nur machen musst:

    SQL
    DELETE FROM hwf35_users WHERE ID IN (
        SELECT id FROM hwf35_users_for_delete 
    );


    Weiß grad nicht, ob ich auf die Schnelle was vergessen hab. Aber im Prinzip war es das schon.

    Würde allerdings - wenn benötigt - noch etwas "verbessern":


    Evtl noch anpassen.

    Ja, was wolf sagt -- Trigger (von mir nicht empfohlen), oder Fremdschlüssel (foreign key).
    Das müsste man bei der Erstellung der neuen Tabelle beachten.

    Weiß ja nicht, was die neue Tabelle für einen Zweck erfüllt.
    Ich tippe mal: Du willst sicherheitshalber erst alle Datensätze in einer extra Table haben, um sie zu kontrollieren.
    Dann, wenn alles ok ist, sollen diese gefilterten/gefundenen Datensätze in der originalen Tabelle gelöscht werden.

    Wenn dem so ist, und Du GANZ sicher gehen musst, dann
    - erstelle neue (nicht temporäre) Tabelle tbl_name_29112015 (mit alles Column/Feldern die wichtig sind (oder allen Feldern =)))
    - lege dabei eine zusätzliche Column an: deleted_at oder delete_date not null, datetime format, default '0000-00-00 00:00:00'
    - kontrolliere die gefilterten Datensätze der neuen Tabelle
    - wenn gelöscht werden kann, dann setze delete_date auf NOW() und lösche in den originalen Tabellen

    Vorteil:
    Du hast Backups den Datensätze, welche als gelöscht markiert sind.
    Im Notfall könntest Du diese wiederherstellen.
    EDIT: Du könntest auch die kompletten Tabellen kopieren. Das kann aber bissl blöd sein, wenn dort sehr viel Datensätze vorhanden sind.

    DELETE:
    Du hattest 2 Tabellen. Evtl musst Du dann auch auf beiden löschen:
    siehe "Multiple-Table Syntax" http://dev.mysql.com/doc/refman/5.7/en/delete.html

    Fremdschlüssel (ON DELETE CASCADE) könnten hier auch helfen. Aber dazu müsste man erstmal wissen
    - wozu die neue Tabelle eigtl dient
    - ob die vorhandenen Tabellen in der Struktur geändert werden dürfen

    Spricht nix dagegen. Ich meine ja nur -- wenn Du eine $_POST-Variable ausliest, dann kam die über POST.
    Ich will Dich davon nicht abbringen. Im just sayin :D

    Du kannst Natürlich ganz am Anfang klarstellen:

    PHP
    if(strtoupper($_SERVER['REQUEST_METHOD']) != 'POST'){
        // hier kam keine post request -- hier gehts nicht weiter
        // exit, oder was auch immer getan werden muss
    }

    Die Reihenfolge ist hier das Problem, glaub ich.
    Du selektierst
    regDate, userName, id, ...
    Also schiebt er sicherlich das regDate in die erste Column -- id.

    Dann setze einfach die Values
    wie in etwa

    Wenn es eine wirklich temporärer Tabelle ist, dann empfehle ich Memory-Table (ram / daten beachten).
    https://dev.mysql.com/doc/refman/5.5…age-engine.html

    Wenn nicht genug RAM ... dann temp table
    http://dev.mysql.com/doc/refman/5.7/en/create-table.html
    (beachte, dass diese tbl nach der Session weg sind. Im Zweifel nen normalen Table)

    Und da die Tabelle ähnlich aufgebaut sein müsste, mach CREATE TABLE LIKE Sinn.
    https://dev.mysql.com/doc/refman/5.7…table-like.html

    bsp:


    Und dann kannst Du die selektierten Daten in die neue Tabelle schieben:
    http://dev.mysql.com/doc/refman/5.7/en/insert-select.html


    Evtl musst Du die Tabelle doch selbst definieren, wenn zB ein Feld X einen Wert benötigt, aber Du diesen nicht im SELECT selektierst.

    jetzt seh ich gerade, da ist ja einiges "krum".
    Erstmal:

    PHP
    strtoupper(  $_SERVER['REQUEST_METHOD'] == 'POST'  )
    // geht gar nicht das gehört so:
    strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'

    Und warum sollte die request method in der Form-Action stehen?

    PHP
    <form action="<?php $_SERVER['REQUEST_METHOD']?>" method="POST">
    // in die action gehört das ziel -- zB /index.php oder "" (leer) für das gleiche script, ...


    Kommt draus an, wie Dein bisheriger Code aussieht.

    Würde das strenggenommen nicht auch reichen?


    Würde ich vermeiden.
    Denn so lässt Du ja das Script volle Kanne in ein Fatal Error rennen :D

    Du solltest mindestens prüfen, ob die Klasse existiert.
    Wenn sie existiert, dann hast du sie ja sicherlich geschrieben und sie wird die benötigte Methode besitzen.
    Den "Schritt" zur Klasse könnte User aber selbst ansteuern, indem er rumprobiert.
    Und anstatt ihm dann den Fatal Error (oder eine weiße Seite) zu zeigen, würde ich einfach umleiten auf die Hauptseite (oder 404).