sprintf - Sinn ?!

BadMatt

Erfahrenes Mitglied
Hey,
vorne weg: ich hab gegoogelt und forensuche benutzt ;) :P

Also, ich bin gerade (bzw eich schon länger^^) am überlegen, was die Funktion "sprintf" in Verbindung mit mysql - Abfragen für einen Sinn macht.

Bei Zahlen, also z.B. (ganz einfach, nur so hingegeschrieben)
PHP:
$id = $_GET['id'];
$sql = "SELECT * FROM tabelle WHERE id='$id'"

Da muss ja auf jedenfall die id eine Zahl sein.
Dann machts ja sinn, das der string formatiert wird.

Aber bei "text" also z.B.:
PHP:
$name = mysql_real_escape_string($_POST['name']);
$sql = "SELECT * FROM tabelle WHERE name='$name'"

Das würde dann ja so in etwa aussehen:
PHP:
$name = mysql_real_escape_string($_POST['name']);
$sql = sprintf("SELECT * FROM tabelle WHERE name='%s'", $name);

Was macht das für einen Sinn?
Das ändert doch nix, oder?

Gruß
 
Bei sprintf werden Platzhalter gesetzt und so weiß der Server auf was für Parameter er sich einstellen muss (bzw. der MySQL-Server oder externer SQL-Server). Bei POST oder GET-Parametern (ggf. auch SESSION) macht dies nur Sinn. Statische Abfragen wie:

PHP:
$sql = sprintf('SELECT COUNT(*) AS c FROM users WHERE id < 999'); // sind Sinnlos

$sql = sprintf('SELECT COUNT(*) AS c FROM users WHERE id < %d', mysql_real_escape_string($_POST['idsearch'])); // Würde Sinn machen
 
das mit "zahlen" also wie du in deinem beispiel mit id, meinte ich ja schon, das ist logisch, da dann alles als Integer angesehen wird.

Aber wie ist das bei "nicht zahlen", wo bleibt da der sinn?
Oder soll mans einfach mal einbaun, das ja (ausser vlt minimal beider performance) nicht schaden kann^^
 
Wenn deine Seite beliebt ist, solltest du es schon aus performancegründen so machen :)

Wieso nur Integer Werte

http://de.php.net/sprintf

Schau dir mal unter Typ-Angabe alles mal in Ruhe an ;)

Das stimmt so nicht.

Hier mal ein exemplarischer Benchmark:

PHP:
<?php

$name = 'foobar';

$start = microtime(true);
for($i = 0; $i < 10000; $i++)
{
	$sql = sprintf("SELECT * FROM tabelle WHERE name='%s'", $name);
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';
unset($start, $end, $final);
$start = microtime(true);
for($i = 0; $i < 10000; $i++)
{
	$sql = "SELECT * FROM tabelle WHERE name='".$name."'";
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';

?>

Ergebnis bei mir (lokaler Rechner):
Test took: 0.012237071991ms
Test took: 0.0036358833313ms

Fakt ist: sprintf() wird immer langsamer sein als eine einfache Stringverkettung.

Bei Strings macht es in diesem Falle keinen Sinn [phpf]sprintf[/phpf] zu benutzen, da es seine Applikation einfach nur verlangsamt...

Übrigens, noch ein kleiner Test:
PHP:
<?php

$name = '30';

$start = microtime(true);
for($i = 0; $i < 10000; $i++)
{
	$sql = sprintf("SELECT * FROM tabelle WHERE name='%i'", $name);
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';
unset($start, $end, $final);
$start = microtime(true);
for($i = 0; $i < 10000; $i++)
{
	$sql = "SELECT * FROM tabelle WHERE name='".(int)$name."'";
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';

?>

Test took: 0.0115220546722ms
Test took: 0.00633692741394ms

Also ist das erzwungene Typecasting mit (int) auch schneller als sprintf().

Prepared Statements sind eine Sache. Aber diese sind auch etwas völlig anderes als die Benutzung von sprintf() bei normalen MySQL Queries.
 
Haarscharf :)

Test took: 0.246779918671ms
Test took: 0.245900154114ms

PHP:
if(isset($_POST['sub'])){

dbc();

$start = microtime(true);
for($i = 0; $i < 1000; $i++)
{
    $sql = sprintf("SELECT * FROM cds WHERE titel= '%s'", $_POST['s']);
		mysql_query($sql);
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';

unset($start, $end, $final);
sleep(2);

$start = microtime(true);
for($i = 0; $i < 1000; $i++)
{
    $sql = "SELECT * FROM cds WHERE titel= '".$_POST['s']."'";
		mysql_query($sql);
}
$end = microtime(true);
$final = $end - $start;

echo 'Test took: '.$final.'ms<br/>';
}
?>
<html>
<head></head>
<body><form method="post" action="bench.php" >

<input type="text" name="s" />
<input type="submit" name="sub" />
</form>
</body></html>
 
ja gut, also mal abgesehen davon, obs jetzt n paar ms schneller oder langsamer ist ...

Es lohnt sich also definitiv nicht einmal bei zahlen, da es mit (int) genauso gut, und noch schneller ist, oder?
 
Hi,

Es lohnt sich also definitiv nicht einmal bei zahlen, da es mit (int) genauso gut, und noch schneller ist, oder?

Es ist im Ergebnis einfach das Gleiche...
Ich denke, das ist eher eine Geschmacksfrage. Manche mögen es übersichtlicher finden, vor allem bei komplexeren Queries, da man den Aufbau der Abfrage besser erkennen kann.
Ich persönlich hab's so noch nie benutzt.

LG
 
Zurück