Llenguatges de guions de servidor. PHP. Introducció

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Objectius

PHP és el llenguatge de script de referència per a fer pàgines web (cantó de servidor). No és l'únic (amb tecnologia Microsoft existeixen les pàgines ASP-Active Server Pages i ASPX-.NET Framework). També existeixen les pàgines JSP (Java), però en aquest cas no corren sobre un servidor web Apache sinó sobre un servidor Tomcat.

Allò normal és utilitzar PHP per a servir pàgnes HTML, però no té perquè ser exclusiu: podem utilitzar PHP com a llenguatge per fer tasques que no tiguin res a veure amb la navegació web, i no cal utilitzar un navegador web com el Firefox. Per exemple, podem executar un fitxer PHP que contingui una connexió a una base de dades i fer updates sobre les 1000 files de la taula empleat, i executar-no en línia de consola:

$ php update_empleats.php

En aquest cas, l'objectiu no és visualitzar una pàgina web en el Mozilla.

Un altre exemple, fitxer prova.php:

<?php
echo "hola<br />";
echo "hola\n";
?>
$ php prova.php
hola<br />hola

En aquest cas el tag
no serveix per a res, doncs només l'interpreta bé un navegador web.

Dit això, l´us normal del PHP és per fer que un servidor web com l'Apache serveixi pàgines web al nostre client web (el Mozilla Firefox).

nota. Per poder utilitzar PHP en línia de comandes es necessita el paquet php5-cli:

$ sudo apt-cache search php5-cli
php5-cli - command-line interpreter for the php5 scripting language

$ man php

Documentació

pàgina web oficial:

Documentació:

Gestió dels errors i logging

El normal quan programem amb PHP és tenir errors i warnings. Mostrar-los és molt necessari mentre estem desenvolupant el projecte, tot i que en la fase de producció (quan ja està en funcionament l'aplicació) s'han de deshabilitar els warnings (i els errors).

Tenim dues possibilitats que són equivalents:

El comportament de la gestió dels errors i logging està en el fitxer php.ini.

$ sudo joe /etc/php5/apache2/php.ini

...

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; This directive informs PHP of which errors, warnings and notices you would like
; it to take action for. The recommended way of setting values for this
; directive is through the use of the error level constants and bitwise
; operators. The error level constants are below here for convenience as well as
; some common settings and their meanings.
; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
; those related to E_NOTICE and E_STRICT, which together cover best practices and 
; recommended coding standards in PHP. For performance reasons, this is the
; recommend error reporting setting. Your production server shouldn't be wasting
; resources complaining about best practices and coding standards. That's what  
; development servers and development settings are for.
; Note: The php.ini-development file has this setting as E_ALL | E_STRICT. This
; means it pretty much reports everything which is exactly what you want during
; development and early testing.
;
; Error Level Constants:
; E_ALL             - All errors and warnings (includes E_STRICT as of PHP 6.0.0)
; E_ERROR           - fatal run-time errors
; E_RECOVERABLE_ERROR  - almost fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was 
;                     intentional (e.g., using an uninitialized variable and 
;                     relying on the fact it's automatically initialized to an
;                     empty string)
; E_STRICT          - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's 
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message 
; E_DEPRECATED      - warn about code that will not work in future versions
;                     of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings
;
; Common Values:
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices and coding standards warnings.)
;   E_ALL & ~E_NOTICE | E_STRICT  (Show all errors, except for notices)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
;   E_ALL | E_STRICT  (Show all errors, warnings and notices including coding standards.)
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED

; This directive controls whether or not and where PHP will output errors,
; notices and warnings too. Error output is very useful during development, but
; it could be very dangerous in production environments. Depending on the code 
; which is triggering the error, sensitive information could potentially leak  
; out of your application such as database usernames and passwords or worse.   
; It's recommended that errors be logged on production servers rather than     
; having the errors sent to STDOUT.
; Possible Values:
;   Off = Do not display any errors
;   stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
;   On or stdout = Display errors to STDOUT
; Default Value: On
; Development Value: On
; Production Value: Off
; http://php.net/display-errors
display_errors = On             <<==== aquesta és la línia que s'ha de canviar

; The display of errors which occur during PHP's startup sequence are handled
; separately from display_errors. PHP's default behavior is to suppress those
; errors from clients. Turning the display of startup errors on can be useful in
; debugging configuration problems. But, it's strongly recommended that you
; leave this setting off on production servers.
; Default Value: Off
; Development Value: On
; Production Value: Off
; http://php.net/display-startup-errors
display_startup_errors = Off

; Besides displaying errors, PHP can also log errors to locations such as a
; server-specific log, STDERR, or a location specified by the error_log
; directive found below. While errors should not be displayed on productions
; servers they should still be monitored and logging is a great way to do that.
; Default Value: Off
; Development Value: On
; Production Value: On 
; http://php.net/log-errors
log_errors = On

...

Si fem algun canvi hem de reiniciar l'Apache:

$ sudo /etc/init.d/apache2 restart

Com veiem, necessitem posar display_errors = On per veure els missatges, i també es pot controlar quin és el nivell de missatges que apareixen: error_reporting = E_ALL & ~E_DEPRECATED.

També podem mirar en els log. Veiem que tenim l'opció log_errors = On, que és l'opció correcta, i ara només ens falta saber on estan els log. Ho podem veure a varis llocs.

El primer lloc és /etc/apache2/apache2.conf, que és el fitxer de configuració principal

$ joe /etc/apache2/apache2.conf
...
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /var/log/apache2/error.log
...

Després en els diferents sites també podem tenir definida la directiva ErrorLog, que indica la mateixa ruta que abans, o bé podríem posar una ruta específica per a cada site:

$ joe /etc/apache2/sites-available/default
...
ErrorLog /var/log/apache2/error.log
...

Per exemple, en el fitxer /var/log/apache2/error.log podem trobar informació del tipus:

$ cat /var/log/apache2/error.log
...
PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/apache2/conf.d/imagick.ini on line 1 in Unknown on line 0
PHP Warning:  Module 'gd' already loaded in Unknown on line 0
PHP Warning:  Module 'mysql' already loaded in Unknown on line 0
[Fri Feb 10 01:01:30 2012] [warn] RSA server certificate CommonName (CN) `ubuntu' does NOT match server name!?
[Fri Feb 10 01:01:30 2012] [notice] Apache/2.2.14 (Ubuntu) PHP/5.3.2-1ubuntu4.10 with Suhosin-Patch mod_ssl/2.2.14 OpenSSL/0.9.8k configured -- resuming normal operations
...

Desenvolupament

Farem tota la introducció de PHP que es troba a:

PHP Basic, que inclou:

Recorda que vas crear el site http://www.iaw.org, que està associat físicament a la carpeta /var/www/iaw. En aquesta carpeta crearàs el directori php_basic, i aquí dins ficaràs els arxius de prova, per exemple, holamon.php. Podràs comprovar com funciona aquest script accedint a la URL:

Entrega 1

Tota la documentació generada (scripts PHP bàsicament) la inclouràs en un fitxer comprimit i l'entregaràs en el Google Classroom. No t'has de restringir als exemples que proposa el tutorial, sinó que també inclouràs totes les proves que fas. El professor també demana incloure el fitxer LLEGEIX-ME.txt on expliquis les dificultats i descobertes que has realitzat.

Recorda la normativa per entregar les pràctiques al Google Classroom: ASIX-M10-UF2#Normativa_d.27entrega_de_les_pr.C3.A0ctiques_al_Google_Classroom

Entrega 2: Exercici de classe 9-nov-2018

Fer les taules de multiplicar amb PHP, i el bucle for.

1. Fer-ho amb un script PHP per la consola

$ php taules_multiplicar.php
$ php taules_multiplicar.php > taules_multiplicar.txt

2. Fer una pàgina web. Formatar-la amb un CSS senzill.


Exercici de classe: 23-nov-2018

A PHP hem vist que existeix la funció:

I també hem vist com crear funcions definides per l'usuari.

Defineix la funció reverse_string() que funcioni de la mateixa manera que strrev(). Pots utilitzar la funció substr:

<html>
<body>

<?php 
$cad = "cadena";
echo strrev($cad);
echo "<br />";
echo invertir_cadena($cad);

function invertir_cadena($str) {
	//strlen — Get string length
	//string substr ( string $string , int $start [, int $length ] )
	$res = "";
	for ($i=strlen($str);$i>=0;$i--) {
		$res .= substr($str,$i,1);
	}
	return $res;
}
?>

</body>
</html>

Exercici de classe (formulari): 23-nov-2018

Dissenya la pàgina canvi_moneda.php, que conté un formulari amb els següents elements.

La informació es processa en el mateix script, i has de donar una informació del tipus (arrodonim a dos decimals):

o bé

La solucicó mínima és:

<html>
<body>

<form action="canvi_moneda.php" method="post">
Selecciona: 
 <select name="tipus">
  <option value="euro_a_dolar">euro a dolar</option>
  <option value="dolar_a_euro">dolar a euro</option>
</select> 
<br />
Import: <input type="text" name="import"><br />
<input type="submit" value="Calcular">
</form>

<?php 
if ( isset($_POST["tipus"]) && isset($_POST["tipus"])) { 

	$tipus = $_POST["tipus"];
	$import = $_POST["import"];
	//echo $tipus."<br />";
	//echo $import."<br />";
	if ($tipus == "euro_a_dolar") {
		echo $import." euros són ".round($import*1.10986,2)." dòlars"; 
	} else {
		echo $import." dòlars són ".round($import/1.10986,2)." euros"; 
	}

}
?>

</body>
</html>

Exemples de classe

matrius


<!DOCTYPE html>
<html>
<body>

<?php
$array = array(1, 2, 3, 4, 5);
print_r($array);
echo "<br />";
var_dump($array);
echo "<br />";
echo $array[0];
echo "<br />";

$x = array("a" => "red", "b" => "green");  
$y = array("c" => "blue", "d" => "yellow");  

print_r($x);
echo "<br />";
var_dump($y);
echo "<br />";

echo $x["a"];
echo "<br />";
echo $x[0]; //Notice
echo "<br />";

var_dump($x == $y);
echo "<br />";
$z = array("b" => "green", "a" => "red"); 
echo $x["a"];
echo "<br />";

//select nom, cognom from empleat;
//select cognom, nom from empleat;

?>  

</body>
</html>

Recórrer els elements d'un array

<?php
function trobar_paritat($num) {
switch ($num % 2) {
    case 0:
        echo "el número $num és parell";
        break;
    case 1:
        echo "el número $num és senar";
        break;
}
echo "<br />";
}


$num = 18;
$numeros = array(28, 23, 34, 654, 11, 43231, 23, 54, 33, 44, 55, 66, 77, 88);

/*
for ($x = 0; $x < sizeof($numeros); $x++) {
    trobar_paritat($numeros[$x]);
} 
*/

foreach ($numeros as $value) {
    trobar_paritat($value);
}

?>

Durarda

2 hores



creat per Joan Quintana Compte, novembre 2018

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines