Alter einer Person in MySQL berechnen

Das Alter einer Person anhand einer Spalte birthday (Format date) in MySQL berechnen

SELECT
    TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age
FROM
    users

Advertisements

Alter in MySQL berechnen

Als erstes wird eine Tabelle für die Benutzer erstellt. Hier im Beispiel benutzen ich nur die 3 Spalten id, nick für den Benutzernamen und birthday für das Geburtsdatum.

CREATE TABLE accounts(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
nick VARCHAR(32) NOT NULL,
birthday DATE NULL,
UNIQUE(nick)
);

Um den Benutzernamen und das Alter aller Benutzer auf der Tabelle „accounts“ auszulesen wird dann folgender Query benutzt:

SELECT
nick,
YEAR(NOW()) - YEAR(birthday) - IF(DATE_FORMAT('%m-%d', NOW()) > DATE_FORMAT('%m-%d', birthday), 0, 1) AS age
FROM
accounts

Es wird dann folgendes (für meine Benutzer „foo“ und „bar“) Ausgegeben:

nick birthday age
foo 1980-05-01 26
bar 1984-04-04 22

MySQL-Queries in PHP sichern

Da es immer wieder Probleme mit SQL-Injections kommt, habe ich hier eine recht einfache Lösung, die ausreichend für die Absicherung von MySQL-Queries sein sollte.

function mysql_queryf()
{
    $args   = func_get_args();
    $query = array_shift($args);
    $args   = array_map('mysql_real_escape_string', $args);
    $query = vsprintf($query, $args);
    return mysql_query($query);
}

Benutzt wird das ganze dann so. Es muss nur darauf geachtet werden, das sich im ersten Parameter, dem Query die entsprechenden Platzhalter benutzt werden.

mysql_queryf("
    INSERT INTO
        guestbook(title, description, created)
    VALUES
        ('%s', '%s', NOW());",
    $title,
    $description
);

Es werden die üblichen Platzhalter von sprintf wie %s für String, %d für einen signed Integer, %u für einen unsigned Integer oder %F (nicht %f) für einen Float benutzt. Der Vorteil ist, dass die Platzhalter einen Query evtl etwas übersichtlicher machen, da sich nicht mehr soviele Anführungszeichen und PHP-Funktionen zum sichern der Variablen im Query befinden und zusätzlich wird jede Variable automatisch für die Datenbank escaped.

Die Funktionen addslashes(), str_replace(), preg_replace() usw. sind nicht zum Absichern von Queries geeignet.