Autor Zpráva
xlifer
Profil
Je nutné nebo doporučuje se v samostatném skriptu inicializovat proměnnou jako prázdnou? Příklad:

verze 1:

$text = ""; // inicializace?
$text .= "ahoj";
echo $text;


verze 2:

$text .= "ahoj";
echo $text;


Omlouvám se možná za stupid dotaz, ale docela mě zajímá názor na věc...

Osobně bych volil kód verze 2, protože pokud skript proběhne pouze jednou a před ani potom se proměnná text už nepoužívá, tak není riziko, že by se něcím naplnila nežádoucím.
Joker
Profil
xlifer:
Na co je tam to spojování?
$text = "ahoj"; 
echo $text; 

Ta otázka mi přijde nesmyslná, přece vždycky se do proměnné musí něco přiřadit předtím než se s ní pracuje.
Pokud se kód větví, jsem pro inicializaci, ušetří to potenciální problémy.
Příklad:
$text = "";
if($_GET["a"] == "b")
{
  $text = "ahoj";
}
echo($text);
Alphard
Profil
Joker:
Ta otázka mi přijde nesmyslná, přece vždycky se do proměnné musí něco přiřadit předtím než se s ní pracuje.
Ten příklad je hodně jednoduchý, ale typicky při plnění v cyklu vždy před cyklem dávám $text = ""; a pak už jen $text.="..."; (pokud není vhodnější plnit a pak spojit pole, ale v tom případě nejdřív vytvořím pole). Takže jsem pro variantu 1.
xlifer
Profil
Alphard:

Díky za názor a varianta 1 mi přijde asi i přehlednější.
xlifer
Profil
Joker:

To spojování bylo myšleno tak, že se někde v průběhu běhu může něco přidat do $text, ale taky nemusí. Proto spojování.
vynalezce_
Profil *
Jsem rozhodně pro variantu 1.

Krom důvodů, které zde padly je tu ještě problém, pokud je na tvém hostingu nastaveno
register_globals ON

(To ti umožní přistupovat k hodnotě $_POST["asdf"] / $_GET... i přes $asdf)
Sice je to už defaultně vypnuté, ale na některých hostinzích (WebZdarma, IC,...) je to stále zapnuté....
Co vlastně hrozí?
Příklad:

login.php
<?
if($_GET["heslo"]=="Tajne_Heslo"){
    $vpusten="1";
}
if($vpusten=="1"){
    echo "tajny obsah";
}
?>


Co se ale stane, když zadám example.org/login.php?vpusten=1:
Interpreter:
Do proměnné vpusten ukládám hodnotu 1 z $_GET["vpusten"], <-- Za toto může register_globals ON.
Podmínka na řádku 2 není splněna, přeskakuji,
Proměnná vpusten MÁ hodnotu jedna => vypisuji "tajny obsah"....
jenikkozak
Profil
vynalezce:
Co vlastně hrozí?
Má to dva háčky:
1) Musíš do nápovědy hackerům napsat, že používáš proměnnou $vpusten.
2) Musíš psát ten skript tak hloupě, jak bylo uvedeno výše.
Co třeba
if($_GET["heslo"]=="Tajne_Heslo") //když je teda nutné tajné heslo posílat metodou get
{
echo "Tajnej obsah";
}
Majkl578
Profil
[#1] xlifer:
2. případ má jeden zásadní problém. Emituje E_NOTICE (Notice: Undefined variable: text).

Proměnné by se měly inicializovat vždy. Předejdeš tím výše zmíněnému problému s nedefinovanou proměnnou a zároveň budeš mít vždy jistotu nad tím, co v té proměnné je.

[#6] vynalezce, [#7] jenikkozak:
Problém s register_globals už není tak žhavý, jako před několika lety, jelikož verze 5.2 je už poměrně dlouho nepodporovaná, verze 5.3 byla vydána před dlouhou dobou a verze 5.4 (která mimochodem register_globals zcela odstraňuje) klepe na dveře a bude vydána ještě letos.
Pokud někdo používá hosting s povoleným/vynuceným register_globals, měl by ho okamžitě opustit.
Joker
Profil
Alphard:
typicky při plnění v cyklu vždy před cyklem dávám $text = ""; a pak už jen $text.="...";
Jo, to je pravda, v tomhle případě je to taky užitečné, stejně jako u větvení.

jenikkozak:
1) Musíš do nápovědy hackerům napsat, že používáš proměnnou $vpusten.
Založit bezpečnost aplikace na „On hacker stejně nebude vědět, že se ta proměnná jmenuje zrovna takhle“ se už pár programátorům dost vymstilo.

Navíc nejde jen o hackery. Další riziko neinicializování proměnných, zvláště u proměnných se jménem jako $text, je, že stejně pojmenovaná proměnná se už používá ve skriptu někde výše, případně později někdo o 200 řádků výš udělá úpravu a tu proměnnou zavede. A vůbec nejlépe v té proměnné něco bude jen za určitých podmínek, takže při testování na to nikdo nepřijde a na ostrém webu budou vznikat divné „náhodné“ chyby.

Další věc je: Je nějaký důvod to nedělat? Je to jeden řádek kódu, dopad na rychlost skriptu je nulový (resp. neměřitelný) a má to výhody popsané výše.
jara
Profil *
No mám asi podobný problém na eshopu jak píše Joker. Po nějaké době mě vypadne zboží z košíku. Vypadává nepravidelně po různě dlouhé době a tím vznikají divné náhodné chyby - viz. poslední příspěvek od Joker.

Mrknul byste se mě někdo na to za nějaký peníz?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0