Софтуерно Инженерство
Loading...
+ Нов въпрос
Valleri avatar Valleri 292 Точки

[Homework] PHP Basics - PHP Forms

Здравейте, 
поствам моите решения на домашното и тъй като е доста сложничко със сигурност има какво да дооправя, ще се радвам на предложения. Не съм правил валидация на входа за скриптове, надявам се да няма хакери от проверяващите.


1. Print tags - Solution
2. Most Frequent - Solution - Тук доста се измъчих с сортирането по стойност, според мен е малко по-объркано от JavaScript и може и да не е оптимално.
3. Calculate Intereset - Solution
4. HTML Tag Counter - Solution - Сигурно има по-добър начин да се извадят всички тагове, например с JavaScript, но видях доста зор с това, макар че стигнах доста напред в конзолата на Хрома, но се отказах и ги хардкоде.
5. CV Generator - Solution - Play at PHPFiddle
6. Combo Box - Solution - Play at PHPFiddle

 

Тагове:
12
PHP Web Development Basics 17/08/2014 00:29:38
kiko144 avatar kiko144 SoftUni Team 795 Точки

Здравей, на 2-ра задача PHP Има една много яка функция, която обхожда масива и ти връща всяка една стойност колко пъти я има (връща друг арей). След това можеш да намериш максимума на този масви и задачата ти е решена :) Ето малко нагледно как изглежда :

$tags = explode(", ", $_POST['tags']); // Сплитва масива по запетайка и разстояние
$c = array_count_values($tags); // функцията за която става въпрос - връща масив
$val = array_search(max($c), $c); // намираме макса на масива
arsort($c); // сортираме го по стойност
foreach ($c as $key => $value) {
echo "$key : $value times <br>"; // след това го принтим в този ред
}
echo "<p>Most Frequent Tag is: $val </p>"; // и изкарваме този таг, който е с най-много повторения

Може също да вземеш първият елемент на масива след като си го сортирам, а да не търсиш макс.

32
15/08/2014 23:22:23
StanDimitroff avatar StanDimitroff 90 Точки

Наистина тези функции са много полезни и в документацията са добре обяснени.Аз съм решил задачата почти по същия начин, само добавям една проверка дали всички тагове не са въведени само по веднъж. Pastebin

1
petrovaliev95 avatar petrovaliev95 359 Точки

Здравейте и от мен. Аз го реших по един по различен начин с 2 масива, но като прави проверката и види, че масив с такъв индекс не съществува ми дава NOTICE. Това бъг ли е или аз бъркам? ЕТО и sorce code.

0
a_rusenov avatar a_rusenov 1103 Точки

@petrovaliev95, прави проверката с (!isset($listOfTags[$key])) - така изглежда не дава notice, пък и е по-правилно да се ползва.

1
16/08/2014 11:34:23
BoniMislyashki avatar BoniMislyashki 36 Точки

Ето още едни решенияВърху 5та задача има още да се работи (валидацията не е напълно направена), но останалите задачи работят.

2
iordan_93 avatar iordan_93 SoftUni Team Trainer 407 Точки

Здравейте,

Ето ги и моите решения. Ще се радвам на коментари и критика :)

1. PrintTags - доста straightforward
2. Most Frequent Tag - използвам асоциативни масиви. Има готови функции, които броят срещанията на елементите, но аз предпочитам да си го направя ръчно (за упражнение smile)
3. Calculate Interest - използвам формулата за сложна лихва (която е сума на една аритметична прогресия tongue-out)
4. HTML Tags Counter - имам едно допълнение към условието (по-скоро нещо, което не е ясно, че се изисква на пръв поглед) - ако потребителят въведе таг, който е валиден, но вече го е написал преди това, се изписва, че тагът е валиден, но не увеличава точките. Аз си взех списъка с елементи от страницата на W3C с малко JavaScript
5. CV Generator - тук има няколко неща, които искам да отбележа (освен тези, които съм написал в коментарите).

Първо, валидацията трябва да се направи с PHP, не с JavaScript. Това е така, защото сървърът може да получи request не само от браузър, а и от много други програми (например Fiddler). Правилото е следното - валидация се прави задължително на сървъра (т. е. в PHP кода в случая) и по желание - и на клиента (в JS кода). Друго нещо, свързано с валидацията - добре е тя да е на отделно място (в отделна функция, или дори в helper клас). И без това PHP не е красиво като се смесва с HTML, още по-грозно е, когато валидацията е пръсната из целия формуляр. Разбира се, има и по-добри методи за това, има и библиотеки (jQuery unobtrusive validation е едно хубаво допълнение към валидацията в PHP). Още повече, че има frameworks, които автоматично правят валидацията по някакви зададени критерии.

Второ, малко по-интересно става, ако dropdown менютата се направят с PHP, а не с hardcoded стойности. Въпросът е, че става малко объркано - PHP код генерира JS код, който генерира HTML... script-ception laughing. Затова съм го оставил да работи така засега.

Трето, това е нещо, което мисля, че някои от нас пропускат - когато се приема повече от една стойност, в name на съответния input се слагат скоби като масив, например name="languages[]". Така когато има повече от едно input поле с name languages[], всички се добавят в $_POST["languages"]. Ако няма [], всяка следваща стойност презаписва тази преди нея.
6. Combo Box - стори ми се прекалено сложна, за да я решавам от нулата и реших малко да cheat-на tongue-out. За решаването на задачата съм използвал една много хубава JS библиотека (с която, между другото, работи и сайтът на SoftUni) - Kendo UI Core. Core версията не само е безплатна, но е и open source; ако някой намери бъг, може да го оправи. Решението изглежда доста кратко (две извиквания на функции в JavaScript-a и две функции в PHP-то), но трябва да призная, че ми отне около 4 часа да го накарам да прави това, което искам laughing.

Това, което се случва е следното - в PHP проверявам дали имам подаден query string continents и ако е така, извеждам континентите в JSON string, ако не - извеждам държавите, като id-тата при държавите отговарят на id-тата при континентите. Естествено, масивите са генерирани с малко JavaScript, домързя ме да търся други начини (този беше най-лесен - да си hardcode-на всичко в world.php).

В JavaScript-a (който е в index.html файла) имам две input полета, които със селектиране правя Kendo ComboBox-ове. В dataSource обекта се държат начините за показване на данни (за добавяне, четене, редакция и изтриване), а в transport - конкретните URL-и на ресурсите. dataTextField е полето от JSON обекта, чийто текст се визуализира в контролата (т. е. имената), а dataValueField е полето, чиято стойност се приема (т. е. ID-тата). cascadeFrom на втория combobox го кара да вземе стойността от първия, когато има избрана такава, да направи AJAX заявка към сървъра, да се напълни и да се покаже (като филтрира тези обекти, при които ID-то е равно на ID-то в първия combobox).

26
19/08/2014 10:59:37
patrik avatar patrik 26 Точки

Какъв е JavaScript кода за взимане на всички елементи?

0
Dominik avatar Dominik 82 Точки

Здравейте и от мен,

Може ли някои да асистира малко за 5-та задача , на 3-тата част със Computer skills след като генерирам с JS няколко полета после незная как да им взема стойностите :/ Успявам да взема само на 1-вото поле , причината е че другите получават по едно номерче залепено за имената им

e.g. да кажем че така изглежда 1-вото поле което приема стойност за даден език :

<input type="text" name="progLan" /> , следващото е ,

<input type="text" name="progLan1" /> и т.н. , при което ако ползвам $_POST['progLan'] после не успявам да взема стойностите за другите въведени езици. 

Доста неясно го обясних , но се надявам да сте разбрали каква ми е болката :)

Благодаря предварително.

Ето го и кода до момента цъК

0
17/08/2014 16:15:51
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Това го има обяснено на първата лекция, в която е засегната работата с форми.

Ако името на полето съдържа array нотацията [] всяко поле с това име ще се прибави към масив в рикуеста от това име

<input type="text" name="progLan[]" />

<input type="text" name="progLan[]" />

 

Съответно после можеш да извършиш foreach върху $_POST['progLan'] или да изведеш който си искаш конкретен елемент от него, примерно $_POST['progLan'][1] ще вземе 2рия елемент от тези двата.

0
17/08/2014 16:29:14
Dominik avatar Dominik 82 Точки

Ами опитах този вариант , но явно нещо не правя като хората защото пак не успява да ми изпринти стойностите след 1вото поле, направих един var_dump$_POST['progLan'][0] , var_dump$_POST['progLan'][1], var_dump$_POST['progLan'][2] и резултата беше че за [1] и [2] стойноста им беше null , а аз бях попълнил стойност в input box-a 

Ето го кода code , ако имаш минутка би ли го погледнал? Иначе да помня , че се обесняваха тези неща в лекциите , но не ми станаха много ясни , пък и съм онлайн и малко беше трудно да попитам :P

Явно проблема е в JS кода ми ,защото установих , че не хваща само динамично добавените инпут полета :(

0
17/08/2014 17:28:13
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Имаш един fieldset който е над формата. Вкараш го вътре във формата и нещата ще се оправят. Като е отвън, излиза че javascript-а адд-ва полета, но неги вкарва във формата, заради несемантичния начин на подредба на кода.

1
aslv1 avatar aslv1 304 Точки

Здравейте! Ето какво намерих, смятам, че е полезно за задачата със страните и континентите:

>> Resource <<

Последователно избираме от списъците:

  • 4) PHP Format as an array unserialized
  • 3) Grouped by continent regions (5)
  • английски

и после кликваме на бутона Update Countries List

Резултатът може да го вземем, като скролираме малко по-надолу smile или натиснем някой от бутоните Show Countries List или Download Countries List.

Надявам се да е полезно и да не съм ви обидил с твърде подробните обяснения laughing

Успех!

П. П.: Ето го и решението ми.

4
17/08/2014 18:07:13
zornitza_gencheva avatar zornitza_gencheva 28 Точки

Здравейте,

имам проблем с 2-ра задача. Когато поемам данните от текстовото поле задачата не работи, когато си създам тестов масив вътре с харкоднати стойности - работи, явно нещо не вземам както трябва масива. Цяла вечер се бъхтам върху това, ще съм много благодарна ако някой ми даде идея някаква:

http://pastebin.com/Z4v7igXi

0
18/08/2014 16:16:09
crazy7 avatar crazy7 177 Точки

Дали не е заради това?

echo "<form action='01_PrintTags.php' method='post'>"

0
anton_cholakov avatar anton_cholakov 88 Точки

Ако файлът е с друго име - да, от това е. А и мисля, че е по-добре да си напишеш формата като html, а не да е echo в php-то.

 

Лично аз (за домашните) оставям action-a празен, така или иначе php-to е в самия файл

0
zornitza_gencheva avatar zornitza_gencheva 28 Точки

Antoн и Crazy, много ви благодаря, реших си проблема, не съм инклудвала правилният php файл.

0
StanDimitroff avatar StanDimitroff 90 Точки

Айде и аз барабар Петко с мъжете laughing 

 

01.Print Tags

02.Most Frequent Tag

03.Calculate Interest

04.HTML Tags Counter

05.CV Generator

06.Combo Box -опитах се да я направя с една форма и два селекта и се получи. Благодаря на колегата aslv1 за споделения ресурс, доста помогна smile

Ще се радвам на ценни препоръки и забележки, особено за задача 5 smile

3
18/08/2014 22:50:10
ZvetanIG avatar ZvetanIG 917 Точки

Ето още един вариант на домашното.  CLICK

Задача 5 си e направо проект - HTML, CSS и JavaScript.  Цял ден загубих с нея и на края не издържах и оставих валидацията само в HTML.

8