PHP ALAPOK Dr. Nagy Enikő PhD. egyetemi adjunktus PTE Pollack Mihály Műszaki és Informatikai Kar, Műszaki Informatika és Villamos Intézet, Rendszer- és Szoftvertechnológiai Tanszék
Szerver konfigurálás PHP alapok Vezérlési szerkezetek Adatbázis-kapcsolat
A szerver konfigurálása Konfigurációs lépések megtételére van szükség. Saját gép esetén nem probléma Más esetben rendszergazdai vagy szolgáltatói jogosultság szükséges
Fontosabb konfigurációs lehetőségek Apache konfigurálása Legfontosabb állomány: httpd.conf xampp/apache/conf/httpd.conf – programozói editorral megnyitni Változtatások érvényesüléséhez webszerver újraindítása
Változó neve Funkciója Példa ServerRoot Apache szerver telepítési útvonal meghatározása ServerRoot „C:/xampp/apache” LoadModule Opcionális Apache modulok betöltése LoadModule rewrite_module modules/mod_rewrite.so DocumentRoot Azoknak az állományoknak a helye, amelyeket elérhetővé kell tenni a szerver számára. DocumentRoot „C:/xampp/htdocs” Directory A megadott könyvtár tartalmát hogyan szolgálja ki a webszerver. <Directory „C:/xampp/htdocs”> Options Indexes FollowsSymLinks Includes ExeCGI AllowOverride All Order allow, deny Allow from all </Directory> IfModule Betöltés után veszi figyelembe <IfModule dir_module>…</IfModule> DirectoryIndex Meghatározza, hogy egy könyvtár lekérésekor mi történjen. DirectoryIndex index.php index.php4 index.php3 index.cgi index.html
A PHP konfigurálása http://localhost/xampp/phpinfo.php - alapvető információk az Apache, PHP konfigurációkról. Távoli szolgáltató esetén i.php állományt kell létrehozni és gyökérkönyvtárba feltölteni a következő tartalommal: <?php phpinfo() ?>
Változó neve Funkciója Példa short_open_tag <?php helyett használható-e a <? short_open_tag=on safe_mode PHP futtatókörnyezet biztonsági problémáinak kiküszöbölése safe_mode=Off disable_functions Függvények letiltása show_source, system max_execution_time Meddig futhat PHP kód. max_execution_time=60 memory_limit Mennyi memóriát használhat a futtatáshoz? memory_limit=32M post_max_size upload_max_filesize Maximálisan elfogadható adatmennyiséget (méretet) írja le. post_max_size=64M upload_max_filesize=64M extension_dir extension Megadja a PHP-hez telepített beépülő ill. betöltendő beépülő csomagok helyét. extension_dir=„c:\xampp\php\ext\” extension=php_gd2.dll session.save_path session.auto_start Munkamenetek állományainak helyét határozza meg, ill. a munkamenetek automatikus indítását tiltja le. session.save_path=„c:\xampp\tmp” session.auto_start=0
A phpMYAdmin konfigurálása MySQL adatbázisok konfigurálásának adminisztrációs felületének elérési útvonala: http://localhost/phpmyadmin
A MySQL konfigurálása XAMPP esetén C:\xampp\mysql\bin\my.ini Beállítási példák: port=3306 - Ezen a porton érhető el az SQL szerver. datadir=„c:/xampp/mysql/data” - adatbázisok helye. log_error=„mysql_error.log” - ide loggolja a hibaüzeneteket.
Jogosultságkezelés Rendkívül fontos szerepet tölt be. Automatikusan települ a mysql adatbázis tartalmára és figyelembe veszi, hogy Honnan kapcsolódunk Kik vagyunk Mit tehetünk
Az adatbázis tábláinak szerepe User: Ki, honnan kapcsolódhat. Globális jogok is. Db: Melyik adatbázishoz, ki férhet hozzá. Adatbázis szintű jogok is. Host: Melyik adatbázishoz honnan lehet csatlakozni. Tables_priv, columns_priv: Tábla és mezőszintű jogok. A hitelesítés 2 lépésben történik: Van-e jogunk csatlakozni? Van-e jogunk az adott parancsot lefuttatni?
Karakterkódolás Használjunk mindenhol UTF 8-at! Miért? Mert a magyar nyelv nem triviális. Mert az UTF-8 egyre dominánsabb, bár nem problémamentes.
PHP ALAPOK PHP: Hypertext Preprocessor – szerver oldali szkriptnyelv Dinamikus és interaktív weboldalak készítése PHP kód HTML kódba ágyazása Szintaxis hasonló C/C++, Java, Javasrcipt, Perl nyelvekhez Tartalmaz szöveget, HTML tagokat, PHP kódokat (szkripteket) Szerveren fut Kommunikálhat adatbázis-szerverrel (pl. MySQL, Oracle stb.) Kiterjesztése .php Szabadon letölthető és használható
Szintaxis <?php … ?> vagy <? … ?> PHP kódot nem lehet böngészővel megnézni, mert az előállított HTML kimenet látható. PHP kód kezdete, vége: <?php … ?> vagy <? … ?>
<html> <body> <. php echo „Hello world. ”; <html> <body> <?php echo „Hello world!”; ?> </body> </html> print
Print és echo nélküli kimenet kezelés: <acronym class=„datum” title=„<?= $datum[‘hosszu’] ?>”> <span class=„honap”><?= $datum[‘honap’] ?></span> <span class=„nap”><?= $datum[‘nap’] ?></span> </acronym <?= kifejezés ?>
Megjegyzések Egysoros megjegyzések: // Egy soros megjegyzés Többsoros megjegyzés: /* Ez egy több soros megjegyzés. */
Változók gettype – változó típusának lekérdezése $ karakterrel kezdődnek a változók nevei Szövegeket, számokat, tömböket tartalmazhatnak Nevek: ABC betűi, számok, aláhúzás karakter, NEM kezdődik számmal, szóközt NEM tartalmazhatnak Gyengén típusos - nincs szükség a változó előzetes megadására (értékadásnál beállítódik) Típusok: Logikai (boolean), Egész számok (integer), Lebegőpontos számok (double), Sztringek(string), Tömbök(array), Objektumok(object), Erőforrások (adatbázis azonosítója), NULL gettype – változó típusának lekérdezése
Típuskonverziók Implicit Explicit $a=3 $b=2.4 print $a + $b print ‘2 alma’ + ‘3 körte’ $a=0.33333333333 print (integer)($a*100)/100.0 print $a + (integer)$b 1. Valós számmá konvertálódik 2. Egész számmá konvertálódik 3. Valós számmá konvertálódik
Eddig nem változtak a típusok Szükség lehet a típus változtatására – settype Változó változók: $a= ‘b’; $b= ‘alma’; $$a=‘alma’
A sztringek Létrehozás aposztróffal ‘heredoc’ szintaxis $t= <<< EOS Több soros sztring, melyben hosszú fülű, törpe tacsi szerepel. EOS; Létrehozás aposztróffal echo ‘Hamlet kérdi: „Lenni vagy nem lenni…”’; Létrehozás idézőjellel: $kutya= ‘tacsi’; echo „törpe $kutya hosszú fülekkel”; echo „ hosszú $kutyafülek”; echo „ hosszú ${kutya}fülek”; echo „ hosszú {$kutya }fülek” String karaktereinek elérése, módosítása: $p = ‘ÉVA’; $elso = $p{0}; $harmadik = $p{2}; $p{2} = „I”;
Operátorok és kifejezések Értékadó operátorok Aritmetikai operátorok Összehasonlító operátorok Logikai operátorok
Értékadó operátorok = $x=$y $x=$y; += $x+=$y $x=$x+$y; -= $x-=$y Példa Jelentés = $x=$y $x=$y; += $x+=$y $x=$x+$y; -= $x-=$y $x=$x-$y; *= $x*=$y $x=$x*$y; /= $x/=$y $x=$x/$y; %= $x%=$y $x=$x%$y; .= $x.=$y $x=$x.$y;
Aritmetikai operátorok Példa Eredmény + $x=2; $x+2 4 - 5-$x 3 * $x=4; $x*5 20 / 5/2 2.5 % 5%2 1 ++ $x=5; $x++ ++$x $x=6 -- $x— --$x $x=4
Összehasonlító operátorok Művelet Példa Eredmény == Egyenlő 5==8 false != Nem egyenlő 5!=8 true > Nagyobb 5>8 < Kisebb 5<8 >= Nagyobb-egyenlő 5>=8 <= Kisebb-egyenlő 5<=8 === Típus és érték egyenlő ‘5’===5
Logikai operátorok Operátor Művelet Példa Eredmény && and és $x=6 $y=3 ($x< 10 and $y>1) True || or Vagy ($x==5 || $y==5) ($x==5 or $y==5) False ! nem !($x==$y)
Operátorok precedenciája ++, --, /,*,% +,- <, <=, >, >= ==, !=, == && || =, +=, -=, /=, *=, %=, .= And or Rövidzár kiértékelés ( $x < 5 ) && ( $y == 5 )
Tömbök 1 vagy több értéket tárolhat egyetlen változónévvel. Típusai: Sorszámozott – egyedi numerikus azonosító kulcsai vannak Asszociatív – egyedi szöveg azonosító kulcsai vannak Többdimenziós tömb – 1 vagy több tömböt tartalmaz
Sorszámozott tömbök $nevek = array( „Anna”, „Attila”, „Anita”); $nevek[0]= „Anna”; $nevek[1]= „Attila”; $nevek[2]= „Anita”; echo $nevek[0] . „ and „ . $nevek[1] . „ and „ . $nevek[2] . „jó barátok.”;
Asszociatív tömbök $korok = array („Anna”= >18, „Attila”=>20, „Anita”=>21); $korok[‘Anna’] = „18”; $korok[‘Attila’] = „20”; $korok[‘Anita’] = „21”; echo „Attila” . $korok[‘Attila’] . „éves.”;
Többdimenziós tömbök $csalad = array ( „Kovacs” => array( „Anna”, „Attila” ), „Nagy” => array( „Anita” );
Vezérlési szerkezetek Elágazások – if, elseif és else Ciklusok – while, do-while, for, foreach Függvények használata
Elágazások - if-else szerkezet if (feltétel) végrehajtandó kód, ha a feltétel teljesül; else végrehajtandó kód, ha a feltétel nem teljesül; Pl. $n=date(„N”); if ($n==„Reggel” ) echo „Jó reggelt!”; echo „Jó napot!”; $n=date(„N”); if ($n==„Reggel”) { echo „Szia! <br>”; echo „Jó reggelt! <br>”; echo”Jó munkát mára <br>”; }
Az elseif szerkezet if (feltétel1) végrehajtandó kód, ha a feltétel1 teljesül; elseif (feltetel2) végrehajtandó kód, ha a feltétel2 teljesül; else végrehajtandó kód, ha a feltétel nem teljesül; $n=date(„N”); if ($n==„Reggel” ) echo „Jó reggelt!”; elseif ($n== „Este”) echo „Jó estét!”; else echo „Jó napot!”;
A switch szerkezet switch (kif) { case cimke1: Akkor használjuk, ha más-más kódot akarunk végrehajtani egy kifejezés lehetséges értékei alapján. Elkerülhetők a hosszú if-es blokkok. Egy kif. egyszer végrehajtódik, A kif. összahsonlításra kerül minden case kif-sel Ha egyezik, akkor a kód végrehajtódik Ezután a break leállítja a kód végrehajtását A default-tal kezeljük a case által nem kezelt eseteket. switch (kif) { case cimke1: végrehajtandó kód, ha a kif = cimke1 break; case cimke2: végrehajtandó kód, ha a kif = cimke2 default; végrehajtandó kód Ha a kif különbözik cimke1 és címke2 – től; }
Ciklusok – a while ciklus PHP-ben Szintaxis: while (feltetel) ciklusmag $i=1; while($i<=5) { echo „ A szám „ . $i .” <br>”; $i++; }
A do-while ciklus $i=0; Szintaxis: do { ciklusmag; } while (feltetel); echo „A szám” . $i . „<br>”; } while ($i<5);
A for ciklus Amikor előre tudjuk hányszor kell futtatni a kódot. Szintaxis: for (inicializálás; feltétel;növelés) { ciklusmag; } for ($i=1; $i<=5; $i++) { echo „Hello Világ! <br>”; } $i=1; while ($i<=5) { echo „Hello Világ! <br>”; $i++; }
A foreach ciklus Tömbelemekre alkalmazzuk Kilépés ciklusból: Tömb elemek kiíratása: $tomb=array(„egy”, „kettő”, „három”); foreach ($tomb as $ertek) echo „Érték: „ . $ertek . „<br>”; Kilépés ciklusból: break utasítással lehetséges. Ciklusmag végrehajtásának megszakítása: continue utasítással lehetséges.
Függvények használata Kb. 1000 beépített függvény Kódblokk function szóval kezdődik A név utaljon a függvény funkciójára. A PHP kód tetszőleges pontján meghívhatjuk. Paraméterezés
Példák egyszerű függvényre Function Kiir($nev) { echo „ A nevem Nagy $nev . <br>”; } Kiir(„Anna”); Kiir(„Attila”); Kiir(„Anita”); Function Kiirfoglalk($nev, $fogl) { echo „ A nevem Nagy $nev, $fogl vagyok . <br>”; } Kiirfoglalk(„Anna”, „Óvodapedagógus”); Kiirfoglalk(„Attila”, „Építőmérnök”); Kiirfoglalk(„Anita”, „Tanárnő”);
Paraméterátadás, visszatérési érték A paraméterek közül egyet vagy többet elhagyhatunk, ha a következőképpen adjuk meg a függvényben: function fuggvenynev($nev; $ertek = „Adott”) { … } function osszeg($x,$y) { $ossz= $x+$y; return $ossz; } echo „3+5 =” . osszeg(3,5)
Adatbázis-kapcsolat MySQL a legnépszerűbb Adatbázis adataihoz való hozzáféréshez kapcsolatot kell létrehozni az adatbázishoz. mysql_connect() Szintaxis: mysql_connect(servername, username, password);
$con = mysql_connect („localhost”, „peter”, „abc123”); if ( $con = mysql_connect („localhost”, „peter”, „abc123”); if (! $con) { die(‘Nem sikerült kapcsolatot kiépíteni:’ . mysql_error()); } mysql_close($con);
Adatbázisok és táblák létrehozása Adattípusok Elsődleges kulcsok Adatok bevitele adatbázisba Lekérdezés Eredmények megjelenítése Műveletek rekordokkal (feltételek, rendezések, módosítás, törlés)
Adatbázisok és táblák létrehozása Szerverkapcsolódás után létrehozzuk az adatbázis(oka)t és a táblá(ka)t. CREATE DATABASE adatbneve $con = mysql_connect („localhost”, „peter”, „abc123”); if (! $con) { die(‘Nem sikerült kapcsolatot kiépíteni:’ . mysql_error()); } If (mysql_query(„CREATE DATABASE my_db”, $con)) { echo „Adatbázis létrehozva”; } else { echo „Sikertelen adatbázis létrehozás.” . mysql_error(); mysql_close($con);
mysql_select_db(„my_db”, $con); $sql=„CREATE TABLE person ( CREATE TABLE tablanev ( Oszlopnev1 adattipus, Oszlopnev2 adattipus, Oszlopnev3 adattipus, … ) mysql_select_db(„my_db”, $con); $sql=„CREATE TABLE person ( keresztnev varchar(15), vezeteknev varchar(15), kor int )”; mysql_query($sql, $con); mysql_close($con);
Adattípusok I. Numerikus – egész és tizedes számok, size max. számjegyek száma, d tizedes jegyek száma int(size), smallint(size), tinyint(size), mediumint(size), bigint(size) decimal(size,d), double(size,d), float(size,d) Szöveges adattípusok – sztring, betűk, számok, spec. karakterek char(size) – fix hosszúság varchar(size) - változó hosszúság tinytext – változó hossz, de max. 255 karakter, text, blob, mediumtext, mediumblob, longtext, longblob (max. 65535, 16777215, 4294967295)
Adattípusok II. Dátum – dátumot és/vagy időt tartalmaz date(yyyy-mm-dd), datetime(yyyy-mm-dd hh:mm:ss), timestamp(yyyymmddhhmmss), time(hh:mm:ss) Összetett típusok – 1-65535 érték listázva enum(ertek1, ertek2, ertek3,….,ertekx) set
Elsődleges kulcs $sql=„CREATE TABLE szemely ( Minden táblának kell legyen (kivétel a kapcsoló táblák) Egyedileg azonosítja a sorokat, rekordokat Egyedinek kell lennie Nem lehet null értékű Indexelni kell a gyakori visszakeresés végett $sql=„CREATE TABLE szemely ( szemelyazon int NOT NULL AUTO_INCREMENT, PRIMARY KEY(szemelyazon), keresztnev varchar(15), vezeteknev varchar(15), kor int )”; mysql_query($sql, $con);
Adatbevitel - INSERT INTO mysql_query(„INSERT INTO szemely (keresztnev, vezeteknev, kor) VALUES(‚Péter’, ‚Kovács’,’22’)”); VALUES(‚Éva’, ‚Kiss’,’25’)”); mysql_close($con);
Pl. <html> <body> <form action="insert.php" method="post"> keresztnev: <input type="text" name=„keresztnev"> vezeteknev: <input type="text" name=„vezeteknev"> kor: <input type="text" name=„kor"> <input type="submit" value="Elküld"> </form> </body> </html>
PHP kód – adatbevitel űrlapról $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerült kapcsolatot kiépíteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $sql="INSERT INTO person (keresztnev, vezeteknev, kor) VALUES ('$_POST[keresztnev]','$_POST[vezeteknev]','$_POST[kor]')"; if (!mysql_query($sql,$con)) { die('Hiba: ' . mysql_error()); } echo "1 rekord létrejött"; mysql_close($con)
Választó Lekérdezés – SELECT $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerült kapcsolatot kiépíteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $eredmeny = mysql_query("SELECT * FROM szemely"); while($sor = mysql_fetch_array($eredmeny)) { echo $sor[‚keresztnev'] . " " . $sor[‚vezeteknev']; echo "<br>"; } mysql_close($con);
Ez miben tér el az előző példától? $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerült kapcsolatot kiépíteni: ' . mysql_error());} mysql_select_db("my_db", $con); $eredmeny = mysql_query("SELECT * FROM szemely"); echo "<table border='1'> <tr> <th>Vezeteknev</th> <th>Keresztnev</th> </tr>"; while($sor = mysql_fetch_array($eredmeny)) { echo "<tr>"; echo " <td>" . $sor[‚Keresztnev'] . "</td>"; echo " <td>" . $sor[‚Vezeteknev'] . "</td>"; echo "</tr>"; } echo "</table>"; mysql_close($con);
Feltételes választó lekérdezés – SELECT WHERE Általános szintaktika: SELECT oszlop FROM tabla WHERE feltetel(ek) Operátor Leírás = Egyenlő != Nem egyenlő > Nagyobb < Kisebb >= Nagyobb, vagy egyenlő <= Kisebb, vagy egyenlő BETWEEN Tartományba esés LIKE Mintával való egyezés
Példa feltételes kiválasztásra $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerült kapcsolatot kiépíteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $eredmeny = mysql_query("SELECT * FROM szemely WHERE keresztnev='Péter'"); while($sor = mysql_fetch_array($eredmeny)) { echo $sor[‚keresztnev'] . " " . $row[‚vezeteknev']; echo "<br>";
Rendezés – ORDER BY Általános szintaktika: SELECT column_name(s) FROM table_name ORDER BY column_name Példa: $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerült kapcsolatot kiépíteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $eredmeny = mysql_query("SELECT * FROM szemely ORDER BY kor"); while($sor = mysql_fetch_array($eredmeny)) { echo $sor[‚keresztnev']; echo " " . $sor[‚keresztnev']; echo " " . $sor[‚kor']; echo "<br>"; } mysql_close($con);
Rendezés növekvő és csökkenő sorrendben SELECT column_name(s) FROM table_name ORDER BY column_name DESC
Rendezés két vagy több oszlop alapján SELECT column_name(s) FROM table_name ORDER BY column_name1, column_name2
Adatok módosítása - UPDATE mysql_query("UPDATE Person SET Age = '36' WHERE FirstName = 'Peter' AND LastName = 'Griffin'"); mysql_close($con);
Adatok törlése mysql_query("DELETE FROM Person WHERE LastName='Griffin'");
Adatbázis absztrakció Ha a szolgáltató nem nyújt MySQL szolgáltatást Ha túl nagy a szerverterhelés Megoldás gyakran a PostgreSQL, Microsoft SQL Server, vagy az Oracle Database Egyre inkább elterjedt módszer Előnyei: Adatbázis-kezelő rendszer függetlenedés Verzió függetlenedés Nem kell specialistává válnunk
Absztrakciós réteg
PHP Data Object - PDO Kapcsolódás adatbázishoz: $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); Rekordszintű bejárás: foreach($db->query('select * from products') as $row) { // ... } Rekord beszúrása, és az új ID kiolvasása: $db->exec("insert into products (name) values ('Sample')"); $id = $db->lastInsertId();
Preparált lekérdezések Preparált lekérdezés : $statement = $db->prepare( 'select * from products where id = ? and category = ?'); $statement->execute( array($_GET['id'], $_GET['category'])); while($statement->fetch() as $row) { // ... } Preparált módosítás: $statement = $db->prepare( 'update products set name=:name where id=:id'); $statement->execute( array('name' => $_POST['name'], 'id' => 123)); Preparált beszúrás: $statement = $db->prepare( 'insert into products (name) values(:name)'); $statement->execute( array('name' => $_POST['name'])); $newProductId = $db->lastInsertId();
PÉLDA 1. Űrlap készítése MySQL adatbázishoz PHP-ben A PHP fájlba alapvetően HTML űrlapot készítünk. Az űrlap elemeit elnevezzük, ezzel fogunk tudni hivatkozni a tartalmára. Vagyis az űrlap eleme egy változó, amit a nevével azonosítunk. Űrlapokat a FORM tag-be írjuk bele. A FORM tag „action” attribútuma egy .php fájl. A „method” attribútum lehet post vagy get. A kettő között a különbség az, hogy a post estében nem fognak látszódni a paraméterek böngésző címsorában.
<?php global $veznev; // vezetéknevet tároljuk majd benne global $kernev; // keresztnevet tároljuk majd benne global $gender; // a nemet tároljuk majd benne global $city; // a várost tároljuk majd benne /*********************************************************** Kezdjük weboldalt. *********************************************************/ echo '<html>'; echo '<head>'; echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8" >'; echo '<title>Teszt oldal űrlap kezeléshez</title>'; echo '</head>'; echo '<body>'; $host = 'XXXXXXXXX'; $user = 'XXXXXXXXX'; $password = 'XXXXXXXXX';
/********* Csatlakozunk az adatbázishoz ********/ $connect = mysql_connect( $host, $user, $password ) or die ( "Error: Can not connect to server" ); mysql_select_db( "teszt", $connect ) or die ( "Can not connect to database" );
/***** Ha az oldal kap paramétereket, akkor letároljuk a globális változókba ***/ $veznev = $_POST["vnev"]; $kernev = $_POST["knev"]; $city = $_POST["varos"]; $gender = $_POST["nem"];
/********* Ez a rész csak akkor fut le, ha minden paraméter létezik **********/ if ( isset($veznev) && isset($kernev) && isset($city) && isset($gender) ) { /******* beszúrjuk a kapott paramétereket a táblába ***********/ $sql = "INSERT INTO emberek (vezeteknev, keresztnev, varos, nem) VALUES ('" . $veznev ."','". $kernev. "','". $city. "','". $gender . "')"; mysql_query( $sql ) or die ("Hiba a beszúrásnál"); } $sql = "SELECT varosnev FROM varosok"; // lekérdezzük a városokat $varoslista = mysql_query( $sql ); mysql_close($connect); // lezárjuk az adatbázis-kapcsolatot
echo '<form action="teszt.php" method="post">'; /************ EZ AZ ŰRLAP ********************/ /***** táblázatos elrendezést használunk *****/ /***********************************************/ echo '<form action="teszt.php" method="post">'; echo '<table width=100 >'; echo '<tr><td>Vezetéknév:</td> <td><input type="text" name="vnev" value=""/></td></tr>'; echo '<tr><td>Keresztnév:</td> <td><input type="text" name="knev" value=""/></td></tr>'; echo '<tr><td>Férfi</td> <td><input type="radio" name="nem" value="Férfi"></td></tr>'; echo '<tr><td>Nő</td> <td><input type="radio" name="nem" value="Nő"></td></tr>'; echo '<tr><td>Város</td> <td><select name="varos" >'; while ( $v = mysql_fetch_array($varoslista, MYSQL_NUM) ) { echo '<option value="' . $v[0] . '">' . $v[0] . '</option>'; } echo '</select></td></tr>'; echo '<tr><td><input type="submit" value="Beszúr" /></td></tr>'; echo '</table>'; echo '</form>';
$sql = "SELECT vezeteknev, keresztnev, varos, nem FROM emberek"; // ---------- LEKERDEZES --------------- /******* újra csatlakozunk az adatbázishoz *********/ $connect = mysql_connect( $host, $user, $password ) or die ( "Error: Can not connect to server" ); mysql_select_db( "teszt", $connect ) or die ( "Can not connect to database" ); /******** lekérdezzük az adatbázisban szereplő embereket *********/ $sql = "SELECT vezeteknev, keresztnev, varos, nem FROM emberek"; $eredmeny = mysql_query( $sql ); /********* a lekérdezés eredményét kiírjuk egy táblázatba ****************/ echo '<center>'; echo '<table width="60%" border="1">'; echo '<tr><td bgcolor="#EEEEEE">Vezetéknév</td><td bgcolor="#EEEEEE">Keresztnév</td> <td bgcolor="#EEEEEE">Város</td><td bgcolor="#EEEEEE">Nem</td></tr>'; while ( $rekord = mysql_fetch_array($eredmeny, MYSQL_NUM) ) { echo '<tr><td>' . $rekord[0] . '</td><td>' . $rekord[1] . '</td><td>' . $rekord[2] . '</td><td>' . $rekord[3] . '</td></tr>'; } echo '</table>'; echo '</center>';
VÉGÜL: mysql_close($connect); // lezárjuk az adatbázis-kapcsolatot echo '</body>'; echo '</html>'; ?>
Mit csinál a következő PHP program? $szam = 11; $maradek = $szam % 2; if ($maradek > 0) { echo "A $szam -------------------------------"; } else{ echo "A $szam -------------------------------."; ?>
PHP feladat Készítsen egy PHP függvényt, amelynek paraméterként átadja a bruttó havi fizetést és egy nevet, és ez a függvény tételesen kiírja az összes levonást illetve a nettó bért.
<?php $nyugdij = $brut * 0.1; $munkanelkuli = $brut * 0.015; $tb = $brut *0.07; $szja = $brut * 0.16; $osszlevonas = $nyugdij + $munkanelkuli + $tb + $szja; $net = $brut - $nyugdij - $munkanelkuli - $tb - $szja; echo "<p> Név: ". $name."</p>"; echo "<p> Bruttó jövedelem: ". $brut."</p>"; echo "<p> Havi levonások: ". $osszlevonas."</p>"; echo "<p> Amiből: </p>"; echo "<ul>"; echo "<li>TB: ".$tb."</li>"; echo "<li>Nugdíj: ".$nyugdij."</li>"; echo "<li>Munkanélküli: ".$munkanelkuli."</li>"; echo "<li>SZJA: ".$szja."</li>"; echo "</ul>"; echo "<p><strong>Havi nettó jövedelem: ".$net."</strong></p>"; } //meghívjuk a függvényt átadva neki a két kezdeti paramétert, amellyel az dolgozni fog berkalkulator("Gipsz Jakab", 180000); ?>
PHP feladat Készítsen egy olyan PHP függvényt (hozzon létre új php fájlt és új függvényt) amelynek átadja a következő asszociatív tömböt és a függvény kigenerál egy HTML táblázatot, amelyben, nettó bér szerint csökkenő sorrendbe rendezve jelennek meg a személyek és azok nettó bére. Bemeneti tömb: ["Kiss Janos" => 170000, "Nagy Jozsef" => 198500, "Szegeny Bela" => 2500000, "Magnas Miska" => 750000, "Gipsz Jakab" => 458010] Kimenet valahogy így kellene kinézzen: Név | Nettó bér xxxxx | 787287.78 yyyy | 232653.00 zzzzz | 154778
<?php function berkalkulator2($bemenet) { $kimenet = array(); foreach($bemenet as $nev => $brut) { $nyugdij = $brut * 0.1; $munkanelkuli = $brut * 0.015; $tb = $brut *0.07; $szja = $brut * 0.16; $net = $brut - $nyugdij - $munkanelkuli - $tb - $szja; $kimenet[$nev] = $net; } arsort($kimenet); eredmenyKiiras($kimenet); function eredmenyKiiras($bemenet) { echo "<table border=1 cellspacing=2 cellpadding=4><th>Név</th> <th>Nettó Bér</th>" ; foreach($bemenet as $nev => $net) { echo "<tr><td>".$nev."</td><td style='text-align:right;'>".$net."</td></tr>"; echo "</table>"; $nevek = array("Kiss Janos" => 170000, "Nagy Jozsef" => 198500, "Szegeny Bela" => 2500000, "Magnas Miska" => 750000, "Gipsz Jakab" => 458010); berkalkulator2($nevek);
Állománykezelés, szöveges fájlok Szerveren tárolt szöveges állományok (.txt, .ini, .dat) Mi a helyzet a .doc, .rtf, .pdf kiterjesztésű fájlokkal? Meghatározott szerkezetük miatt bináris fájlok olvasására, írására előre megírt, erre a célra szolgáló függvényeket kell használni. .txt fájlok kezelési technológiája
Kezelési technológia Meg kell nyitni a beolvasandó fájlt! Megkapjuk az u.n. állományleírót. Egy változó amelynek segítségével érik el a függvények a fájlt. Állománymutató használata. Az állomány valamely karakterére mutat.
Megnyitás és bezárás fopen() – megnyit ill. létrehoz $file = fopen("adatok/nevek.txt", "r"); Megnyitás módjai: művelet állománymutató kezdeti helyzete r fájl megnyitása olvasásra fájl eleje w fájl megnyitása írásra (létrehozás/ürítés) a fájl megnyitása hozzáfűzésre (létrehozás) fájl vége
file_exists() - file létezését ellenőrző függvény A mód befolyásolja a használható műveletek körét. Ha például olvasási módban nyitjuk meg a fájlt, nem engedhetünk rá olyan függvényt, ami írni akarja, és fordítva is igaz. Ha olvasni és írni is akarunk a fájlba, akkor nyissuk meg kétféle módban: $file_r = fopen("file.txt", "r"); $file_w = fopen("file.txt", "a");
if (file_exists("file.txt")){ $file = fopen("file.txt", "r"); fclose() - Ha a fájlban elvégeztük a műveleteket amiket akartunk, és nem akarjuk tovább bántani, akkor be szokás zárni. if (file_exists("file.txt")){ $file = fopen("file.txt", "r"); // olvasás fclose($file); } $file = fopen("file.txt", "a"); // írás fclose($file);
Olvasás $file = fopen("file.txt", "r"); fread() - A függvény fájl olvasására használható. $file = fopen("file.txt", "r"); $content = fread($file, filesize("file.txt")); fclose($file);
Jobb példa, létezést is ellenőriz function file_read($filepath){ if (file_exists($filepath)){ $file = fopen($filepath, "r"); $content = fread($file, filesize($filepath)); fclose($file); } else{ $content = false; return $content; }
$file = fopen("file.txt", "a"); fwrite($file, "Ez egy tengeri T-rex"); Írás fwrite() - Ezzel a függvénnyel fájlba tudunk írni. $file = fopen("file.txt", "a"); fwrite($file, "Ez egy tengeri T-rex"); fclose($file);
Példa Tegyük fel, hogy a nevek.txt-ben neveket tárolunk mégpedig úgy, hogy a nevek egy | karakterrel vannak elválasztva egymástól. Például legyen ilyen a tartalma: Hörb|Ismeretlen arc|DaniL|Gipsz Jakab Legyen egy űrlap, ami bekér egy nevet, és elküldés után bővíti a nevek listáját a beírt névvel, és kilistázza a neveket. Akkor hozzuk létre az urlap.php-t az alábbi tartalommal: <form method="post" action="nevek.php"> // Írd be a neved: <input type="text" name="nev" value="" /> <input type="submit" value="OK" /> </form>
nevek.php dolga, hogy beírja a fájlba az új nevet, amit a felhasználó megadott, majd listázza ki az addig beírt neveket <?php $filename = "nevek.txt"; // fájl írása $file = fopen($filename, "a"); fwrite($file, "|".$_POST["nev"]); fclose($file); // fájl olvasása $file = fopen($filename, "r"); $nevek = fread($file, filesize($filename)); fclose($file); // kiírás $nevtomb = explode("|", $nevek); foreach ($nevtomb as $nev){ print $nev.", "; } ?> Tömbbé alakítja a beolvasott karakterláncot
str_replace() függvény lecseréli a karaktereket // kiírás $nevek = str_replace("|", ", ", $nevek); print $nevek;
Az újsor-karakter háromféle "változata„ van Windows, Linux, Macintosh operációs rendszerekhez A Linux a \n escape-karaktert használja erre (egyéb nevei: LF, line feed, soremelés). A Macintosh viszont a \r karaktert (CR, carriage return, kocsivissza). A Windows szerint pedig az újsor így néz ki: \r\n, vagyis egy kocsivissza és egy soremelés karakter egymás után írva. fwrite($file, "\r\n".$_POST["nev"]);
1. Példa 1.) A példaprogram nem működik megfelelően, ha kezdetben nincs név a nevek.txt fájlban. Ha így futtatjuk le, az első név előtt is lesz | karakter. Próbáljuk meg ezt kiküszöbölni! Vagyis azt kell megoldani, hogy ha eredetileg üres a fájl, akkor a név elé ne írjunk ki | karaktert.
Megoldás $filename = "nevek.txt"; // fájl írása $file = fopen($filename, "a"); if (filesize($filename) === 0){ fwrite($file, $_POST["nev"]); } else{ fwrite($file, "|".$_POST["nev"]); fclose($file); // ...
2. Példa Írjuk meg az urlap.php és a nevek.php fájlt arra az esetre, amikor a nevek.txt fájl így néz ki: Hörb;admin;norb@webprog.biz Ismeretlen arc;user; DaniL;admin;email@email.hu Az űrlap elküldése után megjelenő kimenet legyen ilyen: Hörb (rang: admin, e-mail: norb@webprog.biz) Ismeretlen arc (rang: user, e-mail: ) DaniL (rang: admin, e-mail: email@email.hu)
Az urlap.php fájl lehet például ilyen: <form method="post" action="nevek.php"> Név: <input type="text" name="nev" value="" /><br /> Rang: <input type="text" name="rang" value="" /><br /> E-mail: <input type="text" name="email" value="" /><br /> <input type="submit" value="OK" /> </form>
Az nevek.php-ben először beszúrjuk az új ember adatait, majd kiírjuk az addig összegyűjtött adatokat: // fájl olvasása $file = fopen($filename, "r"); $adatok = fread($file, filesize($filename)); fclose($file); // kiírás $adattomb = explode("\r\n", $adatok); foreach ($adattomb as $sor){ $adat = explode(";", $sor); print $adat[0]." (rang: ".$adat[1].", e-mail: ".$adat[2].")<br />"; } ?> <?php $filename = "nevek.txt"; // fájl írása $file = fopen($filename, "a"); fwrite($file, "\r\n".$_POST["nev"].";".$_POST["rang"] .";".$_POST["email"]); fclose($file);
Állománykezelés Fájlműveletek létrehozás, törlés, átnevezés, áthelyezés és másolás
Fájl létrehozása $file = fopen("data/file.doc", "w"); Fájlt létrehozni a megismert fopen() függvénnyel tudunk, függetlenül attól, hogy szöveges vagy bináris fájlról van-e szó. Ehhez írási vagy hozzáfűzési módban kell meghívni a függvényt: $file = fopen("data/file.doc", "w"); Ekkor a data könyvtárban létrejön a file.doc fájl. Létrehozás után mindjárt írhatunk is a fájlba az fwrite()-tal, mivel a fopen() hívása után meg van nyitva a fájl.
Fájl törlése unlink("data/file.doc"); Fájlt törölni az unlink() függvénnyel tudunk. Beadjuk paraméterként a fájl elérési útját, és máris megszabadultunk tőle: unlink("data/file.doc"); A visszatérési érték true ha sikerült a törlés, false ha nem.
Fájl áthelyezése és átnevezése Mindkét műveletet a rename() függvénnyel tudjuk végrehajtani. Ezzel a függvénnyel egy fájl teljes elérési útját tudjuk módosítani. Pl. a fájl elérési útja: data/file.doc Ez azt jelenti, hogy a fájl a data könyvtárban van, és a neve file.doc. Az áthelyezés a fájl helyét módosítja, az átnevezés pedig a fájl nevét. Mivel a rename() függvénnyel magát az elérési utat tudjuk módosítani, így a segítségével egyszerre mindkét műveletet elvégezhetjük a fájllal: rename("data/file.doc", "limlom/egyeb/vacak.txt");
Nem túl szerencsés dolog az, ha a célfájl már létezik, vagyis már van egy limlom/egyeb/vacak.txt elérési úttal rendelkező fájlunk, és ezt adjuk meg második paraméterként. Ekkor a rename() vagy felülírja a célfájlt, vagy nem csinál semmit, ez főleg az operációs rendszertől függ, ami alatt fut. Így ha biztosra akarunk menni, ellenőrizzük le áthelyezés/átnevezés előtt a célfájlt a file_exists() függvénnyel. Ha felül szeretnénk írni, akkor előbb töröljük az eredetit az unlink()-kel, és utána indítsuk el az áthelyezést! További probléma, hogy ez a függvény nem tud könyvtárat létrehozni, így a fenti példában a limlom/egyeb könyvtárnak már léteznie kell, különben nem sok minden fog történni. Egy könyvtár létezését ugyanúgy a file_exists() függvénnyel tudjuk ellenőrizni.
$targetdir = "limlom/egyeb"; $targetname = "vacak $targetdir = "limlom/egyeb"; $targetname = "vacak.txt"; $file = $targetdir."/".$targetname; if (file_exists($file)){ unlink($file); } if (file_exists($targetdir)){ rename("data/file.doc", $file);
Fájl másolása copy("data/file.doc", "limlom/egyeb/vacak.txt"); A másolási művelet annyiban különbözik az áthelyezéstől, hogy az eredeti helyen is megmarad a fájl. Meg persze más a függvény neve. Ezen kívül teljesen ugyanaz a helyzet: copy("data/file.doc", "limlom/egyeb/vacak.txt"); A paraméterek is teljesen ugyanúgy viselkednek. A függvény lemásolja a data könyvtárban lévő file.doc nevű fájlt, és a másolatot berakja a limlom/egyeb könyvtárba vacak.txt néven. A függvény képességei is megegyeznek a rename() függvénnyel, vagyis könyvtárat nem tud létrehozni, és már létező célfájl itt is bezavarhat, ezért hasonló vizsgálatokat érdemes elvégezni a használat előtt, mint ami fent látható, hacsak nem vagyunk biztosak abban, hogy erre nincs szükség.
Könyvtárak kezelése <img alt="" src="../kepek/kep.jpg" /> Egy könyvtár ugyebár fájlokat és más könyvtárakat tartalmazhat, amiknek nagyjából tetszőleges lehet a nevük (néhány speciális karakter nem használható). Azonban van két különleges állomány minden könyvtárban (egy üres könyvtárban is), a "." (egy pont karakter) és a ".." (két pont karakter). Nem fájlok és nem is könyvtárak, hanem könyvtárakra mutató hivatkozások. A "." állomány az őt tartalmazó könyvtárra hivatkozik, a ".." pedig a könyvtár szülő könyvtárára, vagyis arra, ami a könyvtárfában közvetlen felette van. Pl. html-ben a szülő könyvtár elérése: <img alt="" src="../kepek/kep.jpg" /> <a href="../../index.html" />Kezdőlap</a>
Elérési utak: kepek/kep.jpg relatív ./kepek/kep.jpg relatív c:/wamp/www/phptanfolyam/kepek/kep.jpg abszolút /var/www/phptanfolyam/kepek/kep.jpg abszolút http://php.webprog.biz/kepek/kep.jpg abszolút Mindig az adott (böngészőben fututó) fájlhoz képest kell megadni az elérési utat.
Könyvtár beolvasása Egy könyvtár beolvasása valamelyest hasonlít egy szöveges fájl beolvasásához. Itt is meg kell nyitni a könyvtárat, ezután olvashatunk belőle, majd a végén be kell zárni. $dir = opendir("images/logos"); // olvasás closedir($dir); Itt nincsenek megnyitási módok, mivel "íráshoz" nem kell megnyitnunk a könyvtárat.
Létezik-e? ill. Könyvtár-e? $path = "images/logos"; if (is_dir($path)){ $dir = opendir($path); // olvasás closedir($dir); }
Állományok beolvasása egyenként $dir = opendir("images/logos"); while (($name = readdir($dir)) !== false){ print $name."; "; } closedir($dir); .; ..; 1.jpg; 2.jpg; saves; watermarks;
Állományok kiírása elérési úttal function read_dir_tree($path){ $dir = opendir($path); while (($name = readdir($dir)) !== false){ if ($name != "." && $name != ".." && is_dir($path."/".$name)){ read_dir_tree($path."/".$name); } print $path."/".$name."<br />"; } closedir($dir); }
Lehetséges kimenet images/logos/. images/logos/.. images/logos/1.jpg images/logos/2.jpg images/logos/saves/. images/logos/saves/.. images/logos/saves images/logos/watermarks/. images/logos/watermarks/.. images/logos/watermarks/file1.png images/logos/watermarks
mkdir("images/logos/new"); Könyvtár létrehozása Könyvtárakkal ugyanazokat a műveleteket el lehet végezni, mint a fájlokkal, de sajnos nem mind olyan egyszerű, mert erős korlátozások vannak mindegyikben. Könyvtárat létrehozni az mkdir() függvénnyel lehet az alábbi módon: mkdir("images/logos/new");
Könyvtárág létrehozása $path = "images/logos/new"; $dirs = explode("/", $path); $dirname = $dirs[0]; $n = 0; while ($n < count($dirs)){ mkdir($dirname); ++$n; $dirname += "/".$dirs[$n]; }
Ha létezik a könyvtárág egy része, ill. könyvtár-e vagy fájl esetén: $path = "images/logos/new"; $dirs = explode("/", $path); $dirname = $dirs[0]; $n = 0; while ($n < count($dirs)){ if (is_file($dirname)){ $success = @unlink($dirname); if (!$success) break; } if (!is_dir($dirname)){ mkdir($dirname); $dirname += "/".$dirs[++$n]; }
rmdir("images/logos"); Könyvtár törlése rmdir("images/logos"); Csak üres könyvtárat lehet törölni (vagyis olyat, amiben csak a "." és ".." hivatkozások vannak meg). Teljes könyvtárág törléséhez ki kell törölni a könyvtárból az összes fájlt.
Könyvtár áthelyezése és átnevezése rename("images/logos", "kepek/nagy_kepek/egyeb"); A könyvtárakat áthelyezés esetén a benne lévő fájlokkal és alkönyvtárakkal együtt helyezi át.
Könyvtár másolása // könyvtár átmásolása Nincs semmilyen beépített függvény. Még üres könyvtár másolására se. Úgyhogy a másolást úgy kell megcsinálni, hogy létrehozunk egy üres könyvtárat, majd a forráskönyvtárat beolvassuk, és a fájlokat egyenként átmásoljuk a copy() függvénnyel a célkönyvtárba. function copy_dir($source, $target){ mkdir($target); $sourcedir = opendir($source); while (($name = readdir($sourcedir)) !== false){ $path = $source."/".$name; if ($name == "." || $name == ".."){ continue; } else if (is_dir($path)){ // könyvtár átmásolása copy_dir($path, $target."/".$name); } else{ // fájl átmásolása copy($path, $target."/".$name); } closedir($sourcedir); }
Példa Írjunk egy függvényt, ami egy teljes könyvtárágat tud törölni!
Megoldás else{ // fájl törlése @unlink($path); } } closedir($dir); function delete_dir($dirname){ $dir = opendir($dirname); while (($name = readdir($dir)) !== false){ $path = $dirname."/".$name; if ($name == "." || $name == ".."){ continue; } else if (is_dir($path)){ // könyvtár törlése delete_dir($path); } else{ // fájl törlése @unlink($path); } } closedir($dir); rmdir($dirname); }
10 hasznos tanács leendő php fejlesztőknek
1. Használd a PHP beépített függvényeit és osztályait 2 1.Használd a PHP beépített függvényeit és osztályait 2. Mindig készíts konfigurációs fájlt 3. Mindig takarítsd ki a szemetet az adataidból 4. Kapcsold be a hibaüzeneteket, értesítéseket mikor fejlesztesz 5. Ne tömd tele kommenttel a kódot 6. Legyenek kéznél a kedvenc kódrészleteid 7. Ne pocsékold az időd, használj jó kódszerkesztőt! 8. Használj MySQL adminisztációs tool-t, pl. a phpMyAdmin-t 9. Használj PHP környezeteket 10. Lépj kapcsolatba más PHP fejlesztőkkel