Loading...
RoYaL avatar RoYaL Trainer 6849 Точки
Best Answer

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>";

 

 

1
VenelinGrozev avatar VenelinGrozev 130 Точки

RoYaL, искам да питам нещо във връзка с четенето на данни от формите.

Ползвам NetBeans и когато се опитам да получа входа директно през глобалната променлива $_GET NB ме предупреждава да не правя така а да ползвам filter_input() функцията.

Предполагам, че за курса няма проблем да си четем директно през $_GET или $_POST. В практиката обаче ползва ли се  filter_input() ?

Последно така направих една от задачите

$inputMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING);
$userName = filter_input(INPUT_GET, 'fullName');
$userAge = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_FLOAT);
$userSex = filter_input(INPUT_GET, 'sex');
0
RoYaL avatar RoYaL Trainer 6849 Точки

В темата за домашното от 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...) :)

 

1
01/12/2014 11:18:14
a.angelov avatar a.angelov 1316 Точки

Имам и аз един въпрос.

Как е по-правилно да се escape-ва изхода - с htmlentities или htmlspecialchars?

За разликата между тях прочетох вече в интернет, но кое е препоръчително да се ползва?

1
JuliaS avatar JuliaS 32 Точки

Здравей,

доколкото виждам в нашия курс не са качени задачите за домашни за PHP формите.  Взимаме ги от стария курс ли, дали ще са същите задачи? И аз се чудех дали да започвам да ги правя оттам....

1
a.angelov avatar a.angelov 1316 Точки

Предполагам ще са същите, само ще има добавени изпитни задачи. Поне при досегашните курсове така е било.

1
ibakyrdjiev avatar ibakyrdjiev 172 Точки

То до сега винаги са били еднакви с по-стария курс. Дори да са различни пак е плюс че сме решили повече. Можеш да направиш и туториала в codeacademy. Лично на мен много ми помогна.

0
JuliaS avatar JuliaS 32 Точки

Добре ще погледна, благодаря :)

 

Edit: "Можеш да направиш и туториала в codeacademy" - кой по-точно имаш предвид?

0
01/12/2014 11:11:02
a.angelov avatar a.angelov 1316 Точки

Ето моите решения по темата /без задачата със звездичка/:

GITHUB

1
05/12/2014 11:37:04
RosenKrumov avatar RosenKrumov 203 Точки

Здравей,

Гледам ти валидацията на CV Generator, понеже и аз сега я мъча, и не можах да разбера защо само на последния if имаш ! отпред. Не трябва ли на всяко едно да ти е удивителния, не съм запознат с начина, който използваш, но доколкото гледам, не трябва ли, ако върне true да означава, че е правилен input-a на всяко едно поле. Просто не можах да разбера самата логика, ще се радвам да ми обясниш :)

0
01/12/2014 21:46:02
a.angelov avatar a.angelov 1316 Точки

Здравей,

логиката ми е следната:

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.

Комбинацията ^ ... $ служи за търсене на съвпадение в целия ред/инпут наведнъж - източник

Дано съм го обяснил разбираемо.

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

ПС. Дано работи коректно..., уж го тествах...

1
01/12/2014 22:26:28
RosenKrumov avatar RosenKrumov 203 Точки

Разбрах те напълно, доста добре го обясни, благодаря ти. Не разбирам иначе защо не би работило, така че не се притеснявай. :)

1
RosenKrumov avatar RosenKrumov 203 Точки

Ето и моето домашно (без звездичката) :

Github

Съвети и забележки са добре дошли :)

Изникна ми един въпрос от чисто любопитство. До сега не съм обръщал внимание на това, но [A-z] не би ли работило по същия начин като [A-Za-z]. Защото го пробвах и работеше, но няма как да знам за абсолютно всички случаи. Ако някой има отговор на този въпрос, нека сподели.

1
01/12/2014 22:35:58
ibakyrdjiev avatar ibakyrdjiev 172 Точки

май не е на всички езици. По-добре си вързвай гащите :)

 

1
quickben avatar quickben 966 Точки

[A-z] "хваща" и малко символи който седят между главните и малките букви в ASCII таблицата, затова както отбеляза колегата е най-добре да играеш насигурно с  [A-Za-z] :)

1
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Ето и моите решения Линк.

Има още какво да се оправя, но като цяло резултатите са задоволителни. :D

2
martin_n_marinov avatar martin_n_marinov 26 Точки

Мерси колега златните 4 реда :

$html = file_get_contents("http://www.w3schools.com/tags/");
$regex = "/<td.*><a.+>(.+)<\/a><\/td>/";
$result = [];
preg_match_all($regex, $html, $result);

1
quickben avatar quickben 966 Точки

Хора след като написах около 100 реда отвратителен "код" за да направя бутоните да добавят нужните html елементи на задача №5 искам да споделя едно хубаво, кратко и разбираемо решение. -> ЦЪК

 
1
03/12/2014 22:10:38
quickben avatar quickben 966 Точки

Ето и моето животно -> ЦЪК

0
a.polyanska avatar a.polyanska 107 Точки

Здравейте,

Имам известен проблем с брояча на тагове. Работи коректно, но при първото въвеждане на данните ми изкарва :

Notice: Undefined index: count in C:\xampp\htdocs\Homeworks\Homework_03\04_HTMLTagsCounter.php on line 31
 

Пробвах наслуки някакви размествания в кода, но не постигнах нищо, а и да бях не съм сигурна щях ли да разбера защо. Някой има ли идея от къде идва това съобщение? Ето кода: тук

2
05/12/2014 01:11:13
ibakyrdjiev avatar ibakyrdjiev 172 Точки

Здравей, пробвах кода, даде и при мен същатата грешка. 

Отделих ти index-a от PHP кода, което е добра практика и всичко се оправи. Не е добра практика да пишеш PHP в html-a.

ето как изглежда при мен и върви.

PHP:  цък

HTML: Цък

Виж при теб дали ще работи :) 

Току що пак разцъках кода ти и като премахна <br /> и всичко си идва на мястото. Явно има проблеми като пишеш PHP в HTML и ползваш html тагове в кода при echo :) за това ги разделяй :)

1
05/12/2014 08:37:55
a.angelov avatar a.angelov 1316 Точки

При мен не дава никаква грешка и си работи нормално кода... smile

1
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки
  1. $_SESSION['count'] = 0;
  2.  
  3. if(isset($_GET['tag'])) {
  4.  
  5.     session_start();

Първо зануляваш променливата в сесията, а после стартираш самата сесия... Докато ползваш сесии, слагай 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. Идеята е веднъж щом я занулим, да не го правим отново до края на сесията.

1
05/12/2014 16:21:30
velio84 avatar velio84 241 Точки

Ето ги моите решения

CV Generator-а доста време и нерви ми изяде. Първо като натисках бутона Add за добавяне на нови полета за езици, новото поле се появяваше за части от секундата и изчезваше. На втория ден проби прегледах решенията и видях от RoseKrumov, че на бутона след викането на JS функцията в onclick е добавил и 2 магически думи - "return false;" В последствие и ми обясни какво правят, благодаря за което :)

Накрая се сблъсках и с проблем при валидацията на регекса за езика 28-31 ред в този файл - пробвах различни варианти, но целия скрипт просто спира да се зарежда. Ще се радвам, ако някой може да ми каже какъв е проблема.

1
a.angelov avatar a.angelov 1316 Точки

Сигурен ли си, че си качил последния писан код?

В html файла div-a с езиците е празен и съответно никъде нямаш поле с name="langLevels" - и затова валидацията ти за езика няма как да мине - просто няма такъв масив който да обходи и провери.

0
velio84 avatar velio84 241 Точки

Полетата за езици се добавят от javascript файла, след като се натисне съответния бутон (първото поле се генерира автоматично с извикване на фунцията за добавяне от html-a, ред 37 и 47).

input-а 'langLevels[]' е в js файла на 26 ред

0
07/12/2014 11:02:43
a.angelov avatar a.angelov 1316 Точки

Ох да, аз не го погледнах него :)))

Я пробвай в js-а: name=langLevels[] - нямаш кавички около langLevels[] -> name='langLevels[]'

1
07/12/2014 11:07:31
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Това са моите решения на задачите:

GITHUB

DEMOS

На 5-та задача CVGenerate малко промених начина на добавяне и премахване на езици, като го направих да може да се премахва конкретно поле, а не само последното. Направих и полетата с Prog. Language и Language да не са задължителни и в такъв случай в таблицата изкарва за тях "-". Всички option-и на select ги генерирам с php код и масиви. 

P.S. Суперхостинг дава syntax error на всички файлове, в които има инициалиран масив чрез []. Вместо това иска array().

 

0
08/12/2014 21:54:21
a.angelov avatar a.angelov 1316 Точки

По отношение на инициализиране на масиви с [] - най-вероятно е от версията на 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...

0
07/12/2014 19:04:37
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.