[Homework] PHP Basics -Working with Forms - November 2014
Ето малко решения от мен. Всякакви съвети биха ми били полезни :)
5 - TO DO
6 - TO DO
Утре ще ги довърша че стана късно :)
Ето малко решения от мен. Всякакви съвети биха ми били полезни :)
5 - TO DO
6 - TO DO
Утре ще ги довърша че стана късно :)
if ($value != 1) {
echo "<p>$key: $value times</p>";
} else {
echo "<p>$key: $value time</p>";
}
Това ако само "s"-то му е разликата, няма нужда да го преповтаряш постоянно.
По-скоро бих си го представил нещо такова
echo "<p>$key: $value time" . ($value != 1 ? 's' : '') . "</p>";
Здравей,
доколкото виждам в нашия курс не са качени задачите за домашни за PHP формите. Взимаме ги от стария курс ли, дали ще са същите задачи? И аз се чудех дали да започвам да ги правя оттам....
Предполагам ще са същите, само ще има добавени изпитни задачи. Поне при досегашните курсове така е било.
То до сега винаги са били еднакви с по-стария курс. Дори да са различни пак е плюс че сме решили повече. Можеш да направиш и туториала в codeacademy. Лично на мен много ми помогна.
Добре ще погледна, благодаря :)
Edit: "Можеш да направиш и туториала в codeacademy" - кой по-точно имаш предвид?
Здравей,
Гледам ти валидацията на CV Generator, понеже и аз сега я мъча, и не можах да разбера защо само на последния if имаш ! отпред. Не трябва ли на всяко едно да ти е удивителния, не съм запознат с начина, който използваш, но доколкото гледам, не трябва ли, ако върне true да означава, че е правилен input-a на всяко едно поле. Просто не можах да разбера самата логика, ще се радвам да ми обясниш :)
Здравей,
логиката ми е следната:
1. За first name, last name, company name търся забранените символи: примерно за имената - [^A-Za-z] - т.е. тук търся символ различен от букви. Затова в проверките по-долу нямам ! пред filter_var. Символа ^ означава в случая - намери ми символ с изключение на тези, които са изброени след него - източник
2. За email го правя на обратно - търся точно да match-не позволените символи в правилната поредност: ^[A-Za-z0-9]+@[A-Za-z0-9]+\.[A-Za-z]+$ и затова проверката ми е с ! пред filter_var.
Комбинацията ^ ... $ служи за търсене на съвпадение в целия ред/инпут наведнъж - източник
Дано съм го обяснил разбираемо.
Не ме питай защо не съм го направил еднакво при всички случаи - доста се изтормозих да разбера как да го направя и оставих първия работещ вариант, който успях да измисля :)
ПС. Дано работи коректно..., уж го тествах...
Разбрах те напълно, доста добре го обясни, благодаря ти. Не разбирам иначе защо не би работило, така че не се притеснявай. :)
Ето и моето домашно (без звездичката) :
Съвети и забележки са добре дошли :)
Изникна ми един въпрос от чисто любопитство. До сега не съм обръщал внимание на това, но [A-z] не би ли работило по същия начин като [A-Za-z]. Защото го пробвах и работеше, но няма как да знам за абсолютно всички случаи. Ако някой има отговор на този въпрос, нека сподели.
май не е на всички езици. По-добре си вързвай гащите :)
[A-z] "хваща" и малко символи който седят между главните и малките букви в ASCII таблицата, затова както отбеляза колегата е най-добре да играеш насигурно с [A-Za-z] :)
Ето и моите решения Линк.
Има още какво да се оправя, но като цяло резултатите са задоволителни. :D
Мерси колега златните 4 реда :
$html = file_get_contents("http://www.w3schools.com/tags/");
$regex = "/<td.*><a.+>(.+)<\/a><\/td>/";
$result = [];
preg_match_all($regex, $html, $result);
Хора след като написах около 100 реда отвратителен "код" за да направя бутоните да добавят нужните html елементи на задача №5 искам да споделя едно хубаво, кратко и разбираемо решение. -> ЦЪК
Здравейте,
Имам известен проблем с брояча на тагове. Работи коректно, но при първото въвеждане на данните ми изкарва :
Notice: Undefined index: count in C:\xampp\htdocs\Homeworks\Homework_03\04_HTMLTagsCounter.php on line 31 |
---|
Пробвах наслуки някакви размествания в кода, но не постигнах нищо, а и да бях не съм сигурна щях ли да разбера защо. Някой има ли идея от къде идва това съобщение? Ето кода: тук
Здравей, пробвах кода, даде и при мен същатата грешка.
Отделих ти index-a от PHP кода, което е добра практика и всичко се оправи. Не е добра практика да пишеш PHP в html-a.
ето как изглежда при мен и върви.
PHP: цък
HTML: Цък
Виж при теб дали ще работи :)
Току що пак разцъках кода ти и като премахна <br /> и всичко си идва на мястото. Явно има проблеми като пишеш PHP в HTML и ползваш html тагове в кода при echo :) за това ги разделяй :)
При мен не дава никаква грешка и си работи нормално кода...
Първо зануляваш променливата в сесията, а после стартираш самата сесия... Докато ползваш сесии, слагай session_start() на първия ред във файла, което ще те подсигури, че по-надолу в кода няма да имаш проблеми със $_SESSION['whatever']. След това можеш да провериш дали имаш 'count' и ако нямаш - тогава създаваш и зануляваш. Също така isset проверява дали съществува такова пропърти в асоциативния масив, но ако това пропърти държи празен стринг? Добре е и да сложиш едно !empty($_GET['tag']). За сесията можеш да го направиш с
session_start();
if (!isset( $_SESSION[ 'count' ] )) {
$_SESSION[ 'count' ] = 0;
}
if (tag is valid) {
$_SESSION[ 'count' ] += 1;
}
забележи, че съм сложил session_start() преди да използвам специалната променлива $_SESSION
Проверката дали имаме 'count' я правим, защото ако зануляваме 'count' всеки път, ще имаме проблеми с брояча и никога няма да покаже повече от 1. Идеята е веднъж щом я занулим, да не го правим отново до края на сесията.
CV Generator-а доста време и нерви ми изяде. Първо като натисках бутона Add за добавяне на нови полета за езици, новото поле се появяваше за части от секундата и изчезваше. На втория ден проби прегледах решенията и видях от RoseKrumov, че на бутона след викането на JS функцията в onclick е добавил и 2 магически думи - "return false;" В последствие и ми обясни какво правят, благодаря за което :)
Накрая се сблъсках и с проблем при валидацията на регекса за езика 28-31 ред в този файл - пробвах различни варианти, но целия скрипт просто спира да се зарежда. Ще се радвам, ако някой може да ми каже какъв е проблема.
Сигурен ли си, че си качил последния писан код?
В html файла div-a с езиците е празен и съответно никъде нямаш поле с name="langLevels" - и затова валидацията ти за езика няма как да мине - просто няма такъв масив който да обходи и провери.
Полетата за езици се добавят от javascript файла, след като се натисне съответния бутон (първото поле се генерира автоматично с извикване на фунцията за добавяне от html-a, ред 37 и 47).
input-а 'langLevels[]' е в js файла на 26 ред
Ох да, аз не го погледнах него :)))
Я пробвай в js-а: name=langLevels[] - нямаш кавички около langLevels[] -> name='langLevels[]'
Това са моите решения на задачите:
На 5-та задача CVGenerate малко промених начина на добавяне и премахване на езици, като го направих да може да се премахва конкретно поле, а не само последното. Направих и полетата с Prog. Language и Language да не са задължителни и в такъв случай в таблицата изкарва за тях "-". Всички option-и на select ги генерирам с php код и масиви.
P.S. Суперхостинг дава syntax error на всички файлове, в които има инициалиран масив чрез []. Вместо това иска array().
По отношение на инициализиране на масиви с [] - най-вероятно е от версията на PHP, която се поддържа от хостинга:
As of PHP 5.4 you can also use the short array syntax, which replaces array() with []. - източник
ПС. Хм, гледам че хостинга поддържа PHP 5.2 / 5.3 / 5.4 / 5.5 / 5.6...
RoYaL, искам да питам нещо във връзка с четенето на данни от формите.
Ползвам NetBeans и когато се опитам да получа входа директно през глобалната променлива $_GET NB ме предупреждава да не правя така а да ползвам filter_input() функцията.
Предполагам, че за курса няма проблем да си четем директно през $_GET или $_POST. В практиката обаче ползва ли се filter_input() ?
Последно така направих една от задачите
В темата за домашното от PHP Syntax обясних един много лек пример за това как горе-долу се ползват суперглобалните в съвремието.
Краткият отговор на твоя въпрос е: не.
Малко по-задълбочената му версия ще разгледа 3 от най-нашумелите Frameworks в света на РНР. Symfony, Laravel и Yii.
За всеки един от тях съм изкарал главния файл, който се занимава с Request-а:
Symfony:
https://github.com/symfony/symfony/blob/d277c16a2740b8cd3df315df5ccbdfe35cab70ce/src/Symfony/Component/HttpFoundation/Request.php
Laravel:
(ползва request handler-а на Symonfy - vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php)
Yii:
https://github.com/yiisoft/yii2/blob/master/framework/web/Request.php
Общо взето никой от трите (двата) не използва filter_input(). Имат си техни начини за справяне с нещата. Както можеш да забележиш от сорса, който съм линкнал, си предават параметрите рпез различни функции, създават серия от обекти с тях, валидират ги с регюлър експрешъни и прочие прочие къстъм логики.
filter_input() е ограничена функция до серия филтри, които РНР са сметнали за най-често използвани. За съжаление и с доста неудобно API, защото според зададен филтър, можеш да задаваш събфилтри, но нямаш например някакво автоматично предложение какво да зададеш на FILTER_SANITIZE_STRING например. По дефолт ще стрипне таговете, което може да не е желания бихейвиър.
За "домашни" проекти от друга страна е удобен. Ако не смяташ да ползваш някакъв фреймуърк, който да абстрактва това (както в примерите по-горе), то filter_input би бил един нелош вариант. Един лейър абстракция повече е от това ръчно да аплайваш htmlspecialchars, strip_tags, etc..
За съжаление има един друг проблем и той вече навлиза в неконсистентността на РНР. От документацията "return" на "filter_input()":
Value of the requested variable on success, if the filter fails, or if the variable is not set. If the flag is used, it returns if the variable is not set and if the filter fails.
Явно има някакъв вариант, в който филтърът може да фейлне. Не е описан какъв е и трябва да живееш с това. Т.е. описан е... за всеки филтър по отделно. Проблемът на абстракцията тук е, че всеки неин под-лейър може да фейлне по различен начин. И това нито ще резултира в ексепшън, нито ще върне оригиналната променлива, а ще върне FALSE. Със сигурност не искаме FALSE от user-input-а. Нито пък NULL (учудващо, има опция, която да превърне при фейл FALSE-а в NULL?!)
Та, да се върна на тази инконсинтентност. Този филтър ще ти позволи много трудно по-високо ниво абстракция. Трябва да си много конкретен. В един от коментарите в по-гореспоменатата документация пише следното:
If your $_POST contains an array value:
<?php
$_POST = array(
'var' => array('more', 'than', 'one', 'values')
);
?>
you should use FILTER_REQUIRE_ARRAY option:
<?php
var_dump(filter_input(INPUT_POST, 'var', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY));
?>
Otherwise it returns false.
Т.е. трябва да си абсолютно наясно например, че някое от полетата ти е да речем масив (примерно, с име name[]) за да аплайнеш FILTER_REQUIRE_ARRAY, иначе... false :)Така, че моята лична препоръка е в момента, в който излезеш от рамките на курса и решиш да пишеш РНР, да разгледаш някой от готовите вече фреймуърци, примерно тези трите които споменах, върпеки че има поне още 5 които си струват да се погледнат (phalcon, CakePHP, CodeIgniter, ZendFramework...) :)
Имам и аз един въпрос.
Как е по-правилно да се escape-ва изхода - с htmlentities или htmlspecialchars?
За разликата между тях прочетох вече в интернет, но кое е препоръчително да се ползва?