[Mysqli] aus ID einer Person den Namen abfragen

#1
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
 

alxy

Erfahrenes Mitglied
#2
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 ;) )
 
#3
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:
$mutter = mutter($db, $p_id);
function mutter($db, $p_id)
{
   $ergebnis = mysqli_query($db, "SELECT
                                       m.Vorname AS mutter_vorname,
                                       m.Nachname AS mutter_nachname,
                                       m.id AS mutter_id
                                    
                                   FROM verwandtschaft vw
                                       LEFT JOIN person p
                                       ON vw.ID = p.id
                                       LEFT JOIN person m
                                       ON vw.ID_Mutter = m.id
                                    
                                   WHERE
                                       p.id = '$p_id'
                                       ");
                                  
  
if (!$ergebnis)
   {
       printf("Errormessage: %s\n", mysqli_error($db));
   }
  
$row = mysqli_fetch_object($ergebnis);
$mutter = array();
$mutter['id'] = $row->mutter_id;
$mutter['vorname'] = $row->mutter_vorname;
$mutter['nachname'] = $row->mutter_nachname;

return $mutter;
}
es wird auch alles perfekt ausgegeben
dann die Mama der Mama (also Oma der Person mütterlicherseits)
//Mutter der Mutter
Code:
function grossmutter($db, $mutter_id, $p_id)
{
$grossmutter = array();
$grossmutter['id'] = $row->grossmutter_id;
$grossmutter['vorname'] = $row->grossmutter_vorname;
$grossmutter['nachname'] = $row->grossmutter_nachname;
return $grossmutter;
}
$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 ?
 

Yaslaw

n/a
Moderator
#4
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.
 
#5
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
 

Yaslaw

n/a
Moderator
#6
Erstelle eine Funktion, welche dir für eine ID den Namen liefert.
Darin hast du eine Datenbankabfrage auf die ID.
 
#7
Ok, habe jetzt alles geschrieben:
Code:
$p_id = mysqli_real_escape_string($db, $_REQUEST['ID']);

$person = person($db, $p_id);
function person($db, $p_id)
{
   $ergebnis = mysqli_query($db, "SELECT
                                       Vorname
                                       Nachname
                                       
                                   FROM person
                                   
                                   WHERE
                                       p.id = '$p_id'
                                       ");
if ($ergebnis)
   {
       printf("Errormessage: %s\n", mysqli_error($db));
   }
$row = mysqli_fetch_object($ergebnis);   
$person = array();
$person['id'] = $row->person_id;
$person['vorname'] = $row->person_vorname;
$person['nachname'] = $row->person_nachname;   

return $person;
}
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
Die Fehlermeldung sagt doch eindeutig, dass Row nicht das Problem sein kann.
Code:
mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given
und
Code:
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:
$ergebnis = mysqli_query($db, "SELECT
                                       Vorname
                                       Nachname
                                       
                                   FROM person
                                   
                                   WHERE
                                       p.id = '$p_id'
                                       ");
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.
 
#9
Code:
$person = person($db, $p_id);
function person($db, $p_id)
{
   $ergebnis = mysqli_query($db, "SELECT
                                       p.Vorname AS person_vorname,
                                       p.Nachname AS person_nachname,
                                       p.id AS person_id
                                      
                                   FROM person
                                  
                                   WHERE
                                       p.id = '$p_id'
                                       ");
if ($ergebnis)
   {
       printf("Errormessage: %s\n", mysqli_error($db));
   }
//-----------------------------------------------------------------------------------------------------------------
$row = mysqli_fetch_object($ergebnis);  
$person = array();
$person['id'] = $row->person_id;
$person['vorname'] = $row->person_vorname;
$person['nachname'] = $row->person_nachname;  

return $person;
}
bekomme eine Fehlermeldung dazu:
$row = mysqli_fetch_object($ergebnis);

was ich gar nicht verstehen kann, denn bei $mutter ist es genauso...
 
#10
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?
 

Yaslaw

n/a
Moderator
#11
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'
SQL:
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 !
PHP:
if (!$ergebnis){//Error}
Und warum fährst du nach dem Fehler einfah fort als ob nix bpassiert ist?

Normalerweise macht man das Konstrukt so:
PHP:
if($result = mysqli_query($db, "SELECT...")){
    $row = mysqli_fetch_object($result);
    echo $row->vorname;
} else {
    //Keine Daten gefunden. ggf Fehler ausgeben
}
 
#12
[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
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:
$urgrossvater = vater($db, $grossvater['id']);
function urgrossvater($db, $grossvater_id, $vater_id, $p_id)
{
$urgrossvater = array();
$urgrossvater['id'] = $row->urgrossvater_id;
$urgrossvater['vorname'] = $row->urgrossvater_vorname;
$urgrossvater['nachname'] = $row->urgrossvater_nachname;
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