Zwei dimensionale Arrays füllen


Grunge

Erfahrenes Mitglied
#1
Huhu Leute,

ich habe ein kleines Problemchen. Dabei geht es diesmal um folgendes:

Ich versuche doppelte Einträge in meiner Datenbank zu löschen. Diese Einträge müssen aber zuvor darauf geprüft werden, ob ein Ordner mit deren ID auf dem Server hinterlegt ist. Nur dann dürfen die doppelten Einträge gelöscht werden.

Also Beispiel:
User id: 20
User id: 32
User id: 18

Fall 1:
Einer der drei hat einen Ordner auf dem Webspace, in dem Fall werden die anderen gelöscht.

Fall 2: Keiner der drei hat einen Ordner auf dem Webspace, dann werden die restlichen zwei gelöscht (beliebige ID...).

Die doppelten Einträge in der Datenbank werden dabei von einer Spalte bestimmt, die einen String enthält. Die Spalte heißt user_nicename. Also den Nicknamen des Users.

Jetzt bin ich wie folgt ran gegangen:

Code:
$sql = "SELECT DISTINCT * FROM wp_users";        //Keine doppelten Datensätze damit eindeutiger Name vergeben werden kann
$result = $db->query($sql);
$user = array();

while($row = $result->fetch_assoc()){
    $user[$row['user_nicename']] = array();

// ?? ?? ??
}
Das ist nun der Teil wo ich nicht weiter weiß. In der schleife würde ich nun eine erneute abfrage machen um die IDs der Nutzer zu bekommen, um diese eindeutig bestimmen zu können. Dies würd ich eben wieder in einem Array tun um alle IDs zu zum Beispiel "Thomas" zu bekommen. Damit hätte ich alle "Thomas".
Sieht man ja schon oben:
$user[$row['user_nicename']] = array();


Deshalb hab ich aus oben, folgendes gemacht:

Code:
while($row = $result->fetch_assoc()){
    $user[$row['user_nicename']] = array();
   
    $doppelt = "SELECT * FROM wp_users WHERE user_nicename = '".$row['user_nicename']."'";
    $r = $db->query($doppelt);
    $anz = $r->num_rows;
   
   
    if($anz > 1){
        while($ar = $r->fetch_assoc()){
        if (!file_exists("../".$ar['ID']."/")) {
                $user[$row['user_nicename']] .= $ar['ID'];
                    }
           
           
    }
   
   
    }
   
}
Hoffe ihr konntet verstehen was ich meine!

Es gibt keine Fehlermeldung, das einzige, was er mir in das erste Array schreibt ist ein "A" ... Keine Ahnung wo er da her nimmt.
Wahrscheinlich ist es wieder nur ein banaler Fehler, den ich zu so später Stunde übersehe...hoffe ihr wisst jedenfalls weiter.


LG
 

Yaslaw

n/a
Moderator
#2
Uh, vieles. Als erstes das SQL. Filterte doch schon mal aus, ob mehr als ein User vorhanden ist.

PHP:
//https://wiki.yaslaw.info/doku.php/php/tutorials/sqlreadable
$sql = <<<SQL
    SELECT DISTINCT id
    FROM wp_users
    WHERE wp_users = (
            SELECT user_nicename 
            FROM wp_users 
            GROUP BY user_nicename
            HAVING COUNT(*) > 1
        )
    ORDER BY user_nicename
SQL;

$users = array();
$folders = array();

$rs = $db->query($sql);
while($user = $rs->fetch_assoc()){
    $users[$row['user_nicename']][] = $row['id'];
    //TODO check ob $user['id'] einen Ordner hat. Wenn jam die ID zum nicename speichern
    if(file_exists("../{$row['id']}/")) $folders[$row['user_nicename']] = $row['id'];
}

foreach ($users as $nicename => $ids) {
    if(array_key_exists($nicename, $folders)){
        //Wenn ein Ordner vorhanden ist, dise ID behalten
        $keepId = $folders[$nicename];
    }else{
        //Ansonsten einfach die erste
        $keepId = $ids[0];
    }
    //Zu löschende IDS ermitteln
    $idsToDelete = array_diff($ids, array($keepId));
    //TODO: alle IDs im Array $idsToDelete löschen
}