# PDO - prepared statements & SQL Injections



## DJLopez (9. April 2007)

Hallo,

EDIT: Geht um MySQL - ist aber an sich auch egal, da es afaik alle betrifft!

prepared statements sind wirklich toll, um SQL Injections vorzubeugen!
Leider gehen einige Sachen nicht so wie sie sollen  

Beispiel:


```
$sql = 'SELECT * FROM table WHERE ID = ?';
$stm = $link->prepare($sql);
$stm->bindParam(1,$_POST['ID']);
//... usw
```

Dolle Sache... da kann einem keiner komisch kommen, dass ist "unknackbar" =)

Nun, wenn ich jetzt aber das hier versuche, klappts nicht so recht


```
$sql = 'SELECT * FROM table WHERE ID = ? LIMIT ?, ?';
$stm = $link->prepare($sql);
$stm->bindParam(1,$_POST['ID']);
$stm->bindParam(2,$_POST['startfrom']);
$stm->bindParam(3,$_POST['schrittweite']);
//... usw
```

Nun, das mag wohl daran liegen, dass PDO (also mysql oder der Treiber, is ja auch egal) nur zugewiesene Werte maskiert, nicht aber übergebene Tabellennamen, Spaltennamen oder eben Limitierungswerte 

Tja, da der Limitierungswert aber nun übergeben werden muss, würde mich interessieren, wie man diese Werte ordentlich maskiert, bzw "sicher macht". 

Ich würde aus dem Bauch heraus sowas machen:


```
$start = (int)$_POST['startfrom'];
$weite = (int)$_POST['schrittweite'];

$sql = 'SELECT * FROM table WHERE ID = ? LIMIT '.$start.', '.weite;
$stm = $link->prepare($sql);
$stm->bindParam(1,$_POST['ID']);
//... usw
```

Ist das eine gute Idee? Eigentlich soll man ja keine Typen erzwingen (steht in einigen Handbüchern, ausserdem Grundtenor von vielen Leuten). Gibts bessere Wege?


----------

