tk: Vorfahren aus Datenbank rekursiv ermitteln?

Beitrag lesen

Hallo Rolf,

grundsätzlich stimme ich dir zu, ein paar Sachen würde ich nur gerne noch ergänzen bzw. verdeutlichen:

"'" . addslashes($id) . "'"

Zweimal "wieso?". Deine ids sind in der DB int-Werte. D.h. die Query sollte auch Integers vergleichen, nicht Strings. Prüfe die ID in $_GET[] auf numerisch und weise sie bei Fehler ab. Danach konvertiere sie mit intval() in einen Integer und damit ist es gut. Ich würde Dir ja Type Hints für die Lesefunktion empfehlen wollen, aber das geht erst ab PHP 7.

Das wird so nicht funktionieren: die Werte in $_GET (und auch $_POST) sind immer Strings, egal welcher Wert darin steht. Natürlich kann man mit ctype_digit() kontrollieren ob da ausschließlich Ziffern drin stehen – ich würde das aber alles die Datenbank machen lassen und prepared Statements verwenden.

Das eigentliche Problem von addslashes() ist aber ein ganz anderes: die Funktion ist nicht geeignet um den Kontextwechsel zu SQL korrekt zu behandeln, dafür gibt es spezielle Funktionen, bei mysqli ist das mysqli_real_escape_string() (bei der mysql-Erweiterung ohne das erste i).

@mysql_query

Whoaaa - mysql? Nicht nur PHP 5.6, sondern auch eine "verbotene" MySQL Schnittstelle? Verwende unbedingt mysqli oder PDO für neue Anwendungen.

Nicht nur für neue Anwendungen. PHP 5 (und damit auch mysql_query&Co) ist tot. Mausetot. Selbst PHP 7 hat nur noch rund 1 Jahr zu leben …
PHP 5 sollte man nicht mehr einsetzen, da gibt es seit bald drei Jahren keine Updates mehr und deutlich schneller geworden ist PHP ab Version 7 auch. Und ja, ich weiß dass das – je nach Code – u.U. einiges an Aufwand ist, aber mit einem guten Editor lassen sich die Funktionen relativ leicht durch mysqli ersetzen (eine Versionsverwaltung wie git verwenden um bei Problemen zu bisherigen Version zurück zu können!).

Zu aktualisieren gibt es allerdings noch mehr: Debian 9 wird zwar noch unterstützt, ist aber schon von 2018 und der LTS-Support endet im kommenden Juni. Damit zusammenhängen wird wohl die Tatsache das MariaDB 10.1 installiert ist, auch diese Version wird nicht mehr unterstützt. phpMyAdmin 4.6.6 ist von Anfang 2017, seitdem wurden schon einige Lücken geschlossen weswegen ein Einsatz dieser Version wenig sinnvoll ist (wobei ich generell eher zu Adminer raten würde).

Und das @ Präfix brauchst Du eigentlich nicht.

Das hatte ich die Woche auch schon erwähnt – nur leider ignoriert Linuchs jegliche Kritik an seinem Code völlig.

liesMutterVaterId(...)

[…]

neben dem bereits genannten (genannt wurde es aber nochmal zur Verdeutlichung): global ist böse™. Variablen die in einer Funktion benötigt werden sollten immer als Parameter übergeben werden, wenn da irgendwelche Variablen per global auftauchen führt das zu unlesbarem und unwartbarem Code.

Gruß
Tobias