1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[Mysqli] aus ID einer Person den Namen abfragen

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von MissJour, 5. Januar 2017.

  1. MissJour

    MissJour Grünschnabel

    Guten Abend an alle Mitglieder

    Kurz zur Info:
    Das Thema ist Ahnenforschung.
    Es gibt eine Seite PERSONENSUCHE. Dort geben wir Daten rein um eine Person zu finden. Klappt dies erscheint eine Seite der Person.
    Soweit sogut.
    Dort gibt es eine Option: STAMMBAUMSUCHE

    Hier fängt die Frage an:
    $p_id = mysqli_real_escape_string($db, $_REQUEST['ID']);
    mit diesem Satz übernehmen wir die ID der Person an, die davor gesucht worden ist.

    Ich bräuchte jetzt aber den Vor- und Nachnamen der Person.
    Leider fällt mir nicht wirklich eine Funktion dafür ein.

    Muss ich function machen und es über die SQL-Abfrage machen?

    Dachte an sowas:

    $person = person($db, $p_id);
    $person['vorname'] = $row->person_vorname;
    $person['nachname'] = $row->person_nachname;


    aber bin leider bisschen überfragt...

    Danke im Voraus
     
  2. alxy

    alxy Erfahrenes Mitglied

    Du zeigst dafür zu wenig Code. Die Funktion person() ist selbst definiert, wir wissen nicht was sie tut, geschweigedenn was sie zurückgibt (ein Array, ein Objekt, eine Resource?). Einfacher Teste wäre mal ein var_dump($person) zu machen und schauen, ob da die relevanten Daten dabei sind. [Generell gilt: Man kann beim Programmieren schlecht "raten", man sollte schon grob wissen, was man da gerade tut und warum ;) )
     
    MissJour und sheel gefällt das.
  3. MissJour

    MissJour Grünschnabel

    Also es geht darum, dass diese Person einfach nur da steht um von ihr ein Stammbaum angezeigt wird.
    Also DIE PERSON steht in der Mitte unten
    und nach oben zeigen sich dann die Eltern, Eltern der Eltern, usw usf

    Ich brauche nur den Namen der Person als echo-Ausgabe

    Eine Seite davor (Personensuche) suchte ich nach einer Person (mein Name). Als ich aufgetaucht bin (da ich in der Datenbank abgespeichert bin) klickte ich auf: Stammbaum anzeigen und würde auf eine neue Seite umgeleitet: Stammbaum_Ausgabe

    Der allgemeine Code ist super lang... da ich die Eltern der Person gesucht habe und deren Vorfahren, was da theoretisch egal ist...

    Die Person gibt nichts aus.. das ist leider so mein Problem. Ich überlege was ich da genau machen muss. Eine function mit array drinnen wie z.B. hier:

    Nach dem:
    $p_id = mysqli_real_escape_string($db, $_REQUEST['ID']);

    Suchen wir die Mama der Person
    Code (Text):
    1. $mutter = mutter($db, $p_id);
    2. function mutter($db, $p_id)
    3. {
    4.    $ergebnis = mysqli_query($db, "SELECT
    5.                                        m.Vorname AS mutter_vorname,
    6.                                        m.Nachname AS mutter_nachname,
    7.                                        m.id AS mutter_id
    8.                                    
    9.                                    FROM verwandtschaft vw
    10.                                        LEFT JOIN person p
    11.                                        ON vw.ID = p.id
    12.                                        LEFT JOIN person m
    13.                                        ON vw.ID_Mutter = m.id
    14.                                    
    15.                                    WHERE
    16.                                        p.id = '$p_id'
    17.                                        ");
    18.                                  
    19.  
    20. if (!$ergebnis)
    21.    {
    22.        printf("Errormessage: %s\n", mysqli_error($db));
    23.    }
    24.  
    25. $row = mysqli_fetch_object($ergebnis);
    26. $mutter = array();
    27. $mutter['id'] = $row->mutter_id;
    28. $mutter['vorname'] = $row->mutter_vorname;
    29. $mutter['nachname'] = $row->mutter_nachname;
    30.  
    31. return $mutter;
    32. }
    es wird auch alles perfekt ausgegeben
    dann die Mama der Mama (also Oma der Person mütterlicherseits)
    //Mutter der Mutter
    Code (Text):
    1. function grossmutter($db, $mutter_id, $p_id)
    2. {
    3. $grossmutter = array();
    4. $grossmutter['id'] = $row->grossmutter_id;
    5. $grossmutter['vorname'] = $row->grossmutter_vorname;
    6. $grossmutter['nachname'] = $row->grossmutter_nachname;
    7. return $grossmutter;
    8. }
    9. $grossmutter = mutter($db, $mutter['id']);
    usw usf

    sollte ich das genauso mit der PERSON machen? So wie bei MUTTER oder so wie bei GROßMUTTER ?
     
  4. Yaslaw

    Yaslaw n/a Moderator

    Die grossmutter() wird nicht funktionieren. Woher kommt $row?

    Egal wessen Namen du suchst. Du musst immer Ein SQL absetzen um die Daten auszulesen. Die Namen kannst du nicht einfach aus der Luft greifen.
     
    MissJour gefällt das.
  5. MissJour

    MissJour Grünschnabel

    Das funktioniert alles, die Frage ist nur wie ich den Namen der Person rauskriege, deren ID bereits übernommen worden ist von der Seite davor.
    ID haben wir schon aber den Namen nicht
     
  6. Yaslaw

    Yaslaw n/a Moderator

    Erstelle eine Funktion, welche dir für eine ID den Namen liefert.
    Darin hast du eine Datenbankabfrage auf die ID.
     
    MissJour gefällt das.
  7. MissJour

    MissJour Grünschnabel

    Ok, habe jetzt alles geschrieben:
    Code (Text):
    1. $p_id = mysqli_real_escape_string($db, $_REQUEST['ID']);
    2.  
    3. $person = person($db, $p_id);
    4. function person($db, $p_id)
    5. {
    6.    $ergebnis = mysqli_query($db, "SELECT
    7.                                        Vorname
    8.                                        Nachname
    9.                                        
    10.                                    FROM person
    11.                                    
    12.                                    WHERE
    13.                                        p.id = '$p_id'
    14.                                        ");
    15. if ($ergebnis)
    16.    {
    17.        printf("Errormessage: %s\n", mysqli_error($db));
    18.    }
    19. $row = mysqli_fetch_object($ergebnis);  
    20. $person = array();
    21. $person['id'] = $row->person_id;
    22. $person['vorname'] = $row->person_vorname;
    23. $person['nachname'] = $row->person_nachname;  
    24.  
    25. return $person;
    26. }
    PS: ROW haben wir genommen, da uns der Tutor in der Programmierwerkstatt alles so gezeigt hat...

    Leider bekomme ich bei dem Code diese Fehlermeldung

    Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/pwws16/05/www/Stammbaumsuche_Ausgabe.php on line 99

    Bei der Mutter kommt diese Fehlermeldung nicht.. Nur bei der Person

    Und ob ich: MYSQLI_FETCH_OBJECT ODER MYSQLI_FETCH_ARRAY nehme, kommt immer die selbe Fehlermeldung
    mache ich aber MYSQLI_RESULTS($ergebnis) kommt auch eine Fehlermeldung. Ich gehe davon aus, dass es nicht funktionieren wird wegen dem ROW...

    Help :D
     
  8. sheel

    sheel I love Asm Administrator

    Die Fehlermeldung sagt doch eindeutig, dass Row nicht das Problem sein kann.
    Code (Text):
    1. mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given
    und
    Code (Text):
    1. mysqli_fetch_object($ergebnis);
    , also ist $ergebnis kein gültiges Abfrageergebnis mit den Daten (die durch mysqli_fetch_object herausgeholt werden können), sondern true/false.
    $ergebnis kommt von
    Code (Text):
    1. $ergebnis = mysqli_query($db, "SELECT
    2.                                        Vorname
    3.                                        Nachname
    4.                                        
    5.                                    FROM person
    6.                                    
    7.                                    WHERE
    8.                                        p.id = '$p_id'
    9.                                        ");
    und laut der Doku ergibt mysqli_query false wenns nicht geklappt hat. Also hat entweder die Verbindung in $db ein Problem, oder die SQL-Anweisung ist falsch.
    zB. fehlt zwischen Vorname und Nachname ein Komma.
     
    MissJour gefällt das.
  9. MissJour

    MissJour Grünschnabel

    Code (Text):
    1. $person = person($db, $p_id);
    2. function person($db, $p_id)
    3. {
    4.    $ergebnis = mysqli_query($db, "SELECT
    5.                                        p.Vorname AS person_vorname,
    6.                                        p.Nachname AS person_nachname,
    7.                                        p.id AS person_id
    8.                                      
    9.                                    FROM person
    10.                                  
    11.                                    WHERE
    12.                                        p.id = '$p_id'
    13.                                        ");
    14. if ($ergebnis)
    15.    {
    16.        printf("Errormessage: %s\n", mysqli_error($db));
    17.    }
    18. //-----------------------------------------------------------------------------------------------------------------
    19. $row = mysqli_fetch_object($ergebnis);  
    20. $person = array();
    21. $person['id'] = $row->person_id;
    22. $person['vorname'] = $row->person_vorname;
    23. $person['nachname'] = $row->person_nachname;  
    24.  
    25. return $person;
    26. }
    bekomme eine Fehlermeldung dazu:
    $row = mysqli_fetch_object($ergebnis);

    was ich gar nicht verstehen kann, denn bei $mutter ist es genauso...
     
  10. MissJour

    MissJour Grünschnabel

    2. Frage
    Habe diese Fehlermeldung:
    Notice: Trying to get property of non-object in /var/www/html/pwws16/05/www/Stammbaumsuche_Ausgabe.php on line 102

    Ich habe sowas online gefunden:
    Check the manual for mysql_fetch_object(). It returns an object, not an array of objects.

    I'm guessing you want something like this
    $results = mysql_query("SELECT * FROM sidemenu WHERE `menu_id`='".$menu."' ORDER BY `id` ASC LIMIT 1", $con);
    $sidemenus = array();
    while ($sidemenu = mysql_fetch_object($results)) {
    $sidemenus[] = $sidemenu;
    }
    Was ja bedeutet, dass wir ein OBJECT zurückkriegen und kein ARRAY von OBJEKTEN.

    In der Datenbank bin ich als Person gespeichert, meine Eltern, deren Eltern und dessen Eltern. Also kommen diese Meldungen nicht.

    Sobald ich aber einen anderen Namen eingebe (z.B. der meiner Mama) kommen mindestens 10-15 dieser Fehlermeldungen. Ich gehe davon aus, dass es so ist, weil nur Eltern meiner Mutter und dessen Eltern in der Datenbank eingespeichert sind aber nicht ihre Urgroßeltern...

    Wie könnte man das beheben?
     
  11. Yaslaw

    Yaslaw n/a Moderator

    1) Ich hoffe, deine ID ist eine Zahl. Dann solltest du sie auch als Zahl an die Datenbank übergeben. Entferne die ' bei p.id = '$p_id'
    Code (SQL):
    1. WHERE p.id = $p_id
    2) Ja, es heisst genau das. myqli_fetch_object gibt ein Objekt zurück, kein Array

    3) Lass dir ausgeben, welche ID gesucht wird. Dann wirst du den Fehler schon finden. Die Funktion als solches scheint ja zu funktionieren. Wenn du aber in deiner Stammbaumgenerierung nach UrUrUrGrosselten suchst, die nicht im System erfasst ist, gibt es ein Fehler. Ist ja auch logisch.

    Ups, ich sehe da grad noch was. Warum der folgende Codeteil? Wenn etwas funktioniert hat, gibst du ein Error aus? Macht wenig sinn. Da fehlt ein !
    Code (PHP):
    1. if (!$ergebnis){//Error}
    Und warum fährst du nach dem Fehler einfah fort als ob nix bpassiert ist?

    Normalerweise macht man das Konstrukt so:
    Code (PHP):
    1. if($result = mysqli_query($db, "SELECT...")){
    2.     $row = mysqli_fetch_object($result);
    3.     echo $row->vorname;
    4. } else {
    5.     //Keine Daten gefunden. ggf Fehler ausgeben
    6. }
     
    MissJour gefällt das.
  12. MissJour

    MissJour Grünschnabel

    [3) Lass dir ausgeben, welche ID gesucht wird. Dann wirst du den Fehler schon finden. Die Funktion als solches scheint ja zu funktionieren. Wenn du aber in deiner Stammbaumgenerierung nach UrUrUrGrosselten suchst, die nicht im System erfasst ist, gibt es ein Fehler. Ist ja auch logisch.

    Wie kann ich es vermeiden? Ich möchte nicht, dass es ein Fehler anzeigt, sondern dass dann einfach nichts mehr erscheint... Keine Fehlermeldung in dem Sinne, es sollen nur die Generationen bzw. Personen erscheinen, die in der Datenbank abgespeichert sind, ohne irgendwelche Fehlermeldungen.
     
  13. MissJour

    MissJour Grünschnabel

    Vielen Dank erstmal, es hat alles geklappt.
    Bei dem Fehler
    Notice: Trying to get property of non-object in /var/www/html/....

    Mein Professor meinte, dass wenn NULL in der Tabelle steht, dass ich das im Skipt definieren muss.
    Hat einer eine Idee vielleicht??

    Code (Text):
    1. $urgrossvater = vater($db, $grossvater['id']);
    2. function urgrossvater($db, $grossvater_id, $vater_id, $p_id)
    3. {
    4. $urgrossvater = array();
    5. $urgrossvater['id'] = $row->urgrossvater_id;
    6. $urgrossvater['vorname'] = $row->urgrossvater_vorname;
    7. $urgrossvater['nachname'] = $row->urgrossvater_nachname;
    8. return $urgrossvater;
    Hier müsste ich im Skript es so definieren, dass auch eventuell KEIN ERGEBNIS rauskommt (weil die Person nicht in der DB angelegt ist). Ich weiß leider nicht wie :(

    Danke im Voraus
     
  14. MissJour

    MissJour Grünschnabel

    Hat sich erledigt!!

    Vielen Dank für die Mühe
     
Die Seite wird geladen...