PHP első lépések

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:

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.

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.

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.

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

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.

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 .... :)

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. :-)

--
http://webappz.hu

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 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 .... :)

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

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

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

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.

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 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. :)

Én a $_REQUEST-et javaslom (_GET és _POST is benne van!)

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.