Sähköisten asiointipalveluiden toteuttaminen

Sorakuilu

PHP demo 12, mysql ja PDO, luo taulu, tee hakuja ja päivitä tietoturvallisesti tietokantaa

Ryhmä 1908Tivipa02 on toteuttanut tämän demon hiukan eri tavalla.

Kohta A, yhteys.php

Laadi tiedosto yhteys.php, joka ottaa yhteyden kantaan ja luo yhteyden sisältävän PDO-tyyppisen muuttujan $yhteys.

Lähdekoodi (magnesiumilla oleva tiedosto ja tietokanta)

<?php
$dsn 
"mysql:host=magnesium;dbname=db13leena";
$user "leena";
$passwd "lmjn";

$pdo = new PDO($dsn$user$passwd);
?>

Kohta B, taulun luominen

Alla oleva taulu on tehty pelin Pit of Doom (PHP ja MYSQL-tekniikalla toteutettava) tulosten ja tilanteen ylläpitoon.

Luo seuraava taulu käyttäen PHP:tä ja PDO-luokkaa hyväksi. Mieti sopivat tietotyypit kentille:

Lähdekoodi

<?php
require "connection.php";

$sql "CREATE TABLE IF NOT EXISTS players (
  id int(10) NOT NULL AUTO_INCREMENT,
  account_name varchar(30) NOT NULL,
  password varchar(255) NOT NULL,
  email varchar(50) NOT NULL,
  last_login date NOT NULL,
  online tinyint(1) NOT NULL,
  money decimal(10,0) NOT NULL,
  current_character varchar(15) NOT NULL,
  banned tinyint(1) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"
;

$statement $pdo->query($sql);
if(
$statement) echo "Taulu lisätty";
?>

Kohta C, lisää tauluun dataa

Lisää tauluun phpmyadminin avulla 5 pelaajaa.

Kohta D, laadi yksinkertaisia kyselyitä

Laadi yksinkertaisia kyselyitä tekevä ohjelma, joka listaa kuvaruudulle seuraavat asiat:

Lähdekoodi

<!doctype html>
<html lang="fi">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>PDO demo 12e</title>
</head>
<body>
<?php
require "connection.php";  //1. OTA YHTEYS KANTAAN

echo "<h2>Kaikki käyttäjätunnukset (FETCH_ASSOC)</h2>";

$sql "SELECT account_name FROM players"// 2. RAKENNA SQL
// $statement saa vastauksena sql-kyselyn tuloksen
$statement $pdo->query($sql); //3. SUORITA SQL

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen)
$players $statement->fetchAll(PDO::FETCH_ASSOC); //4. KÄSITTELE VASTAUS

foreach($players as $player) {
    echo 
$player["account_name"]."<br>"// jos olisi haettu FETCH_CLASS $player->account_name
}

echo 
"<h2>Kaikki käyttäjätunnukset ja sähköpostiosoitteet (FETCH_CLASS)</h2>";

$sql "SELECT account_name,email FROM players";
// $statement saa vastauksena sql-kyselyn tuloksen
$statement $pdo->query($sql);

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen)
$players $statement->fetchAll(PDO::FETCH_CLASS);

foreach(
$players as $player) {
    echo 
$player->account_name." ".$player->email."<br>"
}

echo 
"<h2>Kaikki täänään kirjautuneet pelaajat (FETCH_NUM)</h2>";

$sql "SELECT account_name FROM players WHERE last_login = CURDATE()";
// $statement saa vastauksena sql-kyselyn tuloksen
$statement $pdo->query($sql);

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen)
$players $statement->fetchAll(PDO::FETCH_NUM);

foreach(
$players as $player) {
    echo 
$player[0]."<br>"
}

echo 
"<h2>Kaikki tänään kirjautuneet pelaajat (FETCH_CLASS)</h2>";

$sql "SELECT account_name FROM players WHERE banned = 0";
// $statement saa vastauksena sql-kyselyn tuloksen
$statement $pdo->query($sql);

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen)
$players $statement->fetchAll(PDO::FETCH_CLASS);

foreach(
$players as $player) {
    echo 
$player->account_name."<br>"
}
?>
</body>
</html>

Kohta E

Laadi tietoturvallinen lomake, jolla uusi pelaaja voi rekisteröityä mukaan. Tarkista lomakkeella syötetyt tiedot, suojaa parametrit sitomalla (bind)

Lähdekoodi

<!doctype html>
<html lang="fi">
<head>
<meta charset ="utf-8">
<title>PDO demo 12e</title>
</head>
<body>

<form method="post">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" required><br>

<label for="passwd">Salasana</label><br>
<input type="password" name="passwd" required><br>

<label for="passwd2">Salasana uudestaan</label><br>
<input type="password" name="passwd2" required><br>



<label for="email">Sähköposti</label><br>
<input type="email" name="email" required><br>

<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö">hirviö</option>
    <option value="olio">olio</option>
    <option value="keiju">keiju</option>
</select>
<br>
<input type="submit" value="Lisää pelaaja">
</form>

</body>
</html>

<?php
require "connection.php";
require 
"helper.php";

if(isset(
$_POST["aname"],$_POST["passwd"],$_POST["passwd2"],$_POST["email"],$_POST["character"]) && $_POST["passwd"] == $_POST["passwd2"]) {
    
$name sanit($_POST["aname"]);
    
$passu sanit($_POST["passwd"]);
    
$email sanit($_POST["email"]);
    
$character sanit($_POST["character"]);
    
$last_login date('Y-m-d');

    
$sql "INSERT INTO players(account_name,password,email,last_login,online,money,current_character,banned) VALUES (?,?,?,?,?,?,?,?)";

    
$stm $pdo->prepare($sql);

    
$stm->execute(array($name,$passu,$email,$last_login,1,100,$character,0));
}
else {
    echo 
"Tarkista syötteet, salasanat eivät vastaa toisiaan";
}

$sql "SELECT account_name FROM players"// 2. RAKENNA SQL
// $statement saa vastauksena sql-kyselyn tuloksen
$statement $pdo->query($sql); //3. SUORITA SQL

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen)
$players $statement->fetchAll(PDO::FETCH_ASSOC); //4. KÄSITTELE VASTAUS

foreach($players as $player) {
    echo 
$player["account_name"]."<br>"// jos olisi haettu FETCH_CLASS $player->account_name
}
?>

helper.php - sisältää sanit()-funktion

<?php

function sanit($word)
{
    
$word trim($word);
    
$word filter_var($word,FILTER_SANITIZE_STRING);
    return 
$word;
}

?>

Kohta F

Laadi listaus pelaajista siten, että jokaisen perässä on linkki pelaajan muuttamiseen ja poistamiseen. Listaus ei vaadi suojaamista, sillä käyttäjä ei anna syötteitä sitä varten.

Lähdekoodi

<?php
require "connection.php";  //1. OTA YHTEYS KANTAAN

$sql "SELECT id,account_name FROM players";//2.

$statement $pdo->query($sql); //3.

//haetaan vastaus php-muuttujaan (taulukko, assosiatiivinen) //4.
$players $statement->fetchAll(PDO::FETCH_CLASS);

foreach(
$players as $player) {
    echo 
$player->account_name."<a href=\"demo12g.php?id=".$player->id."\">Poista</a>  
    <a href=\"demo12h.php?id="
.$player->id."\">Muokkaa</a><br>"
}

Kohta G

Tee tietoturvallinen ohjelma pelaajan poistamiseen.

Lähdekoodi

<?php
require "connection.php";//1. yhteys

if(!isset($_GET["id"])) {
    
header("Location:demo12f.php");  //uudelleenohjaus, palaa takaisin 
} else  $id $_GET["id"];

$sql "DELETE FROM players WHERE id = ?"//2. luo sql

$stm $pdo->prepare($sql);
$stm->bindValue(1$id);
$stm->execute();

header("Location:demo12f.php");
?>

Kohta H

Laadi tietoturvallinen lomake tarkistuksineen pelaajan päivittämistä varten.

GET-metodi - lähdekoodi

<?php
require "connection.php";

if(!isset(
$_GET["id"])) {
    
header("Location:demo12f.php");  //uudelleenohjaus, palaa takaisin 
} else  $id $_GET["id"];

$sql ="SELECT * FROM players WHERE id = ?";

$stm $pdo->prepare($sql);
$stm->bindValue(1$id);
$stm->execute();

$player $stm->fetchAll(PDO::FETCH_ASSOC);

$id $player[0]["id"];
$account_name $player[0]["account_name"];
$password $player[0]["password"];
$email $player[0]["email"];
$last_login $player[0]["last_login"];
$money $player[0]["money"];
$character $player[0]["current_character"];
$banned $player[0]["banned"];
?>

<!doctype html>
<html lang="fi">
<head>
<meta charset ="utf-8">
<title>PDO demo 12h - GET</title>
</head>
<body>

<form method="post" action = "demo12hpost.php">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" value="<?= $account_name;?>" required><br>


<label for="email">Sähköposti</label><br>
<input type="email" name="email" value="<?= $email;?>" required><br>


<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö" <?php if($character == "hirviö") echo "selected";?>>hirviö</option>
    <option value="olio" <?php if($character == "olio") echo "selected";?>>olio</option>
    <option value="keiju" <?php if($character == "keiju") echo "selected";?>>keiju</option>
</select><br>

<label for="money">Rahaa</label>
<input type = "number" min="0" max = "10000" required name="money" value="<?= $money;?>"><br>

<p>Viimeksi kirjautunut <?= $last_login;?></p>
<br>

<label for="banned">Porttikiellossa</label><br>
Ei <input type ="radio" value="0" name="banned" <?php if($banned == "0") echo "checked";?>><br>
Kyllä <input type="radio" value ="1" name="banned" <?php if($banned == "1") echo "checked";?>><br>

<input type="hidden" name="id" value="<?=$id?>">

<input type="submit" value="Muuta pelaajaa">
</form>

</body>
</html>

POST-metodi - lähdekoodi

<?php
require "connection.php";
require 
"helper.php";

if(isset(
$_POST["id"],$_POST["aname"],$_POST["email"],$_POST["character"],$_POST["money"],$_POST["banned"])) {
    
$id $_POST["id"];
    
$account_name sanit($_POST["aname"]);
    
$email sanit($_POST["email"]);
    
$current_character sanit($_POST["character"]);
    
$money $_POST["money"];
    
$banned $_POST["banned"];

    
$sql "UPDATE players SET account_name = ?, email = ?, money = ?,current_character = ?,banned = ? WHERE id = ?";
    
    
$stm $pdo->prepare($sql);
    
$stm->execute(array($account_name,$email,$money,$current_character,$banned,$id));
    
header("Location: demo12f.php");
}
else 
header("Location: demo12f.php?message=puuttuu");