Publicarea Bazelor de Date pe WEB

  1. Să se realizeze o aplicație web ce menține o listă de contacte dintr-o agendă telefonică. Aplicația va permite următoarele operații:

Pentru a reține contactele din agendă creăm o bază de date MySQL. Clauzele SQL ce crează baza de date db_agenda și tabela contacte sunt următoarele:

CREATE DATABASE db_agenda; USE db_agenda; CREATE TABLE IF NOT EXISTS `contacte` ( `id` INT(11) NOT NULL auto_increment, `nume` CHAR(30) NOT NULL, `numar` CHAR(20) NOT NULL, PRIMARY KEY (`id`) );

Pentru a executa aceste comenzi putem utiliza intrefața web de administrare a serverului MySQL phpMyAdmin accesibilă la adresa http://localhost/phpmyadmin/.

Pentru a ne conecta la acestă bază de date din aplicaţia web avem nevoie de un user şi o parolă. În acest sens putem utiliza userul default root, creat automat la instalarea serverului MySQL. Din motive de securitate se recomandă evitarea utilizării acestui user deoarece acesta este un user de tip Administrator ce are acces deplin asupra tuturor bazelor de date de pe sistemul respectiv, iar o breşă de securitate ce ar putea fi prezentă în aplicaţie ar putea compromite toate aceste baze de date.

Din acest motiv se recomandă crearea unui utilizator ce are drept doar asupra bazei de date utilizată în cadrul aplicaţiei astfel:

GRANT ALL PRIVILEGES ON db_agenda.* TO 'agendauser'@'localhost' IDENTIFIED BY 'changeit';

Această comandă crează userul agendauser cu parola changeit ce se poate conecta doar de pe maşina locală localhost.

În continuare sunt prezentate fişierele PHP ale aplicaţiei web. Acestea vor fi stocate pe disk într-un director al serverului web. Dacă utlizăm XAMPP şi acesta este instalat în directorul c:\xampp atunci putem stoca aceste fişiere în directorul c:\xampp\htdocs\agenda iar aplicaţia va fi accesibilă la adresa http://localhost/agenda/.

----- config.php -----------

<?php /* Detaliile de conectare la baza de date */ define('DB_HOST', 'localhost'); define('DB_NAME', 'db_agenda'); define('DB_USER', 'agendauser'); define('DB_PASS', 'changeit'); /*Se reporteaza toate erorrile cu exceptia celor de tip NOTICE si DEPRECATED */ error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED); ?>

----- connect.php -----------

<?php require_once "config.php"; //Stabilim conexiunea cu serverul MySQL $conexiune = mysqli_connect(DB_HOST, DB_USER, DB_PASS); if (!$conexiune) { die('Eroare conectare la MySQL: ' . mysqli_connect_error()); } mysqli_select_db($conexiune, DB_NAME) or die("Eroare la selectarea bazei de date " . mysqli_error($conexiune)); ?>

----- header.php -----------

<html> <head> <title>Agenda Telefonica</title> </head> <body>

----- footer.php -----------

</body> </html>

----- index.php -----------

<?php include "header.php"; include "connect.php"; ?> <h1>Agenda</h1> <?php $comanda = $_REQUEST["comanda"]; if (isset($comanda)) { switch ($comanda){ case 'add': $nume = $_REQUEST["nume"]; $numar = $_REQUEST["numar"]; //TODO: Aici trebuie adaugat cod ce valideaza datele. $sql="INSERT INTO contacte(nume, numar) VALUES ('$nume','$numar')"; if (!mysqli_query($conexiune, $sql)) { die('Error: ' . mysqli_error($conexiune)); } echo "<font color='red'>Intrare adaugata cu succes</font><br/>"; break; case 'delete': $id = $_REQUEST["id"]; //TODO: Aici trebuie adaugat cod ce valideaza datele. $sql = "DELETE FROM contacte WHERE id=$id"; if (!mysqli_query($conexiune, $sql)) { die('Error: ' . mysqli_error($conexiune)); } echo "<font color='red'>Intrarea cu id-ul $id a fost stearsa cu succes</font><br/>"; break; case 'edit': $id = $_REQUEST["id"]; //TODO: Aici trebuie adaugat cod ce valideaza datele. $sql = "SELECT * FROM contacte WHERE id=$id"; $result = mysqli_query($conexiune, $sql); if ($row = mysqli_fetch_array($result)) { $nume = $row['nume']; $numar = $row['numar']; ?> <!-- Forma de editare (begin) --> <h3>Editare</h3> <form action="index.php" method="post"> <input name="comanda" type="hidden" value="update" /> <input name="id" type="hidden" value="<?php echo $id;?>" /> Nume: <input type="text" name="nume" value="<?php echo $nume;?>"/> Numar: <input type="text" name="numar" value="<?php echo $numar;?>"/> <input type="submit" value="Update"/> </form> <!-- Forma de editare (end) --> <?php } else { echo "<font color='red'>Intrarea cu id-ul $id nu exista!</font><br/>"; } break; case 'update': $id = $_REQUEST["id"]; $nume = $_REQUEST["nume"]; $numar = $_REQUEST["numar"]; //TODO: Aici trebuie adaugat cod ce valideaza datele. $sql = "UPDATE contacte SET nume='$nume', numar='$numar' WHERE id=$id"; if (!mysqli_query($conexiune, $sql)) { die('Error: ' . mysqli_error($conexiune)); } else { echo "<font color='red'>Intrarea cu id-ul $id a fost actualizata cu succes!</font><br/>"; } break; } } ?> <?php /** Afisarea numerelor din agenda */ $query = "SELECT * FROM contacte"; $result = mysqli_query($conexiune, $query); if(mysqli_num_rows($result)) { print("<table border='1' cellspacing='0'>\n"); print("<tr><th>#</th><th width='300'>Nume</th><th width='100'>Numar</th><th>Sterge</th><th>Edit</th></tr>\n"); while($row = mysqli_fetch_array($result)){ print("<tr>\n"); print("<td>" . $row['id']. "</td>\n"); print("<td>" . $row['nume']. "</td>\n"); print("<td>" . $row['numar']. "</td>\n"); print("<td><a href='index.php?comanda=delete&id=" . $row['id']. "'>Delete</a></td>\n"); print("<td><a href='index.php?comanda=edit&id=" . $row['id']. "'>Edit</a></td>\n"); print("</tr>\n"); } print("</table>"); } else { print "Nu exista intrari in agenda!"; } ?> <!-- Forma de adaugare --> <form action="index.php" method="post"> <input name="comanda" type="hidden" value="add" /> Nume: <input type="text" name="nume" /> Numar: <input type="text" name="numar" /> <input type="submit" value="Adauga"/> </form> <?php include "footer.php"; ?>
  1. Să se modifice aplicația precedentă pentru a permite validarea datelor introduse. Se vor adauga următoarele restricții: numele și numarul de telefon trebuie să fie nenule, numărul de telefon trebuie să conțină doar cifre.

  2. Încercați să adăugați un contact ce conține în nume un apostrof (ex: O’Hara). Explicați rezultatul și apoi corectați aplicația pentru a permite adaugarea unor astfel de înregistrări.

    Indicație: se va utiliza funcția php mysqli_real_escape_string(string).

  3. Să se realizeze o aplicatie ce gestionează notele dintr-un catalog școlar.