[{"data":1,"prerenderedAt":1016},["ShallowReactive",2],{"page-\u002Fphp\u002Fformulaires":3,"pieces-php":973,"autour-\u002Fphp\u002Fformulaires":998,"prerequis-\u002Fphp\u002Fformulaires":1003,"plan-php":1005},{"id":4,"title":5,"body":6,"description":942,"extension":943,"ligne":279,"meta":944,"motsCles":945,"navigation":377,"niveau":948,"path":949,"prerequis":950,"ressources":952,"seo":961,"sources":962,"stem":971,"__hash__":972},"docs\u002Fphp\u002F05.formulaires.md","Formulaires et sécurité",{"type":7,"value":8,"toc":931},"minimark",[9,14,40,44,52,199,209,213,221,271,274,330,336,340,343,459,465,469,480,600,617,624,628,631,662,674,678,700,789,796,805,809,812,863,873,882,886,927],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,30,33],"ul",{},[18,19,20,21,25,26,29],"li",{},"Lire les données envoyées par un formulaire avec ",[22,23,24],"code",{},"$_GET"," et ",[22,27,28],{},"$_POST",".",[18,31,32],{},"Valider ces données avant de les utiliser.",[18,34,35,36,39],{},"Neutraliser le HTML malveillant avec ",[22,37,38],{},"htmlspecialchars"," pour éviter une faille XSS.",[10,41,43],{"id":42},"un-formulaire-html","Un formulaire HTML",[45,46,47,48,51],"p",{},"Voici un formulaire pour ajouter une recette. L'attribut ",[22,49,50],{},"method"," choisit comment les données voyagent.",[53,54,60],"pre",{"className":55,"code":56,"filename":57,"language":58,"meta":59,"style":59},"language-html shiki shiki-themes github-light-default github-dark-default github-dark-default","\u003Cform method=\"post\" action=\"ajouter.php\">\n  \u003Clabel>Titre \u003Cinput type=\"text\" name=\"titre\">\u003C\u002Flabel>\n  \u003Clabel>Durée \u003Cinput type=\"number\" name=\"duree\">\u003C\u002Flabel>\n  \u003Cbutton type=\"submit\">Ajouter\u003C\u002Fbutton>\n\u003C\u002Fform>\n","ajouter.php","html","",[22,61,62,97,135,167,189],{"__ignoreMap":59},[63,64,67,71,75,79,82,86,89,91,94],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"scfrF","\u003C",[63,72,74],{"class":73},"s5JFL","form",[63,76,78],{"class":77},"s5iOY"," method",[63,80,81],{"class":69},"=",[63,83,85],{"class":84},"shWOn","\"post\"",[63,87,88],{"class":77}," action",[63,90,81],{"class":69},[63,92,93],{"class":84},"\"ajouter.php\"",[63,95,96],{"class":69},">\n",[63,98,100,103,106,109,112,115,117,120,123,125,128,131,133],{"class":65,"line":99},2,[63,101,102],{"class":69},"  \u003C",[63,104,105],{"class":73},"label",[63,107,108],{"class":69},">Titre \u003C",[63,110,111],{"class":73},"input",[63,113,114],{"class":77}," type",[63,116,81],{"class":69},[63,118,119],{"class":84},"\"text\"",[63,121,122],{"class":77}," name",[63,124,81],{"class":69},[63,126,127],{"class":84},"\"titre\"",[63,129,130],{"class":69},">\u003C\u002F",[63,132,105],{"class":73},[63,134,96],{"class":69},[63,136,138,140,142,145,147,149,151,154,156,158,161,163,165],{"class":65,"line":137},3,[63,139,102],{"class":69},[63,141,105],{"class":73},[63,143,144],{"class":69},">Durée \u003C",[63,146,111],{"class":73},[63,148,114],{"class":77},[63,150,81],{"class":69},[63,152,153],{"class":84},"\"number\"",[63,155,122],{"class":77},[63,157,81],{"class":69},[63,159,160],{"class":84},"\"duree\"",[63,162,130],{"class":69},[63,164,105],{"class":73},[63,166,96],{"class":69},[63,168,170,172,175,177,179,182,185,187],{"class":65,"line":169},4,[63,171,102],{"class":69},[63,173,174],{"class":73},"button",[63,176,114],{"class":77},[63,178,81],{"class":69},[63,180,181],{"class":84},"\"submit\"",[63,183,184],{"class":69},">Ajouter\u003C\u002F",[63,186,174],{"class":73},[63,188,96],{"class":69},[63,190,192,195,197],{"class":65,"line":191},5,[63,193,194],{"class":69},"\u003C\u002F",[63,196,74],{"class":73},[63,198,96],{"class":69},[45,200,201,202,205,206,208],{},"Le champ ",[22,203,204],{},"name"," de chaque ",[22,207,111],{}," devient la clé sous laquelle PHP retrouve la valeur.",[10,210,212],{"id":211},"get-et-post","GET et POST",[45,214,215,216,220],{},"PHP range les données reçues dans des tableaux spéciaux, les ",[217,218,219],"strong",{},"superglobales",", disponibles partout.",[222,223,224,240],"table",{},[225,226,227],"thead",{},[228,229,230,234,237],"tr",{},[231,232,233],"th",{},"Superglobale",[231,235,236],{},"Origine",[231,238,239],{},"Usage typique",[241,242,243,259],"tbody",{},[228,244,245,250,256],{},[246,247,248],"td",{},[22,249,24],{},[246,251,252,253],{},"l'adresse : ",[22,254,255],{},"\u002Frecettes?categorie=dessert",[246,257,258],{},"recherche, filtre, pagination",[228,260,261,265,268],{},[246,262,263],{},[22,264,28],{},[246,266,267],{},"le corps de la requête",[246,269,270],{},"création, modification, mot de passe",[45,272,273],{},"La méthode GET met les données dans l'adresse, visible de tous. N'y envoie jamais d'information sensible. La méthode POST convient aux actions qui modifient quelque chose.",[53,275,280],{"className":276,"code":277,"filename":278,"language":279,"meta":59,"style":59},"language-php shiki shiki-themes github-light-default github-dark-default github-dark-default","\u003C?php\n$categorie = $_GET[\"categorie\"] ?? \"toutes\";\necho \"Catégorie demandée : \" . $categorie;\n","recettes.php","php",[22,281,282,291,316],{"__ignoreMap":59},[63,283,284,288],{"class":65,"line":66},[63,285,287],{"class":286},"sOnC1","\u003C?",[63,289,290],{"class":77},"php\n",[63,292,293,296,298,301,304,307,310,313],{"class":65,"line":99},[63,294,295],{"class":69},"$categorie ",[63,297,81],{"class":286},[63,299,300],{"class":69}," $_GET[",[63,302,303],{"class":84},"\"categorie\"",[63,305,306],{"class":69},"] ",[63,308,309],{"class":286},"??",[63,311,312],{"class":84}," \"toutes\"",[63,314,315],{"class":69},";\n",[63,317,318,321,324,327],{"class":65,"line":137},[63,319,320],{"class":77},"echo",[63,322,323],{"class":84}," \"Catégorie demandée : \"",[63,325,326],{"class":286}," .",[63,328,329],{"class":69}," $categorie;\n",[45,331,332,333,335],{},"L'opérateur ",[22,334,309],{}," donne une valeur de secours si le paramètre est absent.",[10,337,339],{"id":338},"recevoir-le-formulaire","Recevoir le formulaire",[45,341,342],{},"Le même fichier peut afficher le formulaire puis traiter l'envoi. On détecte un envoi en regardant la méthode de la requête.",[53,344,346],{"className":276,"code":345,"filename":57,"language":279,"meta":59,"style":59},"\u003C?php\ndeclare(strict_types=1);\n\nif ($_SERVER[\"REQUEST_METHOD\"] === \"POST\") {\n    $titre = trim($_POST[\"titre\"] ?? \"\");\n    $duree = $_POST[\"duree\"] ?? \"\";\n    \u002F\u002F validation à suivre\n}\n",[22,347,348,354,373,379,401,425,446,453],{"__ignoreMap":59},[63,349,350,352],{"class":65,"line":66},[63,351,287],{"class":286},[63,353,290],{"class":77},[63,355,356,359,362,365,367,370],{"class":65,"line":99},[63,357,358],{"class":286},"declare",[63,360,361],{"class":69},"(",[63,363,364],{"class":77},"strict_types",[63,366,81],{"class":286},[63,368,369],{"class":77},"1",[63,371,372],{"class":69},");\n",[63,374,375],{"class":65,"line":137},[63,376,378],{"emptyLinePlaceholder":377},true,"\n",[63,380,381,384,387,390,392,395,398],{"class":65,"line":169},[63,382,383],{"class":286},"if",[63,385,386],{"class":69}," ($_SERVER[",[63,388,389],{"class":84},"\"REQUEST_METHOD\"",[63,391,306],{"class":69},[63,393,394],{"class":286},"===",[63,396,397],{"class":84}," \"POST\"",[63,399,400],{"class":69},") {\n",[63,402,403,406,408,411,414,416,418,420,423],{"class":65,"line":191},[63,404,405],{"class":69},"    $titre ",[63,407,81],{"class":286},[63,409,410],{"class":77}," trim",[63,412,413],{"class":69},"($_POST[",[63,415,127],{"class":84},[63,417,306],{"class":69},[63,419,309],{"class":286},[63,421,422],{"class":84}," \"\"",[63,424,372],{"class":69},[63,426,428,431,433,436,438,440,442,444],{"class":65,"line":427},6,[63,429,430],{"class":69},"    $duree ",[63,432,81],{"class":286},[63,434,435],{"class":69}," $_POST[",[63,437,160],{"class":84},[63,439,306],{"class":69},[63,441,309],{"class":286},[63,443,422],{"class":84},[63,445,315],{"class":69},[63,447,449],{"class":65,"line":448},7,[63,450,452],{"class":451},"sd6ml","    \u002F\u002F validation à suivre\n",[63,454,456],{"class":65,"line":455},8,[63,457,458],{"class":69},"}\n",[45,460,461,464],{},[22,462,463],{},"trim"," retire les espaces au début et à la fin. Toute donnée venue du navigateur est du texte, même un nombre.",[10,466,468],{"id":467},"valider-les-données","Valider les données",[45,470,471,472,475,476,479],{},"Ne fais ",[217,473,474],{},"jamais"," confiance à ce qu'envoie l'utilisateur. Un visiteur peut vider un champ, saisir n'importe quoi, ou envoyer une requête sans passer par ton formulaire. La ",[217,477,478],{},"validation"," vérifie que chaque donnée a la forme attendue.",[53,481,483],{"className":276,"code":482,"language":279,"meta":59,"style":59},"\u003C?php\n$erreurs = [];\n\nif ($titre === \"\") {\n    $erreurs[] = \"Le titre est obligatoire.\";\n}\n\n$dureeNombre = filter_var($duree, FILTER_VALIDATE_INT);\nif ($dureeNombre === false || $dureeNombre \u003C= 0) {\n    $erreurs[] = \"La durée doit être un entier positif.\";\n}\n",[22,484,485,491,501,505,518,530,534,538,556,583,595],{"__ignoreMap":59},[63,486,487,489],{"class":65,"line":66},[63,488,287],{"class":286},[63,490,290],{"class":77},[63,492,493,496,498],{"class":65,"line":99},[63,494,495],{"class":69},"$erreurs ",[63,497,81],{"class":286},[63,499,500],{"class":69}," [];\n",[63,502,503],{"class":65,"line":137},[63,504,378],{"emptyLinePlaceholder":377},[63,506,507,509,512,514,516],{"class":65,"line":169},[63,508,383],{"class":286},[63,510,511],{"class":69}," ($titre ",[63,513,394],{"class":286},[63,515,422],{"class":84},[63,517,400],{"class":69},[63,519,520,523,525,528],{"class":65,"line":191},[63,521,522],{"class":69},"    $erreurs[] ",[63,524,81],{"class":286},[63,526,527],{"class":84}," \"Le titre est obligatoire.\"",[63,529,315],{"class":69},[63,531,532],{"class":65,"line":427},[63,533,458],{"class":69},[63,535,536],{"class":65,"line":448},[63,537,378],{"emptyLinePlaceholder":377},[63,539,540,543,545,548,551,554],{"class":65,"line":455},[63,541,542],{"class":69},"$dureeNombre ",[63,544,81],{"class":286},[63,546,547],{"class":77}," filter_var",[63,549,550],{"class":69},"($duree, ",[63,552,553],{"class":77},"FILTER_VALIDATE_INT",[63,555,372],{"class":69},[63,557,559,561,564,566,569,572,575,578,581],{"class":65,"line":558},9,[63,560,383],{"class":286},[63,562,563],{"class":69}," ($dureeNombre ",[63,565,394],{"class":286},[63,567,568],{"class":77}," false",[63,570,571],{"class":286}," ||",[63,573,574],{"class":69}," $dureeNombre ",[63,576,577],{"class":286},"\u003C=",[63,579,580],{"class":77}," 0",[63,582,400],{"class":69},[63,584,586,588,590,593],{"class":65,"line":585},10,[63,587,522],{"class":69},[63,589,81],{"class":286},[63,591,592],{"class":84}," \"La durée doit être un entier positif.\"",[63,594,315],{"class":69},[63,596,598],{"class":65,"line":597},11,[63,599,458],{"class":69},[45,601,602,605,606,608,609,612,613,616],{},[22,603,604],{},"filter_var"," avec ",[22,607,553],{}," renvoie l'entier si la valeur en est un, sinon ",[22,610,611],{},"false",". Le filtre ",[22,614,615],{},"FILTER_VALIDATE_EMAIL"," fait la même chose pour une adresse e-mail.",[45,618,619,620,623],{},"Si ",[22,621,622],{},"$erreurs"," est vide, tu peux utiliser les données. Sinon, tu réaffiches le formulaire avec les messages.",[10,625,627],{"id":626},"la-faille-xss","La faille XSS",[45,629,630],{},"Imagine qu'un visiteur saisisse ce titre :",[53,632,634],{"className":55,"code":633,"language":58,"meta":59,"style":59},"\u003Cscript>alert(\"piraté\")\u003C\u002Fscript>\n",[22,635,636],{"__ignoreMap":59},[63,637,638,640,643,646,650,652,655,658,660],{"class":65,"line":66},[63,639,70],{"class":69},[63,641,642],{"class":73},"script",[63,644,645],{"class":69},">",[63,647,649],{"class":648},"syCW7","alert",[63,651,361],{"class":69},[63,653,654],{"class":84},"\"piraté\"",[63,656,657],{"class":69},")\u003C\u002F",[63,659,642],{"class":73},[63,661,96],{"class":69},[45,663,664,665,668,669,673],{},"Si tu l'affiches tel quel dans une page, le navigateur exécute ce script. C'est une faille ",[217,666,667],{},"XSS"," (",[670,671,672],"em",{},"Cross-Site Scripting",") : du code injecté par un utilisateur s'exécute chez les autres visiteurs. Il pourrait voler leur session.",[10,675,677],{"id":676},"htmlspecialchars-le-réflexe","htmlspecialchars : le réflexe",[45,679,680,684,685,687,688,687,690,687,693,687,696,699],{},[217,681,682],{},[22,683,38],{}," remplace les caractères spéciaux du HTML (",[22,686,70],{},", ",[22,689,645],{},[22,691,692],{},"&",[22,694,695],{},"\"",[22,697,698],{},"'",") par des codes inoffensifs. Le navigateur affiche alors le texte au lieu de l'exécuter.",[53,701,703],{"className":276,"code":702,"language":279,"meta":59,"style":59},"\u003C?php\nfunction e(string $texte): string\n{\n    return htmlspecialchars($texte, ENT_QUOTES, \"UTF-8\");\n}\n?>\n\u003Ch2>\u003C?= e($titre) ?>\u003C\u002Fh2>\n",[22,704,705,711,733,738,759,763,768],{"__ignoreMap":59},[63,706,707,709],{"class":65,"line":66},[63,708,287],{"class":286},[63,710,290],{"class":77},[63,712,713,716,719,721,724,727,730],{"class":65,"line":99},[63,714,715],{"class":286},"function",[63,717,718],{"class":648}," e",[63,720,361],{"class":69},[63,722,723],{"class":286},"string",[63,725,726],{"class":69}," $texte)",[63,728,729],{"class":286},":",[63,731,732],{"class":286}," string\n",[63,734,735],{"class":65,"line":137},[63,736,737],{"class":69},"{\n",[63,739,740,743,746,749,752,754,757],{"class":65,"line":169},[63,741,742],{"class":286},"    return",[63,744,745],{"class":77}," htmlspecialchars",[63,747,748],{"class":69},"($texte, ",[63,750,751],{"class":77},"ENT_QUOTES",[63,753,687],{"class":69},[63,755,756],{"class":84},"\"UTF-8\"",[63,758,372],{"class":69},[63,760,761],{"class":65,"line":191},[63,762,458],{"class":69},[63,764,765],{"class":65,"line":427},[63,766,767],{"class":286},"?>\n",[63,769,770,772,774,777,779,782,785,787],{"class":65,"line":448},[63,771,70],{"class":286},[63,773,10],{"class":77},[63,775,776],{"class":286},">\u003C?=",[63,778,718],{"class":648},[63,780,781],{"class":69},"($titre) ",[63,783,784],{"class":286},"?>\u003C\u002F",[63,786,10],{"class":77},[63,788,96],{"class":286},[45,790,791,792,795],{},"Appelle-la sur toute donnée venue de l'extérieur au moment de l'afficher : formulaire, adresse, base de données. Écrire une petite fonction ",[22,793,794],{},"e()"," raccourcit le geste et évite les oublis.",[797,798,799],"warning",{},[45,800,801,802,804],{},"Applique ",[22,803,38],{}," à l'affichage, pas à l'enregistrement. Les données restent ainsi intactes en base et protégées dans chaque page où tu les montres.",[10,806,808],{"id":807},"après-le-traitement","Après le traitement",[45,810,811],{},"Quand l'envoi a réussi, on redirige le visiteur vers une autre page. Sinon, recharger la page renverrait le formulaire une seconde fois.",[53,813,815],{"className":276,"code":814,"language":279,"meta":59,"style":59},"\u003C?php\nif ($erreurs === []) {\n    \u002F\u002F enregistrer la recette (voir le chapitre suivant)\n    header(\"Location: \u002Frecettes.php\");\n    exit;\n}\n",[22,816,817,823,835,840,852,859],{"__ignoreMap":59},[63,818,819,821],{"class":65,"line":66},[63,820,287],{"class":286},[63,822,290],{"class":77},[63,824,825,827,830,832],{"class":65,"line":99},[63,826,383],{"class":286},[63,828,829],{"class":69}," ($erreurs ",[63,831,394],{"class":286},[63,833,834],{"class":69}," []) {\n",[63,836,837],{"class":65,"line":137},[63,838,839],{"class":451},"    \u002F\u002F enregistrer la recette (voir le chapitre suivant)\n",[63,841,842,845,847,850],{"class":65,"line":169},[63,843,844],{"class":77},"    header",[63,846,361],{"class":69},[63,848,849],{"class":84},"\"Location: \u002Frecettes.php\"",[63,851,372],{"class":69},[63,853,854,857],{"class":65,"line":191},[63,855,856],{"class":286},"    exit",[63,858,315],{"class":69},[63,860,861],{"class":65,"line":427},[63,862,458],{"class":69},[45,864,865,868,869,872],{},[22,866,867],{},"header(\"Location: ...\")"," demande au navigateur d'aller ailleurs. Le ",[22,870,871],{},"exit"," qui suit arrête le script : sans lui, PHP continue d'exécuter le code en dessous.",[874,875,876],"note",{},[45,877,878,881],{},[22,879,880],{},"header"," doit être appelé avant tout affichage. Si du HTML est déjà parti, PHP ne peut plus modifier les en-têtes.",[10,883,885],{"id":884},"à-retenir","À retenir",[15,887,888,896,902,910,913,919],{},[18,889,890,892,893,895],{},[22,891,24],{}," lit les paramètres de l'adresse, ",[22,894,28],{}," le corps d'un formulaire.",[18,897,898,899,901],{},"Chaque ",[22,900,204],{}," de champ devient une clé du tableau reçu ; toutes les valeurs sont du texte.",[18,903,904,905,687,907,909],{},"Ne fais jamais confiance aux données reçues : valide-les (",[22,906,463],{},[22,908,604],{},", tests de longueur).",[18,911,912],{},"Une faille XSS vient d'une donnée affichée sans protection.",[18,914,915,916,918],{},"Passe toute donnée extérieure dans ",[22,917,38],{}," au moment de l'afficher.",[18,920,921,922,924,925,29],{},"Après un traitement réussi, redirige avec ",[22,923,867],{}," puis ",[22,926,871],{},[928,929,930],"style",{},"html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .s5JFL, html code.shiki .s5JFL{--shiki-light:#116329;--shiki-default:#7EE787;--shiki-dark:#7EE787}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}",{"title":59,"searchDepth":99,"depth":137,"links":932},[933,934,935,936,937,938,939,940,941],{"id":12,"depth":99,"text":13},{"id":42,"depth":99,"text":43},{"id":211,"depth":99,"text":212},{"id":338,"depth":99,"text":339},{"id":467,"depth":99,"text":468},{"id":626,"depth":99,"text":627},{"id":676,"depth":99,"text":677},{"id":807,"depth":99,"text":808},{"id":884,"depth":99,"text":885},"Recevoir les données d'un formulaire avec $_GET et $_POST, les valider et protéger l'affichage contre les failles XSS avec htmlspecialchars.","md",{},[24,28,946,478,38,667,604,947],"formulaire","redirection","intermediaire","\u002Fphp\u002Fformulaires",[951],"\u002Fphp\u002Ffonctions-et-objets",[953,957],{"nom":954,"url":955,"type":956},"Manuel PHP en français, htmlspecialchars","https:\u002F\u002Fwww.php.net\u002Fmanual\u002Ffr\u002Ffunction.htmlspecialchars.php","doc",{"nom":958,"url":959,"type":960},"OpenClassrooms, Concevez votre site web avec PHP et MySQL","https:\u002F\u002Fopenclassrooms.com\u002Ffr\u002Fcourses\u002F918836-concevez-votre-site-web-avec-php-et-mysql","cours",{"title":5,"description":942},[963,966,968],{"nom":964,"url":965},"Manuel PHP, variables externes","https:\u002F\u002Fwww.php.net\u002Fmanual\u002Ffr\u002Flanguage.variables.external.php",{"nom":967,"url":955},"Manuel PHP, htmlspecialchars",{"nom":969,"url":970},"Manuel PHP, filter_var","https:\u002F\u002Fwww.php.net\u002Fmanual\u002Ffr\u002Ffunction.filter-var.php","php\u002F05.formulaires","ptjXQEi7CTXMAllh7DRvOmQbgyD6Bekq8CgmRlruc4k",[974,978,982,986,989,990,994],{"path":975,"title":976,"stem":977},"\u002Fphp\u002Fpremiers-pas","Premiers pas en PHP","php\u002F01.premiers-pas",{"path":979,"title":980,"stem":981},"\u002Fphp\u002Ftypes-et-chaines","Types, chaînes et conditions","php\u002F02.types-et-chaines",{"path":983,"title":984,"stem":985},"\u002Fphp\u002Fboucles-et-tableaux","Boucles et tableaux","php\u002F03.boucles-et-tableaux",{"path":951,"title":987,"stem":988},"Fonctions et objets","php\u002F04.fonctions-et-objets",{"path":949,"title":5,"stem":971},{"path":991,"title":992,"stem":993},"\u002Fphp\u002Fpdo-et-composer","Base de données avec PDO et Composer","php\u002F06.pdo-et-composer",{"path":995,"title":996,"stem":997},"\u002Fphp","PHP","php\u002Findex",[999,1001],{"title":987,"path":951,"stem":988,"description":1000,"children":-1},"Écrire des fonctions typées avec strict_types, puis modeler tes données avec des classes, la promotion de propriétés et les espaces de noms.",{"title":992,"path":991,"stem":993,"description":1002,"children":-1},"Se connecter à une base avec PDO, écrire des requêtes préparées contre l'injection SQL, puis organiser le projet avec Composer et son autoload.",[1004],{"path":951,"title":987,"ligne":279},[1006,1008,1009,1010,1011,1012,1014],{"path":975,"title":976,"niveau":1007,"stem":977},"debutant",{"path":979,"title":980,"niveau":1007,"stem":981},{"path":983,"title":984,"niveau":1007,"stem":985},{"path":951,"title":987,"niveau":948,"stem":988},{"path":949,"title":5,"niveau":948,"stem":971},{"path":991,"title":992,"niveau":1013,"stem":993},"avance",{"path":995,"title":996,"niveau":1015,"stem":997},"memo",1794583448852]