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.