Escapowanie % w sprintf
2008-09-29W PHP możemy formatować łańcuchy znaków na kilka sposobów. Najpopularniejszy, to używanie kropek, do łączenia ciągów i ewentualnie konkretnych funkcji do formatowania na przykład liczb zmiennoprzecinkowych. Ta metoda mnie nie do końca przekonuje, bo przy dłuższych ciągach jest średnio czytelna. Dlatego też, często korzystam z sprintf’a, poznanego jeszcze za czasów programowania w C.
Używając metody opisanej na wstępie, aby uzyskać taki ciąg:
Witaj wowo, masz 5 wiadomości, stan konta: 43.99 zł.
musimy wykonać coś w tym stylu:
$txt = ‚Witaj ‚ . $user . ‚ masz ‚ . $msgs .’ wiadomości, stan konta: ‚ . round($money,2);
sprintf’em natomiast poradzimy sobie w ten sposób:
$txt = sprintf(‚Witaj %s masz $d wiadomości, stan konta %.2f’, $user, $msgs, $money);
Jak dla mnie druga metoda jest przyjemniejsza. Ostatnio jednak natrafiłem na dziwny problem. Problem pojawia się, gdy chcemy w ciągu przetworzonym przez sprintfa mieć znak %, na przykład, w zapytaniu SQL:
$query = „SELECT name FROM users WHERE name like ‚%s%'”
$query = sprintf($query, $name);
zwróci:
SELECT name FROM users WHERE name like ‚wowo’
bo znak% na końcu, zostanie zinterpretowany jako znacznik formatu. Aby obejść ten problem trzeba użyć podwójnego procenta %%
$query = „SELECT name FROM users WHERE name like ‚%s%%'”
Więcej o spritnfie można znaleźć tam gdzie zawsze , czyli http://pl2.php.net/sprintf 🙂