Home!
Up!

Zpracování určitých složitostí v PHP

Užití při zpracování dat

V následujícím kódu můžeme vidět zpracování informací z formuláře, pomocí metody POST a následné zapsání dat do databáze. Prosím číst komentáře v kódu, je to nejsnazší způsob, jak dát správné informace na správné místo. Je to to barevné.

HTML část

<form action="/action_page.php">
<div class="form-group">
 <label for="username">Username:</label>
 <input type="text" class="form-control" id="username">
</div>
<div class="form-group">
 <label for="password">Password:</label>
 <input type="password" class="form-control" id="pwd">
</div>
<div class="form-group">
 <label for="email">Email:</label>
 <input type="email" class="form-control" id="email">
</div>
<div class="form-group">
 <label for="phone">Phone:</label>
 <input type="tel" class="form-control" id="phone">
</div>
<button type="submit" class="btn btn-success mt-2">Submit</button>
<input type="hidden" name="check_submit" value="true"><s/form>

PHP část


                
            $login = $_POST['username'];
            $password = $_POST['password'];
            $email = $_POST['email'];
            $phone = $_POST['phone'];

            //jednoduchá podmínka pro ověření správnosti dat

    if(empty($login) || empty ($password)){
        echo "Některé pole nebylo vyplněno správně";
        
    include "./function.form2.php";

    

    }else{

        //include je metoda nebo funkce, která do kódu vloží kompletní kus jiného kódu, který si vyberete, zde například connector pro připojení do databáze
        include './function/connector.php'; 
            

        //V tomto kódu se zpracovávají osobní údaje pro tvorbu profilu, je tedy potřeba ověřit, zda již někdo takový neexistuje.
        $checklogin = mysqli_query($conn, "SELECT * FROM users WHERE email = '$email'");
                if ($row = mysqli_fetch_assoc($checklogin)){
                    echo "Login již existuje";
                }else{

                    //Pokud ne, otevře se transakce, neboli privátní spojení s databází, která zajistí, že pokud by se posílalo více insertů najednou, tak se mezi sebou nepomíchají různí uživatelé

                    $conn->begin_transaction();

                    try{
                        $insert = "INSERT INTO users (name, password, email, phone) 
                               VALUES ('$login', '$password', '$email', '$phone')";
                        $conn->query($insert);
                                        
                        //transakce mají všehovšudy 3 metody: commit, catch a rollback
                        //commit provede transakci a její obsah, catch zachytí problémy a rollback transakci zruší, pokud catch něco našel
                        $conn->commit();

                        loading_session($login, $email);

                        //toto je přímý odkaz na jinou stránku pomocí "header" a URL adresy
                        $url = "./myaccount.php";
                        header('Location: ' . $url);
                        exit();
                    }catch(Exception $e){
                            $conn->rollback();
                            //Tahle sranda se vypisuje na stránku uživateli
                            echo "Chyba při provádění transakce: " . $e->getMessage();
                    }
                    

                }


    }

Připojení do databáze neboli connector

V následujícím kousku kódu si vysvětlíme jak se připojit do databáze a co se tam vlastně děje.

Příklad užití procedurálního konektoru



//Pro připojení do databáze potřebujeme jméno serveru kde běží, uživatele, který ji používá a jeho heslo, ve MySQL WorkBenchi je to vždycky v levým horním rohu jestli se nepletu

$servername = "localhost";  
$username = "root";
$password_db = "password";

//Vytvoříme proměnnou $conn, do které vkládáme výsledek metody mysqli_connect, do které vkládáme hodnoty pro připojení
    
$conn = mysqli_connect ($servername, $username, $password_db);
        
//Ověření jestli bylo připojení úspěšné
if(!$conn) {
    die('ERROR: Could not select database');
    die("Connection failed: " . mysqli_connect_error());
}
            
//Samozřejmě je potřeba znát i jméno databáze
mysqli_select_db($conn,'db_sazkovka_test');

Příklad užití objektového konektoru

<?php
// Definice přístupových údajů k databázi
$servername = 'localhost'; // Název serveru, na kterém běží databáze
$username = 'root'; // Uživatelské jméno pro přihlášení k databázi
$password = ''; // Heslo pro přihlášení k databázi
$dbname = 'dbname'; // Název databáze, ke které se chceme připojit

try {
    // Připojení k databázi pomocí PDO
    $db = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8;", $username, $password);
    // Nastavení režimu zpracování chyb na výjimky
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) { // Zachycení výjimky v případě chyby
    echo "Connection failed: " . $e->getMessage(); // Vypsání chybové zprávy
}
?>

Využití sessions(ukládání dat v mezipaměti webu)

V následujícím kousku kódu si vysvětlíme, co jsou to sessions, jak je použít a proč je použít



//Vytvoříme si nový soubor, pojmenujeme ho sessions.php(nebo jak chcete, ale aby jste to po sobě poznali) a v něm využijeme několik základních věcí
//První je session_start což je funkce, kterou PHP obsahuje automaticky a vytvoří nám tu session paměť
session_start();
//Dále je potřeba být lehce kreativní a vytvořit si vlastní funkci, která nám data do session uloží
//Tudíž vytvoříte funkci a do jejích parametrů vložíte proměnné, které chcete uložit
function loading_session($login, $email){
session_start();//Toto je zde pouze pro jistotu kdyby se něc posralo a session se z nějakého důvodu nestartnula
//Ty následně uložíte pomocí $_SESSION['cokoliv'] = $cokoliv
    $_SESSION['username'] = $login;
    $_SESSION['email'] = $email;
                
//Nyní lze využít $_SESSION['cokoliv'] nepříklad pro ověření jestli máte přístup na určité stránky, nebo například pro změny, které se stanou až po přihlášení
}
//Sessions je ovšem potřeba i smazat, tudíž si vytvoříte funkci, která nejdřív session vymaže uvnitř a pak celkově
//Jinými slovy nejdřív využijete unset a pak destroy
function deleting_session(){
    session_unset(); 
    session_destroy();  
}
//Sessions se následně vkládají do kódu pomocí include, to snad ukazovat nemusím   

Kódy z projektů

File upload, file display, file download

Napište program, který umožní nahrávat 3 typy souborů. Při nahrání souboru bude možné zadat platnost souboru. V zobrazené tabulce se neplatný soubor podbarví. Soubory se boudou zobrazovat v tabulce a budou rozděleny dle typu

index.html

<!-- Form for file upload -->
<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <br>
    Enter a date:
    <input type="date" name="date" id="date">
    <br>
    <input type="submit" value="Upload Image" name="submit">
</form>

<hr>

<!-- Display files using into table -->
<?php include 'display.php'?>

</body>
</html>

upload.php

<?php
// Check if the form was submitted
if (isset($_POST["submit"])) {
    // Check if a file was selected
    if (isset($_FILES["fileToUpload"]) && $_FILES["fileToUpload"]["error"] == 0) {
        // Define allowed file types
        $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'text/plain', 'application/msword', 'application/vnd.ms-excel'];

        // Get the uploaded file type
        $fileType = $_FILES["fileToUpload"]["type"];

        // Check if the uploaded file type is allowed
        if (in_array($fileType, $allowedTypes)) {
            $dbHost = "localhost";
            $dbUser = "root";
            $dbPass = "";
            $dbName = "testv4";

            // Connect to the database
            $conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

            // Get file details from the uploaded file
            $nazev = $_FILES["fileToUpload"]["name"];
            $type = $_FILES["fileToUpload"]["type"];
            $fileData = file_get_contents($_FILES["fileToUpload"]["tmp_name"]);

            $date = $_POST['date']; // Get the date from the form

            // Prepare SQL statement to insert the file into the database
            $stmt = $conn->prepare("INSERT INTO `files` (name, type, date, file) VALUES (?, ?, ?, ?)");
            $stmt->bind_param("ssss", $nazev, $type, $date, $fileData);

            // Execute the statement to insert the file into the database
            if ($stmt->execute()) {
                echo "File uploaded and inserted into the database successfully.";
            } else {
                echo "Error inserting file into the database: " . $stmt->error;
            }

            // Close the statement and database connection
            $stmt->close();
            $conn->close();
        } else {
            // Display error if the uploaded file type is not supported
            echo "Error: Unsupported file type. Please upload images, documents, or text files.";
        }
    } else {
        // Display error if no file was selected for upload
        echo "Error: Please select a file to upload.";
    }
}
?>

display.php

<?php
// Database connection information
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "";
$dbName = "testv4"; // Database name

// Establish a connection to the database
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

// Check if the connection was successful
if ($conn->connect_error) {
    // If the connection fails, output an error message and terminate the script
    die("Connection failed: " . $conn->connect_error);
}

// Array defining different file types and their corresponding MIME types
$types = [
    'Images' => ['image/jpeg', 'image/png', 'image/gif'],
    'Documents' => ['application/pdf', 'application/msword', 'application/vnd.ms-excel'],
    'TextFiles' => ['text/plain']
];

// Create a table structure to display the files
echo '<table border="1">';
echo '<tr>';
// Create table headers based on file types
foreach ($types as $type => $mimeTypes) {
    echo "<th>$type!/th>";
}
echo '</tr>';

// Find the maximum number of rows for file display
$maxRows = 0;
foreach ($types as $type => $mimeTypes) {
    // Query the database to count the number of files for each type
    $sql = "SELECT name, type, date FROM files WHERE type IN ('" . implode("','", $mimeTypes) . "')";
    $result = $conn->query($sql);
    
    // Determine the maximum number of rows needed for the table
    if ($result->num_rows > $maxRows) {
        $maxRows = $result->num_rows;
    }
}

// Display files in rows and columns based on their types
for ($row = 0; $row < $maxRows; $row++) {
    echo '<tr>';
    foreach ($types as $type => $mimeTypes) {
        echo '<td>';
        // Query the database to fetch files of a particular type for a given row
        $sql = "SELECT idfiles, name, type, date FROM files WHERE type IN ('" . implode("','", $mimeTypes) . "') LIMIT 1 OFFSET $row";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($data = $result->fetch_assoc()) {
                // Retrieve file information
                $fileID = $data['idfiles'];
                $fileName = $data['name'];
                $fileDate = $data['date'];
                $today = date("Y-m-d");
                
                // Compare dates to change the background color of the list item
                $style = (strtotime($fileDate) < strtotime($today)) ? 'background-color: red;' : '';
                
                // Display file names as links and apply styles based on date comparison
                echo "<a href='download.php?id={$fileID}' style='{$style}'>{$fileName}</a> - Date: {$fileDate}";
                echo '<br>'; // Adding line break for separation
            }
            // Removed the closing ul tag
        } else {
            // If there are no files, display a message
            echo "No files";
        }
        echo '</td>';
    }
    echo '</tr>';
}

// Close the table
echo '</table>';

// Close the database connection
$conn->close();
?>

download.php

<?php
// download.php

// Database connection details
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "";
$dbName = "testv4";

// Establish a connection to the database
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);

// Check if the connection to the database was successful
if ($conn->connect_error) {
    // If the connection fails, display an error message and stop the script
    die("Connection failed: " . $conn->connect_error);
}

// Check if the 'id' parameter is set in the URL (GET request)
if (isset($_GET['id'])) {
    // Get the file ID from the GET parameters
    $fileID = $_GET['id'];

    // Prepare a SQL statement to select file details based on the file ID
    $sql = "SELECT name, type, file FROM files WHERE idfiles = ?";
    $stmt = $conn->prepare($sql);
    
    // Bind the file ID as a parameter to the prepared statement
    $stmt->bind_param("i", $fileID);
    
    // Execute the prepared statement
    $stmt->execute();
    
    // Get the result of the executed statement
    $result = $stmt->get_result();

    // If the file with the given ID exists in the database
    if ($result->num_rows > 0) {
        // Fetch the file information
        $file = $result->fetch_assoc();
        $fileName = $file['name'];
        $fileType = $file['type'];
        $fileData = $file['file'];

        // Set the appropriate content type for the file
        header("Content-Type: $fileType");
        
        // Set the content disposition to force download and specify the file name
        header("Content-Disposition: attachment; filename=$fileName");
        
        // Output the file data to the browser
        echo $fileData;
        
        // Terminate the script after file output
        exit;
    } else {
        // If the file is not found, display an error message
        echo "File not found";
    }

    // Close the prepared statement
    $stmt->close();
} else {
    // If the 'id' parameter is not set in the URL, display an error message
    echo "Invalid file request";
}

// Close the database connection
$conn->close();
?>

File storage

index.php

<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="Upload">
</form>
    
<hr>
    
    <?php
// Connect to the database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "file_storage";

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// Retrieve files from the database
$sql = "SELECT iddata, name, type, size, file FROM data";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // Display files in a table
  echo "<table>";
  echo "<tr><th>ID</th><th>Name</th><th>File Type</th><th>Size</th><th>Action</th></tr>";
  while($row = $result->fetch_assoc()) {
    echo "<tr>";
    echo "<td>" . $row["iddata"] . "</td>";
    echo "<td>" . $row["name"] . "</td>";
    echo "<td>" . $row["type"] . "</td>";
    echo "<td>" . $row["size"] . "</td>";
    if (strpos($row["type"], 'image') !== false) {
      echo "<td><mg src='data:" . $row["type"] . ";base64," . base64_encode($row["file"]) . "'></td>";
    } else {
      echo "<td><a href='download.php?id=" . $row["iddata"] . "'>Download</a></td>";
    }
    echo "</tr>";
  }
  echo "</table>";
} else {
  echo "No files found.";
}

$conn->close();

?>


</body>

upload.php

<?php
// Connect to the database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "file_storage";

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// Handle file upload
if(isset($_FILES['file'])) {
    $file_name = $_FILES['file']['name'];
    $file_type = $_FILES['file']['type'];
    $file_size = $_FILES['file']['size'];
    $file_content = addslashes(file_get_contents($_FILES['file']['tmp_name']));

    $sql = "INSERT INTO data (name, type, file, size) VALUES ('$file_name', '$file_type', '$file_content', '$file_size')";

    if ($conn->query($sql) === TRUE) {
      echo "File uploaded successfully";
    } else {
      echo "Error uploading file: " . $conn->error;
    }
}

$conn->close();
?>

download.php

<?php
// Connect to the database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "file_storage";

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// Retrieve file content from the database
$id = $_GET["id"];
$sql = "SELECT name, file, type FROM data WHERE iddata = $id";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  $row = $result->fetch_assoc();
  $name = $row["name"];
  $content = $row["file"];
  $file_type = $row["type"];

  // Send file to the browser as a file attachment
  header("Content-Type: $file_type");
  header("Content-Disposition: attachment; filename=\"$name\"");
  echo $content;
} else {
  echo "File not found.";
}

$conn->close();
?>