Bases de Dados Introdução à linguagem PHP Tópicos PHP • blocos construtivos • arrays • instruções condicionais • ciclos • redireccionamento • sessões PHP and Postgres • interacção com o Postgres • utilização de formulários HTML IST ▪ DEI ▪ Bases de Dados 2 1 Introdução ao PHP PHP: PHP Hypertext Preprocessor • linguagem de 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 • possui um vasto conjunto de extensões • é software livre 3 IST ▪ DEI ▪ Bases de Dados Arquitectura Browser 1 pedido HTTP HTML extensão 8 *.php 2 Servidor Web 7 HTML queries SQL 5 PHP 3 ficheiro *.php 6 SGBD dados código PHP 4 Sistema de ficheiros IST ▪ DEI ▪ Bases de Dados 4 2 Uma página em PHP variáveis SGBD HTML HTML PHP HTML HTML HTML Servidor Cliente IST ▪ DEI ▪ Bases de Dados 5 "Hello World" em PHP <html> <head> <title>PHP Test</title> </head> <body> <?php echo('<p>Hello World!</p>'); ?> </body> </html> Demo: helloworld.php IST ▪ DEI ▪ Bases de Dados 6 3 Variáveis Não é preciso declarar variáveis, simplesmente atribuir valor $age = 12; $price = 2 2.55; 55; $number = -2; $name = "Jones"; Os nomes de variáveis • começam com um $ podem incluir apenas p letras,, algarismos g e underscore • p • não podem começar por número Para "destruir" variáveis usa-se: unset($age); PHP é case-sensitive! IST ▪ DEI ▪ Bases de Dados 7 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 8 4 Instrução if $message = ""; if ($country == "Germany" ) { g = "Willkommen!"; $message } elseif ($country == "France" ) { $message = "Bienvenue!"; } else { $message = "Welcome!"; } echo("$message<br>"); IST ▪ DEI ▪ Bases de Dados 9 Strings Uma string $string = 'Hello World!'; p ((" e ')) Caracteres especiais $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 10 5 Aspas e plicas Texto entre plicas não é processado $age = 12; echo('The age is $age'); The h age i is $ $age Texto entre aspas é processado $age = 12; echo("The age is $age"); The age is 12 Caracteres especiais • \n, \t, ... 11 IST ▪ DEI ▪ Bases de Dados Data e hora Data e hora actual $today = time(); http://www.php.net/manual/en/ IST ▪ DEI ▪ Bases de Dados 12 6 Data e hora Formatar uma data $cdate = date("d/m/y", $today); $ctime = date("G:i:s", $today); http://www.php.net/manual/en/ 13 IST ▪ DEI ▪ Bases de Dados Data e hora Conversão de strings para datas $prazo = strtotime("January 15 2003"); http://www.php.net/manual/en/ IST ▪ DEI ▪ Bases de Dados 14 7 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 variantes $importantDate $importantDate $importantDate $importantDate p $importantDate $importantDate ... = = = = = = strtotime("tomorrow"); strtotime("now + 24 hours"); strtotime("last saturday"); strtotime("8pm p + 3 days"); y strtotime("2 weeks ago"); strtotime("this 4am"); IST ▪ DEI ▪ Bases de Dados 15 Outros elementos úteis Mais operadores aritméticos $counter += 2; $ $counter -= 3; 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 16 8 Funções Exemplo • adição de 2 números (argumentos opcionais) function addnumbers($num1 = 1, $num2 = 1) { $total = $num1 + $num2; return $total; } IST ▪ DEI ▪ Bases de Dados 17 Arrays Array simples $animais[1] = "gato"; $animais[2] = "tigre"; $animais[4] = "elefante"; $animais = array("gato","tigre","elefante"); (inicializa elementos [0], [1] e [2]) IST ▪ DEI ▪ Bases de Dados 18 9 Arrays Array associativos $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 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) IST ▪ DEI ▪ Bases de Dados 20 10 Iterar por um array Os arrays podem comportar-se como iteradores reset($airlines); $ l $value = current($airlines); ($ i li ) 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 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: foreach.php IST ▪ DEI ▪ Bases de Dados 22 11 Arrays multidimensionais Como criar um array multidimensional $productPrices['clothing']['shirt'] $ d tP i [' l thi '][' hi t'] = 20 20.00; 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 23 Arrays multidimensionais <?php echo("<table border=1>"); foreach($productPrices as $category => $prices) { f foreach($prices h($ i as $ $product d t => > $ $price) i ) { echo("<tr>"); echo("<td>$category</td>"); echo("<td>$product</td>"); $f_price = sprintf("%01.2f", $price); echo("<td>$f_price</td>"); echo("</tr>"); ( / ); } } echo("</table>"); Demo: multidim.php ?> IST ▪ DEI ▪ Bases de Dados 24 12 Ciclo for for ($i = 0; $i < sizeof($customerNames); $i++) { echo( $customerNames[$i]<br> ); echo("$customerNames[$i]<br>"); } for ($i = 0, $j = 1; $t <= 4; $i++, $j++) { $t = $i + $j; echo("$t<br>"); ( $ ) } IST ▪ DEI ▪ Bases de Dados 25 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 26 13 Ciclo do…while do { if ($customers[$k] == "Smith") { $t t $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 27 Bases de Dados Processamento de formulários 14 Formulários HTML Exemplo <html> <body> <form action="submit.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> </body> </html> Demo: form.php 29 Processamento de formulários Um formulário HTML <form action="submit1.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 submit.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 $ Q S – variáveis iá i d de $_POST, $ OS $_GET $ G e $_COOKIE $ COO Exemplo: $name = $_REQUEST["name"]; 30 15 Processamento de formulários Exemplo <html> <body> <p> O nome é: <?php echo($_REQUEST["name"]); ?> </p> <p> A idade é: <?php echo($_REQUEST["age"]); ?> </p> </body> </html> 31 Processamento de formulários Outro exemplo <html> <head><title>Customer Info</title></head> <body> <?php foreach ($_REQUEST as $field => $value) { echo("$field = $value<br>"); } ?> </body> </html> Demo: form.php + submit.php IST ▪ DEI ▪ Bases de Dados 32 16 Utilização de outros controlos Radio buttons <input name="curso" type="radio" value="diurno"/>Frequentar curso diurno<br> di b <input name="curso" type="radio" value="nocturno"/>Frequentar curso nocturno<br> 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: form2.php IST ▪ DEI ▪ Bases de Dados 33 Bases de Dados Sessões em PHP 17 Sessões em PHP PHP implementa mecanismos de sessões Quando uma sessão é iniciada • se a sessão já existe usa essa, 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 (transparente para o utilizador) • armazena variáveis no array $_SESSION $ SESSION IST ▪ DEI ▪ Bases de Dados 35 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['user'] = "João"; • e usá-las noutra: echo($_SESSION['user']); Fechar a sessão session_destroy(); IST ▪ DEI ▪ Bases de Dados 36 18 Exemplo de sessão – página 1 <?php session_start(); ?> <html> <body> <? h <?php $_SESSION['session_var'] = "valor de sessão"; echo("Foi criada uma variável de sessão."); ?> <form action="session2.php" method="POST"> <input type="hidden" name="form_var" value="valor de formulário"> <input type="submit" value="go to next page"> </form> </body> </html> Demo: session1.php IST ▪ DEI ▪ Bases de Dados 37 Exemplo de sessão – página 2 <?php session_start(); ?> <html> <b d > <body> <?php echo("session_var = {$_SESSION['session_var']}<br/>"); echo("form_var = {$_REQUEST['form_var']}<br/>"); ?> </body> </html> Demo: session2.php IST ▪ DEI ▪ Bases de Dados 38 19 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 39 Bases de Dados PHP e Postgres 20 PHP e Postgres 1. Abrir a ligação e escolher a BD $user = “istxxxxxx"; $host = “db.ist.utl.pt"; $port = 5432; $password = “xxxxxxxx“; $dbname = $user; /* username sigma */ /* password psql_reset */ /* porquê? */ $connection = pg_connect("host=$host port=$port user=$user password=$password dbname=$dbname") or die(pg_last_error()); IST ▪ DEI ▪ Bases de Dados 41 PHP e Postgres 2. Fazer uma consulta $sql = "select * from customer"; $result = pg_query($sql) or die(pg_last_error()); IST ▪ DEI ▪ Bases de Dados 42 21 PHP e Postgres 3. Determinar o número de colunas e de registos devolvidos (opcional) echo("No. columns: " . pg_num_fields($result) . "<br/>"); echo("No. records: " . pg_num_rows($result) . "<br/>"); IST ▪ DEI ▪ Bases de Dados 43 PHP e Postgres 4. Iterar pelos resultados echo("<table>"); while($row_array = pg_fetch_assoc($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>"); } echo("</table>"); IST ▪ DEI ▪ Bases de Dados 44 22 PHP e Postgres 5. Fechar a ligação pg_close($connection); IST ▪ DEI ▪ Bases de Dados 45 Consultas e modificações à BD $result = pg_query($query) or die("Could di ("C ld not t execute t query."); ") Para perguntas que devolvem um resultado • $result é um apontador para os dados Para p perguntas g q que não devolvem um resultado • verdadeiro ou falso, conforme sucesso da operação • pg_last_error() permite determinar último erro IST ▪ DEI ▪ Bases de Dados 46 23 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 $ l = " $sql "select l t * f from customer"; t " $result = pg_query($sql) or die(pg_last_error()); echo("N. of results: " . pg_num_rows($result) . "<br/>"); echo("N. of columns: " . pg_num_fields($result) . "<br/>"); while($row_array = pg_fetch_assoc($result)) { echo("<tr>"); echo("<td>{$row_array['customer_name']}</td>"); echo("<td>{$row_array['customer_street']}</td>"); echo("<td>{$row echo( <td>{$row_array[ array['customer customer_city city']}</td>"); ]}</td> ); echo("</tr>"; } ?> Demo: customers.php </table> IST ▪ DEI ▪ Bases de Dados 47 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 48 24 PHP e Postgres Documentação das funções utilizadas • http://www.php.net/manual/en/book.pgsql.php 49 25