A "Tanuljuk meg a PHP4 használatát 24 óra alatt" c. konyv alapján kezdtem el PHP-t tanulni.
Az első igazi PHP híváskor nem azt teszi amit kellene.
Van egy egyszerű ürlap HTML-ben amit egy php scripttel kellene feldolgozni (most csak kiíratni). Az űrlapot kitöltve a "rendben" gombra kattintva betöltődik a php script, de csak a fixen benne lévő szövegeket írja ki, a formról nem veszi át a változók (mezőnevek szerinti) tartalmát, azok üresek maradnak.
Ide másolom a HTML és a PHP script kódját is:
Az űrlapot létrehozó HTML-fájl:
<html>
<head>
<title>9.2. program Egy egyszerű HTML űrlap</title>
</head>
<body>
<form action="9.3.program.php" method="GET">
<input type="text" name="felhasznalo">
<br>
<textarea name="cim" rows="5" cols="40">
</textarea>
<br>
<input type="submit" value="rendben">
</form>
</body>
</html>
Az ürlapot feldogozni hivatott "9.3.program.php" fájl:
<html>
<head>
<title>9.3. program A 9.2. példa űrlapjának feldolgozása</title>
</head>
<body>
<?php
//A kovetkező két sor csak az újabb változóláthatóság esetén kell, amikor
//a php.ini -ben register_globals = Off áll.
//Az újabb PHP-knél ez az alapértelmezett !!!
$felhasznalo = $_GET['felhasznalo'];
$cim = $_GET['cim'];
print "Üdvözlet <b>$felhasznalo</b><P>\n\n";
print "A címe:<P>\n\n<b>$cim</b>";
?>
</body>
</html>
Tehát az a probléma, hogy a "rendben" gombra kattintva a "9.3.program.php" fájl ugyan betöltődik, de a $felhasznalo és a $cim változók nem veszik át a mezők tartalmát, így cak ennyi jelenik meg a képernyőn:
Üdvözlet
A címe:
Hol lehet a hiba?
(A könyv korábbi gyakorlatival nem volt gondom, objektumok, ciklusok, tömbbejárás, stb.., szépen működött, tehát a php értelmezőt használja a web-szerver. A szerveren CentOS fut.)
--------------------------
Útószó:
Mind a két megoldás működik:
- mogorva javaslata: "A php.ini -ben legyen ez: register_globals = On"
esetén a paraméterek a form mezőinek neve php-s változóként $felhasznalo használható a feldolgozást végző php scriptben.
- ventura megoldása ami az újabb PHP verziókban divatos azaz át kell venni a form mezőit: $felhasznalo=$_GET[felhasznalo]
A fenti kódot átírtam az utóbbi javaslat szerint, hogy aki megtalálja ezt a topikot, akkor az aktuális módit lássa:
- 3786 megtekintés
Hozzászólások
A php.ini -ben mi van?
ez: register_globals = On
vagy ez: register_globals = Off
Utóbbi lehet a jelenség oka. Így első ránézésre.
- A hozzászóláshoz be kell jelentkezni
Nagyon szépen köszönöm, ez volt a megoldás!
- A hozzászóláshoz be kell jelentkezni
Azért Off, mert úgy biztonságosabb, nem tudsz pl querystringből változót felülírni.
A kód amúgyis hibás, mert helyesen:
$_GET['felhasznalo'] és $_GET['cim']
figyelj az idézőjelre, mert asszociatív tömb, stringet vár indexnek.(najó, int-et is kaphat, de most asszociatívkodunk). Azért nem kaptál hibát, mert azt hitte a php, hogy konstans a felhasznalo meg a cim, s mivel nincs a konstansok között értékük, ezért üres string lett. a $_GET[''] -nek meg nincs értéke. Ergo üres stringet írt ki.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Ezt jó, hogy mondod! A doksiban aposztofokkal szerepel, de mert ventura kolléga így írta a példát ezt is kipróbáltam. Működött, tehát azt hittem, hogy egy fülösleges syntaktikai kikötés, amit szabadon kezel a php. De most, hogy írtad, használni fogom az aposztrofokat, jobb az elején megszokni a helyes alkalmazási módokat!
A példa kódban is javítottam.
Köszi.
- A hozzászóláshoz be kell jelentkezni
szia
register globals nál lesznek a gondok
mivel már kb. 4.0 ás php óta off van azt jelenti hogy máshogy kell
kezelni a változókat
azaz
a 9.3.program.php ben
$felhasznalo=$_GET[felhasznalo]
Celeron-M 1400Mhz, 768M, Debian SID, 2.6.18-rc7
- A hozzászóláshoz be kell jelentkezni
Neked is nagyon szépen köszönöm!
A register_globals = Off -ot visszaírva ez a "felhasznalo=$_GET[felhasznalo]" paraméter átvételes mód működik.
Ha azt mondod, hogy ez az új "szabvány", akkor inkább ezt használom.
- A hozzászóláshoz be kell jelentkezni
Nem csak szabvany, hanem biztonsagi szempontbol is ez az ajanlott.
- A hozzászóláshoz be kell jelentkezni
Egyszer vki elmagyarázhatná már, hogy mi ebben a biztonsági szempont.
Mert ez egy common para, mindenki visít mint a sziréna, de még senki nem tudta elmondani, hogy PONTOSAN milyen security problémákat okozhat és hogy MILYEN körülmények között.
- A hozzászóláshoz be kell jelentkezni
Küldök neki egy foo=bar párost, és a foo változójának már értéket is adtam. Szerintem...
- A hozzászóláshoz be kell jelentkezni
Mert ez ezt jelenti. B-)
A PHP tudtommal nem követeli meg a változók deklarációját.
Az ebből következő hibákat meg szerintem nem így kellene megoldani.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
nagyon egyszerű a dolog. register_globals = on esetén minden a klienstől kapott név=érték (get/post/cookie) a kód futásakkor létrejön és inicializálódik a megnevezett változó a kapott értékkel.
namármost ha van pl. egy olyan kódrész ahol nincs előre deklarálva az adott változó (v. mondjuk le tudod futtatni ha pl direkt file.php -val hivatkozol rá az url-ben) akkor te egy manipulált kéréssel kliens oldalról létrehozhatod azt és beállíthatod arra amire akarod, így befolyásolva a program további futtatását.
függően attól, h a hibás programrész mit és hogyan csinál ez eredményezhet mondjuk plusz jogosultság szerzését pl portálon belül, de ha mondjuk vmi külső progi futtatásról v. ilyesmiről van szó akkor máris sokkal kényesebb a dolog.
- A hozzászóláshoz be kell jelentkezni
$felhasznalo=$_GET["felhasznalo"]
(A $foo[bar] forma nem ajánlott.)
- A hozzászóláshoz be kell jelentkezni
Régen én is ezt a könyvet olvasgattam első lépésekben.
Javasolni tudom, hogy annyira ne rögzüljenek meg benned azok a gondolati, megoldási sémák, amiket ez a könyv ad. Anno jó volt, most már azért idejét múlta. Jobban jársz szerintem, ha php5 specifikus könnyvvel/leírással kezdesz és már az elejétől próbáld meg magadba erőszakolni az objektum orientált szemléletet, mert később sokkal nehezebb lesz az agyadat "átszoktatni" a struktúrált programozási szemléletről az objektum orientáltra.
Ezek csak tanácsok részemről.
Sok sikert és rengeteg kitartást!!!
___________________________________________________________________
Lógnak a pálmafán a kókuszok .... :)
- A hozzászóláshoz be kell jelentkezni
Na ez a másik. Objektum orientált php.
Kádárról senki nem hallott? A krumplileves legyen krumplileves.
Aki OO-zni akar, tanuljon JAVA-t.
- A hozzászóláshoz be kell jelentkezni
Szerintem az aki PEAR csomagokat, Smarty-t, ADODB-t, phpCake-et és még sorolhatnám milyen alkalmazást, CMS-t vagy keretrendszert használ, az szerintem tudja miért teszi.;-)
Sajnos sokan nagyon lenézik ezt a nyelvet és már lassan mindenki PHP programozónak születik. Ha hatékonyabban szeretnél PHP-ban fejleszteni esetleg csapatmunkában, akkor jobb, ha megbarátkozol a PHP OO lehetőségeivel is. :-)
- A hozzászóláshoz be kell jelentkezni
Ez most olyan mintha azt mondanád, hogy aki közlekedni akar vegyen Mercedes-t. Igenis LEHET használni a PHP OO lehetőségeit kis projekteknél, méghozzá hatékonyan.
- A hozzászóláshoz be kell jelentkezni
ROTFLMAOPIMP
2004 óta abban fejlesztgetem az oldalamat (=kis projekt) és felfordul a gyomrom tőle, egyszerűen _csak_ gányolni lehet. nem veszem észre, ha elírok egy változtót, rendes OO-t nem tud, és a legnagyobb baj: egy átlagosnak mondható oldalnál is nagyon sok objektumtípus jöhet létre, ami meg azt jelenti, hogy sok fájlban van szétdobva (autoloaddal megoldható). Minden kérésnél beolvassa a fájlt, ami időigényes, stb. Kis-nagybetűk megkülönböztetése még véletlenül sincs, ennek ellenére eléggé olyan az érzése az embernek, mintha javában programozna. Az első két percben. Aztán már menekül is.
Java: +1. Az legalább rendes nyelv és gyorsabb is...
- A hozzászóláshoz be kell jelentkezni
>> rendes OO-t nem tud
agreed
- A hozzászóláshoz be kell jelentkezni
A javaval nem sikerült annyira megismerkednem (még). De azért kis weboldalt, vagy egyszerűbb alkalmazást nem biztos hogy megéri javaban megcsinálni PHP helyett, olyan ágyúval verébre. Tervezem majd én is hogy közelebbi barátságba kerülök majd a javaval. Biztos sokkal jobb nyelv, de nem csak belőle áll a világ, ahogy korábban már írták itt. Meg azért előnyére válik az is hogy sokkal nagyobb háttér van a java mögött, mint a PHP mögött.
___________________________________________________________________
Lógnak a pálmafán a kókuszok .... :)
- A hozzászóláshoz be kell jelentkezni
"nem veszem észre, ha elírok egy változtót"
E_NOTICE-t generál, debuggoláshoz bekapcsolható.
"rendes OO-t nem tud"
Mit nem tud?
"nagyon sok objektumtípus jöhet létre, ami meg azt jelenti, hogy sok fájlban van szétdobva"
Általában valóban kényelmesebb, de nem kell minden osztályt külön fájlba rakni.
- A hozzászóláshoz be kell jelentkezni
Több hozzászólásodra egyben reagálnék.
A globális változók nem csak biztonsági problémát okozhatnak, de nagyobb (sok változót használó) programok esetén programozói hibák esélyét is növeli. Nem emlékszel egy változóra aztán ismét használod, pedig másik, új változóra lenne szükség. Ezért is érdemes a változók láthatóságát gondosan megválasztani.
A php OO tulajdonságait meg nem kötelező kihasználni, ha neked nem tetszik! Majd ha ráérzel az OO ízére ott is objektumokat fogsz gyártani, ahol egyszerűbb lenne nélküle. :-{)E
Sajnos ahogy én tudom a php-ben pont az egyik OO alap tulajdonság az objektum adattagjainak elrejtése nincs megoldva. Minősítéssel kívülről is elérhető, megváltoztatható. (Forrás: Tanuljuk meg a PHP-t 24 óra alatt)
Végül, azért mert mások felhívják a figyelmet a veszélyekre, még nem kellene letorkolni őket.
Mert ez egy common para írod te, pedig inkább azt jelenti, hogy sokan tisztába vannak a veszályeivel!
Ha nem tetszik ne fogadd meg a tanácsokat, a maga kárán tanul az ember a legtöbbet, csak nem mindegy milyen áron.
Ön dönt, vezet, vagy iszik. Azonban egyszerre a hármat ne csinálja! :-{)E
- A hozzászóláshoz be kell jelentkezni
"Sajnos ahogy én tudom a php-ben pont az egyik OO alap tulajdonság az objektum adattagjainak elrejtése nincs megoldva. Minősítéssel kívülről is elérhető, megváltoztatható. (Forrás: Tanuljuk meg a PHP-t 24 óra alatt)"
???? (hint: public, private, protected)
- A hozzászóláshoz be kell jelentkezni
php5-öt láttál már?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
A nevezett könyv még a PHP 4-et írja le.
Kb. 2 órahosszat foglalkoztam eddig PHP-vel.
- A hozzászóláshoz be kell jelentkezni
Remélem a nevezett könyv is leírja, ami a php4 doksiban van, hogy ez fake oo.
pl a változóban maga az ojjektum van, nem csak egy referencia, ergo
$ojj2 = &$ojj1;
a php4es referenciamasolas, mert amugy ekvivalens a javas .clone-nal (sot meg tobb is annal, persze dzsavaban megfelelo interface-t implementalni kell).
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Akkor idézek a "Tanuljuk meg a PHP4 használatát 24 óra alatt" c. könyvből:
Az objektumközpontú nyelvek, mint a Java, megkívánják, hogy a programozó beállítsa a tulajdonságok és tagfüggvények biztonsági szintjét. Ez azt jelenti, hogy a hozzáférés úgy korlátozható, hogy csak bizonyos, az objektumot kezelõ magas szintû függvények legyenek elérhetõk, a belsõ használatra szánt tulajdonságok, tagfüggvények pedig biztonságosan elrejthetõk. A PHP-nek nincs ilyen védelmi rendszere. Az objektum összes tulajdonsága elérhetõ, ami problémákat okozhat, ha a tulajdonságot (kívülrõl) nem lenne szabad megváltoztatni.
És valóban: (Szintén egy példa a könyvből, de ki is próbáltam.)
class elso_osztaly
{
var $nev = "Gizike";
}
$obj1 = new elso_osztaly(); //Példányosítás $obj1 objektumként
print "$obj1->nev<br>"; //Kiírja, hogy "Gizike"
$obj1->nev = "Bonifác";
print "$obj1->nev<br>"; //Kiírja, hogy "Bonifác"
- A hozzászóláshoz be kell jelentkezni
A PHP 5-ben teljesen újraírták az OOP-t. Szerintem innen tanulj, ez a hivatalos (és az aktuális verzióhoz való) dokumentáció. Azt hiszem, abban is van egyszerű leírás (nem csak referencia), szóval valószínűleg elsőre érthető, főleg, ha már tudsz programozni valamilyen nyelven. Ha nem, akkor is minél előbb térj át rá, ha az alapokat már tudod a 24 órás könyvből.
Szerk: most veszem észre, hogy 2 éves topicra ugrottam rá, mindegy, hátha még valaki idetéved. :)
- A hozzászóláshoz be kell jelentkezni
Hámámé...? A Perl-ben is lehet oop-ni..
- A hozzászóláshoz be kell jelentkezni
vagy Objective C , vagy C++, vagy ObjectPascal, vagy Perl, vagy \dots
Nem java a világ!
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
OCaml ...
- A hozzászóláshoz be kell jelentkezni
Én a $_REQUEST-et javaslom (_GET és _POST is benne van!)
- A hozzászóláshoz be kell jelentkezni
és még a $_COOKIE is, de szerintem átláthatóbb lesz, ha külön-külön használja, mivel így jobban látszik, hogy mi honnan "jött"...
______
[É.N.]
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Nem akartam uj temat nyitn ezert irom ide. Mint a kolleganak 2 evvel ezelott nekem is az a gondom, hogy nem akkar mukodni a $_GET['valtozo'] kifejezes.
FreeBSD 7.2 + Apcahce 2.2 + PHP 5
< form method="get" action="cgi-bin/pgsqlxhtml.php" >
< input type="text" name="szo" size="20" maxlength="30" />
< input type="radio" name="illeszkedes" checked="checked" value="e" />Előre<br />
< input type="radio" name="illeszkedes" value="h" />Hátra<br />
< input type="radio" name="illeszkedes" value="k" />Középre<br />
< input type="radio" name="irany" checked="checked" value="a_1" />Kerület nevének keresése<br />
< input type="radio" name="irany" value="a_2" />Lakosságszám keresése<br />
< input type="checkbox" checked="checked" name="db1" value="mikrocenzus_2005" />Abszolút adatok<br />
< input type="checkbox" name="db2" value="mikrocenzus_2005_ezrelek" />Ezrelékes adatok<br />
< input type="checkbox" name="db3" value="mikrocenzus_2005_szazalek" />Százalékos adatok<br />
< input type="submit" value="Elküld" />
< /form>
Es a kovetkezo nem add semmit eredmenykent:
$szavak = $_GET['szo'];
echo $szavak;
echo $_REQUEST['szo'];
echo $QUERY_STRING;
phpinfo();
Pontosabban a phpinfo() szerint letrejon a QUERY_STRING a megfelelo tartalommal.
- A hozzászóláshoz be kell jelentkezni
form method="get" action="cgi-bin/pgsqlxhtml.php"
Nem lehet az a baj, hogy a cgi-bin-ből akarod futtatni?
Oda nem php való szerintem.
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
echo $_SERVER['QUERY_STRING'];
mit ad?
- A hozzászóláshoz be kell jelentkezni