In der täglichen PHP-Praxis begegnest du häufig Situationen, in denen du zwei Zeichenketten exakt vergleichen willst. Hier setzt strcmp() an – eine der wichtigsten Funktionen für den binärsicheren Vergleich von Strings und die Verarbeitung von characters. Dieser Artikel zeigt dir im Detail, wie strcmp() funktioniert, wann du sie statt anderer Methoden verwendest und worauf du bei Typen und Sicherheitsfragen achten solltest.

Einleitung: Was ist strcmp() und warum ist sie wichtig?
Die Funktion strcmp() prüft, ob zwei Zeichenketten exakt gleich sind. Sie arbeitet dabei binärsicher, das heißt: Sie beachtet Groß- und Kleinschreibung sowie alle Zeichen exakt in ihrer binären Form. Im Gegensatz zu den geläufigen Vergleichsoperatoren liefert sie einen Wert zurück, der nicht nur Gleichheit, sondern auch die Reihenfolge bestimmt. In der Praxis gibt das Sicherheit – vor allem, wenn es auf Genauigkeit und keine automatische Typumwandlung ankommt.
Im Artikel erfährst du die wichtigsten Grundlagen, siehst Unterschiede zu anderen Methoden und lernst Best Practices für den Einsatz – inklusive Stolperfallen und Sicherheitsaspekten.
1. Die Grundlagen von PHP strcmp() verstehen
Um strcmp() sicher anzuwenden, musst du wissen, wie sie intern arbeitet und welche Werte sie liefert.
1.1 Syntax und Parameter
Zuerst werfen wir einen Blick auf die Funktionssignatur. In PHP lautet sie:
/** Vergleicht zwei Strings binärsicher */
$iErgebnis = strcmp($sString1, $sString2);
$sString1 und $sString2 sind die beiden zu vergleichenden Zeichenketten. Beide Parameter sollten vom Typ string sein, um unerwartetes Verhalten zu vermeiden.
1.2 Der Rückgabewert im Detail
Das Ergebnis von strcmp() ist ein Integer-Wert. Aber es kommt nicht auf den genauen Wert, sondern nur auf das Vorzeichen an:
- $iErgebnis < 0: $sString1 ist im Vergleich zu $sString2 lexikographisch kleiner.
- $iErgebnis > 0: $sString1 ist lexikographisch größer als $sString2.
- $iErgebnis = 0: Beide Strings sind exakt gleich.
Der Vergleich erfolgt zeichenweise anhand der ASCII- oder Unicode-Werte. Treffen die beiden Zeichenketten erst nach mehreren Zeichen auseinander, spiegelt sich das im Wert wider, aber du prüfst meist nur das Vorzeichen.
Beispiele für alle drei Rückgabetypen:
/** Vergleicht zwei identische Strings */
$iErgebnis = strcmp("Apfel", "Apfel");
/* Rückgabe: 0 */
/** sString1 ist kleiner als sString2 */
$iErgebnis = strcmp("Apfel", "Banane");
/* Rückgabe: negativ */
/** sString1 ist größer als sString2 */
$iErgebnis = strcmp("Birne", "Apfel");
/* Rückgabe: positiv */
Im Alltag prüfst du oft mit:
if (strcmp($sErsterWert, $sZweiterWert) === 0) {
/** Strings sind exakt gleich */
}
2. Case-Sensitivity bei strcmp()
Die Funktion arbeitet case-sensitiv. Das heißt, Groß- und Kleinbuchstaben werden unterschiedlich behandelt – und zwar rein nach ihren ASCII-Werten.
Ein Beispiel macht das Verhalten sofort deutlich:
/** "Apfel" und "apfel" werden als verschieden betrachtet */
$iErgebnis = strcmp("Apfel", "apfel");
/* Rückgabe: negativ (weil 'A' < 'a') */
Wenn du hingegen zwei Werte unabhängig von der Groß-/Kleinschreibung vergleichen willst, nutzt du die Alternative strcasecmp():
/** Case-insensitiver Vergleich */
$iErgebnis = strcasecmp("Apfel", "apfel");
/* Rückgabe: 0 (gleich) */
Setze also immer gezielt die richtige Funktion ein, je nach Anforderung.
3. strcmp() im Vergleich: Abgrenzung von anderen Vergleichsmethoden
Für Stringvergleiche gibt es in PHP mehrere Ansätze. Aber wann solltest du welche nutzen? Hier kommt der direkte Vergleich.
3.1 strcmp() vs Gleichheitsoperator (==)
Der Gleichheitsoperator (==) vergleicht Werte „locker“. PHP wandelt dazu, falls nötig, die Typen um – das sogenannte Type Juggling. Im Gegensatz dazu prüft strcmp() strikt binär auf String-Basis.
Ein typisches Beispiel:
/** Lockerer Vergleich: Typ-Juggling findet statt */
if ("123abc" == 123) {
/** Wird als true bewertet, da PHP den String in eine Zahl umwandelt */
}
/** Mit strcmp() kein Typ-Juggling, da expliziter String-Vergleich */
if (strcmp("123abc", "123") === 0) {
/** false – nur exakt gleiche Strings geben 0 zurück */
}
Verlasse dich bei sicherheitskritischen Vergleichen nie auf ==, sondern nutze entweder den strikten Vergleich === oder strcmp() mit explizitem String-Check.
3.2 strcmp() vs strcasecmp()
Der einzige Unterschied zwischen den beiden: strcasecmp() ignoriert Groß- und Kleinschreibung, während strcmp() case-sensitiv arbeitet.
Zusammengefasst:
- Verwende strcmp(), wenn es auf exakte Übereinstimmung ankommt (z. B. Passwörter, IDs).
- Nutze strcasecmp(), wenn du Benutzereingaben flexibel behandeln willst (z. B. für E-Mail-Adressen, wo Groß-/Kleinschreibung oft egal ist).
3.3 strcmp() vs strcoll() (Hinweis auf locale-basierte Vergleiche)
Die Funktion strcoll() vergleicht Zeichenketten unter Berücksichtigung der aktuellen Locale. Das ist zum Beispiel für sortierte Listen in verschiedenen Sprachen relevant.
Im Alltag solltest du aber meistens strcmp() nutzen, da sie binärsicher arbeitet und keine unerwarteten Locale-Abhängigkeiten mitbringt. Verwende strcoll() gezielt, wenn du die locale-spezifische Sortierung wirklich brauchst.
4. Wichtige Überlegungen und Fallstricke bei der Verwendung von strcmp()
strcmp() ist mächtig, aber wie bei vielen PHP-Funktionen gibt es Stolpersteine.
PHP ist flexibel – aber manchmal zu flexibel. Übergibst du andere Datentypen als String, kann das zu unerwarteten Ergebnissen führen. Besonders gefährlich wird das, wenn du Arrays oder Objekte vergleichst. PHP gibt dann immer 1 zurück, unabhängig vom Inhalt. Das kann Sicherheitslücken verursachen, zum Beispiel bei der Authentifizierung.
Beispiel für problematisches Verhalten:
$sUserInput = $_POST["password"];
$aDatenbankWert = ["passwort123"];
/** Niemals so prüfen! */
if (strcmp($sUserInput, $aDatenbankWert) === 0) {
/** Kommt nie vor, aber kein Fehler! strcmp() gibt 1 zurück */
}
Lösung:
Stelle sicher, dass beide Werte wirklich Strings sind, bevor du strcmp() verwendest.
if (is_string($sUserInput) && is_string($sDatenbankPasswort) && strcmp($sUserInput, $sDatenbankPasswort) === 0) {
/** Sicherer Vergleich */
}
Vermeide grundsätzlich Typ-Juggling, wenn du mit Benutzereingaben oder sicherheitsrelevanten Daten arbeitest.
4.2 Locale-Abhängigkeiten (Vertiefung)
Standardmäßig arbeitet strcmp() binärsicher und unabhängig von der Locale. In seltenen Fällen – abhängig vom System oder der PHP-Implementierung – können Locale-Einstellungen aber dennoch Einfluss nehmen. Im Normalfall bist du aber mit strcmp() auf der sicheren Seite.
Setze für echte Locale-Sortierung immer strcoll() ein, aber prüfe dabei die Auswirkungen für verschiedene Sprachen.
5. Praktische Anwendungsfälle für strcmp()
Im Alltag ist strcmp() vielseitig einsetzbar, vom Sortieren bis zur Validierung.
5.1 Sortieren von Arrays mit usort()
Du kannst strcmp() perfekt als Vergleichsfunktion für usort() einsetzen. So sortierst du Arrays mit Zeichenketten zuverlässig und binärsicher.
$aFruechte = ["Banane", "Apfel", "birne"];
usort($aFruechte, function ($sA, $sB) {
/** Binärsicherer Vergleich, Case-Sensitive */
return strcmp($sA, $sB);
});
/** Ergebnis: ["Apfel", "Banane", "birne"] */
5.2 Filtern oder Suchen in Arrays von Strings
Du kannst mit strcmp() gezielt nach exakten Übereinstimmungen filtern – oder mit strcasecmp() case-insensitiv suchen.
$aNamen = ["Anna", "Bernd", "Claudia"];
$sGesucht = "bernd";
$aGefunden = array_filter($aNamen, function ($sName) use ($sGesucht) {
return strcasecmp($sName, $sGesucht) === 0;
});
/** Ergebnis: ["Bernd"] */
5.3 Grundlegende Validierung von Benutzereingaben (mit Vorsicht!)
Für einfache Vergleiche kannst du strcmp() verwenden. Beachte aber immer die Hinweise aus Abschnitt 4.1!
$sEingabe = "Test123";
$sReferenz = "Test123";
if (is_string($sEingabe) && strcmp($sEingabe, $sReferenz) === 0) {
/** Eingabe ist exakt korrekt */
}
6. Verwandte PHP String-Funktionen
Für Stringvergleiche gibt es noch weitere nützliche Funktionen:
Funktion | Beschreibung |
strncmp() | Vergleicht die ersten n Zeichen von zwei Strings. |
strncasecmp() | Wie strncmp(), aber case-insensitiv. |
substr_compare() | Vergleicht einen Teilbereich von Zeichenketten. |
strcasecmp() | Case-insensitiver Stringvergleich (bereits behandelt). |
strcoll() | Locale-basierter Vergleich (bereits behandelt). |
Alle diese Funktionen eignen sich je nach Anwendungsfall besser – lies die Doku oder diesen Artikel, wenn du unsicher bist.
Schlussfolgerung
Mit strcmp() hast du ein mächtiges Werkzeug für den exakten, binärsicheren Vergleich von Zeichenketten in der Hand. Du bestimmst nicht nur Gleichheit, sondern auch die Reihenfolge, und bist unabhängig von vielen Stolperfallen, wenn du die Typen der Parameter stets explizit prüfst.
Achte bei sicherheitsrelevanten Vergleichen immer auf korrekte Typen und verwende nie Type Juggling mit Benutzereingaben. Prüfe, ob du Case-Sensitivity brauchst oder nicht – und setze gezielt die Alternativen wie strcasecmp() oder locale-basierte Methoden ein.
In der Praxis solltest du für alle Aufgaben mit Strings überlegen, ob der Vergleich exakt, flexibel oder sprachenabhängig erfolgen soll. So findest du immer die optimale Lösung und baust robuste, sichere PHP-Anwendungen.