Hallo. Ich habe eine Umsetzung von Prepared Statements gefunden, die mir nicht ganz einleuchtet.
Eine Beispiel eines SQL-Statements geht so:
Die Benutzereingaben werden als Array an die Update-Methode übergeben.
In den SQL-String werden dann die Elemente des Arrays eingefügt.
Mal ganz abgesehen davon, dass $_REQUEST benutzt wird, sehe ich keinen großen Zusatznutzen im Vergleich zur gewöhnlichen Implementierung mit Übergabe des fertigen SQL-Strings.
Die Variablen werden lediglich escaped. Mir leuchtet der Nutzen des ganzen nicht ein, ausser dass das Escapen eben in der Klasse vorgenommen wird...
Eine Beispiel eines SQL-Statements geht so:
PHP-Code:
$id = 1;
$column2 = $_REQUEST['col2'];
$column3 = $_REQUEST['col3'];
$column4 = $_REQUEST['col4'];
$DB->Update('INSERT INTO `table` VALUES (?,?,?,?)', array($id, $column2, $column3, $column4 ));
In den SQL-String werden dann die Elemente des Arrays eingefügt.
PHP-Code:
class DB
{
public function Update($query, $binds = array() )
{
$query = $this->Prepare($query, $binds);
$result = mysql_query($query);
//error check + return der affected_rows
}
public function Prepare($query, $binds = array() )
{
if( empty($binds) )
{
return $query;
}
$query_result = '';
$index = 0;
$pieces = preg_split('~(\?|#)~', $query, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach( $pieces as $piece )
{
if( $piece == '?' )
{
if( $binds[$index] === null )
{
$query_result .= 'NULL';
}
else
{
$query_result .= "'" . mysql_real_escape_string($binds[$index]) . "'";
}
$index++;
}
else
{
$query_result .= $piece;
}
}
return $query_result;
}
}
Die Variablen werden lediglich escaped. Mir leuchtet der Nutzen des ganzen nicht ein, ausser dass das Escapen eben in der Klasse vorgenommen wird...
Kommentar