mysql_query() hat ausgedient

Ich bin gerade dabei, bei meine PHP Funktionen und Klassen, die auf mysql_query() basieren, mysql_query() zu entfernen und durch PDO zu ersetzen.

Die meisten haben wahrscheinlich noch nie davon gehört. Dabei ist es in meinen Augen wesentlich besser, als mysql_query();. PDO steht für PHP Data Objects.

mysql_query ist, wie der Name schon sagt, auf MYSQL Datenbanken limitiert.
Eine weitere Schwachstelle bei mysql_query ist, dass man höllisch aufpassen muss, dass keine SQL Injection möglich ist.
Bei PDO können so ziemlich alle gängigen SQL Datenbanken verwendet werden. Auch ist hier die Gefahr einer Injection nicht ganz so groß. Dennoch sollte man auch hier jeglichen Userinput validieren, da doppelt ja bekanntlich besser hält.

Um das mal zu veranschaulichen zwei kleine Beispiele:

Vereinfacht und ohne zusätzliche Funktionen bzw. Klassen kann man mit mysql_query so eine einfache Abfrage machen:

Hier wird jeglicher Wert aus dem GET Parameter ungefragt übernommen, so dass man mit einer Injection schnell die ganze Datenbank ausforschen kann.

Bei PDO ist dies nicht mehr so einfach möglich:

Dies ist nur eine Art die Abfrage zu gestalten. Es gibt bei PDO noch wesentlich mehr Möglichkeiten.

Besonders interessant sind prepared Statements zusammen mit der Bindfunktion, wenn man einen Aufruf öfters macht. Hier definiert man einmal das Grundgerüst, um später Variablen Werte zuzuweisen und dann das Statement auszuführen. Eine kleine Logfunktion könnte man so umsetzen:

$log->execute(); dann die Werte in die Datenbank, die gerade definiert sind.

Besonders, wenn man bei dem Aufruf eines Skriptes gleich mehrere Aktionen speichern möchte, sind prepared Statements also eine deutliche Arbeitserleichterung.

Jedem, der mit einem neuen Projekt beginnt ist anzuraten, von vornherein mit PDO zu arbeiten. mysql_query(); hat ausgedient

2 Gedanken zu “mysql_query() hat ausgedient

  1. Auf der IPC10 habe ich von einem MySQL Entwickler gehört, dass PDO nicht so der Knaller ist. Vor allem auch aus Security Sicht (z.B. wegen dem Multiple Query Support).
    Er hat mysqli empfohlen. Dort sind auch prepared statements möglich, falls das dein über-Kriterium für PDO war :)

    Er hat noch einige andere Gründe gegen PDO genannt, die ich aber nicht mehr weiß. Ich kann aber deswegen wirklich jedem von PDO abraten und mysqli empfehlen.

    • Dann sind wir uns ja schon einmal einige, dass die Funktion mysql_query() ausgedient hat.

      Meine Hauptkriterium war es, dass ich in der Lage sein möchte, verschiedene SQL Datenbanken, insbesondere auch PostgreSQL ansprechen zu können. Dies ist mit PDO problemlos möglich.

      Was mich bei der Umstellung auch gleich begeistert hat, ist, dass einem vor Augen geführt wird, wo man bei der Einrichtung seiner MYSQL Datenbank nicht richtig aufgepasst hat.

      Hat man Columns als NOT NULL definiert und versucht nun einen leeren Wert einzutragen, verweigert sich PDO. mysql_query() hat an dieser Stelle den Query problemlos ausgeführt.
      Mir ist das bei Columns aufgefallen, bei denen ich ursprünglich davon ausgegangen bin, dass es sich um required Felder aus Formularen handelt, die ich zu einem späteren Zeitpunkt auf optional abgeändert hatte. Die MYSQL Column hatte ich in den Fällen aber nicht angepasst.

      Ist mysqli auch so empfindlich, oder lässt es die oben beschriebenen Schlampereien durchgehen?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.