Bases de Dados Apresentação da linguagem PHP Tópicos § PHP • blocos construtivos • arrays • instruções condicionais • ciclos • redireccionamento • sessões § PHP and MySQL • interacção com o MySQL • utilização de formulários HTML IST DEI ▪ Bases de Dados 2006-07 ▪ 2 Introdução ao PHP § PHP: PHP Hypertext Preprocessor • linguagem para server-side scripting • concebida para geração dinâmica de páginas Web • corre em muitas plataformas • integrada com vários servidores Web • suporte para muitos SGBDs (MySQL, Oracle, ...) ▫ especialmente bem integrada com MySQL • possui um vasto conjunto de extensões ▫ Smarty, PEAR, … • é software livre (aprovado pela FSF) IST DEI ▪ Bases de Dados 2006-07 ▪ 3 Arquitectura Browser 1 pedido HTTP HTML extensão 8 queries *.php SQL Servidor 2 5 PHP Web 7 6 SGBD HTML dados 3 ficheiro *.php código PHP 4 Sistema de ficheiros IST DEI ▪ Bases de Dados 2006-07 ▪ 4 Uma página em PHP variáveis SGBD HTML HTML PHP HTML HTML HTML 5 IST DEI ▪ Bases de Dados 2006-07 ▪ "Hello World" em PHP <html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p>Hello World!</p>'; ?> </body> </html> (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 6 Variáveis § Não é preciso declarar variáveis, simplesmente atribuir valor $age = 12; $price = 2.55; $number = -2; $name = "Jones"; § Os nomes de variáveis • começam com um $ • podem incluir apenas letras, algarismos e underscore • não podem começar por número § Para "destruir" variáveis usa-se: unset($age); § PHP é case-sensitive! IST DEI ▪ Bases de Dados 2006-07 ▪ 7 Constantes § Constantes são especificadas com define define("COMPANY","ABC Pet Store"); define("AGE",29); echo COMPANY; echo AGE; IST DEI ▪ Bases de Dados 2006-07 ▪ 8 Operadores § Operadores aritméticos • +, −, *, % • exemplo: $result = (1 + 2) * 4 + 1; § Operadores de comparação • ==, >, <, >=, <=, != (ou <>) • exemplos: $weather == "raining" $age < 13 § Operadores lógicos: • and (ou &&), or (ou ||), xor e ! IST DEI ▪ Bases de Dados 2006-07 ▪ 9 Strings § Uma string $string = 'Hello World!'; § Caracteres especiais (" e ') $string = 'It is Tom\'s house'; § Concatenação de strings $string1 = 'Hello'; $string2 = 'World!'; $stringall = $string1 . ' ' . $string2; § Formatação de strings $price = 25; $fprice = sprintf("%01.2f", $price); IST DEI ▪ Bases de Dados 2006-07 ▪ 10 Aspas e apóstrofes § Texto entre apóstrofes não é processado $age = 12; echo 'The age is $age'; The age is $age § Texto entre aspas é processado $age = 12; echo "The age is $age"; The age is 12 § Caracteres especiais • \n, \t, ... IST DEI ▪ Bases de Dados 2006-07 ▪ 11 Data e hora § Data e hora actual $today = time(); § Formatar uma data $cdate = date("d/m/y", $today); $ctime = date("G:i:s", $today); § Opções de formatação • F – mês por extenso • M – mês abreviado (3 letras) • … § Conversão de strings para datas $prazo = strtotime("January 15 2003"); IST DEI ▪ Bases de Dados 2006-07 ▪ 12 Operações com datas § Operações aritméticas com datas $timeSpan = $today - $importantDate; • devolve o número de segundos entre as 2 datas § Conversão de strings aceita muitas operações $importantDate $importantDate $importantDate $importantDate $importantDate $importantDate ... = = = = = = strtotime("tomorrow"); strtotime("now + 24 hours"); strtotime("last saturday"); strtotime("8pm + 3 days"); strtotime("2 weeks ago"); strtotime("this 4am"); IST DEI ▪ Bases de Dados 2006-07 ▪ 13 Expressões regulares § Suporte para expressões regulares ereg("pattern", string) • resultado do tipo verdadeiro/falso § Exemplo ereg("^[A-Za-z ]+$", $name) • verdadeiro para "Pedro Matos Chaves" • falso para "", "Pedro Matos-Chaves" e "Conan O'Brien" IST DEI ▪ Bases de Dados 2006-07 ▪ 14 Expressões regulares – símbolos § Símbolos em expressões regulares • • • • • • • • • • • • "^a" – qualquer string começada por "a" "a$" – qualquer string terminada em "a" "ab*" – um "a" seguido de zero ou mais "b" "ab+" – um "a" seguido de um ou mais "b" "a?b" – um possível "a" seguido de "b" "ab{2}" – um "a" seguido de 2 "b" "ab{2,4}" – um "a" seguido de 2 a 4 "b" "(b|cd)ef" – qualquer string que contenha "bef" ou "cdef" "a(bc){1,5}" – um "a" seguido de 1 a 5 cópias de "bc" "a." – "a" seguido de qualquer caracter (só 2 caracteres) "^[a-zA-Z]" – qualquer string que comece por uma letra … IST DEI ▪ Bases de Dados 2006-07 ▪ 15 Outros elementos úteis § Mais operadores aritméticos $counter += 2; $counter -= 3; $counter *= 2; $counter /= 3; § Sair do script exit("The program is exiting"); die("The program is dying"); § Comentários /* ... */, // e # IST DEI ▪ Bases de Dados 2006-07 ▪ 16 Funções § Exemplo • adição de 2 números (argumentos opcionais) function add_2_numbers($num1 = 1, $num2 = 1) { $total = $num1 + $num2; return $total; } IST DEI ▪ Bases de Dados 2006-07 ▪ 17 Arrays simples § Array simples $animais[1] = "gato"; $animais[2] = "tigre"; $animais[3] = "elefante"; $animais = array("gato","tigre","elefante"); IST DEI ▪ Bases de Dados 2006-07 ▪ 18 Arrays associativos § Array indexado a chaves (keys) $airlines['BA'] = "British Airways"; $airlines['LH'] = "Lufthansa"; $airlines['AF'] = "Air France"; $airlines = array("BA" => "British Airways", "LH" => "Lufthansa", "AF" => "Air France"); IST DEI ▪ Bases de Dados 2006-07 ▪ 19 Ordenação de arrays § Ordenação de arrays simples sort($pets); § Ordenação de arrays associativos asort($airlines); § Outros métodos de ordenação • rsort, arsort (ordenação inversa) • ksort, krsort (ordenação por chave) • usort($array,function) (com função auxiliar) IST DEI ▪ Bases de Dados 2006-07 ▪ 20 Iterar por um array § Os arrays podem comportar-se como iteradores reset($airlines); $value = current($airlines); echo "$value<br>"; $value = next($airlines); echo "$value<br>"; $value = next($airlines); echo "$value<br>"; § Outras funções: • prev(), end(), sizeof() 21 IST DEI ▪ Bases de Dados 2006-07 ▪ Iterar por um array com foreach § Também é possível utilizar o ciclo foreach $airlines = array("BA" => "British Airways", "LH" => "Lufthansa", "AF" => "Air France"); ksort ($airlines); foreach($airlines as $symbol => $name) { echo "$name ($symbol)<br>"; } (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 22 Arrays multidimensionais § Como criar um array multidimensional $productPrices['clothing']['shirt'] = 20.00; $productPrices['clothing']['pants'] = 22.50; $productPrices['linens']['blanket'] = 25.00; $productPrices['linens']['bedspread'] = 50.00; $productPrices['furniture']['lamp'] = 44.00; $productPrices['furniture']['rug'] = 75.00; § Como usar um array multidimensional $shirtPrice = $productPrices['clothing']['shirt']; IST DEI ▪ Bases de Dados 2006-07 ▪ 23 Arrays multidimensionais <?php echo "<table border=1>"; foreach($productPrices as $category) { foreach($category as $product => $price) { $f_price = sprintf("%01.2f", $price); echo "<tr>"; echo "<td>$product</td>"; echo "<td>$f_price</td>"; echo "</tr>"; } } echo "</table>"; ?> (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 24 Instrução if if ($country == "Germany" ) { $message = "Willkommen!"; } elseif ($country == "France" ) { $message = "Bienvenue!"; } else { $message = "Welcome!"; } echo "$message<br>"; IST DEI ▪ Bases de Dados 2006-07 ▪ 25 Instrução switch switch($country) { case "Germany" : $salestaxrate = 0.16; break; case "Portugal" : $salestaxrate = 0.21; break; default: $salestaxrate = 0.19; break; } $salestax = $orderTotalCost * $salestaxrate; IST DEI ▪ Bases de Dados 2006-07 ▪ 26 Ciclo for for ($i = 0; $i < sizeof($customerNames); $i++) { echo "$customerNames[$i]<br>"; } for ($i = 0, $j = 1; $t <= 4; $i++, $j++) { $t = $i + $j; echo "$t<br>"; } IST DEI ▪ Bases de Dados 2006-07 ▪ 27 Ciclo while while($testvar != "yes") { if ($customers[$k] == "Smith") { $testvar = "yes"; echo "Smith<br>"; } else { echo "$customers[$k], not Smith<br>"; } $k++; } IST DEI ▪ Bases de Dados 2006-07 ▪ 28 Ciclo do…while do { if ($customers[$k] == "Smith") { $testvar = "yes"; echo "Smith<br>"; } else { echo "$customers[$k], not Smith<br>"; } $k++; } while($testvar != "yes") • também é possível utilizar break e continue IST DEI ▪ Bases de Dados 2006-07 ▪ 29 Redireccionamento de páginas § A função header() pode ser usada para redireccionamento • mas sempre antes de qualquer outro output! if ($customer_age < 13) { header("Location: ToyCatalog.php"); } else { header("Location: ElectronicsCatalog.php"); } IST DEI ▪ Bases de Dados 2006-07 ▪ 30 Utilização de cookies § Criar cookie • sempre antes de qualquer outro output! setcookie("state","CA"); setcookie("state","CA",time()+3600); § Todos os valores dos cookies disponíveis no array $_COOKIE echo $_COOKIE['state']; IST DEI ▪ Bases de Dados 2006-07 ▪ 31 Sessões em PHP § Nem sempre os cookies estão disponíveis • PHP possui um mecanismo mais conveniente: sessões § Quando uma sessão é iniciada • se a sessão já existe usa a mesma, senão cria nova • passa o identificador de sessão em cada página ▫ através de cookies, no URL, ou variáveis POST escondidas • armazena variáveis no array $_SESSION IST DEI ▪ Bases de Dados 2006-07 ▪ 32 Utilização de sessões § Iniciar uma sessão • sempre antes de qualquer outro output! session_start(); § Criar variáveis de sessão numa página: $_SESSION['state'] = "CA"; • e usá-las noutra: echo $_SESSION['state']; § Fechar a sessão session_destroy(); IST DEI ▪ Bases de Dados 2006-07 ▪ 33 Exemplo de sessão – página 1 <?php session_start(); ?> <html> <head><title>Testing Sessions page 1</title></head> <body> <?php $_SESSION['session_var'] = "testing"; echo "This is a test of the sessions feature. <form action='sessiontest2.php' method='POST'> <input type='hidden' name='form_var' value='testing'> <input type='submit' value='go to next page'> </form>"; ?> </body></html> (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 34 Exemplo de sessão – página 2 <?php session_start(); ?> <html> <head><title>Testing Sessions page 2</title></head> <body> <?php echo "session_var = {$_SESSION['session_var']}<br>\n"; echo "form_var = {$_POST['form_var']}<br>\n"; ?> </body></html> (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 35 Bases de Dados PHP e MySQL Estabelecer ligação ao MySQL § Abrir uma ligação $connection = mysql_connect($host,$user,$password) or die("Couldn't connect to server"); § Informação sobre erros if (!$connection = mysql_connect($host,$user,$password)) { $message = mysql_error(); echo "$message<br>"; die(); } IST DEI ▪ Bases de Dados 2006-07 ▪ 37 Estabelecer ligação ao MySQL § Escolher a BD (por nome) $database = "bank"; $db = mysql_select_db($database, $connection); § Fechar a ligação mysql_close($connection); IST DEI ▪ Bases de Dados 2006-07 ▪ 38 Enviar perguntas $result = mysql_query($query) or die("Couldn't execute query."); $result = mysql_query($query, $connection) or die("Couldn't execute query."); § Para perguntas que devolvem um resultado • $result é um apontador para os dados § Para perguntas que não devolvem um resultado • verdadeiro ou falso, conforme sucesso da operação IST DEI ▪ Bases de Dados 2006-07 ▪ 39 Acesso aos resultados § Para aceder aos resultados, obtém-se um array $row = mysql_fetch_assoc($result); while($row) { $valor = $row["atributo"]; echo "<p>$valor</p>"; $row = mysql_fetch_assoc($result); } IST DEI ▪ Bases de Dados 2006-07 ▪ 40 Acesso aos resultados – exemplo <table border=1> <tr><td><b>Name</b></td><td><b>Street</b></td> <td><b>City</b></td></tr> <?php $sql="select * from customer"; $result = mysql_query($sql); echo "N. of results: " . mysql_num_rows($result)"; echo "N. of columns: " . mysql_num_fields($result)"; while($row_array = mysql_fetch_array($result)) { echo "<tr>"; echo "<td>{$row_array['customer_name']}</td>"; echo "<td>{$row_array['customer_street']}</td>"; echo "<td>{$row_array['customer_city']}</td>"; echo "</tr>"; } ?> (demo) </table> IST DEI ▪ Bases de Dados 2006-07 ▪ 41 Processamento de formulários § Um formulário HTML <form action="processform.php" method="post"> <p>Your name: <input type="text" name="name"/></p> <p>Your age: <input type="text" name="age"/></p> <p><input type="submit"/></p> </form> § O script processform.php terá acesso aos campos do formulário através dos arrays • $_POST – se o método utilizado for POST • $_GET – se o método utilizado for GET • $_REQUEST – variáveis de $_POST, $_GET e $_COOKIE § Exemplo: $name = $_POST['name']; IST DEI ▪ Bases de Dados 2006-07 ▪ 42 Processamento de formulários – exemplo <html> <head><title>Customer Info</title></head> <body> <?php foreach ($_POST as $field => $value) { echo "$field = $value<br>"; } ?> </body> </html> (demo) 43 IST DEI ▪ Bases de Dados 2006-07 ▪ Utilização de outros controlos § Usar radio buttons <input name="curso" type="radio" value="diurno"/>Frequentar curso diurno<br> <input name="curso" type="radio" value="nocturno"/>Frequentar curso nocturno<br> § Usar checkboxes <input type="checkbox" name="ingrediente1" value="queijo"> Queijo<br> <input type="checkbox" name="ingrediente2" value="fiambre"> Fiambre<br> <input type="checkbox" name="ingrediente3" value="tomate"> Tomate<br> (demo) IST DEI ▪ Bases de Dados 2006-07 ▪ 44 Limpeza de dados § Formatação adequada dos dados (texto vs. HTML) • strip_tags() – remove elementos HTML $last_name = strip_tags("<p>Assunção</p>"); • htmlspecialchars() – converte caracteres especiais para entidades HTML $last_name = htmlspecialchars("Assunção"); IST DEI ▪ Bases de Dados 2006-07 45 IST DEI ▪ Bases de Dados 2006-07 46 ▪ Manual PHP ▪