Sunteți pe pagina 1din 10

Workshop2.

Crearea mediului de lucru si conectarea MySQL cu PHP (partea a 2-a: Update si


Adaugare protectie CSRF)

In primul tutorial am invatat cum sa ne conectam la baza de date MySQL folosind o metoda „moderna“, PDO.

Invatam cum sa modificam si cum sa stergem o inregistrare in PHP/MySQL .

Cerinte preliminarii:

- Cunostinte minime de HTML

- Cunostinte minime de PHP

- Un mediu local PHP+MySQL ( XAMPP )

- Codul aplicatiei create in primul Worksohop

Scopuri:

- Crearea unei pagini care listeaza toti utilizatorii impreuna cu un buton de editare asociat fiecarui nume
- Crearea dinamica a unei pagini unice care permite editarea datelot unei persoane

Pasul 1: Pregatirea mediului de lucru

Dacă ati efectuat primul tutorial , veți avea tot codul de care aveți nevoie pentru a începe să lucrati.

Dacă nu aveti codul din primul tutorial. Puteți descărca întregul cod și îl puteți plasa în rădăcina serverului dvs.

Tot ceea ce vom edita este în folderul „public“, deoarece toate configurațiile noastre inițiale raman aceleasi.
Pregătește totul pentru a lucra din punctul in care l-am lăsat, și apoi putem continua.

Pasul 2: Crearea unei liste editabile a tuturor utilizatorilor

- Cream un fisier nou „update.php“


- In „index.php“ adaugam un link catre „update.php“ imediat dupa cel de „Create“ si „Read“

<li><a href="update.php"><strong>Update</strong></a> - edit a user</li>

Acum rularea aplicatiei ar trebui sa returneze o pagina cu urmatorul continut:

Urmatorul pas este adaugarea de cod in fisierul „Update.php“. Rolul acestui fisier este de a lista toti utilizatorii
din baza de date si de a afisa un link „Edit“ langa fiecare utilizator, care va facilita editarea utilizatorilor individual.

Selectarea ruturor utilizatorilor se face cu interogarea:

$sql = "SELECT * FROM users";

- Vertraulich / Confidential -
Aceasta este cea mai simplă comandă SQL posibilă pe care o putem executa cu PDO - pur și simplu selectați
toți utilizatorii, pregătiți instrucțiunea și stocați rezultatul în rezultatul $result

$sql = "SELECT * FROM users";

$statement = $connection->prepare($sql);

$statement->execute();

$result = $statement->fetchAll();

Folosind acest lucru, putem construi blocul nostru try / catch în partea de sus a „update.php“.

<?php

/**
* List all users with a link to edit
*/

require "../config.php";
require "../common.php";

try {
$connection = new PDO($dsn, $username, $password, $options);

$sql = "SELECT * FROM users";

$statement = $connection->prepare($sql);
$statement->execute();

$result = $statement->fetchAll();
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
?>
Sub acest cod vom construi tabela HTML care va contine rezultatele generate de SELECT

<?php require "templates/header.php"; ?>

<h2>Update users</h2>

<table>
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email Address</th>
<th>Age</th>
<th>Location</th>

- Vertraulich / Confidential -
<th>Date</th>
/**
* 1 - aici urmeaza sa adaugam ceva
*/
</tr>
</thead>
<tbody>
<?php foreach ($result as $row) : ?>
<tr>
<td><?php echo escape($row["id"]); ?></td>
<td><?php echo escape($row["firstname"]); ?></td>
<td><?php echo escape($row["lastname"]); ?></td>
<td><?php echo escape($row["email"]); ?></td>
<td><?php echo escape($row["age"]); ?></td>
<td><?php echo escape($row["location"]); ?></td>
<td><?php echo escape($row["date"]); ?> </td>
/**
* 2 - aici urmeaza sa adaugam ceva
*/
</tr>
<?php endforeach; ?>
</tbody>
</table>

<a href="index.php">Back to home</a>

<?php require "templates/footer.php"; ?>

Până în prezent, avem aceleasi cod ca in în read.php. Partea interesantă pe care o vom adăuga acum este
modul în care vom ajunge la o pagină în care putem edita fiecare utilizator individual.

La „1“ mai adaugam o coloana iat la

<th>Edit</th>

- Vertraulich / Confidential -
iar la „2“ vom adăuga un link care corespunde acestui antet pentru fiecare utilizator. Vom crea un nou fișier
numit update-single.php, care va fi o pagină de editare pentru fiecare utilizator. Dar cum va sti actualizat-
single.php dacă suntem pe editare la un utilizator sau la altul?

Vom transmite lui update-single.php printr-un parametru în URL-ul aferent utilizatorului pentru a edita. Din
moment ce știm ce fiecare utilizator este unic, iar noi nu putem garanta alte date, cum ar fi numele și vârsta ca
sunt unice, o putem folosi în condiții de siguranță „id“- ul pentru a identifica fiecare utilizator.

Se creeze un link care deschiede actualiza-single.php, și pun un semn de întrebare după numele fișierului,
care porneste un șir de interogare HTTP. După această semn de întrebare, putem insera cat mai multe perechi
cheie / valoare așa cum ne dorim în adresa URL.

Dacă vrem să se acceseze utilizatorul cu numele „Dinesh“, are un id = 3, URL-ul nostru va fi „update-
single.php? Id = 3“.

<td><a href="update-single.php?id=<?php echo escape($row["id"]); ?>">Edit</a></td>

Pasul 3: Modificarea datelor unui utilizator existent

In primul rând, vom dori să afișeze datele pe care le vom edita, apoi va trebui sa adaugam funcții pentru a
modifica.

In Update.php, am creat link-uri de editare care detectează ID-ul utilizatorului și creaza o adresă URL unică
pentru fiecare utilizator. update-single.php, trebuie să ne dăm seama care este încărcat în, deoarece toate
pagina de editare se vor deschide prin această singură pagină.

Așa cum ne-am folosit $ _POST pentru a detecta ce date a fost postat printr-un formular HTML, vom folosi $
_GET pentru a prelua informații de la URL. Este important de remarcat faptul că datele sensibile, cum ar fi
parolele nu ar trebui să fie trecut prin variabila $ _GET; Cu toate acestea, în exemplul nostru simplu de
astăzi, nu se va intampla nimic rau.

Sa cream update-single.php , incarcam fisierele dorite si construin o structura “if-else“ care verifica
daca id-ul cerut exista, altfel afisam un mesaj de eroare

<?php

/**
* Use an HTML form to edit an entry in the
* users table
*/
require "../config.php";
require "../common.php";

if (isset($_GET['id'])) {

- Vertraulich / Confidential -
echo $_GET['id']; // for testing purposes
} else {
echo "Something went wrong!";
exit;
}
?>
Putem testa sa vedem ce se afiseaza.
Pagina va imprima id-ul utilizatorului selectat, așa cum se vede în URL.
Excelent! Acum, că știm că funcționează, putem folosi pentru a extrage datele în mod specific pentru acel utilizator.

Încă lucrăm cu SELECT aici, așa că facem exact ceea ce am făcut anterior cu locația read.php .
Vom atribui $ _GET [„id“] la o variabilă, și căutați utilizatorul cu clauza WHERE.

if (isset($_GET['id'])) {
try {
$connection = new PDO($dsn, $username, $password, $options);
$id = $_GET['id'];

$sql = "SELECT * FROM users WHERE id = :id";


$statement = $connection->prepare($sql);
$statement->bindValue(':id', $id);
$statement->execute();

$user = $statement->fetch(PDO::FETCH_ASSOC);
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
} else {
echo "Something went wrong!";
exit;
}

Acum vrem să afișam datele, dar va fi un pic diferit față de data anterioara.
Vom începe prin a scris o buclă foreach, dar în loc sa returnam întregul tablou asociativ în variabila, vom separa cheile
și valorile în variabile diferite. Vom lua valoarea prin fetch (DOP :: FETCH_ASSOC)
Vom pune întreaga buclă în interiorul unui formular cu un buton de trimitere.

<?php require "templates/header.php"; ?>

<h2>Edit a user</h2>

<form method="post">
<?php foreach ($user as $key => $value) : ?>
// print data here
<?php endforeach; ?>
<input type="submit" name="submit" value="Submit">
</form>

<a href="index.php">Back to home</a>

<?php require "templates/footer.php"; ?>

- Vertraulich / Confidential -
In interiorul foreach, vom face un „form“ care va consta din etichete și intrări. Fiecare etichetă va fi un nume de coloană
din baza de date.

<label for="<?php echo $key; ?>">


<?php echo ucfirst($key); ?>
</label>

Fiecare valoare va fi valoarea unui intrare. Vom folosi cheia ca nume si ID-ul de intrare și valoarea ca valoare.
Am adaugat , de asemenea, un ternar (declarație condiționată rapidă -> "?:" (or ternary) operator )
( mai multe detalii aici http://php.net/manual/en/language.operators.comparison.php )
pentru a face intrarea „readonly“.

<input
type="text"
name="<?php echo $key; ?>"
id="<?php echo $key; ?>"
value="<?php echo escape($value); ?>"
<?php echo ($key === 'id' ? 'readonly' : null); ?>>

Acum intregul „form“ va arata asa:

<form method="post">
<?php foreach ($user as $key => $value) : ?>
<label for="<?php echo $key; ?>"><?php echo ucfirst($key); ?></label>
<input type="text" name="<?php echo $key; ?>" id="<?php echo $key; ?>" value="<?php echo
escape($value); ?>" <?php echo ($key === 'id' ? 'readonly' : null); ?>>
<?php endforeach; ?>
<input type="submit" name="submit" value="Submit">
</form>

- Vertraulich / Confidential -
Singura pagina de editare are acum câmpuri care se pot modifica pentru fiecare valoare. Cu toate acestea, codul nostru
în acest moment este doar pentru a afișa datele - avem nevoie sa adăugam o altă secțiune pentru a procesa codul după
ce butonul de trimitere a fost apăsat.

În partea de sus a update-single.php, chiar sub cele două fișiere importate, verificam dacă formularul a fost trimis și
pentru asta începem un bloc try / catch.

if (isset($_POST['submit'])) {
try {
$connection = new PDO($dsn, $username, $password, $options);
// run update query
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}

Dorim să folosim clauza de UPDATE pentru a seta fiecare inregistrare la noua valoare. Codul pentru cazul nostru arata
ca :

UPDATE users
SET id = :id,
firstname = :firstname,
lastname = :lastname,
email = :email,
age = :age,
location = :location,
date = :date
WHERE id = :id

- Vertraulich / Confidential -
Asta e tot ce trebuie să actualizeze valorile acum! Am doar de gând să adăugați rapid într-un cod pentru a afișa faptul că
totul a fost actualizat.

<?php if (isset($_POST['submit']) && $statement) : ?>


<blockquote><?php echo escape($_POST['firstname']); ?> successfully updated.</blockquote>
<?php endif; ?>
Aici aven intreg fisierul creat:

<?php

/**
* Use an HTML form to edit an entry in the
* users table.

*/

require "../config.php";
require "../common.php";

if (isset($_POST['submit'])) {
//aici adaug testarea csfr mai tarziu

try {
$connection = new PDO($dsn, $username, $password, $options);

$user =[
"id" => $_POST['id'],
"firstname" => $_POST['firstname'],
"lastname" => $_POST['lastname'],
"email" => $_POST['email'],
"age" => $_POST['age'],
"location" => $_POST['location'],
"date" => $_POST['date']
];

$sql = "UPDATE users


SET id = :id,
firstname = :firstname,
lastname = :lastname,
email = :email,
age = :age,
location = :location,
date = :date
WHERE id = :id";

$statement = $connection->prepare($sql);
$statement->execute($user);

- Vertraulich / Confidential -
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}

if (isset($_GET['id'])) {
try {
$connection = new PDO($dsn, $username, $password, $options);
$id = $_GET['id'];

$sql = "SELECT * FROM users WHERE id = :id";


$statement = $connection->prepare($sql);
$statement->bindValue(':id', $id);
$statement->execute();

$user = $statement->fetch(PDO::FETCH_ASSOC);
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
} else {
echo "Something went wrong!";
exit;
}
?>

<?php require "templates/header.php"; ?>

<?php if (isset($_POST['submit']) && $statement) : ?>


<blockquote><?php echo escape($_POST['firstname']); ?> successfully
updated.</blockquote>
<?php endif; ?>

<h2>Edit a user</h2>

<form method="post">
// aici se va adauga imputul ascuns csfr
<?php foreach ($user as $key => $value) : ?>
<label for="<?php echo $key; ?>"><?php echo ucfirst($key); ?></label>
<input type="text" name="<?php echo $key; ?>" id="<?php echo $key; ?>"
value="<?php echo escape($value); ?>" <?php echo ($key === 'id' ? 'readonly' : null);
?>>
<?php endforeach; ?>
<input type="submit" name="submit" value="Submit">
</form>

<a href="index.php">Back to home</a>

- Vertraulich / Confidential -
<?php require "templates/footer.php"; ?>

Tema de lucru in clasa: crearea unui formular de upadate parola ( introducere parola veche, introducere
parola noua de doua ori testarea corectitudinii si salvarea parolei noi)

- Vertraulich / Confidential -