[Homework] PHP Basics - PHP Syntax - November 2014
Здравейте, колеги от 1во ниво!
С нетърпение чаках да започнем този курс и да си припомня лошото и старо PHP. Като резултат съм готов с домашните и реших да ги споделя с вас!
Доста четене в google падна по тези задачи с датите... И останах с впечатлението, че доста лесно се борави с тях, стига да научиш какви неща ти дава php.
PS: Кодът е подобрен съобразно препоръките на RoYal!
Благодаря за препоръките!
Аз търсих в google точно за този начин на отваряне/затваряне на for цикли, но явно не съм го попитал правилно - ти ми спести доста търсене. :)
Относно масивите в стринговете - няма ли някаква конвенция как да се прави или както ми харесва на мене?
Възможните варианти са доста и по принцип няма една единна конвенция, а зависи от случая.
Когато става въпрос за пример като твоя, обикновено се избягва да се конкатенират стрингове с echo/print syntax-a.
Реално изречението ти е статично, имаш да вмъкнеш някакви променливи, така че би трябвало да изглежда така:
<p>My name is: <?= $myArray['name']; ?> and I am <?= $myArray['age']; ?> years old </p>
Когато например се използва за MySQL query, тогава най-лекият вариант е този с плейсхолдърите. Модерните енджини за връзка с базата (като не броим ORM-ите тук) разчитат на плейсхолдъри:
$query = $stmt->prepare("SELECT id FROM users WHERE name = :name AND age < :age");
$stmt->bindParam("name", $myArray['name']);
$stmt->bindParam("age", $myArray['age']);
Що се отнася до достъпването на входните данните от рикуеста (POST, GET, PUT, etc...) модерните фреймуърци използват някакъв wrapper върху суперглобалните и някакъв механизъм за ескейпване, защото почти никога не трябва да се разчита на raw data-та. Дори, например, ако пишеш на Netbeans и кажеш echo $_POST['name'] ще ти каже, че не е добра практика да се използва суперглобалната директно.
Това, естествено, не е обект на курса ви по РНР, но е нещо полезно, ако смяташ занапред да се занимаваш с РНР.
Механизмът, който имплементират, сведен до кратък код би изглеждал нещо такова:
http://pastebin.com/wqTM7cYt
Имаш обект който достъпва рикуеста, обикновено в MVC архитектурите, рикуеста не е суперглобален, а е достъпен само до контролерите. Контролерът може да извика Request обекта, който му е инжектнат и да поиска параметър от там. $this->getRequest()->getPost()->firstName например. Като примерно, преди това на рикуест инжектирания обект му е зададено да използва механизъм за ескейпване - HTML (htmlentities). В примера, който съм направил, съм изнесъл една примерна стратегия за ескейпване, един много прост wrapper около $_POST и съответно инстанцирането на последния. Параметрите вече се поискват само като полета на обекта, и минават задължително през ескейпа. В случая, там където съм направил echo $post->firstName дори и да напишеш във формата <script>alert("asd");</script> ще се ескейпне.
P.S.: Май много се отплеснах... :)
Благодаря ти за отделеното време и за това, че се опитваш да ме/ни научиш на нещо полезно. Вече съм няколко идеи по-потготвен за курса и за напред - не се знае дали новата година няма да работя като PHP 'програматор'.
Аз винаги съм бил на мнението, че трябва да свикваме с добрите практики още в началото, защото веднъж свикнеш ли с нещо, трудно се отвиква. Това escape-ване със сигурност се прави при всички web apps, които приемат информация от потребителя. Дори да не пиша на php, ще си имам 1 наум, че някога някой ми е споменал нещо за post и get данните!
Примерният ти код ми показа също, че не само for цикли могат да се пишат без къдрави скоби. Направи ми впечатление дефиницията на масивите - в private променливата я инициализираш със [], а в конструктора с array() (default-на стойност, предполагам). Вече имам още неща, за които трябва да прочета.