Start · Sprachen · PHP · Referenz · mysql_query

mysql_query

Funktion

Sendet eine SQL-Abfrage an die aktuell aktive oder angegebene MySQL-Datenbankverbindung und gibt das Ergebnis zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

mysql_query(string $query, resource $link_identifier = null): mixed

Beschreibung

mysql_query() sendet eine SQL-Abfrage an den MySQL-Server. Bei lesenden Abfragen (SELECT, SHOW, DESCRIBE, EXPLAIN) wird bei Erfolg eine Ergebnis-Ressource zurückgegeben, die anschließend mit Funktionen wie mysql_fetch_assoc(), mysql_fetch_row() oder mysql_num_rows() ausgewertet werden kann. Bei schreibenden Abfragen (INSERT, UPDATE, DELETE usw.) gibt die Funktion bei Erfolg true zurück.

Wichtiger Hinweis zur Veraltung: Die gesamte mysql_*-Erweiterung wurde in PHP 5.5.0 als deprecated (veraltet) markiert und in PHP 7.0.0 vollständig entfernt. Für neuen Code sollten ausschließlich mysqli_*-Funktionen oder die PDO-Erweiterung verwendet werden, da diese aktiv gepflegt werden und moderne Sicherheitsmechanismen unterstützen.

Wird kein $link_identifier angegeben, wird automatisch die zuletzt mit mysql_connect() geöffnete Verbindung verwendet. Gibt es keine offene Verbindung, versucht PHP, eine Verbindung mit Standardparametern aufzubauen. Im Fehlerfall gibt die Funktion false zurück; die Fehlermeldung kann dann über mysql_error() abgerufen werden.

Sicherheit: Benutzereingaben dürfen niemals ungeprüft in SQL-Abfragen eingebettet werden. Um SQL-Injection zu verhindern, müssen Eingaben zwingend mit mysql_real_escape_string() maskiert werden — besser noch wechselt man zu PDO oder mysqli mit Prepared Statements, da diese das Problem strukturell lösen.

Parameter

Name Typ Default Beschreibung
$query Pflicht string Die auszuführende SQL-Abfrage. Der abschließende Strichpunkt ; soll nicht Teil des Strings sein. Die Abfrage wird an den Server gesendet, der mit $link_identifier verknüpft ist.
$link_identifier resource null Eine MySQL-Verbindungsressource, die von mysql_connect() oder mysql_pconnect() zurückgegeben wurde. Wird dieser Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet.

Rückgabewert

Typ
mixed
Beschreibung
  • Bei SELECT, SHOW, DESCRIBE und EXPLAIN: eine resource bei Erfolg oder false bei einem Fehler.
  • Bei INSERT, UPDATE, DELETE, DROP usw.: true bei Erfolg oder false bei einem Fehler.

Beispiele

Einfache SELECT-Abfrage mit Ergebnisausgabe

<?php
// Verbindung aufbauen (nur für Beispielzwecke — mysql_* nicht mehr verwenden!)
$link = mysql_connect('localhost', 'db_user', 'db_pass');
mysql_select_db('meine_datenbank', $link);

$result = mysql_query('SELECT id, name, email FROM benutzer WHERE aktiv = 1', $link);

if ($result === false) {
    die('Datenbankfehler: ' . mysql_error($link));
}

while ($row = mysql_fetch_assoc($result)) {
    echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . PHP_EOL;
}

mysql_free_result($result);
mysql_close($link);
ID: 1, Name: Max Mustermann ID: 2, Name: Erika Musterfrau

INSERT mit Eingabe-Maskierung (SQL-Injection-Schutz)

<?php
$link = mysql_connect('localhost', 'db_user', 'db_pass');
mysql_select_db('meine_datenbank', $link);

// Benutzereingaben IMMER maskieren!
$name  = mysql_real_escape_string($_POST['name'],  $link);
$email = mysql_real_escape_string($_POST['email'], $link);

$sql = "INSERT INTO benutzer (name, email) VALUES ('$name', '$email')";

if (mysql_query($sql, $link)) {
    $neueId = mysql_insert_id($link);
    echo 'Neuer Eintrag mit ID: ' . $neueId;
} else {
    echo 'Fehler: ' . mysql_error($link);
}

mysql_close($link);
Neuer Eintrag mit ID: 42

// Wichtig · Fallstricke

Deprecation / Entfernung: mysql_query() und alle mysql_*-Funktionen wurden in PHP 5.5.0 als veraltet markiert (E_DEPRECATED-Warnung) und in PHP 7.0.0 vollständig entfernt. Code, der diese Erweiterung nutzt, läuft auf PHP 7+ nicht mehr. Migration auf mysqli oder PDO ist zwingend erforderlich.

SQL-Injection: Benutzereingaben dürfen niemals direkt in den Abfrage-String eingebettet werden. mysql_real_escape_string() bietet einen gewissen Schutz, ist aber fehleranfällig, wenn die Zeichenkodierung nicht korrekt gesetzt ist. Prepared Statements mit mysqli oder PDO sind die zuverlässigere Alternative.

Mehrfache Abfragen: Im Gegensatz zu mysqli_multi_query() unterstützt mysql_query() nur eine einzelne Abfrage pro Aufruf — das Einschleusen von ; gefolgt von weiteren Befehlen ist daher etwas schwieriger, aber nicht unmöglich durch andere Angriffsvektoren.