ausgabebug beim Geschlecht

Aser

Erfahrenes Mitglied
tag

das folgende Script nimmt die Usernamen aus einem Ordner
(jeder user ist als datei drin gespeichert)
nun weiss das Script, wie der jeweilige User heisst und guckt in der Datenbank nach dem jeweiligen Geschlecht des Users...
mannlich oder weiblich, falls weder M(male) noch F(female) als Wert vorhanden sind, dann wid er N(neutrum) ausgegeben

nun das verblueffende...
am Schluss vom Script wird die gesamtstatistik ausgegeben, bei der heisst es dann
z.B.
4 mannliche Freunde,
3 weibliche Freunde,
0 neutrum(/Datenbankfehler)

die Freunde werden aber alle in der Kategorie NEUTRUM aufgelistet, obwohl erkannt wurde, dass 4 mannlich und 3 weiblich sind... und diese Operation findet vor der Schlussstatistik statt, d.h. dass die werte bislag korrekt sein muessten :confused:

Ich finde den Fehler einfach nicht...
vielen Dank im Voraus



PHP:
<?

if($auszugebendernic=='')
{
$auszugebendernic=$nic;
}

include "./admin/mysqldaten.php";



$path = "./user/".$auszugebendernic."/mates/";
$sexmalenr="0";
$sexfemalenr="0";
$sexneutrumnr="0";

include "./admin/mysqldaten.php";



$ordnerinhalt=opendir($path);
while ($auszugebendedatei = readdir($ordnerinhalt))
{
    if ($auszugebendedatei != "." && $auszugebendedatei != ".." && $auszugebendedatei != ".htaccess")
    {#SChleife if not . or .. open

           $abfrage = mysql_query("SELECT * FROM user WHERE nic = '".$auszugebendedatei."'");
           $sex = mysql_result($abfrage, 0, "sex");

           if($sex=="m")
           {
              ${'m'.$sexmalenr}=$auszugebendedatei;
              $sexmalenr++;
           }
           elseif($sex=="f")
           {
              ${'f'.$sexfemalenr}=$auszugebendedatei;
              $sexfemalenr++;
           }
           #test
           else
           #elseif($sex=="n")
           {
              ${'n'.$sexneutrumnr}=$auszugebendedatei;
              $sexneutrumnr++;
           }
        
        
    } #Schleife if not . or .. closed
} # Schleife vom Auslesen closed


echo "maennliche Mates: <br>";

echo "<table>";
#linkespalte open --------------------------------------------------------------
$sexmalenr="0";
while (${"m".$sexmalenr}!="" )
{
     echo"<tr>
              <td><a target='_blank' href='./userprofil.php?nic=$nic&auszugebendernic=".${"m".$sexmalenr}."&zz=$zz'>".${'m'.$sexmalenr}."[test]</a>
              </td>
          </tr>";
     $sexmalenr++;
}
#linkespalte closed --------------------------------------------------------------

echo "weibliche Mates: <br>";
#linkespalte open --------------------------------------------------------------
$sexfemalenr="0";
while (${"f".$sexfemalenr}!="" )
{

     echo"<tr>
              <td><a target='_blank' href='./userprofil.php?auszugebendernic=".${'f'.$sexfemalenr}."&nic=$nic'>".${'f'.$sexfemalenr}."[test]</a>
              </td>
          </tr>";
     $sexfemalenr++;
}
#linkespalte closed --------------------------------------------------------------

echo "ungeschlechtliche Mates: <br>";
#linkespalte open --------------------------------------------------------------
$sexneutrumnr="0";
while (${"n".$sexneutrumnr}!="" )
{
     echo"<tr>
              <td><a target='_blank' href='./userprofil.php?auszugebendernic=".${'n'.$sexneutrumnr}."&nic=$nic'>".${'n'.$sexneutrumnr}."[test]</a>
              </td>
          </tr>";
     $sexneutrumnr++;
}
#linkespalte closed --------------------------------------------------------------
echo "</table>";

echo "<br>";
echo "maennliche Mates: ".$sexmalenr;
echo "<br>";
echo "weibliche Mates: ".$sexfemalenr;
echo "<br>";
echo "unentschiedene Mates: ".$sexneutrumnr;



?>

Beispielausgabe:

Kontakt zur Datenbank...Tabelle wurde ausgewaehlt...

maennliche Mates:
weibliche Mates:
ungeschlechtliche Mates:
Der Photograph[test]
eva[test]

maennliche Mates: 1
weibliche Mates: 1
unentschiedene Mates: 0
 
Probier mal folgende Abfrage um die Anzahl jedes Geschlechts abzufragen:
Code:
SELECT
        COUNT(*) AS `anzahl`,
        `sex`
  FROM
        `user`
  GROUP BY
        `sex`
 
hmm
danke fuer die Hilfe...
allerdigns... glabe ich nicht, dass das die Loesung fuer mein Problem ist, da ja der Counter am Schluss stimmt

, wenn ich das richtig aufgefasst habe, meinst du, dass ich die Ausleseschleife dreimal durchgehen lassen soll...
1x fuer nur maennliche ausgeben
1x fuer nur weibliche ausgeben
1x fuer nur neutrum ausgeben

das koennt ich machen...
ich dachte es kommt resourcsparsamer, wenn ich jeweils den wert in eine Variable reinsteck und diese dann jeweils auslese...(siehe mein vorheriger code)
aber da ist ja irgendwo ein Fehler :confused:
 
Wieso sind die Benutzer überhaupt einerseits jewels als Dateien und andererseits als Datensätze gespeichert? Das ist doch völlig redundant.
 
das liegt daran, dass in der datenbank sehr viele user vorhanden sind und von diesen jeder seinen eigenen Freundeskreis hat...
d.h. ich muesste bei jedem user aus der Datenbank eine kleine weitere Datenbank anlegen, die die Freunde (lediglich Name) beinhalten...

eine Datenbank (Freundetabelle) in einer Datenbankzelle geht meines Wissens nach nicht...
und fuer jeden user eine weitere Tabelle anzufertigen fuehrt nur zur verwirrung...

da jeder User eh seinen eigenen Ordner mit diversen Daten hat, befindet sich ein Ordner mitdabei, der seine Freunde "auflistet"
 
@Aser:
Überlege doch ein Mal, ob du deine Datenbankstruktur nicht normalisieren willst, also eine einzige Tabelle für die Freunde mit Verknüpfung über die ID...

Tabelle 1: User
ID Username

Tabelle 2:
ID UserID Freund (oder FreundID, wenn die Freunde alle in der DB vorhanden sind)

Konkret zu deinem Problem:

Auch wenn ich die Verwendung von "variablen Variablen" hier für nicht sonderlich sinnvoll halte (Arrays sind da deutlich praktischer), ist mir eins aufgefallen:
PHP:
   if($sex=="m") 
           { 
              ${'m'.$sexmalenr}=$auszugebendedatei; 
              $sexmalenr++; 
           }
Wenn ich das richtig verstehe, wird doch nur der letzte Wert immer überschrieben, bei mehr als einem Datensatz gehen also die vorherigen bei der Ausgabe verloren !?
 
Zuletzt bearbeitet:
Wie Ceppi es bereits erwähnte, sind zusätzliche Tabellen oder gar Dantebanken für den Freundeskreis jedes Benutzers gar nicht nötig. Es reicht, wenn lediglich eine zusätzliche Tabelle angelegt wird, die eine Assoziation zwischen den einzelnen Benutzern und dessen Beziehung herstellt.
 
hmm
klingt interessant...
aber wie genau meint ihr des...
also...
Wenn da jeder user 30 Freunde hat, wird die Beziehungstabelle mind 30x groesser als die Usertabelle?
Wie koennt sowas aussehen?

USER | FREUND | ETC

user1 user3
user1 user4
user1 user5
user3 user1

:confused:
 
Sicherlich hat dann die Freunde-Tabelle mehr Datensätze, aber du speicherst ja nur die IDs, während du dir dann die restlichen Daten per Verknüpfung aus 'ner anderen Tabelle holst.

Dadurch gewinnst du an Übersichtlichkeit und vermeidest Redundanz und folgich Inkonsistenz (*danke an BR-alpha für die tollen TV-Sendungen zu Datenbanken*:suspekt:).

Aber du hast nicht ganz Unrecht: man sollte es mit der Normalisierung nicht unbedingt übertreiben...

Eine Tabelle mit den ganzen Userdaten:
Code:
ID | Name | Geburtsdatum | Wohnort | Telefon | Hobbies | ...

Und die Freundetabelle:
Code:
ID | UserID | FreundID

Alle Freunde eines Users mit zugehörigen Details selektierst du dann so:
SQL:
SELECT 
  u.name,
  u.geburtsdatum 
FROM freunde f LEFT JOIN user u ON u.id=f.FreundID WHERE f.UserID = '123';
 
Zuletzt bearbeitet:
wenn, dann haett ichs so geloest
... oder waere son Quellcode... :rolleyes:

$abfrage = mysql_query("SELECT * FROM userfreunde where user=$nic );

$passenderusernr="0";
while ($auszugebenderfreund!="")
{
$auszugebenderfreund = @mysql_result($abfrage, $passenderusernr, "freund");
$passenderusernr++;
}

echo holde Daten aus normaler Tabelle vom nic $auszugebenderfreund;
 
Zurück