Filtrovanie a overovanie údajov PHP. Časté chyby

nulová funkcia (11)

Mám (alebo nemám) premennú $ _GET ["myvar"] pochádzajúcu z môjho reťazca dotazu a chcem skontrolovať, či táto premenná existuje, a tiež či sa hodnota zhoduje s niečím v mojom príkaze if:

To, čo robím a myslím si, nie je najlepšie urobiť:

if (isset ($ _ GET ["myvar"]) && $ _GET ["myvar"] == "niečo"): urobte niečo

Je to jednoduchý prípad, ale predstavte si, že chcete porovnať mnohé z týchto premenných $ myvar.

Odpovede

Toto je podobná akceptovanej odpovedi, ale namiesto toho používa in_array. V tejto situácii radšej používam prázdny (). Navrhujem tiež použiť novú deklaráciu poľa reťazcov, ktorá je k dispozícii v PHP 5.4.0+.

$ allowed = ["niečo", "nič"]; if (! empty ($ _ GET ["myvar"]) && in_array ($ _ GET ["myvar"], $ allowed)) (..)

Tu je funkcia na testovanie viacerých hodnôt naraz.

$ arrKeys = array_keys ($ _ GET); $ allowed = ["niečo", "nič"]; funkcia checkGet ($ arrKeys, $ povolené) (foreach ($ arrKeys ako $ key) (if (in_array ($ _ GET [$ key], $ allowed)) ($ values ​​[$ key];)) return $ values ;)

Používam všetky svoje vlastné užitočné funkcie exst (), ktorý automaticky deklaruje premenné.

$ element1 = exst ($ arr ["key1"]); $ val2 = exst ($ _ POST ["key2"], "novalue"); / ** * Funkcia exst () - skontroluje, či bola premenná nastavená * (skopírujte / prilepte ju na akékoľvek miesto v kóde) * * Ak je premenná nastavená a nie prázdny vráti premennú (žiadna transformácia) * Ak premenná nie je nastavená alebo prázdna, vráti predvolenú hodnotu $ * * @param zmiešaný $ var * @param zmiešaný $ predvolený * * @návrat zmiešaný * / funkcia exst (& $ var, $ default = "") ($ t = ""; if (! isset ($ var) ||! $ var) (if (isset ($ default) && $ default! = "") $ t = $ default;) else ($ t = $ var;) if (is_string ($ t)) $ t = trim ($ t); return $ t;)

Vystačíte si len s tým, ak ($ ​​_ GET ["myvar"] == "niečo"), pretože táto podmienka predpokladá, že premenná tiež existuje. Ak nie je, výraz bude vyhodnotený aj ako nepravdivý.

Myslím si, že je v poriadku to robiť za podmienok uvedených vyššie. Vlastne žiadna škoda.

Moja otázka znie, existuje spôsob, ako to urobiť bez dvakrát deklarovania premennej?

Nie, neexistuje žiadny spôsob, ako to urobiť správne, bez vykonania dvoch kontrol. Tiež to neznášam

Jedným zo spôsobov, ako to obísť, je importovať všetky relevantné premenné GET v jednom centrálnom bode do poľa alebo objektu konkrétneho typu (väčšina MVC to robí automaticky) a nastaviť všetky potrebné vlastnosti neskôr. (Namiesto prístupu k premenným požiadaviek prostredníctvom kódu.)

If (isset ($ _ GET ["myvar"]) == "something")

Vďaka Mellowsoonovi a Pekkovi som tu urobil malý prieskum a prišiel som na toto:

  • Pred použitím (podľa odporúčania) skontrolujte a deklarujte každú premennú ako nulovú (ak je to tak):
! isset ($ _ GET ["myvar"])? $ _GET ["myvar"] = 0: 0;

* ok, je to jednoduché, ale funguje to skvele. Premennú môžete začať používať kdekoľvek za týmto riadkom

  • Použitie poľa pre všetky prípady:
$ myvars = pole ("var1", "var2", "var3"); foreach ($ myvars ako $ key)! isset ($ _ GET [$ key])? $ _GET [$ key] = 0: 0;

* potom môžete použiť svoje premenné (var1, var2, var3 ... atď.),

PS: funkcia získavajúca objekt JSON by mala byť lepšia (alebo jednoduchý oddelený reťazec pre bang / bang);

Oceňujú sa lepšie prístupy :)

AKTUALIZÁCIA:

Použite $ _REQUEST namiesto $ _GET, týmto spôsobom pokryjete premenné $ _GET a $ _POST.

Problém ($ _ REQUEST [$ key])? $ _REQUEST [$ kľúč] = 0: 0;

Riešenie, ktoré som z hry našiel, je urobiť toto:

Ak ($ x = & $ _ GET ["myvar"] == "niečo") (// robte veci s $ x)

Ako pomôcku by ste mohli zvážiť tento prístup:

Povinné = pole ("myvar" => "defaultValue1", "foo" => "value2", "bar" => "value3", "baz" => "value4"); $ missing = array_diff ($ required, array_keys ($ _ GET)); foreach ($ chýba ako $ key => $ predvolené) ($ _GET [$ key] = $ predvolené;)

Nastavíte predvolené hodnoty a predvolené nastavenia neprijatých parametrov :)

Bohužiaľ je to jediný spôsob, ako to urobiť. Existujú však prístupy k práci s veľkými poľami. Napríklad niečo také:

$ required = array ("myvar", "foo", "bar", "baz"); $ missing = array_diff ($ required, array_keys ($ _ GET));

Premenná $ missing teraz obsahuje zoznam hodnôt, ktoré sú povinné, ale v poli $ _GET chýbajú. Na zobrazenie správy návštevníkovi môžete použiť pole $ missing.

Alebo môžete použiť niečo také:

$ required = array ("myvar", "foo", "bar", "baz"); $ missing = array_diff ($ required, array_keys ($ _ GET)); foreach ($ chýba ako $ m) ($ _GET [$ m] = null;)

Každý požadovaný prvok má teraz predvolenú hodnotu. Teraz môžete použiť if ($ _ GET ["myvar"] == "niečo") bez obáv z toho, že kľúč nebude nastavený.

Obnoviť

Ďalším spôsobom, ako vyčistiť kód, by bolo použiť funkciu, ktorá kontroluje, či bola nastavená hodnota.

Funkcia getValue ($ key) (if (! Isset ($ _ GET [$ key])) (return false;) return $ _GET [$ key];) if (getValue ("myvar") == "something") ( / / Urob niečo)

prečo na to nevytvoríte funkciu, premente premennú, ktorú chcete skontrolovať, na skutočnú premennú, napr.

Funkcia _FX ($ name) (if (isset ($$ name)) return $$ name; else return null;)

potom urobíte _FX ("param") == "123", len myšlienka

Našiel som (oveľa) lepší kód, ako to urobiť, ak chcete čokoľvek otestovať.

Ak [[$ 1 = ""]] potom ozvena „$ 1 je prázdna“, inak ozvena „1 dolár je vyplnený“ fi

Prečo je to všetko? Všetko, čo je v Bash, existuje, ale v predvolenom nastavení je prázdne, takže test -z a test -n vám nemôže pomôcť.

Ak [$ (# 1) = 0], potom ozvena „$ 1 je prázdna“, inak ozvena „$ 1 je vyplnená“ fi

Chcem skontrolovať, či existuje premenná. Teraz robím niečo také:

Skúste: myVar okrem NameError: # Urobte niečo.

Existujú aj iné spôsoby bez výnimiek?


2018-05-09 13:10

Odpovede:

Ak chcete skontrolovať prítomnosť lokálnej premennej:

Ak „myVar“ v miestnych (): # myVar existuje.

Ak chcete skontrolovať existenciu globálnej premennej:

Ak „myVar“ v globáloch (): # myVar existuje.

Ak chcete skontrolovať, či má objekt atribút:

Ak hasattr (obj, "attr_name"): # obj.attr_name existuje.


2018-05-09 13:16

Používanie premenných, ktoré neboli definované alebo nastavené (implicitne alebo explicitne), je takmer vždy zlé akýkoľvek pretože to naznačuje, že logika programu nebola správne premyslená a pravdepodobne povedie k nepredvídateľnému správaniu.

Ďalší trik, ktorý je podobný tomu vášmu, zabezpečí, že premenná má niektorí hodnota pred použitím:

Skúste: myVar okrem NameError: myVar = žiadny # Teraz môžete myVar používať bez toho, aby sa Python sťažoval.

Stále si však myslím, že to nie je dobrý nápad - podľa mňa by ste mali svoj kód refaktorovať, aby ste sa tejto situácii vyhli.


2018-05-09 13:19

Najlepším spôsobom, ako skontrolovať existenciu premennej, je použiť príkaz try / okrem. Ale takmer určite existuje lepší spôsob, ako robiť to, čo robíte, než nastavovanie / testovanie globálov.

Ak napríklad chcete inicializovať premennú na úrovni modulu pri prvom volaní nejakej funkcie, urobte s kódom niečo podobné:

My_variable = None def InitMyVariable (): global my_variable if my_variable is None: my_variable = ...


2018-05-09 13:27

pre objekty / moduly môžete tiež

"var" v dir (obj)

Napríklad,

>>> trieda Niečo (objekt): ... prejsť ... >>> c = Niečo () >>> ca = 1 >>> "a" v dir (c) Pravda >>> "b" v dir c) nepravdivé


2017-10-28 18:39

Najjednoduchší spôsob je inicializovať ho najskôr myVar = None

Potom neskôr:

Ak myVar nie je None: # Urobte niečo


2018-06-04 18:46

Hádam, že test bude použitý vo funkcii podobnej odpovedi užívateľa 97370. Táto odpoveď sa mi nepáči, pretože znečisťuje globálny priestor názvov. Jedným zo spôsobov, ako to vyriešiť, je použiť namiesto toho triedu:

Trieda InitMyVariable (objekt): my_variable = None def __call __ (self): if self.my_variable is None: self.my_variable = ...

Nepáči sa mi to, pretože to komplikuje kód a otvára otázky, ako keby to potvrdilo programovací vzor Singleton? Našťastie Python na chvíľu povolil funkciám mať atribúty, čo nám dáva toto jednoduché riešenie:

Def InitMyVariable (): if InitMyVariable.my_variable is None: InitMyVariable.my_variable = ... InitMyVariable.my_variable = None


2018-03-25 20:31

2018-05-09 13:12

Spôsob, ktorý často funguje dobre pri zvládaní tohto druhu situácie, je výslovne nekontrolovať, či premenná existuje, ale jednoducho pokračovať a zabaliť prvé použitie potenciálne neexistujúcej premennej do pokusu / okrem NameError.

Materiál je určený hlavne pre začínajúcich webových programátorov.

Úvod.

Často ma oslovujú klienti, ktorí majú nainštalovaný CMS alebo moduly napísané začínajúcimi webovými programátormi, ktorí nechápu, čo je potrebné na ochranu údajov a často kopírujú funkcie filtrovania bez toho, aby premýšľali o tom, ako fungujú a čo presne je potrebné s nimi urobiť. .

Tu sa pokúsim popísať čo najpodrobnejšie bežné chyby pri filtrovaní údajov v Skript PHP a poskytnite jednoduché tipy na správne filtrovanie údajov.

Na internete je veľa článkov o filtrovaní údajov, ale nie sú úplné a bez podrobných príkladov.

Rozbor.

Filtrácia. Chyba č. 1
Pre číselné premenné sa používa táto kontrola:
$ number = $ _GET ["input_number"]; if (intval ($ number)) (... spustiť SQL dotaz ...)
Prečo to povedie k Injekcia SQL? Ide o to, že používateľ môže v premennej špecifikovať vstupné_číslo význam:
1 " + ÚNIA + VÝBER
V takom prípade bude kontrola úspešne úspešná. funkcia intval získa celočíselnú hodnotu premennej, t.j. 1, ale v samotnej premennej $ číslo nič sa nezmenilo, takže všetok škodlivý kód bude odoslaný do dotazu SQL.
Správne filtrovanie:
$ number = intval ($ _ GET ["input_number"]); if ($ number) (... spustiť SQL dotaz ...)
Podmienka sa môže samozrejme zmeniť, napríklad ak potrebujete získať iba určitý rozsah:
if ($ number> = 32 AND $ number<= 65)

Ak používate začiarkavacie políčka alebo viacnásobné výbery s číselnými hodnotami, začiarknite toto:
$ checkbox_arr = mapa_mapy („intval“, $ _POST [„začiarkavacie políčko“]);
array_map
Tiež sa stretávam s filtrovaním vo forme:
$ number = htmlspecialchars (intval ($ _ GET ["input_number"]));
htmlspecialchars
Alebo:
$ number = mysql_escape_string (intval ($ _ GET ["input_number"]));
mysql_escape_string

Nemôže to spôsobiť nič iné ako úsmev :)

Filtrácia. Chyba č. 2.
Pre reťazcové premenné sa používa nasledujúce filtrovanie:
$ input_text = addlashes ($ _ GET ["input_text"]);
Funkcia addlashes uniká špeciálom. znakov, ale neberie do úvahy kódovanie databázy a filtrovanie je možné obísť. Nebudem kopírovať text autora, ktorý popísal túto zraniteľnosť, a dám iba odkaz na Chrisa Shifletta (preklad je k dispozícii na ruskom internete).

Použite funkciu mysql_escape_string alebo mysql_real_escape_string, príklad:
$ input_text = mysql_escape_string ($ _ GET ["input_text"]);
Ak nemienite vstúpiť html tagy, potom je najlepšie vykonať nasledujúce filtrovanie:
$ input_text = strip_tags ($ _ GET ["input_text"]); $ input_text = htmlspecialchars ($ input_text); $ input_text = mysql_escape_string ($ input_text);
strip_tags - odstrániť html značky.
htmlspecialchars - prevádza špeciálne. znakov v html entite.
Týmto spôsobom sa chránite pred inými útokmi XSS, ako je injekcia SQL.
Ak potrebujete značky HTML, ale iba na zobrazenie zdrojového kódu, stačí použiť:
$ input_text = htmlspecialchars ($ _ GET ["input_text"]); $ input_text = mysql_escape_string ($ input_text);

Ak je pre vás dôležité, aby hodnota premennej nebola prázdna, použite napríklad funkciu orezania:
$ input_text = trim ($ _ GET ["input_text"]); $ input_text = htmlspecialchars ($ input_text); $ input_text = mysql_escape_string ($ input_text);

Filtrácia. Chyba číslo 3.
Týka sa to vyhľadávania v databáze.
Na vyhľadávanie podľa čísel použite filtrovanie popísané v prvej chybe.
Na vyhľadávanie podľa textu použite filtrovanie popísané v druhej chybe, ale s výhradami.
Aby používateľ nemohol vykonať logickú chybu, je potrebné špeciál odstrániť alebo zobraziť obrazovku. Symboly SQL.
Príklad bez pridania. spracovanie linky:
$ input_text = htmlspecialchars ($ _ GET ["input_text"]); // Hľadať: "%" $ input_text = mysql_escape_string ($ input_text);
Na výstupe dostaneme žiadosť vo formulári:
... KDE PORADÍ text_row "%". $ Input_text. "%" ... // KDE text_row LIKE "%%%"
To výrazne zvýši zaťaženie základne.
Vo svojom skripte používam funkciu, ktorá odstraňuje nežiaduce znaky z vyhľadávania:
funkcia strip_data ($ text) ($ quotes = pole ("\ x27", "\ x22", "\ x60", "\ t", "\ n", "\ r", "*", "%", "<", ">","? ","! "); $ goodquotes = pole (" - "," + "," # "); $ repquotes = pole (" \ - "," \ + "," \ # "); $ text = trim (strip_tags ($ text)); $ text = str_replace ($ quotes, "", $ text); $ text = str_replace ($ goodquotes, $ repquotes, $ text); $ text = ereg_replace ("+" , "", $ text); vrátiť $ text;)
Samozrejme, nie všetky vyššie uvedené symboly sú nebezpečné, ale v mojom prípade nie sú potrebné, preto hľadám a nahrádzam.
Príklad použitia filtrovania:
$ input_text = strip_data ($ _ GET ["input_text"]); $ input_text = htmlspecialchars ($ input_text); $ input_text = mysql_escape_string ($ input_text);
Tiež vám odporúčam obmedziť počet znakov vo vyhľadávaní, najmenej na 3, pretože ak máte v databáze veľký počet záznamov, potom vyhľadávanie o 1-2 znaky výrazne zvýši zaťaženie databázy.
Filtrácia. Chyba č. 4.
Hodnoty v premennej nie sú filtrované $ _COOKIE... Niektorí ľudia si myslia, že keďže túto premennú nemožno prejsť cez formulár, je to záruka bezpečnosti.
Túto premennú je veľmi jednoduché falšovať akýmkoľvek prehliadačom úpravou súborov cookie stránok.
Napríklad v jednom známom CMS bola kontrola použitej šablóny stránok:
if (@is_dir (MAIN_DIR. " / template /". $ _COOKIE ["skin"])) ($ config ["skin"] = $ _COOKIE ["skin"];) $ tpl-> dir = MAIN_DIR. " / šablóna /". $ config ["skin"];
V tomto prípade môžete nahradiť hodnotu premennej $ _COOKIE ["skin"] a spôsobiť chybu, v dôsledku ktorej uvidíte absolútnu cestu k priečinku lokality.
Ak na ukladanie do databázy používate hodnotu súborov cookie, potom použite jeden z vyššie popísaných filtrov, to platí aj pre premennú $ _SERVER.
Filtrácia. Chyba č. 5.
Zahrnutá smernica register_globals... Ak je zapnutý, určite ho vypnite.
V niektorých situáciách môžete odovzdať hodnotu premennej, ktorá nemala byť odovzdaná, napríklad ak sú na webe skupiny, potom premenná $ group by mala byť prázdna alebo rovná 0 pre skupinu 2, ale stačí sfalšovať formulár pridaním kódu:

V skripte PHP je premenná $ skupina sa bude rovnať 5, ak nebol v skripte deklarovaný s predvolenou hodnotou.
Filtrácia. Chyba č. 6.
Skontrolujte svoje stiahnuté súbory.
Skontrolujte nasledujúce body:
  1. Rozšírenie súboru. Je žiaduce zakázať sťahovanie súborov s príponami: php, php3, php4, php5 atď.
  2. Je súbor nahraný na server move_uploaded_file
  3. veľkosť súboru
Vyšetrenie. Chyba č. 1.
Stretol som sa s prípadmi, keď pre požiadavku AJAX (napríklad: zvýšenie reputácie) bolo postúpené užívateľské meno alebo jeho ID (ktorému je reputácia rozšírená), ale v samotnom PHP neexistovala kontrola existencie takéhoto používateľa.
Napríklad:
$ user_id = intval ($ _ REQUEST ["user_id"]); ... VLOŽIŤ DO SADY REPLOGU uid = "($ user_id)", plus = "1" ... ... AKTUALIZOVAŤ NASTAVENIE používateľov reputácia = povesť + 1 KDE user_id = "($ user_id)" ...
Ukazuje sa, že v databáze vytvoríme záznam, ktorý je pre nás úplne zbytočný.
Vyšetrenie. Chyba č. 2.
Pri vykonávaní rôznych druhov akcií (pridávanie, úpravy, odstraňovanie) s údajmi nezabudnite skontrolovať práva používateľa na prístup k tejto funkcii a pridané vlastnosti (pomocou html tagy alebo možnosť publikovať materiál bez overenia).

Dlho som opravoval podobnú chybu v jednom module fóra, keď mohol ľubovoľný používateľ upravovať správu.

Vyšetrenie. Chyba číslo 3.
Ak používate viacero súborov php, urobte jednoduchú kontrolu.
V súbore index.php(alebo do akéhokoľvek iného hlavného súboru) napíšte tento riadok pred zahrnutím ďalších súborov php:
define ("READFILE", true);
Na začiatok ostatných súborov php napíšte:
if (! defined ("READFILE")) (exit ("Chyba, nesprávny spôsob súboru."
Prejdite na hlavnú."); }
Tým sa obmedzí prístup k súborom.
Vyšetrenie. Chyba č. 4.
Používajte hash pre používateľov. Pomôže to zabrániť XSS volať konkrétnu funkciu.
Príklad generovania hodnoty hash pre používateľov:
$ secret_key = md5 (strtolower ("http://site.ru/". $ member ["name"]. sha1 ($ heslo). datum ("Ymd"))); // $ secret_key je náš hash
Ďalej vo všetkých dôležitých formách nahraďte vstup hodnotou aktuálneho hasha používateľa:

Počas vykonávania skriptu skontrolujte:
if ($ _POST ["secret_key"]! == $ secret_key) (exit ("Chyba: secret_key!");)
Vyšetrenie. Chyba č. 5.
Pri zobrazovaní chýb SQL urobte jednoduché obmedzenie prístupu k informáciám. Nastavte napríklad heslo pre premennú GET:
if ($ _GET ["passsql"] == "heslo") (... chybový výstup SQL ...) else (... len informácie o chybe, žiadne podrobnosti ...)
Pred hackerom sa tým skryjú informácie, ktoré mu môžu pomôcť pri hackovaní stránky.
Vyšetrenie. Chyba č. 5.
Pokúste sa nezahrnúť súbory tým, že externe získate názvy súborov.
Napríklad:
if (isset ($ _ GET ["file_name"])) (include $ _GET ["file_name"]. ". php";)
Použite vypínač

Môžete skontrolovať, či daná premenná existuje (to znamená, že je inicializovaná alebo ona). Na tento účel použite funkciu:

Emisia (premenná);

Ak je premenná v tento moment neexistuje (nebola mu predtým priradená žiadna hodnota alebo bola odstránená funkciou rozrušený () ), potom funkcia isset () vracia falošný , inak - pravda :

$ x = 5;

if (isset ($ x))

ozvena ‘< BR > Premenná $ X existuje, ‘,“ jeho hodnota je $ X < BR >”;

Na obrazovke sa zobrazí:

Variabilné $ X existuje, jeho hodnota je 5

Je dôležité mať na pamäti, že v programe nemôžeme použiť neinicializovanú premennú - toto vygeneruje varovanie od tlmočníka. PHP .

Ak chcete zistiť, či je hodnota premennou prázdny , funkcia sa používa:

prázdny ( premenná);

Ak je hodnota premennej nula ,“0”, NULOVÝ , prázdny riadok (“” ), false, premenná nie je deklarovaná alebo je prázdne pole potom sa táto funkcia vráti pravda , inak - falošný .

Skontrolovať Typ premenná, používajú sa funkcie:

Is_string (premenná);

je _ int (premenná);

je _ plavák (premenná);

je _ nulový (premenná);

je _ pole (premenná);

je _ číselné (premenná); - ak je premenná číselná ( celé číslo , plavák ) alebo reťazec obsahujúci iba čísla.

Tieto funkcie sa vrátia pravda ak je premenná zadaného typu.

Dátový výstup

Výstup bez formátu

Bez formátu výstup reťazcov alebo hodnôt premenných vykonáva funkcia:

ozvena zoznam premenných;

ozvena čiara;

kde variabilný zoznam - názvy výstupných premenných oddelené čiarkami.

Ak pracujeme s webovým prehliadačom, tak táto funkcia smeruje výstup na klientsku stranu prehliadača (do jeho okna).

Ako už bolo uvedené, ak sa názvy premenných nachádzajú v reťazci uzavretom v dvojitých úvodzovkách, namiesto týchto názvov sa na obrazovke zobrazia zodpovedajúce hodnoty. Navyše, ak taký reťazec obsahuje značky Html (úchytky uzavreté v hranatých zátvorkách), potom to prehliadač zobrazí Html -kódovať spôsob, akým by to mal pri interpretácii urobiť Html -dokument:

$ rok = 2012;

$ message = “ Prianie všetkým šťastie !”;

ozvena “

Môj gratulujem !

”;

ozvena “ Prišiel $ rok rok !
$ správa
”;

?>

Zobrazí sa nadpis úrovne. H 3 a nasledujúci pozdrav so slovom „ šťastie! " budú zobrazené hrubou kurzívou:

Gratulujem!

Prišiel rok 2012! Prajem všetkým šťastie!

Takto môžete vytvárať dynamické stránky.

Formátovaný výstup

Naformátované výstup vám umožňuje reprezentovať výstupné čísla v rôznych číselných systémoch a v desiatkovej sústave - v rôznych formách ( formáty ). Je podobný formátovanému výstupu v Si a je vykonávaný funkciami:

printf („Formát“, výstupný zoznam);

šprint („Formát“, výstupný zoznam);

Prvá funkcia zobrazí formátované údaje v okne prehliadača a vráti ich množstvo.

Druhá funkcia iba formátuje výstupné údaje, ale nevytvára ich.

Formát Je postupnosťou deskriptorov prevodu pre výstupné hodnoty.

Transformátor Descriptor pre každú hodnotu má tvar:

% Typ výplne Zarovnať dĺžku

- Agregát - toto je znak, ktorý bude použitý na dokončenie výsledku prevodu na zadanú hodnotu dĺžka (predvolené - priestor ); ak je to iný znak, predchádza mu jeden citát ( apostrof ),

- Zarovnanie - štandardne - do správny okraj výstupného poľa; ak je mínus ( - ), potom do vľavo ,

- Dĺžka - šírka výstupného poľa - počet medzier pre znaky pridelených na výstup tejto hodnoty. Ak zobrazená hodnota obsahuje menšiu známosť ako daná dĺžka potom sa vyplní zostávajúci priestor medzery alebo vypĺňanie znakov,

- Presnosť - počet desatinných miest v zlomkovej časti čísla,

- Typ - typ výstupnej hodnoty:

b binárne ,

s symbol ,

d celé v desatinnom zápise,

e materiál v exponenciálnej forme (plávajúca čiarka),

f materiál vo forme pevného bodu,

s riadok ,

O celé v osmičkovej číselnej sústave,

X celé v hexadecimálnom zápise.

Príklad:

php

$ zarp _1 = 6543.21;

$ zarp _2 = 45321.67;

$ fam _1 = "Balaganov";

$ fam _2 = "Ohýbačka";

printf ("< H 1> Mzdy h 1>");

printf ("%" .- 12 s% ". 10,2f rub.", $ fam_1, $ zarp_1);

ozvena "
";

printf ("%" .- 12 s% ". 10,2f rub.", $ fam_2, $ zarp_2);

ozvena "
";

?>

Bod bol vybraný ako zástupný symbol ( ‘. ). Priezviská sú zarovnané doľava ( - ) v poli šírky 12 postavy. Čísla sú reprezentované vo forme pevných bodov v šírke poľa 10 postavy a s presnosťou 2 desatinné miesta, vpravo odôvodnené.