Witajcie !
Ostatnio na zajęciach robiliśmy bazę MySQL którą połączyliśmy za pomocą PHP i tzw. warstwy abstrakcji PDO.
Mamy działającą aplikację, w której możemy dodawać, usuwać i edytować rekordy.
Jest jeden problem - wszystko jest zrobione na metodzie GET, która jak wszyscy wiedzą nie jest bezpieczna.
Mamy ją przerobić na POST. I tu się zaczyna problem - nie wiem jak to zrobić.
Moja "aplikacja" składa się z trzech plików : konfiguracyjnego (dane dostępu do bazy) , db.php (obsługa bazy) i index.php (reszta).
To plik db.php :
<?php
class Baza
{
public $lp;
function __construct($dbms, $host, $database, $port, $username, $password)
{
try {
$this->pdo = new PDO($dbms.':host='.$host.';dbname='.$database.';port='.
$port, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->lp = 0;
}
catch(PDOException $e) {
echo 'Połączenie nie mogło zostać utworzone:<br> ' . $e->getMessage();
}
}
function select_insert()
{
echo '
<form method="post" action="index.php" name="formularz">
<input type="hidden" name="insert" value="true">
<table>
<tr>
<th>LP</th>
<th>Imię</th>
<th>Nazwisko</th>
<th>Waga</th>
<th>Aktualizacja</th>
<th>Usuń</th>
<th onclick="sprawdz()">Edytuj</th>
</tr>';
$stmt = $this->pdo->query('SELECT id_osoba, imie, nazwisko, waga, aktualizacja FROM osoba');
$lp = 1;
foreach($stmt as $row)
{
echo '<tr>'.
'<td>'.$lp.'</td>'.
'<td>'.$row['imie'].'</td>'.
'<td>'.$row['nazwisko'].'</td>'.
'<td>'.$row['waga'].'</td>'.
'<td>'.$row['aktualizacja'].'</td>'.
'<td><a href="index.php?delete='.$row['id_osoba'].
'" class="delete" onclick=\'return confirm("Na pewno usunąć?");\'>U</a></td>'.
'<td><a href="index.php?edit='.$row['id_osoba'].'" class="edit">E</a></td>'.
'</tr>';
$lp++;
}
$stmt->closeCursor();
echo '<tr>
<td></td>
<td><input type="text" name="imie"></td>
<td><input type="text" name="nazwisko"></td>
<td><input type="text" name="waga"></td>
<td><input type="submit" value="Dodaj" onclick="return sprawdz();"></td>
<td></td>
<td></td>
</tr>
</table>
</form>';
}
function select_update($id)
{
echo '
<form method="post" action="index.php" name="formularz">
<input type="hidden" name="insert" value="true">
<table>
<tr>
<th>Lp</th>
<th>Imię</th>
<th>Nazwisko</th>
<th>Waga</th>
<th>Aktualizacja</th>
<th>Usuń</th>
<th>Edytuj</th>
</tr>';
$stmt = $this->pdo->query('SELECT id_osoba, imie, nazwisko, waga, aktualizacja FROM osoba');
foreach($stmt as $row)
{
if($row['id_osoba'] == $id)
{
echo '<tr>'.
'<td><input type="hidden" name="update" value="'.$row['id_osoba'].'">'.
$row['id_osoba'].'</td>'.
'<td><input type="text" value="'.$row['imie'].'" name="imie"></td>'.
'<td><input type="text" value="'.$row['nazwisko'].'" name="nazwisko"></td>'.
'<td><input type="text" value="'.$row['waga'].'" name="waga"></td>'.
'<td>'.$row['aktualizacja'].'</td>'.
'<td><input type="submit" value="Zapisz" onclick="return sprawdz();"></td>'.
'<td><input type="button" value="Anuluj" '.
'onclick="document.location = \'index.php\';"></td>'.
'</tr>';
}
else
echo '<tr>'.
'<td>'.$this->lp.'</td>'.
'<td>'.$row['imie'].'</td>'.
'<td>'.$row['nazwisko'].'</td>'.
'<td>'.$row['waga'].'</td>'.
'<td>'.$row['aktualizacja'].'</td>'.
'<td><a href="index.php?delete='.$row['id_osoba'].
'" class="delete" onclick=\'return confirm("Na pewno usunąć?");\'>U</a></td>'.
'<td><a href="index.php?edit='.$row['id_osoba'].'" class="edit">E</a></td>'.
'</tr>';
}
$stmt->closeCursor();
echo '</table></form>';
}
function insert($imie,$nazwisko,$waga,$aktualizacja)
{
$lp++;
try {
$dbquery = $this->pdo->prepare('INSERT INTO osoba(imie, nazwisko, waga, aktualizacja) VALUES(?, ?, ?, ?)');
$dbquery->execute(array($imie,$nazwisko,$waga,$aktualizacja));
header('Location: index.php');
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
function delete($id)
{
try {
$dbquery = $this->pdo->prepare('DELETE FROM osoba WHERE id_osoba= ?');
$dbquery->execute(array($id));
header('Location: index.php');
$lp--;
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
function update($imie, $nazwisko, $waga, $aktualizacja, $id)
{
try {
$dbquery = $this->pdo->prepare('UPDATE osoba SET imie = ?, nazwisko = ?, waga = ?, aktualizacja = ? WHERE id_osoba = ?');
$dbquery->execute(array($imie, $nazwisko, $waga, $aktualizacja, $id));
header('Location: index.php');
}
catch(PDOException $e) {
echo $e->getMessage();
}
}
}
?>
A to index.php :
<!DOCTYPE HTML>
<html>
<head>
<title>Baza danych w PHP przy użyciu biblioteki PDO - przykład</title>
<meta charset="utf-8">
<meta name="author" content="">
<meta name="description" content="">
<meta name="keywords" content="">
<link href="style.css" rel="stylesheet" type="text/css">
<script src="skrypty.js" type="text/javascript"></script>
</head>
<body>
<section>
<header>
<h1>Przykład użycia biblioteki PDO - tabela osoba.</h1>
</header>
<?php
require('db.php');
require('config.php');
$baza = new Baza($szbd,$host,$dbname,$port,$login,$haslo);
if( isset($_GET['delete']) )
$baza->delete($_GET['delete']);
elseif( isset($_POST['update']) )
$baza->update($_POST['imie'],$_POST['nazwisko'],$_POST['waga'],date("Y-m-d H:i:s"),$_POST['update']);
elseif( isset($_POST['insert']) )
$baza->insert($_POST['imie'],$_POST['nazwisko'],$_POST['waga'],date("Y-m-d H:i:s"));
elseif( isset($_GET['edit']) )
$baza->select_update($_GET['edit']);
else
$baza->select_insert();
?>
</section>
<section>
<header>
<h2>Uwagi:</h2>
</header>
<p>Powyższy przykład demonstruje użycie biblioteki PDO i umożliwia wyświetlanie, dodawanie, usuwanie, modyfikowanie danych w tabeli osoba(id_osoba,imie,nazwisko,waga,aktualizacja).
Rozwiązanie zostało przedstawione w postaci obiektowej.
Dodatkowo też zostały zaprezentowane sposoby przesyłania informacji pomiędzy stronami www metodami GET i POST. Ze względów bezpieczeństwa dane przesyłane o usuwanym i modyfikowanym rekordzie powinny być przesyłane metodą POST, a nie tak jak to jest w przykładzie metodą GET (uwaga: istnieje możliwość złośliwego preparowania linków). Wynikowy interfejs jest napisany w HTML5, a formatowanie strony znajduje się w zewnętrznym pliku CSS. Do walidacji pól formularza użyto prostych funkcji javascript, które zostały umieszczone w zewnętrznym pliku JS. Plik SQL zawiera strukturę bazy danych - przykład został przetestowany na MySQL i PostgreSQL. Przedstawiony przykład powinien być odporny na ataki SQL injection.
</section>
<footer>
<br>
<div>Copyright © 2013 <a href="#">Anonim</a></div>
</footer>
</body>
</html>
Zapomniałem dodać - mam także plik javascript, w którym mam funkcję sprawdz(), sprawdzającą pewne warunki.
Próbowałem problem rozwiązać zmienną sesyjną, ale są zapisywanie nie te wartości, jakie potrzeba. Próbowałem także zmienić przekazywanie parametrów do funkcji jednak to także nic nie dało.
Ma ktoś jakiś pomysł, jak to ugryźć ?
Pozdrawiam