Harjoitus 5

Tehtävä, asenna LAMP pino

Tavoitteena on asentaa LAMP pino eli

  • Linux
  • Apache2
  • MariaDB
  • PHP

Asennuksen teen virtuaalipalvelimelle, jonka hankin Digital Ocean palvelusta.

Linux on jo asennettu aiempien harjoitusten yhteydessä. Samoin Apache2 ja PHP.

Tässä harjoituksessa jatkan ympäristön rakentamista, ja asennan MariaDB:n, ja teen CRUD toiminnallisuudet tietokantaa käyttävään PHP ohjelmaan.

MariaDB asennus

Asennus komennoilla

sudo apt-get update
sudo apt-get install mariadb-server mariadb-client

Tämän jälkeen root salasana ja tietosuojan parannuksia

sudo mysql_ssuecure_installation

Asetukset seuraavasti

Enter current password for root (enter for none): Press Enter for none.

  • Set root password? Y
  • Create and confirm a new password
  • Remove anonymous users? Y
  • Disallow root login remotely? Y
  • Remove test database and access to it? Y
  • Reload privilege tables now? Y

Testataan root kirjautuminen

$ sudo mysql -u root -p

Login onnistuu ja MariaDB on asenenttu.

screenshot.62

Luodaan tietokanta ja käyttäjä

MariaDB [(none)]> CREATE DATABASE book CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

Tarkistetaan vielä luotu tietokanta

MariaDB [(none)]> SHOW DATABASES;

+——————–+
| Database |
+——————–+
| book |
| information_schema |
| mysql |
| performance_schema |
+——————–+
4 rows in set (0.00 sec)

Käyttäjän luominen
MariaDB [(none)]> GRANT ALL ON book.* TO book@localhost IDENTIFIED BY ’tahan_hyva_salasana_tuli_laitettua’;

Testataan vielä, että luotu käyttäjä toimii

mono@ubuntu-mono-02:~$ mysql -u book -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 56
Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the current input statement.

MariaDB [book]> exit

Automatisoidaan MariaDB login käyttäjälle book

$ cd
$ nano .my.cnf

Kirjoitetaan rivit .my.cnf tiedostoon

[client]
user=”student”
password=”tahan_hyva_salasana_tuli_laitettua”
database=”student”

Muutetaan vielä tiedoston suojaukset paremmaksi

$ chmod -go-rwx .my.cnf

mono@ubuntu-mono-02:~$ chmod go-rwx .my.cnf
mono@ubuntu-mono-02:~$ ls -la .my.cnf
-rw——- 1 mono mono 63 Sep 21 12:03 .my.cnf

Testaus tämän jälkeen komennolla mariadb, jolloin sisäänkirjatuminen mariadb:hen tapahtuu helposti.

mono@ubuntu-mono-02:~$ mariadb
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 53
Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the current input statement.

MariaDB [book]> exit

Tietokannan toimintojen testaus (CRUD)

Luodaan taulu (CREATE TABLE)

MariaDB [book]> CREATE TABLE books (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(1024));
Query OK, 0 rows affected (0.01 sec)

id kenttä on taulun PRIMARY KEY eli rivin yksilöivä kenttä, ja sen arvon muodostaa tietokanta parametrilla AUTO_INCREMENT PRIMARY KEY. Käytännössä se on juokseva numero.

screenshot.63

Lisätään rivi tauluun (INSERT)

MariaDB [book]> INSERT INTO books(name) VALUES (”The gift of fear”);
Query OK, 1 row affected (0.00 sec)

Ja kokeillaan lisätä pari muuta riviä tauluun samalla

MariaDB [book]> INSERT INTO books(name) VALUES (”On Combat”);
Query OK, 1 row affected (0.00 sec)

MariaDB [book]> INSERT INTO books(name) VALUES (”On killing”);
Query OK, 1 row affected (0.00 sec)

Haetaan dataa taulusta (SELECT)

MariaDB [book]> SELECT * FROM books;

+—-+——————+
| id | name |

+—-+——————+
| 1 | The gift of fear |
| 2 | On Combat |
| 3 | On killing |
+—-+——————+
3 rows in set (0.00 sec)

Päivitetään dataa (UPDATE)

MariaDB [book]> UPDATE books SET name=”Perfect Practise” WHERE name=”On killing”;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [book]> SELECT * FROM books;

+—-+——————+
| id | name |
+—-+——————+
| 1 | The gift of fear |
| 2 | On Combat |
| 3 | Perfect Practise |
+—-+——————+
3 rows in set (0.00 sec)

 

Poistetaan dataa (DELETE)

MariaDB [book]> DELETE FROM books WHERE name=”Perfect Practise”;
Query OK, 1 row affected (0.00 sec)

MariaDB [book]> SELECT * FROM books;

+—-+——————+
| id | name |
+—-+——————+
| 1 | The gift of fear |
| 2 | On Combat |
+—-+——————+
2 rows in set (0.00 sec)

Tehdään PHP ohjelma, joka toteuttaa CRUD operaatiot tietokantaan

PHP on asennettu ympäristöön aiemmin ja se toimii käyttäjien kotihakemistoista.

screenshot.64

Jotta PHP ohjemat saadaan kommunikoimaan MariaDBn kanssa pitää asentaa PHPtä varten ajuri PHP-PDO.

Asennetaan se komennolla

$ sudo apt-get install php-mysql

Toiminta vaatii Apahen restartin

$ sudo systemctl restart apache2

Linkki ajettavaan ohjelmaan: http://juhaimmonen.com/list.php

Tietokantayhteyden luominen PHPllä

Luodaan oma tiedosto tietokantayhteyden luontia varten, ja tämä teidoston voidaan liittää sitä käyttävään PHP ohjelmaan ”include(”connection.php”);” komennolla.

nano connection.php

<?php

$database = ”book”;
$user = ”book”;
$password = ”salainen”;
$dns = ”mysql:host=localhost;charset=UTF8;dbname=$database”;
echo ”$dns, $user”;
$con = new PDO($dns,$user,$password);

?>

Tietokantaa lukeva PHP ohjelma (SELECT)

Luodaan ohjelma

nano list.php

<!DOCTYPE html>

<html>
<head>
<title>Book list</title>
</head>

<body>

<h1>Book list</h1>

<table>

<tr>
<th>
Name
</th>
<th>
Id
</th>

<?php

include(”connection.php”);

$sql = ”SELECT id, name

FROM books
ORDER BY name DESC”;

$query = $con->prepare($sql);
$query->execute();

while ($row = $query->fetch()) {

$name = $row[”name”];
$id = $row[”id”];
echo ”<tr>”;
echo ”<td>{$name}</td>”;
echo ”<td>{$id}</td>”;
echo ”<td><a href=’modify.php?id={$id}’>M</td> ”;
echo ”<td><a href=’delete.php?id={$id}’>X</td> ”;
echo ”</tr>”;

}
?>

</table>
<a href=”add.php”>Add book</a>

</body>

</html>

Testataan ohjelmaa selaimella: http://juhaimmonen.com/php/list.php

screenshot.65

Lisätään tietoa tietokantaan PHP ohjelmasta (INSERT)

Tehdään ensin lomake kirjan tietojen syöttämistä varten.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Uusi nimi</title>
</head>

<body>
<h1>Add book</h1>

<form action=”addBook.php” method=”post”>
<p>Nimi: <br> <input type=”text” name=”name”></p>
<p><input type=”submit” value=”Send”></p>
</form>

</body>
</html>

Lisäksi tehdään PHP-ohjelma, jolle lomakkeelta välitetään tiedot. addBook.php tallentaa uuden kirjan tiedot tietokantaan.

Virheitä tulee koodatessa, ja niitä voi etsiä kommenolla

$ tail -F /var/log/apache2/error.log

Esimerkki:

[Fri Sep 21 13:57:46.495459 2018] [php7:emerg] [pid 7455] [client 91.152.137.83:
54704] PHP Parse error: syntax error, unexpected ’list’ (T_LIST) in /home/mono/
public_html/addBook.php on line 13, referer: http://178.128.199.241/~mono/add.ht
ml

Korjausten jälkeen ohjelma näyttää tältä
<?php
include(”connection.php”);

$name = htmlspecialchars($_POST[”name”]);

$sql = ”INSERT INTO books (name)
VALUES (:name)”;

$query = $con->prepare($sql);
$query->bindParam(’:name’, $name);
$query->execute();

print (”<h2>Added book: {$name}</h2>”);
print (”<p><a href=’list.php’>Back to booklist</a></p>”);

?>

Testattu ja tulos

 

screenshot.66

Muutetaan kirja tietoja (UPDATE)

Tehdään lomake, jolle haetaan id:n perusteella halutun kirjan nimi. Tätä lomaketta kutsutaan kirjalistalta (booklist). Tällöin id saadaan GET-parametrina ja nimi haetaan tietokannasta.

modify.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Update book</title>
</head>
<body>
<h1>Update book</h1>
<form action=”modBook.php” method=”post”>
<?php
include(”connection.php”);

$id = htmlspecialchars($_GET[”id”]);

$sql = ”SELECT id, name
FROM books
WHERE id=(:id)”;

$query = $con->prepare($sql);
$query->bindParam(’:id’, $id);
$query->execute();

$row = $query->fetch();
$name = $row[”name”];

echo ” <p>Name: <br> <input type=’text’ name=’name’ value=’${name}’></p>
”;
echo ” <input type=’hidden’ name=’id’ value=’${id}’></p>”;
?>
<p><input type=”submit” value=”Send”></p>
</form>
</body>
</html>

Tulos testistä

screenshot.67

Ohjelma joka tallentaa muutetun kirjan tiedot tietokantaan

modBook.php

<?php
include(”connection.php”);

$id = htmlspecialchars($_POST[”id”]);
$name = htmlspecialchars($_POST[”name”]);

$sql = ”UPDATE books SET name = :name WHERE id = :id”;

$query = $con->prepare($sql);
$query->execute(array(’:name’ => $name, ’:id’ => $id));

print (”<h2>Book name {$name} modified</h2>”);
?>
<p><a href = ”list.php”>Back to booklist</a></p>

 

Tulos testistä, kun muutettiin kirja nimi ”Otavan Suuri Satukirja” –> ”Otavan Suuri Satukirja!”

screenshot.68

Kirjalista muutoksen jälkeen

screenshot.69

Kirjan poistaminen PHP ohjelmasta (DELETE)

Ohjelma delete.php tekee poistaa rivin taulusta books. Ohjelma saa parametrina poistettavan kirjan id:n.

delete.php
<?php
include(”connection.php”);

$id = htmlspecialchars($_GET[”id”]);

$sql = ”DELETE FROM books WHERE id = (:id)”;

$query = $con->prepare($sql);
$query->bindParam(’:id’, $id);
$query->execute();

echo ”<h2>Book deleted </h2>”;

echo ”<p><a href=’list.php’>Back to Booklist</a>”;
?>

Testi

Alkutilanne:

screenshot.70

Ja poiston jälkeen:

screenshot.71

 


 

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out /  Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out /  Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out /  Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out /  Muuta )

Muodostetaan yhteyttä palveluun %s