# Bestmögliches MySQL PDO (Fehler abfangen etc.)



## Georgler (6. August 2015)

*Bestmögliches MySQL PDO (Fehler abfangen etc.)*

Hi,

ich habe jetzt eine ganze Weile MySQLi genutzt, u.a. für Prepared Statements. Doch genau hier wird es nun hakelig und deswegen wollte ich zu PDO umsteigen.

Nun wollte ich fragen, wie so eine Standard-Abfrage aussieht, wenn man auch alle Fehler abfangen möchte. 

Nun habe ich folgenden Code gefunden und ich frage mich: Ist das eine gute Methode wie man PDO anwenden kann?


```
try {
  $connection = new PDO('mysql:host=localhost;dbname=test001', 'root', '');
  foreach ($connection->query('SELECT * FROM `guestbook`;') as $entry) {
    echo '<div class="name">'.$entry['name'].' schrieb:</div>';
    echo '<div class="text">'.$entry['text'].'</div>'; echo '<hr />';
  }
} catch (PDOException $e) {
  echo "Datenbankfehler: Die Daten konnten nicht gelesen werden.";
}
```
Quelle: EinfÃ¼hrung in PDO | florianherlings.de


----------



## TessaKavanagh (7. August 2015)

*AW: Bestmögliches MySQL PDO (Fehler abfangen etc.)*

Wenn schon ein * im Select steht und bei der Verbindung nicht angegeben wurde in welcher Koalition die Daten erwartet werden, dann ist es sicherlich keine optimale Lösung.

1. Man gibt immer explizit alle Spalten an die abgerufen werden.
2. Man legt bereits die Zeichenkodierung beim Verbindungsaufbau fest. (UTF-8 wäre empfehlenswert)
3. Ließ direkt Informationen auf der Konfigurationsdatei beim Verbindungsaufbau ein, das unterbindet bereits manche SQL Injects.
4. Ich würde auch bei Selects zu prepared Statements raten.


----------



## BenRo (7. August 2015)

*AW: Bestmögliches MySQL PDO (Fehler abfangen etc.)*

Wenns ums Fehler abfangen geht:
Die Art des Fehlers steht ja in der Exception. Ich würde auf jeden Fall sicherstellen, dass der Fehler möglichst genau geloggt wird,falls das noch nicht der Fall ist.

Was das obige Beispiel angeht: per htmlspecialchars() oder ähnlich Sonderzeichen escapen!

Edit: Zu prepared Statements mit PDO hat das Handbuch unter der Überschrift „Prepared Statements und Stored Procedures“  Beispiele. Handbuch ist meist Blogeinträgen vorzuziehen.


----------



## Georgler (7. August 2015)

*AW: Bestmögliches MySQL PDO (Fehler abfangen etc.)*

Ok, vielen Dank. Und dieses try-catch sollte immer um alle SQL-Sachen gebaut werden, also alle Sachen wie query, exec, prepare, bindParam und Ausgabe der Daten immer innerhalb des try-Blocks?



BenRo schrieb:


> Was das obige Beispiel angeht: per htmlspecialchars() oder ähnlich Sonderzeichen escapen!


Ist bei sowas nicht immer htmlentities mit ENT_QUOTES besser?

```
htmlentities($_POST['bla'], ENT_QUOTES, 'UTF-8');
```




TessaKavanagh schrieb:


> 3. Ließ direkt Informationen auf der Konfigurationsdatei beim Verbindungsaufbau ein, das unterbindet bereits manche SQL Injects.


Was meinst du damit genau? Alle anderen Punkte sind umgesetzt.


----------



## BenRo (7. August 2015)

*AW: Bestmögliches MySQL PDO (Fehler abfangen etc.)*

try-catch hat nichts mit SQL zu tun, sondern mit Exceptions, hier ein Link:
PHP: Ausnahmebehandlung (Exception-Handling) - Manual
Im catch-Block steht, was ausgeführt wird, wenn im try-Block bestimmte Exceptions geworfen werden. Falls bestimmte Aufräumarbeiten in jedem Fall stattfinden sollen, bietet sich ein finally-Block an.

Nicht alle PDO-Funktionen werfen eine Exception, manche liefern im Fehlerfall einfach false zurück.
Welche Funktionen eine Exception werfen und welcher Art diese ist, siehst du meist im Bereich "Return Value" im Handbuch, z. B. hier:
PHP: PDO::prepare - Manual

Wenn du das möchtest, kannst du auch dafür sorgen, dass alle PDO-Funktionen eine Exception werfen, wenn ein Fehler auftritt. Wie das geht wird hier erklärt:
PHP: Fehler und Fehlerbehandlung - Manual
Bin ich persönlich kein Fan von.


----------



## TessaKavanagh (7. August 2015)

*AW: Bestmögliches MySQL PDO (Fehler abfangen etc.)*


```
PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf'
```
In das Optionen Array setzen. Das sollte verhindern das dir jemand eine andere (manipulierte) Config unterschiebt.


----------

