Plan zajęć
- Język php - wprowadzenie
- Tworzenie skryptów zgdodnie z paradygmatem proceduralnym i obiektowym
- Tablice globalne w języki php
- Przetwarzanie formularzy
- Tworzenie sesji, ciasteczka
- Przetwarzanie danych XML w php
- Szablony w języku php
W ramach tego punktu przedstawione zostaną dwa skrypty wykonujące tę samą funkcjonalność, jednak zrealizowane w odmiennych stylach programowania. Pierwszy zgodnie z standardem programowania proceduralnego, drugi zgodnie z standardem wzorca obiektowego - przetworzone zostaną dane przesłane metodą POST protokołu HTTP z formularza logowania.
Plik zad01.html - ( [listing dokumentu] [link do dokumentu]
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Formularz rejestracyjny</title>
</head>
<body>
<form name="test" method="post" action="zad01p.php">
Podaj imię:<input type="text" name="fname"><br/>
Podaj nazwisko:<input type="text" name="lname"><br/>
Podaj e-mail:<input type="text" name="email"><br/>
Podaj hasło:<input type="text" name="pass">
<input type="submit">
</form>
</body>
</html>Plik zad01p.php - ( [listing dokumentu] [link do dokumentu]
<?php $fname = $_POST['fname'] ; $lname = $_POST['lname'] ; $email = $_POST['email'] ; $pass = $_POST['pass'] ; echo "Wprowadzone dane (proceduralnie) <br/>" ; echo "Imię: ". $fname ." <br/>" ; echo "Nazwisko: ". $lname ." <br/>" ; echo "E-mail: ". $email ." <br/>" ; echo "Hasło: ". $pass ." <br/>" ; ?>
Plik Register.php - ( [listing dokumentu] [link do dokumentu]
<?php
class Register {
protected $data = array() ;
function __construct () {
}
function _read () {
$this->data['fname'] = $_POST['fname'] ;
$this->data['lname'] = $_POST['lname'] ;
$this->data['email'] = $_POST['email'] ;
$this->data['pass'] = $_POST['pass'] ;
}
function _write () {
echo "Wprowadzone dane (obiektowo) <br/>" ;
echo "Imię: ". $this->data['fname'] ." <br/>" ;
echo "Nazwisko: ". $this->data['lname'] ." <br/>" ;
echo "E-mail: ". $this->data['email'] ." <br/>" ;
echo "Hasło: ". $this->data['pass'] ." <br/>" ;
}
}
?> Plik zad1o.php - ( [listing dokumentu] [link do dokumentu]
<?php
include "Register.php" ;
$reg = new Register ;
$reg->_read();
$reg->_write();
?> Plik Server.php - ( [listing dokumentu] [link do dokumentu]
<?php
class Server {
function prn_server () {
echo 'Tablica $_SERVER ';
echo "================= ";
foreach ( $_SERVER as $key => $value )
print '$_SERVER['.$key.'] = '.$value.'<br>' ;
}
function prn_post () {
echo 'Tablica $_POST ';
echo "=============== ";
foreach ( $_POST as $key => $value )
print '$_POST['.$key.'] = '.$value.'<br>' ;
}
function prn_get () {
echo 'Tablica $_GET ';
echo "============== ";
foreach ( $_GET as $key => $value )
print '$_GET['.$key.'] = '.$value.'<br>' ;
}
function prn_cookie () {
echo 'Tablica $_COOKIE ';
echo "================= ";
foreach ( $_COOKIE as $key => $value )
print '$_COOKIE['.$key.'] = '.$value.'<br>' ;
}
function prn_session () {
echo 'Tablica $_SESSION ';
echo "================== ";
foreach ( $_SESSION as $key => $value )
print '$_SESSION['.$key.'] = '.$value.'<br>' ;
}
}
?> Plik zad02.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$obj = new Server() ;
$obj->prn_server() ;
$obj->prn_post() ;
$obj->prn_get() ;
$obj->prn_cookie() ;
$obj->prn_session() ;
?> Plik User.php - ( [listing dokumentu] [link do dokumentu]
<?php
class User extends Register {
private $ident = 'test' ;
private $auth = false ;
function __construct () {
parent::__construct() ;
session_set_cookie_params([
'lifetime' => 360,
'path' => '/~user/', // konto na ktorym dziala serwis
'domain' => $_SERVER['HTTP_HOST'],
'secure' => false, // serwer Pascal - tylko http
'httponly' => false,
'samesite' => 'LAX'
]);
session_start() ;
}
function setSession () {
$_SESSION["ident"] = $this->ident ;
}
function destroySession() {
$_SESSION = array() ;
if ( isset($_COOKIE[session_name()]) ) {
setcookie( session_name(), '', time()-42000, '/') ;
}
session_destroy();
}
}
?> Plik zad03a.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new User();
$user->setSession() ;
$obj = new Server();
$obj->prn_cookie();
$obj->prn_session();
?> Plik zad03b.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new User();
$obj = new Server();
$obj->prn_cookie();
$obj->prn_session();
?> Plik zad03c.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new User();
$user->destroySession();
$obj = new Server();
$obj->prn_cookie();
$obj->prn_session();
?> W ramach aplikacji wykorzystamy bazę danych klucz - wartość ( BerkeleyDB ), która jest zaimplementowana w języku php poprzez interfejs dbm. W pliku bazy danych dane są zapisywane w postaci klucz - wartość. Klucz jest zmienną typu "string". W ramach bazy danych możemy tylko przeszukiwać po kluczu i wartości klucza są posortowane - BTree. Pole wartość też jest typu "string" i wymagana jest serializacja obiektów jeżeli zapisujemy w bazie danych.
W ramach tego zadania utworzymy klasę Register_new, która jest rozszerzeniem klasy Register i do której dodawać będziemy kolejne funkcjonalności. Funkcje, które będą opracowywane to: zapis do bazy danych, logowanie do serwisu, wylogowanie z serwisu, wydruk danych użytkownika i wydruk wszystkich użytkowników zarejestrowanych w serwise.
Plik zad04.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new Register_new;
/* Funkcjonalnosc zakomentowana - brak metody _is_logged()
if ( ! $user->_is_logged() )
{
*/
echo "<p><a href='zad04reg.html'>Rejestracja w serwisie</a></p>";
echo "<p><a href='zad04log.html'>Logowanie do serwisu</a></p>";
/*
}
else
{
echo "<p><a href='zad04user.php'>Dane uzytkownika</a></p>" ;
echo "<p><a href='zad04all.php'>Zarejestrowani uzytkownicy</a></p>" ;
echo "<p><a href='zad04out.php'>Wylogowanie z serwisu</a></p>" ;
}
*/
?> Do realizacji tego zadania wykorzystamy plik z punktu Z1 - plik formularza (zad01.html) i plik obsługi w php (zad01o.php). Po zmodyfikowaniu ich zawartość zawierają odpowiednio plik zad04reg.html i plik zad04reg.php.
Plik zad04reg.html - ( [listing dokumentu] [link do dokumentu]
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Formularz rejestracyjny</title>
</head>
<body>
<form name="test" method="post" action="zad04reg.php">
Podaj imię:<input type="text" name="fname"><br/>
Podaj nazwisko:<input type="text" name="lname"><br/>
Podaj e-mail:<input type="text" name="email"><br/>
Podaj hasło:<input type="text" name="pass">
<input type="submit">
</form>
</body>
</html> Plik zad04reg.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$reg = new Register_new ;
$reg->_read();
$reg->_write();
echo $reg->_save();
echo "<p><a href='zad04.php'>Powrot do programu glownego</a></p>";
?>
Plik Register_new.php - ( [listing dokumentu] [link do dokumentu]
<?php
class Register_new extends Register {
private $dbh;
private $dbfile = "files/datadb.db" ;
function __construct () {
parent::__construct() ;
session_set_cookie_params([
'lifetime' => 360,
'path' => '/~user/', // konto na ktorym dziala serwis
'domain' => $_SERVER['HTTP_HOST'],
'secure' => false, // serwer Pascal - tylko http
'httponly' => false,
'samesite' => 'LAX'
]);
session_start() ;
}
/*
* Zapis danych do bazy
*/
function _save () {
$this->dbh = dba_open( $this->dbfile, "c");
if ( ! dba_exists($this->data['email'], $this->dbh ) ) {
$serialized_data = serialize($this->data) ;
dba_insert($this->data['email'],$serialized_data, $this->dbh) ;
$text = 'Dane zostały zapisane' ;
} else {
$text = 'Dane dla podanego adresu e-mail sa w bazie danych' ;
}
dba_close($this->dbh) ;
return $text;
}
}
?> W ramach tego punktu utworzymy metody do klasy Register_new - logowania _login() i sprawdzającą czy użytkownik jest zalogowany _is_logged(). Dodatkowo do realizacji zadania zostanie utworzony formularz logowania zad04log.html i skrypt obsługujący ten formularz zad04log.php.
Plik method_login.php - ( [listing dokumentu] [link do dokumentu]
<?php
/*
* Logowanie uzytkownika do serwisu
*/
function _login() {
$email = $_POST['email'] ;
$pass = $_POST['pass'] ;
$access = false ;
$this->dbh = dba_open( $this->dbfile, "r");
if ( dba_exists( $email, $this->dbh ) ) {
$serialized_data = dba_fetch($email, $this->dbh) ;
$this->data = unserialize($serialized_data);
if ( $this->data['pass'] == $pass ) {
$_SESSION['auth'] = 'OK' ;
$_SESSION['user'] = $email ;
$access = true ;
}
}
dba_close($this->dbh) ;
$text = ( $access ? 'Uzytkownik zalogowany' : ' Uzytkownik nie zalogowany ' ) ;
return $text ;
}
/*
* Sprawdzamy czy uzytkownik jest zalogowany
*/
function _is_logged() {
if ( isset ( $_SESSION['auth'] ) ) {
$ret = $_SESSION['auth'] == 'OK' ? true : false ;
} else { $ret = false ; }
return $ret ;
}
?> Plik zad04log.html - ( [listing dokumentu] [link do dokumentu]
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Logowanie do serwisu</title>
</head>
<body>
<form name="test" method="post" action="zad04log.php">
Podaj e-mail:<input type="text" name="email"><br/>
Podaj hasło:<input type="text" name="pass"><br/>
<input type="submit">
</form>
</body>
</html> Plik zad04log.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new Register_new;
echo $user->_login() ;
echo "<p><a href='zad04.php'>Powrot do programu glownego</a></p>";
?>
Plik method_logout.php - ( [listing dokumentu] [link do dokumentu]
<?php
/*
* Wylogowanie uzytkownika do serwisu
*/
function _logout() {
unset($_SESSION);
session_destroy();
$text = 'Uzytkownik wylogowany ' ;
return $text ;
}
?> Plik zad04out.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new Register_new;
echo $user->_logout() ;
echo "<p><a href='zad04.php'>Powrot do programu glownego</a></p>";
?> Plik method_read.php - ( [listing dokumentu] [link do dokumentu]
<?php
/*
* Pobranie danych uzytkownika z bazy
*/
function _read_user() {
$email = $_SESSION['user'] ;
$this->dbh = dba_open( $this->dbfile, "r");
if ( dba_exists( $email, $this->dbh ) ) {
$serialized_data = dba_fetch($email, $this->dbh) ;
$this->data = unserialize($serialized_data);
}
dba_close($this->dbh) ;
}
/*
* Pobranie danych uzytkownikow z bazy
*/
function _read_all() {
$table = array();
$this->dbh = dba_open( $this->dbfile, "r");
$key = dba_firstkey($this->dbh);
while ($key) {
$serialized_data = dba_fetch($key, $this->dbh) ;
$this->data = unserialize($serialized_data);
$table[$key]['email'] = $this->data['email'];
$table[$key]['fname'] = $this->data['fname'];
$table[$key]['lname'] = $this->data['lname'];
$key = dba_nextkey($this->dbh);
}
dba_close($this->dbh) ;
return $table;
}
?> Plik zad04user.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new Register_new ;
if ( $user->_is_logged() ) {
$user->_read_user();
echo $user->_write();
echo "<p><a href='zad04.php'>Powrot do programu glownego</a></p>";
}
?> Plik zad04all.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$user = new Register_new ;
if ( $user->_is_logged() ) {
$table = $user->_read_all();
echo "<table><tr><th>Nazwisko</th><th>Imie</th><th>E-mail</th></tr>" ;
foreach ( $table as $key => $record ) {
echo "<tr><td>".$record['fname']."</td><td>".$record['lname']."</td><td>".$record['email']."</td><tr>";
}
echo "</table>" ;
echo "<p><a href='zad04.php'>Powrot do programu glownego</a></p>";
}
?> Plik zad05.xml - ( [listing dokumentu] [link do dokumentu]
<?xml version="1.0" ?>
<zajecia>
<nazwa>techniki internetowe</nazwa>
<termin>poniedzialek, 10.00</termin>
<sala>D10, lab. 206</sala>
<studenci>
<student>
<nazwisko>Abacki</nazwisko>
<imie>Adam</imie>
<email>abacki@agh.edu.pl</email>
</student>
<student>
<nazwisko>Backi</nazwisko>
<imie>Krzysztof</imie>
<email>backi@agh.edu.pl</email>
</student>
<student>
<nazwisko>Ewa</nazwisko>
<imie>Cabacka</imie>
<email>cabacka@agh.edu.pl</email>
</student>
</studenci>
</zajecia> Plik zad05.xsl - ( [listing dokumentu] [link do dokumentu]
<?xml version="1.0" standalone="no" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>zadanie 1 - przetwarzanie dokumentow XML</title> <meta name="author" content="Antoni Dydejczyk" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link type="text/css" href="zajecia.css" rel="stylesheet" /> </head> <body> <p class="title" >Przykladowe rozwiazanie zadania 1</p> <p class="zajecia" > Zajecia: <span><xsl:value-of select="//zajecia/nazwa" /></span>, termin: <span><xsl:value-of select="//zajecia/termin" /></span>, sala: <span><xsl:value-of select="//zajecia/sala" /> </span> </p> <table> <tr><th>Nazwisko</th><th>Imie</th><th>e-mail</th></tr> <xsl:apply-templates select="//studenci" /> </table> </body> </html> </xsl:template> <xsl:template match="studenci"> <xsl:for-each select="//student" > <xsl:sort select="./nazwisko/text()" /> <tr xmlns="http://www.w3.org/1999/xhtml"> <td><xsl:value-of select="nazwisko" /></td> <td><xsl:value-of select="imie" /></td> <td><xsl:value-of select="email" /></td> </tr> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Plik zad05.php - ( [listing dokumentu] [link do dokumentu]
<?php
/*
Przyklad przetwarzania dokumnetu XML z wykorzystaniem XSL.
*/
$xmlfile = 'zad05.xml' ;
$xslfile = 'zad05.xsl' ;
// date_default_timezone_set('Europe/Berlin');
// $fdate = date ("d M Y",filemtime($xmlfile));
$xml = new DOMDocument;
$xml->load($xmlfile);
//echo $xml->saveXML();
$xsl = new DOMDocument;
$xsl->load($xslfile);
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules
// $proc->setParameter ('', 'fdate', $fdate );
$template = $proc->transformToXML($xml);
print $template ;
?> Plik Template.php - ( [listing dokumentu] [link do dokumentu]
<?php
class Template {
private $page ;
private $f_page ;
function read( $source ) {
$this->page = implode('',file($source)) ;
// echo $this->page;
return ;
}
function merge( $data ) {
// print_r ($data) ;
$this->f_page = preg_replace_callback('/{([^}]+)}/',
function($matches) use ($data) { return $data[str_replace(array('{','}'),'',$matches[0])] ;},
$this->page) ;
// print $this->f_page;
return ;
}
function write() {
return $this->f_page ;
}
}
?>
Plik zad06.tpl - ( [listing dokumentu] [link do dokumentu]
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8" />
<title>Przyklad wykorzystania szablonow - 1</title>
<link rel="stylesheet" type="text/css" href="szablony.css" />
</head>
<body>
<div class="ramka">
<p class="tytul" >REFERAT</p>
<p> <span class="bold" >Tytuł:</span>{tytul}</p>
<p> <span class="bold" >Data:</span>{data}</p>
<p> <span class="bold" >Prelegent:</span>{name}</p> <br />
<p class="italic" >{opis}</p>
</div>
</body>
</html> Plik zad06.php - ( [listing dokumentu] [link do dokumentu]
<?php
/* php5, php7
function __autoload($class_name) {
include $class_name . '.php' ;
}
*/
function my_autoloader($class) {
include $class . '.php';
}
spl_autoload_register('my_autoloader');
/* Or, using an anonymous function
spl_autoload_register(function ($class) {
include $class . '.php';
});
*/
$page = new Template() ;
$data['tytul'] = " Szablony ";
$data['opis'] = " Prosty program ";
$data['name'] = " A. Dydejczyk ";
$data['data'] = " 17 listopad 2025 ";
$file = "zad06.tpl" ;
$page->read($file);
$page->merge($data);
echo $page->write();
?> Metody magiczne nie sa jawnie wywoływane. Ich funkcjonalność pojawia się w określonych sytuacjach. Poniżej przedstawione zostały metody magiczne i ich opis działania.
zad07.php - ( [listing dokumentu] [link do dokumentu]
<?php
class Magic
{
private $myArray = array();
public function __set($prop, $value) {
$this->myArray[$prop] = $value;
}
public function __get($prop) {
return $this->myArray[$prop];
}
public function __isset($prop) {
return isset($this->myArray[$prop]);
}
public function __unset($prop) {
unset($this->myArray[$prop]);
}
public function __toString() {
return "class {". __CLASS__ . "} method {". __METHOD__ ."} :" . $this->name;
}
}
$obj = new Magic();
if (!isset($obj->name)) {
$obj->name = "Krakow";
}
echo $obj->name."<br/>";
echo $obj."<br/>";
echo "dir {".__DIR__."} file {". __FILE__ ."} line {". __LINE__ ."}" ;
?> Linki dostępne z sieci wydziałowej.