Update einer Chatfunktion
bearbeitet von
Lieber j4nk3y,
> `'\'%1$s\'` Die Zeichenkette versteh ich gerade noch nicht vollständig. Das `s` sollte den übergebenen String beinhalten, das erste `s` dann hier `$_SESSION['user_name']` usw. . Aber was macht das `\'%1$`.
wenn Du bei PHP.net nachgelesen hast, das die Funktion `sprintf`{: .language-php} Ersetzungen in Strings vornehmen kann, dann hast Du sicher gesehen, dass es nicht nur das `s` ist, sondern die Zeichenfolge `%s`. Man kann die Platzhalter mit Nummern versehen, um einen Teilstring, der öfter eingesetzt werden soll, nicht öfter in der Parameterliste notieren zu müssen:
~~~ php
sprintf(
'Wir haben %1$ %1$ %1$ haben %1$ %1$ %1$ haben %1$ %1$ %1$ haben %2$!',
'Hunger',
'Durst'
);
~~~
Wenn in Deinem SQL-String der Wert in einfache Quotes verpackt werden soll, dann müssen diese mit einem Backslash escaped werden, da sonst Syntaxfehler entstehen:
~~~ php
sprintf(
'Wir haben '%1$' '%1$' '%1$' haben '%1$' '%1$' '%1$' haben '%1$' '%1$' '%1$' haben '%2$!'',
'Hunger',
'Durst'
);
~~~
Deshalb diese Schreibweise:
~~~ php
sprintf(
'Wir haben \'%1$\' \'%1$\' \'%1$\' haben \'%1$\' \'%1$\' \'%1$\' haben \'%1$\' \'%1$\' \'%1$\' haben \'%2$!\'',
'Hunger',
'Durst'
);
~~~
> Wenn ich jetzt aber einfach mal sage das:
>
> ~~~ php
> if($_POST)
> {
> foreach($_POST as $key=>$value)
> {
> $_POST[$key]= mysqli_real_escape_string($value);
> }
> }
> ~~~
>
> Dann kommt ja z.b. ein `'` garnicht durch als `$_POST`variable oder nicht?
Warum willst Du alle geposteten Werte für den SQL-Kontext kodieren? Solltest Du eine Fehlermeldung ins Dokument schreiben, bei der Du etwas bemängelst, dann kannst Du den originalen Wert nicht mehr rekonstruieren:
~~~ php
$_POST['lang'] = 'Leck mich!';
if (!in_array($_POST['lang'], $available_languages) {
// create error message
$error = sprintf(
'<p class="error">Falsche Sprache <strong>%1$s</strong>angegeben!</p>',
htmlspecialchars($_POST['lang'])
);
}
~~~
Man kodiert genau dort, wo man es benötigt. Im obigen Beispiel wird der gepostete Wert für den HTML-Kontext kodiert. Der Wert im `$_POST`{: .language-php}-Array wird dabei aber nicht verändert, damit er an anderer Stelle wieder original zur Verfügung steht und für den dortigen Kontext passend kodiert werden kann (z.B. mit `mysqli_real_escape_string`{: .language-php}). Das stand aber in dem von mir verlinkten und zur Lektüre ans Herz gelegten Artikel... ;-)
Liebe Grüße,
Felix Riesterer.