PHP - Optimalizácia funkcie (kontrola vstupu)

Programovacie jazyky, rady, poradňa...
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa weroro »

Ahoj, napísal som si funkciu, ktorú vo veľkom používam a zaujímalo by ma, či v nej mám vychytávať ešte nejaké muchy.

Kód: Vybrať všetko

function gv ($varName, $intTest = 0, $arrayKey = '') {
    // . GET
    // # POST
    // ! SESSION
    $name = substr($varName, 1);
    if (strpos($varName, '#') === 0) $return = (!empty($_POST[$name])) ? trim($_POST[$name]) : false;
    else if (strpos($varName, '!') === 0 && !empty($arrayKey)) $return = (!empty($_SESSION[$name][$arrayKey])) ? trim($_SESSION[$name][$arrayKey]) : false;
    else if (strpos($varName, '!') === 0) $return = (!empty($_SESSION[$name])) ? trim($_SESSION[$name]) : false;
    else if (strpos($varName, '.') === 0) $return = (!empty($_GET[$name])) ? trim($_GET[$name]) : false;
    if ($return && $intTest === 1) $return = (is_numeric($return)) ? $return : false;
    if ($return && $intTest === 0) $return = (!empty($return)) ? $return : false;
    return $return;
}
Často totiž používam zápisy v tvare:

Kód: Vybrať všetko

$var = (!empty($_POST['nazov'])) ? $_POST['nazov'] : false;
alebo

Kód: Vybrať všetko

$var = (!empty($_POST['nazov']) && is_numeric($_POST['nazov'])) ? $_POST['nazov'] : false;
a to isté aj pre $_GET a $_SESSION a tak som si to chcel uľahčiť.
Teraz mi stačí miesto

Kód: Vybrať všetko

$var = (!empty($_POST['nazov'])) ? $_POST['nazov'] : false;
dať toto

Kód: Vybrať všetko

gv('#nazov');
alebo miesto

Kód: Vybrať všetko

$var = (!empty($_POST['nazov']) && is_numeric($_POST['nazov'])) ? $_POST['nazov'] : false;
dať toto

Kód: Vybrať všetko

gv('#nazov', 1);
znaky na začiatku názvu mám určené podľa logiky CSS kde znak v tomto prípade
  • . určuje niečo často používané ($_GET)
  • # určuje niečo silnejšie ($_POST)
  • ! (v css important) a určuje niečo čo sa nezničí po refreshe stránky ($_SESSION)
Je ešte niečo čo by v tej funkcii nemalo chýbať? Veci ako escapovanie a pod, tam pchať nechcem, to si ošetrím mimo funkciu (v jej výstupe).
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa sharky-no »

mozno toto by ti mohlo usetrit troska kodu http://php.net/manual/en/reserved.variables.request.php

post,get,cookie by si mal v jednej systemovej premenej.. a teda mal by si nejaku podmienku if($_REQUEST['name']) ktora keby nie je splnena tak este pozries ci sa nenachadza v $_SESSION, a tym padom by si nemusel pouzivat . # !

nemusi ti to vsak vyhovovat, je to len napad :)
S-player
Light Star
Light Star
Príspevky: 277
Registrovaný: 23 júl 2011, 22:30

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa S-player »

Opäť trošku kritiky z mojej strany. Pevne verím tomu ,že dojde aspoň k nejakému pochopeniu a nebudem tu opäť za debila.

- Nieje mi jasne čo chceš optimalizovať na vyššie zverejnenej funkcii. Rýchlosť, dĺžku kódu alebo jeho čistotu?
- Je super ,že tvoja funkcia zaberá 13 riadkov aj s komentármi ,ale ten bordel sa nedá čítať.
- Názov funkcie "gv" tak to snáď nemyslíš vážne.
- . určuje triedu a # určuje id. Podľa mňa je ,ale absolútne od veci ťahať do .PHP tieto znaky. Nehovoriac o tom ,že komentáre slúžia na iné veci než takéto vysvetľovačky. O čo ide, to by malo byť jasné hneď z daných podmienok.

Osobne si myslím ,že celá táto funkcia je nesprávna a trebalo by ju kompletne prerobiť. Prikladám však nejaké "vylepšenie" z mojej strany možno ti kúsok pomôže (Som dosť unavený, čekni a daj mi vedieť či som na niečo nezabudol). Netestoval som to no prakticky by to malo byť o čosi rýchlejšie než to tvoje riešenie už len kvôli tomu ,že nevolám v každej podmienke strpos().

Kód: Vybrať všetko

<?
function gv ($varName, $intTest = 0, $arrayKey = '') {
    $name = substr($varName, 1);

    switch($varName[0])
    {
        case ".": // GET
              $return = (!empty($_GET[$name])) ? trim($_GET[$name]) : false;  // Ešte by som sa trochu pohral s týmito podmienkami
        break;

        case "#": // POST
            $return = (!empty($_POST[$name])) ? trim($_POST[$name]) : false;
        break;

        case "!": // SESSION
            if(!empty($arrayKey))
                $return = (!empty($_SESSION[$name][$arrayKey])) ? trim($_SESSION[$name][$arrayKey]) : false;
            else
                $return = (!empty($_SESSION[$name])) ? trim($_SESSION[$name]) : false;
        break;

        default:
            $return = false;
    }


    /* Pokiaľ preferuješ takúto krátku alternatívu tak ju tu máš ,ak to chceš mať ,ale zrozumitelnejšie tak by som ti odporúčil to prepísať. *Zmenil by som aj názov premennej $return */

    return ($return && (($intTest && is_numeric($return)) || (!$intTest && !empty($return)))) ? $return : false;
}
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa audiotrack »

bolo by užitočné rozšíriť tú funkciu o ďalší (nepovinný) parameter ktorý hodnotu nastaví ak nie je nastavená. Vrátiť false mi tiež nepríde moc optimálne, lebo potom nevieš rozšíriť medzi nenastaveným parametrom, a nastaveným na hodnotu false. Čo je dosť rozdiel (Príklad: nejaká funkcia ktorá je defaultne zapnutá, napr. newsletter. Pošlem parameter že ho nechcem využívať, teda newsletter=false. Ty teraz nevieš či som poslal false a máš ju vypnúť, alebo som neposlal nič a je teda defaultne naďalej zapnutá.). Skús sa inšpirovať funkciou ktorá sa používa v phpbb: https://wiki.phpbb.com/Function.request_var

btw:
! (v css important) a určuje niečo čo sa nezničí po refreshe stránky ($_SESSION)
veď ani $_GET sa po refreshe nestratí :) A či sa stratí alebo nie $_POST rozhoduje užívateľ, ak klikne "znova odoslať" tak sa tiež nestratí
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8220
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa harrison314 »

Mne tiez cela koncepcia nepride najstanejsia,
Najme ten znak na zaciatku a tiez to ze jedna funkcia dokaze vracat viac typov (viem, ze sa to spociatku zda ako sikovne, ale neskor budes nadavat).
Ked sa neskor na to pozries v kode a uvidis $a=gv($b) nebudes mat sajn co to robi.
Ja by som to rozdelil do samostatnych funkcii pre cisla, retazce a subory, kde by bol jeden argument ci ide o GET, POST, SESSION, dalsi nazov a treti defaultna hodnota, ak nebude uvedena hodis exception.
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa jorg22 »

Mne sa tiez zda tato funkcia nevhodna ale skusil som ju optimalizovat. Aby bola prehladnejsia, kratsia, univerzalnejsia a rychlejsia.

Kód: Vybrať všetko

$req = array('.' => $_GET,'#' => $_POST,'!' => $_SESSION);
function gv($varName, $intTest = false, $arrayKey = false){
	global $req;
	$name = substr($varName, 1);
	$var = $req[$varName[0]][$name];
	$var = $arrayKey !== false ? (isset($var[$arrayKey]) ? $var[$arrayKey] : false) : $var;
	$var = trim($var);

	$var = $intTest ? (is_numeric($var) ? $var : false) : $var;	
	
	if( empty($var) ) return false;
	
	return $var;
}
Testy som robil na premennej GET v cykle 100 000 krat.

Tvoja funkcia(753 znakov):

Kód: Vybrať všetko

Time: 0.320631980896 s
Moja funkcia(421 znakov):

Kód: Vybrať všetko

S kontrolou cisla:
Time: 0.22513008117676 s
Bez kontroly:
Time: 0.18720483779907 s
Nevyhodou mojej funkcie je ze pouziva globalnu premennu $req koli zvyseniu rychlosti.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa audiotrack »

:D táto téma naberá na obrátkach. Mala by sa čítať od konca k začiatku, lebo čím ďalej tým väčšie zverstvá tu pribúdajú. Akože tou globálnou premennou to je zabité, uvidíme či to ešte niekto prekoná
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa jorg22 »

No tak audiotrack :D daj nieco konstruktivne. Preco je to zle a ako by to bolo lepsie?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8220
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa harrison314 »

jorg22 napísal:No tak audiotrack :D daj nieco konstruktivne. Preco je to zle a ako by to bolo lepsie?
Globalna premenna je zla, lebo je to globalna premenna a je vsade, to je fuj, presny opak OOP. Ja vo svojich projektoch mam iba 3 funkcie : __autoload, a dve funkcie, ktore davam ako argument pre zalogovanie neodchytenych exceptions a chyb.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa audiotrack »

1) samotná globálna premenná - spoliehaš sa na ňu. Ak si niekto vytvorí pole, nemôže ho pomenovať $req ak chce použiť tvoju funkciu. Nedajbože ak také má, bude všetko musieť prepisovať alebo musí zasahovať do tvojej funkcie.
2) $var = trim($var); je akože čo? Čo si ty boh, že mi ideš manipulovať s obsahom mojich premenných? Týmto by si dostal nejedného človeka do blázninca. Ak si chcem poslať v $_POST reťazec končiaci medzerou alebo enterom, tak nemáš najmenšie právo mi meniť moje premenné. Sú to znaky ako každé iné a ja ich tam CHCEM mať keď si ich tam posielam


konštruktívnu odpoveď som dal. Nech si pozre tú funkciu z phpbb. Je hlúpe sa naháňať za pár mikrosekúnd, keď to záleží od plno vecí (tvoj cyklus v skutočnosti nerobil to čo si myslíš že robil - tá funkcia sa ani z ďaleka nevykonala 100 000krát)
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa jorg22 »

Ok mas pravdu, snazil som sa zefektivnit funkciu za kazdu cenu a ponechat jej povodnu funkcionalitu.

Ale este ma zajima preco si myslis ze sa ta funkcia nevykonala 100 000 krat ked som ju dal do cyklu?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP - Optimalizácia funkcie (kontrola vstupu)

Príspevok od používateľa audiotrack »

pretože php má optimalizačné metody, rovnako ako väčšina jazykov. A keďže tá funkcia nemá vedlajšie efekty (nemení žiadnu globálnu premennú od ktorej by závisela) a dostáva vždy rovnaké parametre (ak to máš v cykle volané 100 000 krát s rovnakými vstupmi) tak sa vykoná raz a potom už iba vracia nacachovaný výsledok. Kľudne si to skús, a uvidíš že druhé volanie je podstatne rýchlejšie ako prvé:

Kód: Vybrať všetko

<?php
$time = microtime(true);

	gv("test", true);

echo microtime(true)-$time;
echo '<br/>';
$time = microtime(true);

	gv("test", true);

echo microtime(true)-$time;
?>
Napísať odpoveď