Month: March 2025

  • Laravel Project: Building a Car Management System

    Laravel Project: Building a Car Management System

    This text serves as a comprehensive guide to understanding and building web applications using the Laravel PHP framework. It explores key aspects such as project structure, request lifecycles, configuration, routing, debugging, controllers, views with Blade templating, database migrations, Eloquent ORM, relationships, factories, and seeders. The material provides hands-on examples and step-by-step instructions. Practical demonstrations of common tasks such as creating routes, controllers, models, database operations, component creation, and pagination are included. The goal is to equip developers with the knowledge and skills to create dynamic and maintainable web applications with Laravel.

    Laravel Project Deep Dive Study Guide

    Quiz

    1. What is the purpose of the public folder in a Laravel project? The public folder is the single web-accessible directory. It contains the index.php file, which serves as the entry point for all requests to the application, and other assets like CSS, JavaScript, and images.
    2. Why is it important not to commit the .env file to a Git repository? The .env file contains sensitive information such as database credentials, API keys, and other configuration details. Committing it could expose this information to unauthorized users.
    3. Explain the Laravel request lifecycle. The request starts at public/index.php, which loads the autoloader and bootstraps the application. The request is then passed to the router, which identifies and executes the appropriate controller action, potentially involving middleware and rendering views, before sending a response back to the user.
    4. How can you customize configuration options that are not available in the .env file? Configuration files are located in the config folder. If a specific option is not available in the .env file, you can modify the corresponding configuration file within the config folder or use the php artisan config:publish command to make additional configuration files available.
    5. What is the difference between the dump() and dd() debugging functions in Laravel? The dump() function prints variable information without halting code execution, allowing the script to continue. The dd() function (dump and die) prints variable information and immediately stops the execution of the script.
    • List the six primary HTTP request methods and their typical uses.GET: Retrieve information.
    • POST: Create new data.
    • PUT: Update existing data (replaces the entire resource).
    • PATCH: Update existing data (partially modifies the resource).
    • DELETE: Delete data.
    • OPTIONS: Retrieve communication options for a resource.
    1. How do you define a route with a required parameter in Laravel? You define a route with a required parameter by enclosing the parameter name within curly braces in the URI (/product/{id}). The parameter value is then passed as an argument to the route’s associated function.
    2. Explain the purpose of the where method when defining routes in Laravel. The where method is used to add constraints to route parameters, ensuring that they match a specific pattern, like being numeric (whereNumber(‘id’)) or containing only alphabetic characters (whereAlpha(‘username’)).
    3. What are Blade directives, and how do they simplify template development? Blade directives are special keywords prefixed with @ symbols, providing a shorthand way to perform common tasks in Blade templates, such as conditional statements, loops, and including subviews. They are compiled into plain PHP code.
    4. Explain the purpose of route naming in Laravel, and how do you generate URLs using named routes? Route naming allows you to refer to routes by their name rather than their URI. You can generate URLs using the route() helper function, passing the route’s name as an argument (route(‘routeName’)).

    Quiz Answer Key

    1. The public folder is the single web-accessible directory. It contains the index.php file, which serves as the entry point for all requests to the application, and other assets like CSS, JavaScript, and images.
    2. The .env file contains sensitive information such as database credentials, API keys, and other configuration details. Committing it could expose this information to unauthorized users.
    3. The request starts at public/index.php, which loads the autoloader and bootstraps the application. The request is then passed to the router, which identifies and executes the appropriate controller action, potentially involving middleware and rendering views, before sending a response back to the user.
    4. Configuration files are located in the config folder. If a specific option is not available in the .env file, you can modify the corresponding configuration file within the config folder or use the php artisan config:publish command to make additional configuration files available.
    5. The dump() function prints variable information without halting code execution, allowing the script to continue. The dd() function (dump and die) prints variable information and immediately stops the execution of the script.
    • GET: Retrieve information.
    • POST: Create new data.
    • PUT: Update existing data (replaces the entire resource).
    • PATCH: Update existing data (partially modifies the resource).
    • DELETE: Delete data.
    • OPTIONS: Retrieve communication options for a resource.
    1. You define a route with a required parameter by enclosing the parameter name within curly braces in the URI (/product/{id}). The parameter value is then passed as an argument to the route’s associated function.
    2. The where method is used to add constraints to route parameters, ensuring that they match a specific pattern, like being numeric (whereNumber(‘id’)) or containing only alphabetic characters (whereAlpha(‘username’)).
    3. Blade directives are special keywords prefixed with @ symbols, providing a shorthand way to perform common tasks in Blade templates, such as conditional statements, loops, and including subviews. They are compiled into plain PHP code.
    4. Route naming allows you to refer to routes by their name rather than their URI. You can generate URLs using the route() helper function, passing the route’s name as an argument (route(‘routeName’)).

    Essay Questions

    1. Discuss the significance of the .env file in Laravel development, detailing its role in managing application configuration and the security implications of mishandling it. Explain best practices for managing environment variables in a collaborative development environment.
    2. Describe the Laravel request lifecycle in detail, from the initial request to the final response. Explain the roles of key components such as the router, middleware, controllers, and views, and how they interact to process a request.
    3. Explain how the Laravel Blade templating engine facilitates the creation of dynamic and reusable user interfaces. Discuss the advantages of using Blade directives for common tasks like conditional rendering, looping, and including subviews, and provide examples of how these directives simplify template development.
    4. Discuss the role and implementation of model factories and seeders in Laravel. Explain how they are used to generate realistic data for testing and development, and provide a detailed example of creating a factory with relationships to other models.
    5. Describe how Laravel’s Eloquent ORM simplifies database interactions and management. Discuss different types of relationships including one-to-one, one-to-many, and many-to-many. Explain best practices for working with Eloquent models, including defining relationships, using scopes, and performing CRUD operations efficiently.

    Glossary of Key Terms

    • Artisan: Laravel’s command-line interface (CLI) used for various development tasks like generating files, running migrations, and clearing cache.
    • Blade: Laravel’s templating engine that allows developers to use directives and simple syntax to create dynamic views.
    • Composer: A dependency manager for PHP, used to manage project dependencies like Laravel packages.
    • .env file: A configuration file in Laravel that stores environment-specific settings such as database credentials and API keys.
    • Eloquent: Laravel’s ORM (Object-Relational Mapper) that provides a simple and enjoyable way to interact with databases.
    • Facade: A static interface to classes available in the application’s service container, providing a convenient way to access Laravel’s features.
    • Factory: A class that generates fake data for seeding databases or creating test data.
    • Migration: A PHP file that defines database table schema changes, allowing for easy database version control.
    • Middleware: Code that executes before or after a request is handled by the application, used for tasks like authentication, logging, and request modification.
    • ORM (Object-Relational Mapper): A technique that lets you query and manipulate data from a database using an object-oriented paradigm.
    • Route: A definition in Laravel that maps a specific URI to a controller action or closure.
    • Seeder: A class that populates the database with initial data using model factories or custom data.
    • Service Container: A powerful tool for managing class dependencies and performing dependency injection in Laravel.
    • Trait: A mechanism for code reuse in PHP, allowing developers to inject methods and properties into classes without inheritance.
    • View: A PHP file containing HTML and Blade directives used to display data in a Laravel application.

    Laravel Fundamentals: A Concise Overview

    Okay, here’s a detailed briefing document summarizing the key themes and ideas from the provided text excerpt.

    Briefing Document: Laravel Fundamentals

    Overview:

    This document summarizes key aspects of Laravel development as described in the provided text. It covers project structure, routing, debugging, request lifecycle, configuration, database interaction, ORM (Eloquent), templating (Blade), and response generation. The text serves as a practical guide, demonstrating code examples and artisan commands alongside explanations.

    I. Project Structure & Core Concepts

    • Directory Structure: The document outlines the standard Laravel project directory structure.
    • app: Contains the core application logic, including controllers, models, etc. The text notes it can house user-uploaded files.
    • bootstrap: Contains the app.php file, which bootstraps the application.
    • config: Holds configuration files. “Most of the configuration options regarding LL is available in file.”
    • database: Contains factories, migrations, and seeds for database management. “the database folder contains factories migrations and sits this will also contain database.sql file if your database driver is set to sq light.”
    • public: The web-accessible directory, containing index.php (the entry point). “public folder is single web accessible folder index PHP right here is the entry script and the request starts from this index PHP.”
    • resources: Contains assets like CSS, JavaScript, and views. Views are Blade templates.
    • routes: Defines application routes (web, API, console). “RS folder contains the main rots for our application whether those are web based roads or console based roads.”
    • storage: Stores generated files, user uploads, cached views, sessions, and logs.
    • tests: Contains application tests.
    • vendor: Contains third-party packages (Composer dependencies).
    • Environment Configuration: .env file is crucial for environment-specific settings (database credentials, API keys, etc.). It should not be committed to Git. .env.example serves as a template. “enf do example file is the simple example file of you should never comit and push file in your git repository because it might contain sensitive data instead you’re going to comment and push. example file which should not contain sensitive data.”

    II. Request Lifecycle

    • The request starts at public/index.php.
    • index.php includes vendor/autoload.php, then creates the application.
    • Configuration files are loaded, and service providers are initiated. “The application itself loads configuration files and initiates service providers.”
    • Service Providers: Prepare and configure the application (registering services, event listeners, middleware, and routes). “Service providers in Lal prepare and configure the application handling tasks like registering Services event listeners middle wear and Roots.”
    • Router: Takes the request, finds the corresponding route, and executes the associated function. “the request is passed to router the router takes the request finds the corresponding function to execute and executes that.”
    • Middleware: Can execute code before the request reaches the action and before the response is sent back to the user.
    • Controller: Handles the request logic and can render a view. “the controller will send the response back to the user or if the middle we is registered the response will be passed to Middle we first and then returned to the user the controller action might also optionally render The View.”

    III. Routing

    • Basic Routing: Defines routes in routes/web.php.
    • Example: Route::get(‘/about’, function () { return view(‘about’); });
    • HTTP Methods: Laravel supports common HTTP methods: GET, POST, PUT, PATCH, DELETE, OPTIONS.
    • Redirect Routes: Route::redirect(‘/old-url’, ‘/new-url’, 301); (301 is a permanent redirect). “we call the redirect method the first argument in this method is the rout to which we are going to listen to and the second argument is where the user should be redirected by default this redirect happens with status code 302 but we can also provide a third argument which is going to be the status code.”
    • View Routes: Route::view(‘/contact’, ‘contact’, [‘phone’ => ‘123-456-7890’]); Directly renders a view. “the following code will listen to SL contact road and it will immediately try to render a view called Contact.”
    • Route Parameters:Required: Route::get(‘/product/{id}’, function ($id) { … }); “Road parameters needs to be inside curly braces.”
    • Optional: Route::get(‘/product/{category?}’, function ($category = null) { … }); “to make this optional we’re going to provide question mark before this closing curly brace.”
    • Route Constraints: Restricting route parameters using where() method.
    • Route::get(‘/product/{id}’, function ($id) { … })->where(‘id’, ‘[0-9]+’); id must be numeric. “we number accepts an argument and we’re going to provide a parameter so in this case I’m going to provide it and that’s it.”
    • Route::get(‘/user/{username}’, function ($username) { … })->where(‘username’, ‘[a-zA-Z]+’); username must be alphabetic. “the following Road definition will match the following URLs whenever the ID only contains numeric values it is going to match but it is not going to match anything that does not contain numeric values now.”
    • Custom Regex: Route::get(‘/user/{username}’, function ($username) { … })->where([‘lang’ => ‘[a-z]{2}’, ‘id’ => ‘[0-9]{4,}’]); More complex validation. “the length needs to be exactly two characters any symbol from A to Z and let’s use two character annotation however the ID needs to be digits let’s make sure it is a digit and also we need to make sure that it is at least four characters length.”
    • Route Naming: Route::get(‘/about’, function () { … })->name(‘about’); Used for generating URLs. route(‘about’) will return the /about URL. “Whenever we access slab about URL we see the following content this is how we Define the TRU now let’s see what other request methods are available in LL there are totally six request methods available get post put patch delete and option get is mostly used to get the information post is to create the information put is to update the information and Patch is also for to update the information delete is to delete the information and options is to get more information about the specific root in LL.”
    • Route Prefixes: Route::prefix(‘admin’)->group(function () { Route::get(‘/users’, function () { … }); }); Groups routes under a common prefix.
    • Controller Namespaces: Route::controller(CarController::class)->group(function () { … }); Groups routes using the same controller.
    • Single Action Controllers: Controllers with a single __invoke method. “to generate single action controller we’re going to execute the following commment PHP artisan make controller we’re going to provide the controller name like show car controller for example and then we’re going to provide a flag D- invocable.”
    • Resource Controllers: Provide a standard way to handle CRUD operations for a resource. Route::resource(‘products’, ProductController::class); “In LEL a controller is a special type of controller that provides a convenient way to handle typical crowd operations for a resource such as a database table.”

    IV. Debugging

    • dump($variable): Prints information about a variable. “dump is a Lal built-in function which prints every information about the given variable and it prints pretty nicely.”
    • dd($variable): Prints information and stops code execution. “DD which actually prints the variable and stops code execution.”

    V. Configuration

    • Configuration options are primarily set in the .env file.
    • config() helper function accesses configuration values. Example: config(‘app.name’).
    • Configuration files reside in the config directory.
    • Publishing Configuration Files: php artisan config:publish [config_file] – copies configuration files from the vendor directory to the config directory for customization.

    VI. Templating with Blade

    • Blade Templates: Located in resources/views. Use .blade.php extension.
    • Variable Output: {{ $variable }} Automatically escaped to prevent XSS. {!! $variable !!} Unescaped output.
    • Blade Directives: Keywords prefixed with @ (e.g., @if, @foreach). “every directive starts with eight symbol for example there is a for each directive.”
    • Escaping Blade Directives: Used @ symbol two times in order to correctly display @foreach or @if
    • Verbatim Directive: @verbatim … @endverbatim Prevents Blade from processing the content within the block.
    • Shared Data: View::share(‘key’, ‘value’); Makes data available to all views.
    • Conditional Classes/Styles: @class([‘class-name’ => $condition]), @style([‘property’ => ‘value’ => $condition])
    • Including Subviews: @include(‘path.to.view’, [‘data’ => $data])@includeIf: Includes only if the view exists.
    • @includeWhen: Includes based on a condition.
    • @includeUnless: Includes unless a condition is met.
    • @includeFirst: Includes the first existing view from a list.
    • Looping with @each: @each(‘view.name’, $array, ‘variable’) Renders a view for each item in an array.
    • Raw PHP: @php … @endphp Executes raw PHP code within a Blade template. @use directive imports classes.
    • Layouts:@extends(‘layouts.app’): Specifies the parent layout.
    • @section(‘title’) … @endsection: Defines a section.
    • @yield(‘title’): Placeholder in the layout for a section.
    • @include(‘partials.header’): Includes a partial view.
    • Stacks: Manage the pushing of named CSS or JavaScript to a master layout.

    VII. Database & Eloquent ORM

    • Database Configuration: Configured in config/database.php and driven by .env variables.
    • SQLite: Default database is SQLite, using database/database.sqlite.
    • Migrations: Used to define database schema changes.
    • Eloquent Models: Represent database tables. Located in the app/Models directory. “In lal’s eloquent omm relationships Define how different database tables are related to each other.”
    • Model Relationships:hasOne()
    • hasMany()
    • belongsTo()
    • belongsToMany()
    • Mass Assignment: Protecting attributes from mass assignment vulnerabilities. Use $fillable (whitelist) or $guarded (blacklist) properties on the model. “By default, LEL protects against mass assignment vulnerabilities unless you explicitly permit it. This safety mechanism prevents unintended modifications to your application’s data by limiting which attributes can be modified.”
    • Disabling Timestamps: $timestamps = false; on a model disables automatic created_at and updated_at management.
    • Retrieving Data:Model::all(): Retrieves all records.
    • Model::find($id): Retrieves a record by its primary key.
    • Model::where(‘column’, ‘value’)->get(): Retrieves records matching a condition.
    • Model::first(): Retrieves the first record matching a condition.
    • Inserting Data:Model::create([‘column’ => ‘value’]): Creates a new record. “Model: create attributes which will insert the data.”
    • $model = new Model(); $model->column = ‘value’; $model->save();
    • Updating Data:$model = Model::find($id); $model->column = ‘new_value’; $model->save();
    • Model::where(‘column’, ‘value’)->update([‘column’ => ‘new_value’])
    • Deleting Data:$model = Model::find($id); $model->delete();
    • Model::where(‘column’, ‘value’)->delete();
    • Soft Deletes: Using the SoftDeletes trait to mark records as deleted instead of permanently removing them.
    • Model Factories: Used to generate fake data for testing and seeding. “factory stating LEL is a way to define specific variations of data when using modu factories states allow you to Define different sets of attributes for the model and making it easy to create various types of data without duplicating the code.”
    • Model States: Allow to define different sets of attributes for the model and making it easy to create various types of data without duplicating the code
    • Model After Making: the method is executed when we call make.
    • Model After Creating: the method is executed when we call create.
    • Database Seeding: Seed the database with initial data.
    • Paginating results: the data will be displayed per page.

    VIII. Responses

    • Returning data to the user: We can return array which will be converted into JSON.
    • Explicitly returning json: The return result will explicitly be a JSON.
    • Returning Views: Using the helper function and controlling the status code.
    • Redirecting the User: There are several ways to implement redirect in Laravel.
    • The root method accepts a root name.
    • Providing car object with the id parameter will be automatically rendered.
    • Redirecting an external URL: using redirect away.

    Key Takeaways:

    • Laravel provides a structured framework for web development, emphasizing convention over configuration.
    • Eloquent ORM simplifies database interactions.
    • Blade templating offers a powerful and expressive way to create views.
    • Artisan commands streamline common development tasks.
    • The .env file and configuration system are essential for managing environment-specific settings.

    Laravel Application Development: Core Concepts and FAQs

    FAQ on Laravel Application Structure, Routing, Configuration, Debugging, ORM (Eloquent), Factories, Migrations, Controllers and Responses

    Q1: What is the function of each key directory in a Laravel project?

    • app/: Contains the core logic of your application, including models, controllers, service providers, and other custom classes. Uploaded files by the user can also be stored here.
    • config/: Stores all of your application’s configuration files. These files define settings for things like database connections, mail servers, and application behavior. If you want to customize configuration options which are not available in .env file, you can find the configuration files here. Feel free to delete the default configuration files if you don’t plan to modify them as the default files exist in the Vendor folder in Laravel core.
    • database/: Contains your database migrations, factories, and seeders. This also includes the database.sqlite file if you’re using SQLite.
    • public/: The web server’s document root. It contains the index.php file (the entry point for all requests), as well as assets like CSS, JavaScript, and images. Only files and folders within this directory are publicly accessible.
    • resources/: Contains your application’s views (Blade templates), CSS, and JavaScript files.
    • routes/: Defines all the routes for your application, including web routes (web.php), API routes (api.php), and console routes (console.php).
    • storage/: Stores generated files, user uploads, cached data, sessions, logs and other application-specific files. Contains subdirectories like app/ (for user uploads), framework/ (for cache, sessions, and views), and logs/ (for log files).
    • tests/: Contains your application’s automated tests.
    • vendor/: Contains all the third-party packages installed via Composer.

    Q2: How does the Laravel request lifecycle work?

    The Laravel request lifecycle can be summarized as follows:

    1. Request Entry: The request hits the public/index.php file.
    2. Bootstrapping: index.php includes vendor/autoload.php and bootstraps the Laravel application.
    3. Application Loading: The application loads configuration files and initiates service providers. Service providers prepare and configure the application, registering services, event listeners, middleware, and routes.
    4. Routing: The router takes the request and matches it to a defined route.
    5. Middleware Execution: Any middleware associated with the route is executed. Middleware can perform actions before the request reaches the controller (e.g., authentication, logging) and can even block the request.
    6. Controller Action: The matched route’s controller action is executed.
    7. Response Generation: The controller action may render a view or return data.
    8. Middleware (Post-Response): If middleware is registered, the response is passed through it before being sent to the user.
    9. Response to User: The final response (HTML, JSON, etc.) is sent back to the user’s browser.

    Q3: How can I configure application settings in Laravel, and what is the role of the .env file?

    Laravel’s configuration is primarily managed through configuration files located in the config/ directory. These files are typically populated with values from environment variables defined in the .env file.

    The .env file stores sensitive or environment-specific settings like database credentials, API keys, and application debugging mode. It is crucial to never commit the .env file to your Git repository. Instead, commit the .env.example file, which contains sample values.

    To access configuration values, use the env() helper function or the config() helper function.

    If you want to customize configuration options which are not available in .env file, you can find the configuration files under config/.

    Q4: How can I create custom routes in Laravel, and what request methods are available?

    You define routes in the files within the routes/ directory. The most common file is routes/web.php for web routes. To create a new route, open the appropriate file and use the Route facade. For example:

    use Illuminate\Support\Facades\Route;

    Route::get(‘/about’, function () {

    return view(‘about’);

    });

    This code defines a GET route for the /about URL that renders the about view.

    Laravel supports the following request methods:

    • GET: Used to retrieve data.
    • POST: Used to create data.
    • PUT: Used to update an existing resource.
    • PATCH: Used to partially update an existing resource.
    • DELETE: Used to delete a resource.
    • OPTIONS: Used to retrieve the communication options available for a resource.

    You can define routes that respond to multiple methods using Route::match([‘GET’, ‘POST’], ‘/path’, …) or routes that match any method with Route::any(‘/path’, …)

    You can define a redirect type of route in Laravel by calling the redirect method. The first argument is the route to which you are going to listen to and the second argument is where the user should be redirected.

    Q5: How can I debug my Laravel application, and what are some useful debugging functions?

    Laravel offers several debugging tools:

    • dump(): Prints the variable’s contents with detailed information. It does not halt code execution.
    • dd(): “Dump and Die.” Prints the variable’s contents and stops further code execution.

    Configuration: You can set the APP_DEBUG environment variable to true in your .env file to enable detailed error reporting.

    Laravel Logs: Laravel’s built in logging system writes errors, warnings, and other information to log files in the storage/logs directory. You can use this directory as well.

    Q6: What are Laravel Blade templates, and how can I pass data to them?

    Blade is Laravel’s templating engine. Blade templates use the .blade.php extension and allow you to embed PHP code within HTML using special directives (prefixed with @). To display variables, use double curly braces {{ $variable }}.

    You can pass data to views using the following methods in your controller:

    • Associative Array: Pass an associative array as the second argument to the view() function:
    • return view(‘my_view’, [‘name’ => ‘John’, ‘age’ => 30]);
    • with() Method: Chain the with() method to the view() function:
    • return view(‘my_view’)->with(‘name’, ‘John’)->with(‘age’, 30);

    You can also share data globally with all Blade files using the View facade in a service provider’s boot method:

    use Illuminate\Support\Facades\View;

    View::share(‘year’, date(‘Y’));

    This makes the year variable available in every view. You can use functions and classes with namespaces in Blade files to output certain things.

    Q7: What are Laravel Blade directives, and how are they used?

    Blade directives are special keywords (prefixed with @) that simplify common tasks in your templates. Some common directives include:

    • @if, @elseif, @else, @endif: Conditional statements.
    • @foreach, @for, @while: Looping constructs.
    • @include: Includes a sub-view into the current view.
    • @yield, @section: Used for template inheritance to define sections of content that can be overridden in child templates.
    • @extends: Specifies the parent template that a child template inherits from.
    • @auth, @guest: Check user authentication status.
    • @csrf: Generates a hidden CSRF token for form submissions.
    • @class: Conditionally applies CSS classes to an HTML element.
    • @verbatim: Prevents Blade from compiling code within its block, useful for JavaScript frameworks that also use curly braces.
    • @php, @endphp: Defines a block of raw PHP code.
    • @use: Import a class into the Blade template.

    Q8: How does Laravel’s Eloquent ORM work, and how can I define relationships between models?

    Eloquent is Laravel’s ORM (Object-Relational Mapper). It provides an object-oriented way to interact with your database. Each database table typically has a corresponding “Model” class that represents it.

    To define a model, create a new class that extends Illuminate\Database\Eloquent\Model. For example:

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Car extends Model

    {

    // …

    }

    Eloquent automatically determines the table name based on the model name (e.g., Car model corresponds to the cars table).

    Eloquent supports various types of relationships:

    • HasOne: Defines a one-to-one relationship.
    • HasMany: Defines a one-to-many relationship.
    • BelongsTo: Defines a reverse one-to-many relationship.
    • BelongsToMany: Defines a many-to-many relationship.
    • MorphTo: Defines a polymorphic relationship.

    Example (one-to-many):

    // In the Car model:

    public function images()

    {

    return $this->hasMany(CarImage::class);

    }

    // In the CarImage model:

    public function car()

    {

    return $this->belongsTo(Car::class);

    }

    These relationships allow you to easily retrieve related data. For example: $car->images would return all images associated with a specific car. To prevent mass assignment vulnerabilities, define the $fillable property in your models, specifying which attributes can be mass-assigned.

    Laravel Configuration: Settings and Customization

    Configuration files in Laravel contain various settings for your application, and they are a key aspect of customizing its behavior.

    Key points regarding configuration files:

    • Location Configuration files are stored in the config folder.
    • Purpose These files manage various aspects of your application, such as the application name, language, database credentials, session driver, and mailer settings.
    • .env file Most configuration options are stored in the .env file. This file contains sensitive data and should not be committed to your Git repository. Instead, commit the .env.example file, which contains sample data.
    • Accessing Configuration Values You can access configuration values using the config() helper function, providing the configuration name as an argument (e.g., config(‘app.name’)).
    • Overriding Configuration Values If you need to customize configuration options that are not available in the .env file, you can modify the corresponding files in the config folder. If you don’t plan to modify a configuration file, you can delete it. Laravel will use the default values from the core.
    • Publishing Configuration Files You can publish configuration files that are not available by default in the config folder using the php artisan config:publish command.
    • Caching Configuration Files Once your Laravel project is deployed to production, it is recommended to execute the command PHP Artisan route:cache. This generates a cached version of your Laravel routes. If you want to clear this cache, you can do so by running PHP Artisan route:clear.

    Laravel Routing Essentials

    Laravel routing is a flexible system for defining how your application responds to client requests.

    Key aspects of Laravel routes:

    • Definition Routes are typically defined in the routes directory, with web.php for web routes and api.php for API routes.
    • Basic Routing A basic route accepts a URI and a closure.
    • Route::get(‘/uri’, function () {
    • return ‘Hello, World!’;
    • });
    • Available Methods Routes can be defined for various HTTP methods: GET, POST, PUT, PATCH, DELETE, and OPTIONS.
    • Route Parameters Routes can accept parameters. Required parameters are enclosed in curly braces {}.
    • Route::get(‘/product/{id}’, function ($id) {
    • return ‘Product ID: ‘ . $id;
    • });
    • Optional Parameters To make a route parameter optional, a ? can be added after the parameter name.
    • Regular Expression Constraints Parameters can be constrained using regular expressions with the where method.
    • Route::get(‘/product/{id}’, function ($id) {
    • // …
    • })->where(‘id’, ‘+’);
    • Named Routes Routes can be assigned names, allowing URL generation using the route() helper function.
    • Route::get(‘/about’, function () {
    • // …
    • })->name(‘about’);
    • $url = route(‘about’);
    • Route Groups Route groups allow sharing route attributes, such as middleware or namespaces, across multiple routes. The prefix method can be used to add a common prefix to a group of routes.
    • Fallback Routes A fallback route can be defined to handle unmatched URIs, typically displaying a 404 error page or custom message.
    • Route::fallback(function () {
    • return ‘Fallback’;
    • });
    • Controller Routing Routes can be associated with controller methods.
    • Resource Controllers Resource controllers provide a conventional way to handle CRUD operations for a given resource. A resource route can be defined using Route::resource(‘products’, ProductController::class). This defines multiple routes for common actions like index, create, store, show, edit, update, and destroy. You can limit the included routes with only or exclude routes using except.
    • Single Action Controllers Single action controllers contain a single __invoke method and can be directly associated with a route.
    • Route Listing The php artisan route:list command displays a list of all registered routes. Additional flags, like -v, will show middleware. Flags such as –except-vendor and –only-vendor can filter routes.
    • Route Caching The php artisan route:cache command creates a cached version of your routes, improving performance, especially for applications with many routes. Clear the cache with php artisan route:clear.
    • Redirect Routes Redirect routes allow you to redirect one route to another.
    • Route::redirect(‘/here’, ‘/there’, 301); //Redirect from /here to /there
    • View Routes View routes directly return a view.
    • Route::view(‘/contact’, ‘contact’, [‘phone’ => ‘555-555-5555’]);

    Laravel Migrations: Database Schema Management and Version Control

    Laravel migrations offer a way to manage and version control a database schema, acting as a versioned blueprint that allows definition of the structure of database tables (including columns and data types) in code. Migrations facilitate the easy creation, modification, and sharing of database changes within a team. When a migration is run, Laravel applies the changes to the database, ensuring consistency and simplifying the process of rolling back changes if necessary.

    Key aspects of Laravel migrations:

    • Location: Migrations are typically located in the database/migrations folder.
    • Structure: Each migration file extends the Migration class and contains an anonymous class with two methods: up and down.
    • The up method defines the changes to be applied to the database, such as creating or modifying tables. It uses Laravel’s schema builder to define schema changes.
    • The down method reverts the changes made in the up method, providing a way to roll back the migration.
    • Naming Convention: Migration filenames consist of a timestamp followed by a descriptive name. The timestamp ensures migrations are executed in the correct order.
    • Creating Migrations: New migrations can be created using the php artisan make:migration command, followed by the migration filename (e.g., php artisan make:migration create_car_types_table). When creating a new table, it’s conventional to name the migration file create_your_table_name_table.
    • Schema Builder: Laravel’s schema builder is used to define table structures within migrations.
    • Schema::create(‘users’, function (Blueprint $table) {
    • $table->id();
    • $table->string(‘name’);
    • $table->string(’email’)->unique();
    • $table->timestamp(’email_verified_at’)->nullable();
    • $table->string(‘password’);
    • $table->rememberToken();
    • $table->timestamps();
    • });
    • Foreign Keys: Migrations can define foreign keys to establish relationships between tables.
    • $table->foreignId(‘maker_id’)->constrained(‘makers’);
    • This creates a maker_id column and defines a foreign key constraint to the makers table.
    • Data Types: Migrations support various data types for columns, such as string, integer, bigInteger, boolean, and longText.
    • Nullable Columns: The nullable method can be used to specify that a column can accept null values.
    • Timestamps: The timestamps method creates created_at and updated_at columns.
    • Soft Deletes: To implement soft deletes, add a deleted_at column to the table and use the SoftDeletes trait in the corresponding model.
    • $table->softDeletes();
    • Migration Commands: Artisan provides several commands for managing migrations.
    • php artisan migrate: Executes all pending migrations.
    • php artisan migrate:fresh: Drops all tables and reruns all migrations.
    • php artisan migrate:refresh: Resets and reruns all migrations.
    • php artisan migrate:rollback: Rolls back the last batch of migrations. You can specify the number of steps to roll back using the –step option (e.g., php artisan migrate:rollback –step=3). You can also rollback to a specific batch using the –batch option.
    • php artisan migrate:status: Shows the status of each migration.
    • php artisan migrate:reset: Rollbacks all database migrations.
    • Simulating Migrations: The –pretend option can be used with migration commands to preview the SQL statements that will be executed.
    • Updating Existing Migrations: To add new columns to an existing table, you can modify the existing migration file or create a new one. After modifying a migration, you typically need to run php artisan migrate:fresh or php artisan migrate:refresh.
    • Default Values: You can define default values for columns using the default method.

    Laravel Eloquent ORM: Models, Relationships, and Factories

    Eloquent is Laravel’s built-in Object-Relational Mapping (ORM) library, which allows developers to interact with databases using PHP objects instead of writing raw SQL queries. Each database table has a corresponding “model” that is used to interact with that specific table. Eloquent provides an intuitive active record implementation for working with databases, including methods for common CRUD (Create, Read, Update, and Delete) operations. It also supports relationships, allowing definition of and interaction with associations between different database tables. Eloquent simplifies data manipulation and retrieval, making database interactions more readable and maintainable.

    Key aspects of Eloquent models:

    • Location: Eloquent models are located under the app/Models directory and typically extend the Illuminate\Database\Eloquent\Model class.
    • Model Generation: New model classes can be generated using the php artisan make:model command. For example, php artisan make:model FuelType will create a model file for the FuelType model. A migration and controller can also be generated alongside the model by using flags, such as php artisan make model fuel_type -m to generate a migration.
    • Table Names: By default, Laravel considers the table name of the model to be a snake case, plural version of the class name. For example, if the model name is Car, Laravel will assume the table name is cars. You can customize the table name by defining a protected $table property on the model.
    • protected $table = ‘car_fuel_types’;
    • Primary Keys: By default, Laravel assumes the primary key of the table is a column named id. You can customize the primary key by overriding the protected $primaryKey property.
    • Timestamps: By default, Eloquent expects created_at and updated_at columns to exist. These can be disabled by setting the $timestamps property to false.
    • public $timestamps = false;
    • Soft Deletes: If your database table has a deleted_at column, you can use the SoftDeletes trait in your model. When the delete method is called on the model instance, it will not be actually deleted from the database, but the deleted_at column will be set to the current timestamp.
    • use SoftDeletes;
    • Model Information: You can see information about the model by executing PHP Artisan model:show command followed by the model name.
    • Mass Assignment: For security reasons, it is not allowed for the model to be filled with arbitrary data. You can specify which attributes can be mass-assigned by defining a $fillable array on the model. Only the columns included in the $fillable array can be populated using mass assignment techniques like the create method.
    • protected $fillable = [‘maker_id’, ‘model_id’, ‘year’, ‘price’, ‘vin’, …];
    • Eloquent ORM Relationships: Define how different database tables are related to each other. Eloquent supports relationship types such as one-to-one, one-to-many, many-to-many, and polymorphic relationships. Relationships allow easy retrieval and management of related data using methods on models.
    • hasOne: Defines a one-to-one relationship.
    • hasMany: Defines a one-to-many relationship.
    • belongsTo: Defines a many-to-one relationship.
    • belongsToMany: Defines a many-to-many relationship.
    • Eloquent Factories: A tool to generate fake data for models. It makes it easy to create test and seed data. Factories define how a model should be created, including the default values for attributes. Using factories, you can quickly generate multiple instances of a model with realistic data, which is helpful for testing and database seeding.

    Laravel Blade Templating Engine: Syntax, Directives, and Components

    Blade is Laravel’s templating engine that allows you to write well-structured, dynamic web pages by mixing plain HTML with PHP code using a clean and simple syntax. Blade views are stored in the resources/views directory and have the .blade.php extension.

    Key features and concepts of Blade views:

    • Basic Syntax: To display data, you can enclose variables in double curly braces {{ $variable }}. This automatically escapes HTML entities to prevent XSS vulnerabilities. If you want to render unescaped data, use {!! $variable !!}.
    • Blade Directives: Blade directives are special keywords prefixed with an @ symbol. Directives provide a shorthand notation for common PHP control structures, such as if statements, loops, and including subviews. Blade directives are converted into plain PHP code, which improves readability and maintainability.
    • Conditional Directives: Blade provides directives for conditional statements, including @if, @elseif, @else, and @endif. There are also directives for @isset and @empty to check if a variable is set or empty, respectively. The @unless directive is the opposite of @if.
    • @if (count($cars) > 1)
    • <p>There is more than one car.</p>
    • @elseif (count($cars) == 1)
    • <p>There is exactly one car.</p>
    • @else
    • <p>There are no cars.</p>
    • @endif
    • Loop Directives: Blade includes directives for creating loops, such as @for, @foreach, @forelse, and @while. The @forelse directive combines a @foreach loop with an @empty directive, allowing you to specify content to display when the loop has no iterations.
    • Comments: Blade comments are defined using {{– comment –}}. Unlike HTML comments, Blade comments are not visible in the page source.
    • Template Inheritance: Blade allows you to define a base layout and extend it in other views. This is achieved using the @extends and @section directives.
    • @extends: Specifies which layout a view should inherit.
    • @extends(‘layouts.app’)
    • @section and @yield: Sections define content that can be inserted into specific locations in the layout, marked by the @yield directive.
    • // Layout file (resources/views/layouts/app.blade.php)
    • <title>@yield(‘title’) – Car Selling Website</title>
    • // View file (resources/views/home/index.blade.php)
    • @extends(‘layouts.app’)
    • @section(‘title’, ‘Home Page’)
    • @section(‘content’)
    • <h1>Homepage content goes here</h1>
    • @endsection
    • @show: The @show directive is used to both define and immediately display a section. @show is equivalent to calling @endsection and then @yield with the same section name.
    • @parent: Used within a section to include the content of the parent section.
    • @hasSection: Checks if a specific section has been defined.
    • @sectionMissing: Checks if a specific section is missing.
    • Including Subviews: Blade provides directives for including other view files within a view.
    • @include: Includes a view, and you can pass data to the included view as an associative array.
    • @include(‘shared.button’, [‘color’ => ‘brown’, ‘text’ => ‘Submit’])
    • @includeIf: Includes a view if it exists.
    • @includeWhen: Includes a view based on a condition.
    • @each: Renders a view for each item in a collection.
    • @each(‘car.view’, $cars, ‘car’)
    • Components: Blade components are reusable pieces of user interface that can be included in blade views. They can be class-based or anonymous.
    • Anonymous Components: Blade files located under a specific folder inside resources/views. They are included as HTML tags starting with x-.
    • <x-card />
    • Class-Based Components: Provide the possibility to override the default location of the Blade file.
    • <x-search-form action=”search” method=”get” />
    • Slots: Blade components can also utilize slots, providing designated areas within the component where content can be injected from the parent view.
    • Other Directives:
    • @verbatim: Ignores all Blade directives and expressions within the block.
    • @json: Renders a PHP variable as JSON.
    • @checked: Adds the checked attribute to an HTML input element if a given condition is true.
    • @disabled: Adds the disabled attribute to an HTML element if a given condition is true.
    • @selected: Adds the selected attribute to an HTML <option> element if a given condition is true.
    • @required: Adds the required attribute to an HTML element if a given condition is true.
    • @readonly: Adds the readonly attribute to an HTML input element if a given condition is true.
    • @class: Conditionally adds CSS classes to an HTML element.
    • @style: Conditionally adds inline styles to an HTML element.
    Laravel 11 in 11 hours – Laravel for Beginners Full Course

    The Original Text

    I recently have released Lal for beginners course on my website the cool.com that course contains 37 modules 24 plus hours of content more than 300 well prepared well-edited HD videos written lessons quizzes and challenges deployment on custom domain on VPS server with GitHub actions certificate of completion and a lot more today I took first 19 modules of my premium course combine that into a single video and offering this to you for free on my YouTube channel the only thing I ask is like subscribe and provide a nice comment the video has a Time codes for pretty much every lesson if you want to skip around you can do this I have one very important and big announcement to make in this introduction section so please don’t skip that section and watch it till the end I tried to make the course Very beginner friendly so I didn’t not use any extra JS or css Frameworks during this course even the HTML CSS template which I created exclusively for this course is pure HTML and CSS and JavaScript template no extra Frameworks there we will just work with LL and blade templates and of course database and a lot of other things do you get my point right anyway I plan to update the course from time to time trying to make this literally the best Lal 4 beginners course out there and for this I need your feedback whether you’re watching this on YouTube channel or on my website C .c if you have anything in your mind you can write them under the comment section down below and I will do my best to read every comment and react accordingly on those comments if you are enrolled in this course you can provide your feedback on the Discord group as well the course also has 400 Pages written notes for pretty much every lesson from time to time as I update my course I will update that written notes as well on the course page or on my website you can find the newsletter subscription form if you want to get the course updates or PDF updates or releases about new courses please subscribe to the newsletter I promise you won’t be spammed you will be only notified with meaningful and useful information for you before we jump into the course two more things I want to mention first is that I’m right now working on one of the most exciting project I have ever built and this is going to be available on my YouTube channel for free and this is Lal react e-commerce website that course will use the latest Lal version react uh with inertia version two and service side rendering spatia roles and permissions package it’s going to have multiple vendors online payments and it’s going to have a lot of comprehensive e-commerce features such as product variants Dynamic Fields coupon codes and discounts watch list reviews and a lot more follow me on EX or Twitter because I share updates regarding this course from time to time and also don’t forget to subscribe to be the first one to be notified when the course is released and now here’s the exciting news I wanted to give a chance to every student who wants to enroll to my courses but cannot afford them so this is what I decided in every video I’m going to generate 100% coupon code for all the products that I have right now created on my website and right now there are three products Lal course for beginners which is what I’m talking about right now the offline written notes for this Lal course for beginners which is 400 page PDF file and laravel vue.js e-commerce website as soon as you find the coupon code you can use that coupon code to purchase all my three products and in this specific video there are two such coupon codes and though the location of these coupon codes are absolutely random so you see that this is 11 hours tutorial somewhere in this um tutorial there are two coupon codes using which you can purchase all three prod products that I have right now available in order to find the coupon code you need to watch the video or scheme the video find the location and as soon as you find the coupon code you can use that you can uh just go through the checkout process on my website you can put the coupon code there and purchase for free you can enroll for free it’s a 100% coupon code I want to highlight that uh but also send me a DM on X so please let me know once you find the coupon code because I want to announce this as soon as you somebody finds that on my Twitter account or ex because I want to let everyone know that the coupon codes are already found for this specific video so for this please follow me on Twitter as well and send me DM if you find the coupon code if you’re the lucky one to find that I’m I’m very happy for you um but yeah this is all I wanted to say and this happens on almost all the videos I release from now on so in every upcoming videos there will be at least one coupon code one is going to be kind of minimum but today because this is a special video for me um I decided to put two coupon codes yeah that’s what what I wanted to mention and now enjoy the video Welcome to my leral course for absolute beginers in this course we will learn all the fundamental topics of Lal and build fully functional car selling website where you can browse cars for sale filter by multiple criteria such as make model release yard price car type and so on you can see car details page with multiple images detailed description and features of the car in case you are interested buying the specific car you can view the owner’s full phone number if you want to sell your own car you can sign up or login with email and password or with social out such as Google or Facebook you can add your own car upload images and publish on the website at the end of the course I will also teach you how to host the project on custom domain in production environment just type in your browser grab a car doxyz and see the final version of the project at the end of each module you will also find quizzes and challenges to test your skills the course also includes written notes for almost all the topics that is explained in video content this course also has 3 hours testing section we’re going to get familiar writing test in LEL and write all the necessary and useful tests for our project by the end of this course you will be able to confidently build Lal projects with this complexity and host it on custom domain the course also comes with 30 days money back guarantee if you don’t like it we will refund your money back hello everyone my name is Zur also know known as the code holic I taught to hundreds of thousands of students what is PHP and how they can create fullstack applications with PHP and L I’m super excited to be your Mentor in this course and let’s get [Music] started this course is the perfect course for everyone whether you have zero experience with Lal or you know your way around round and you want to take your Lal skills to the next level since Lal is built on PHP it’s important you to have solid grasp of PHP and objectoriented programming don’t worry you don’t need to be an expert just comfortable enough to understand the basics you also need good handle of HTML and CSS since they are essential part of building websites knowing how to structure a page with HTML and style it with CSS is all what you need need lastly we will be working with databases a lot Reading Writing inserting updating the data so having a basic understanding of SQL databases will help a lot you should know what tables columns primary Keys foreign Keys data types are along with how to run queries write joints and perform basic insert update and delete operations again no need to be an expert just Basics will be enough now let’s have a look at the full demo of the project we are going to build in this course you can also check this on your own computer just type in the browser grab a car. XYZ this is already deployed on production environment when you open the homepage you’re going to see hero slider right here then search section and then latest edit cars in this hero section we see two main slides one is for potential buyers and second is for potential sellers this search form is just basic search form we can search by maker model state city type ER range price range and fuel type and when we click on search right here this is going to open dedicated search page and on the left side we have even more search criterias let me go back and check the homepage on the homepage we see 30 latest eded cars we can see car’s primary image its location its yard maker model and price the type and the fuel type as well when we click on the car it is going to open car details page right here we see all the images of this car and we can just activate the image by clicking on the thumbnail or we can navigate into the images through these arrows on the right side we see the price and all the details about this car we also have right here the seller information who is selling that specific car we can also see that this seller has 26 total cars open for selling right here we have the phone number if you as a potential buyer are interested to buy this specific car you can contact to this buyer um on this phone number however the phone number if you pay attention is not fully visible that is done on purpose we didn’t want the phone to be always fully visible because search engines will crawl our website and they will just grab grab the phone number and use it for spamming purposes instead if you are interested to see the full phone number you can click on this button this is going to make Ajax request to the server get the full phone number and display this right here so here we also have detailed description of the car and car specifications all the features the car U has supported if we scroll at the top we see right here heart icon this is to add the car into your watch list into your favorite cars right now I am not authenticated and if I click this watch list I get the following message please authenticate first to add cars into watch list okay let’s try to add this car into my favorite cars when I am authenticated now let’s test everything from the sellers perspective I’m going to click on sign up right here we have the very basic form with a name email phone and password we have also possibility to sign up with Google and Facebook let’s sign up with Google I’m going to click on this then I’m going to choose the account using which I want to sign up and I am actually already signed up and it opens this a new car page right now because I’m already authenticated let’s open the homepage I’m going to scroll down below and I’m going to add this car into my favorite cars right now I get the message car was added to watch list let’s click okay now right here I have my profile section so I can see my personal details like name email phone and I can change the password right here the email is disabled this is because I am authenticated as Google user and I cannot change email if I am authenticated as Google user if you are authenticated as regular user with email and password you can change your email let’s check my car section and at the moment my user doesn’t have any cars I can click right here to add new one but I’m interested in my favorite cars section inside which I have only one car at the moment let me go ahead and add a few more cars I’m interested into this one okay and into this one as well okay awesome now let’s click on my favorite cars and I see all three cars and the latest added car is at the top of the list okay I’m not interested in this one I’m just going to remove it I can reload the page and this is gone if I have a lot of cars added into my favorite cars list then right here I will see pagination now let me try to authenticate with a different user which has cars inside my car section and we can try to add new car from there I’m going to log out click on login I’m going to click on login right here okay and welcome back Ila Graham now let’s check my car section and I have right here a lot of cars and right here I also see this pagination okay let’s let me try to add new car click right here I’m going to choose Lexus RX ER we’re going to choose car type let’s provide some price here let’s provide the VIN code which must be exactly 17 characters so for justed testing purposes I’m just going to type right here one one one let’s provide the millage let’s provide the fuel type we’re going to choose the location we’re going to provide the address as well we’re going to provide address as well phone number and we’re going to choose the features the car has supported I’m going to take couple of features not all of them we’re going to provide right here some description let’s provide test description and if we want to publish the car and make it available for selling we’re going to provide the publish date right here we can also provide the publish date in the future and then the car will be visible on the website in the future but not now if we just want to create CS but not publish them you can just leave this publish date as empty right now I want the card to be displayed on the website so I’m going to choose today as publish date and before I click on the submit let’s add images as well that’s good let’s click on submit the car was added and we see right here this new car we can click on the homepage scroll down below and we see uh right here the new car has been added now let’s try to edit this car I’m going to click on my cars we can click on edit we can change anything what we want however if we want to manage images for the specific car we cannot do this from the screen we can click right here or we can click images button from here in the my cars page I’m going to click on images and right here we have couple of options we can delete the images we don’t want let’s say I don’t want this image so I’m going to tick this under the delete column and I’m going to click this update images and that image was actually deleted I can also change the ordering let’s say I want this image to be the first one so I’m going to give it position one and I’m going to give this position three I’m going to click on update images that was updated now this is the first one and if I check the homepage we’re going to see that this image now is the first image kind of thumbnail image of the car let’s go back into images if we decide that we want to add more images to that car we can click right here choose a few more right now we will have duplicated images but that’s not important and click on ADD images right now we have more images on this car let’s go on the homepage click on the car and we see all the images that we added for that specific car before we dive deep into larel I want to talk to you about something super important important and this is deployment now I know for many developers this seems something like they can put off for later stage but trust me learning how to deploy your project on production environment and make it accessible to the world is a GameChanger imagine this you have worked very hard created cool application with some cool and nice features and you want to put this project in portfolio and you want to demonstrate this to everyone how you’re going to do this of course you can write text descriptions you can also put some screenshots of the application in the portfolio but would not it be even better if you just deploy the project and put a demo link of the project in your portfolio having a demo link of your project is such a powerful tool now it is not just your words about the project it is a real actual functioning application that anyone can see when I personally look for some projects to use for my personal purposes I always look for projects which have demo links because one thing is what they say about the project how the screenshots look but the other thing is how it actually works when you make your hands on the project deploying the project on your own custom domain gives it professional look and touch as well it shows that you can take the project from start to finish and make it accessible to anyone and anywhere and this is exactly what we are going to do in this course we will be using GitHub actions for the project deployment which means less hustle for you once we set the project up your updates will be deployed immediately it is like a magic now speaking about hosting and deployment I personally use hostinger and they have been great so far I have been using their services for past three or four years and I’m very happy and confident that I can recommend it to you as well alongside with great advantages of the hostinger one of the greatest Advantage I personally like is that I have a single space from which I can purchase domains I can purchase shared hosting VPS hosting Cloud hosting I can manage DNS settings I can purchase business emails for my websites in my case this is going to be info@ grab card. XYZ um or support at grab a card. XYZ or both at the same time and hostinger also provides D protection with cloudware from their panel I don’t have to switch back and forth between multiple accounts one for domain second for hosting third for dust protection or DNS management everything is in a single place which is pretty cool for me and this saves a lot of time for me as well shared hosting is great for small projects and if the projects do not need any big customizations I can use shared hosting for a very low price which includes domain SSL certificates databases 100 website support and a lot more I do have YouTube videos where I deploy my Lal projects on shared hosting and I can tell you that this is is not bad practice but you should always keep in mind that shered hosting has shared Resources with others so that’s good for small projects but not for the big ones for medium to large size of projects I generally grab a VPS server and this is what I recommend also which comes with the latest pre-installed Lal application and set up everything the engine server the MySQL databas is the cloud panel to manage everything on your server and simply I can replace the existing prein Lal application with mine for this project we’re going to get VPS server and purchase the domain for as low as $2 all inside the hostinger they have all the tools you need to set the project up very easily and I will show you stepbystep guide how you can make your Lal project up and running on their platform for this course I partnered up with hostinger and they were kind enough to provide me the VPS server on which I’m going to host my project they also provided special link in discount coupon code for the students of this course or for pretty much anyone who wants to learn Lal go to the following URL hostinger.com learn Lal grab the VPS hosting you want and during checkout use a coupon code learn Lal to get extra 10% off so by the end of this course you will not only know how to create fully working Lal applications but also how to deploy this on custom domain on production environment make it accessible to to the world which is an awesome skill to have and it’s going to boost your confidence as well all right let’s get started lateral hands down is the most popular PHP framework out there used for almost everything starting from simple websites to apis crms e-commerce systems and just about any kind of web application you can think it was created by Taylor otwell in 2011 and right now is developed and maintained by an amazing team of passionate web developers laravel is all about clean and elegant syntax it provides a lot of tools to make building modern and robust web applications easier and more enjoyable LL offers ton of benefits so let’s take a look at few of these standout features it’s quick and simple to get started with but powerful enough to handle complex applications security is right in with features like xss protection and protection against SQL injection it delivers high performance right out of the box laravel’s rooting system is super flexible and Powerful eloquent orm makes working with a databases a breeze the syntax is clean simple and elegant making coding more enjoyable it follows the MVC architecture for better structure structure and organization LL comes with built-in support for testing which is a huge plus authentication and authorization are already baked into the framework caching is made easy for better performance it offers excellent error and exception handling the blade templating engine helps you build Dynamic frontend effortlessly task scheduling is seamless making automated tasks a breeze it has a robust QE system for managing heavy background jobs need to support multiple languages Lal got you covered with multilingual support maintenance and updates are super easy it keeps costs low while providing tons of value and let’s not forget huge laral community and ecosystem there is a package for just about anything you can think of these are just few benefits of using l the more time you spend in LL the better you will understand how powerful the framework is if you are here on this course willing to learn Lal I assume that you already have some experience in PHP and you quite probably have PHP working environment setup locally here are two major options in terms of Lal working environment setup if you are on Windows or on Ma Mech you can set up your laravel working environment using laravel herd laravel herd is a single program which combines PHP engine X web server node.js and composer if you buy a pro version of this package it is going to include MySQL radi and few other useful Services as well the second option to set up your PHP working environment is called zamp zamp is a package which contains PHP Apache web server MySQL and few other services if you choose zamp as a choice of your PHP environment you have to install composer and node.js separately which is a disadvantage compared to herd another disadvantage of zamp is that at the moment it doesn’t have the latest version of PHP supported in the future this might change and it might support the latest version of PHP but Lal herd already supports PHP 8.3 however the ADV Vantage of zamp is that it supports MySQL and comes with PHP my admin as well in case of her MySQL is in pro version so you cannot get it for free you can choose whichever you want herd or zamp if you’re on Linux you might install PHP apach your engine and MySQL as separate packages but we will not need MySQL engine or apachi locally installed for this course as we are going to use sqlite as a choice of the database and we are going to start the project with php’s built-in server but my choice for this course is going to be LEL herd just because it has the latest version of PHP 8.3 at the moment in case of Lal herd before you install your Lal project we should make one change in PHP in we are going to open a folder inside which PHP in file is located this in my case is located in my home directory under config folder heard being PHP and the version of the PHP in this folder there is PHP in file located and we’re going to open this using any editor you want we’re going to find variables order text and we’re going to remove this e and change this e gpcs into just gpcs we can close this file then we’re going to open any terminal and we’re going to execute her restart to take the changes of PHP speaking about the editor/ ID for Lal there are two major players PHP storm and vs code PHP storm is the paid product but is the best choice in my personal opinion for PHP it has integrated all the tools you need for laravel or PHP development it has 30 days free trial as well so I really recommend to try it vs code is free and open source but you need to install a couple of extensions to make it convenient for Lal development one of the extension is PHP allinone extension this contains all the basic things you need on PHP such as syntax highlighting Auto completion formatting and so on the next extension I recommend is LL blade Snippets I also recommend to install LL goto view leral extra intelligence and leral blade formater this extensions in my opinion are the most basic extensions you need to install in vs code to make it convenient to work with LL there are several ways to create Lal projects locally one of them is to install using composer comment we’re going to execute composer create d project ll/ Lal and we’re going to provide here your project name the second option is to install Lal installer and create new project with Lal installer keep in mind that internally it still uses composer to install Lal installer globally we’re going to execute composer Global require ll/ installer once this comment is finished we can create new Lal projects using Lal new and our project name the third option to create Lal project locally is using Lal herd if we go into side section we have a plus button right here when we click on this we have three options no starter kit leral Breeze and Jetstream we can choose whichever we want we’re going to click next we’re going to provide right here our project name we’re going to choose the testing framework we’re going to choose the Target location and we’re going to click next it is going to start creating project locally and once this is done we’re going to have up and running Lal project the Lal project has been created using Lal herd but I am going to delete this because this is not the way I want to create my Lal project maybe you are following this on zamp or you have a separate environment on Linux separate installation of PHP and everything so we’re going to create Lal project using terminal I’m going to navigate into desktop folder and I’m going to execute Lal new Lal course right here on the first question I have three options I’m going to hit the enter I’m going to choose the default one no starter kit and I’m going to hit enter right here as well now it asks us which database we want to use and I’m going to leave this default as this is the SQ light and this is exactly what I’m going to use hit the enter right here the project has been installed and here we have the instructions we can navigate into the project and we’re going to execute PHP Artisan serve but before I do this I want to open this project using my editor or ID the project is on my desktop as we created that I’m going to open brand new install PHP store and I’m going to click open right here we’re going to go to desktop and choose a lotel course we’re going to trust this project the project has been opened and now I’m going to bring up terminal integrated terminal of PHP storm you can open integrated terminal of vs code as well we are inside the LEL course project and we’re going to execute PHP Artisan serve now we’re going to open 1271 Port 8,000 in our browser and we’re going to see Lal application up and running in Lal in art design is a command line tool that helps you to perform various tasks related to your web application such as generating code managing migrations clearing cache and more here’s my project opened in PHP store and now I’m going to open Terminal in one terminal I have PHP Artisans running so I’m going to open second terminal in vs code you can open your terminal from the menu item terminal Al new terminal you can execute PHP Artis on serve right here and if you click the plus button it’s going to create second terminal and you can execute all the rest of the Artisan commments right here now let’s go back to PHP storm and I’m going to open this terminal on a full screen every Artisan command should be executed using PHP Artisan this is a common line tool and this command will be followed specific Artisan command such as about when we hit the enter this is going to give me the all information every information about our project such as application name Lal version PHP version information about caches and drivers let’s hold on for a second and understand how this works there is a file in our project which is called Artisan it doesn’t have any extension but actually this is a PHP file it is using the following class to pass the arguments in our console it is loading all the autoload files from vendor folder right here it is creating the Lal application and calling handle command passing the new argument input instance the rest happens inside this handle command and inside this application class to get the list of all available commments in our terminal we are going to execute PHP Artisan list we can scroll up and we see dozens of comments right here here some of the commments are inside the group such as cache DB event or make every comment right here has its own description what it does okay to see a list of commments in a specific group we’re going to execute PHP artisan make which is the name of the group help which means that I want to get all the commments inside make group or make name space when we hit the enter it’s going to give me all the commments available for the make name space to get information for a specific command such as make controller we’re going to execute the following commment PHP artisan make controller d-el we hit the enter and we’re going to see the description of the commment the usage how we can use it arguments as well as all the additional options with the description for each option so whenever you have a question how a specific command Works in Artisan you can always execute PHP Artisan that command D- [Music] help now let me give you a challenge I want you to execute an artisan command which will give you list of all the available commments in a q namespace pause the video right now execute that Artisan comment and then continue the video and see the [Music] answer okay to get a list of all commments in a q name space we’re going to execute PHP Artisan Q help we hit the enter and it’s going to give us all the available comments or the Q name space as well as the descriptions for each comment now I have another small challenge to you now let’s execute an artisan command which will give you all the information about migrate colum refresh commment okay I hope that was easy to get all the information about migrate refresh commment we’re going to execute PHP Artisan migrate colon refresh D- help we hit the enter and it’s going to give us the description the usage as well as all the options with their description regarding that specific comment now let’s explore directory structure of our lateral application there are several key folders in your Lal application inside which you are going to do most of your work one of them is the app folder by default it contains HTTP moduls and providers folder containing controllers models and a single provider but you can also create new folders manually inside the app folder such as enam for example and create new enams inside the enam folder and it’s going to be autoloaded or whenever you execute specific Artisan comments such as PHP artisan make job is going to create job folder for you inside app folder bootstop folder contains two main files a PHP and providers PHP a PHP file is one of the most important files inside which we can configure middle weers routing exceptions and few other useful things around our application providers PHP just contains a single provider you can add more providers inside this array config folder contains the major configuration files if you don’t plan to modify these configuration files you can delete them or if you want to create new configuration files you can also create them either by manually or by executing specific Artisan command the database folder contains factories migrations and sits this will also contain database.sql file if your database driver is set to sq light in our case we are using SQ light as our choice of database that’s why we see right here database SQ light this is the main database file for our project public folder is single web accessible folder index PHP right here is the entry script and the request starts from this index PHP so every file or folder which is available inside public folder is going to be accessible through the browser resources folder contains CSS JavaScript and Views RS folder contains the main rots for our application whether those are web based roads or console based roads if if we decide to create API roads we can have api.php for roads related to API storage is the folder that contains all the generated files inside app folder we can have uploaded files by the user inside the framework there are files and folders generated by the Lal framework itself such as cache sessions testing or views those views are cached views the locks folder contains all the log files generated by Lal framework test folder contains all the available tests vendor folder contains all the third party packages editor config file is necessary for IDE or editor file contains most of the configuration options around our application such as the application name application language database credentials session driver RIS client mailer SMTP credentials and so on enf do example file is the simple example file of you should never comit and push file in your git repository because it might contain sensitive data instead you’re going to comment and push. example file which should not contain sensitive data it should contain only sample data git attributes and git ignore are git related files we already talked about Artisan composer Json and composer log are composer related files package Json is for mpm dependencies PHP unit is for test read me is I think obvious and V config JS is the configuration file for V server now I want to create new route whenever I access slab URL in our application I want to see um some text some information about my project so let’s go to the project and we’re going to open Roots folder web PHP and we are going to create new root for slab for this we’re going to use root facade we’re going to listen on get method the URL is going to be about and we’re going to provide function right here from which we are going to return view in inside view we’re going to pass the actual view name in our case I’m going to create a view called about we need semicolon here semicolon here now if I try to access slab root is available but we don’t have view yet let’s go inside resources views and just like here we have welcome blade PHP I’m going to create another blade PHP file about. blade PHP file let’s hit the enter the blade file can contain plain HTML even plain HTML is okay we’re going to obviously talk more about blade in the future lessons but for now let’s just create H1 tag right here and I’m going to write hello welcome to my LEL course and let’s create another paragraph I’m going to just write low mum text now when I save this I go in the browser reload the page and we’re going to see hello welcome to my Lal course with some Laur msum text congratulations you have just created your first Lal [Music] route in leral application the request starts on public index PHP index PHP includes wender out toold PHP file then it creates application in bootup PHP the application itself loads configuration files and initiates service providers service providers in Lal prepare and configure the application handling tasks like registering Services event listeners middle wear and Roots they ensure both core and custom features are set up properly making the application ready to function efficiently then the request is passed to router the router takes the request finds the corresponding function to execute and executes that optionally there might be middle we registered on the road we will talk more about middle weers but in a nutshell the purpose of the middle we is to execute code before the request reaches to the action and maybe block the request after this the controller will send the response back to the user or if the middle we is registered the response will be passed to Middle we first and then returned to the user the controller action might also optionally render The View after which the response as a view will be sent to the browser in some cases the road might be configured in a way that it directly renders the view in which case the response might be directly sent to the user or if the middle we is available first the response will be passed back to Middle we and then back to user this is the Lal request life [Music] cycle most of the configuration options regarding LL is available in file here you can change the application name application time zone change the language change the database credentials session driver modify rist client information SMTP details AWS and so on they are are even more configuration Keys available which is not by default in the file if you want to customize configuration options which are not available inen file you can find the configuration files under config folder if you don’t plan to modify these configuration files feel free to delete them the default files exist in Vendor folder in laravel core and they will be used from core let’s open up PHP for example here we have the application name which is taken from file here we have the environment we have deug mode and so on now let’s open database PHP configuration file we have couple of options right here and most of the values are coming from file but here we have one of the option which is called migrations and here we have the table for example if you decide that you want to change the table name for migrations you should update that right here and if you don’t plan to modify any other configuration options in this database PHP feel free to delete every other option right here and only leave migrations with your own database table name in this case the default values for those other configuration options will be taken from vendor from laravel core but your modified configuration option will be taken accordingly so if I quickly delete all the options right here just below the migrations and above we can have database.php file as simple as that and of course modify the table name I’m going to undo this because this is not exactly what I want Let Me Close database PHP in a PHP and I’m going to open Terminal besides the configuration files that is available by default in the config folder there are other configuration files which is not available by default in the config folder but we can publish them and modify them to publish new configuration files we should execute the following Artisan commment PHP Artisan config publish when we hit the enter it’s going to give us a list of configuration files we want to publish most of the configuration files are familiar for us and is already available in the config folder such as app for example but by default broadcasting is not available in the config folder also course is not available in the config folder if I want to publish broadcasting configuration file I would just type right here broadcasting and hit the enter and the configuration file will be published or if you know exactly which configuration file you want to publish you can directly execute PHP artison config publish and the configuration file name for example course we hit the enter and we published course configuration file as well we can see those configuration files in our config folder broadcasting and course I just showed you how you can publish configuration files I don’t need them to be published so I’m going to delete [Music] them now let’s talk about couple of useful debugging functions in Lille we have the welcome page opened and let’s go and open roads web PHP file here we have two Roots defined and I’m going to make some changes right here I want to Define an associate creative array called person where we have this name and email and I want to print that person I’m going to use the following function called dump we’re going to provide the person right here we save this and let’s check in the browser and we’re going to see a person like this dump is a Lal built-in function which prints every information about the given variable and it prints pretty nicely if the associative array is too large you you can also collapse it and expand it and you can also see right here a comment from which file and which line that was printed there are two other debugging functions available one of them is called DD which actually prints the variable and stops code execution so if I reload right now we’re going to see only this dump and we don’t see welcome page anymore because right here the code execution was [Music] topped we have already defined a single Road in our application when we access slab about URL we see the following content this is how we Define the TRU now let’s see what other request methods are available in LL there are totally six request methods available get post put patch delete and option get is mostly used to get the information post is to create the information put is to update the information and Patch is also for to update the information delete is to delete the information and options is to get more information about the specific root in LL there is also a possibility to Define Roots which listen for multiple methods for example the following route will listen to get and post methods and the corresponding function will be executed for both methods in the following way we can also Define a root which matches to all request methods if we want to define a redirect type of rout in Lal Roots we can do this in the following way we call the redirect method the first argument in this method is the rout to which we are going to listen to and the second argument is where the user should be redirected by default this redirect happens with status code 302 but we can also provide a third argument which is going to be the status code in this case we are doing a redirect with status code 301 which is the identical of calling permanent redirect method in lateral there’s also possibility to Define view type of rules for example the following code will listen to SL contact road and it will immediately try to render a view called Contact so if we open our application we can even change the following Road definition in the following way we can change this get into view we have the road as a first argument and the second argument in our case should be the view name we already have view called about so this will be the equivalent of what we had previously and now if I open the browser and reload the page we’re going to see the same result optionally we can also provide third argument to the view method and pass the parameters for view in this case we are passing a single parameter called the phone to the contact view in the later lessons we’re going to see how we can get and how we can print those parameters inside the blade [Music] file now let’s understand how to define roots with required parameters let’s define a get root I’m going to listen to the following URL product slash and right here I want to have a variable Road parameter the road parameters needs to be inside curly braces so I’m going to Define curly braces and inside there I’m going to give it a name I’m going to call it ID so whenever the URL looks like this then some function should be executed so here I have the function and whenever the function is executed it means that the URL was matched so we are going to get that ID as a parameter of the function once we have this ready we can already return something from here for example product ID equals the parameter ID okay now let’s save this in open browser and let’s access the URL product slash1 when we hit the enter we see the following text that text is exactly what is returned from here we can type right here not only one uh we can type any arbitrary number obviously because this is a variable like 1 2 three or we can even have strings like test because we don’t have any restriction defined on the following root for the root parameter ID so our defined Road will match the following URLs any string after the product textt if it does not contain forward slash will be matched now let’s see slightly more complex example in this case I’m going to have three Road parameters let’s say that I want to access product review for the specific language so in this case the URL the first section of the URL contains the language code then we have the product as a hardcoded then we have the product ID then we have review text and the review ID so we have three variables and we can access those three variables inside this closure function we have length ID and reviews and the following Road will match the following URLs it’s going to match these three URLs just pause right now and pay attention the variables at the moment can contain any arbitrary text as soon as these variables do not contain forward slash because forward slash is is a special character in the URL in the later lessons we will understand how to add those restrictions so that link ID or review ID cannot be any arbitrary text now let’s learn how to define rades with optional parameters let me Define get Ro in this case I’m going to listen to the following URL product SL in here I’m going to define a category parameter category but to make this optional we’re going to provide question mark before this closing curly brace now let’s provide Associated function here let’s put a semicolon and inside this function we can obviously accept the category that’s going to be string category but because we Define that category right here optional this category might not be given to the fun function whenever it is not presented in the URL in order us to not have any kind of Errors we’re going to assign some default value to the category okay in this case I’m going to assign null to it otherwise you might have an error when you do don’t provide this category in the URL now I’m going to return something product for category equals the given category let’s save this now let’s open the browser and let’s try to access the following Road product slash and let’s provide the category let’s say cars I’m going to hit the enter and we’re going to see product for category cars however if we remove this section completely it’s going to still work however the category is going to be null that’s why we don’t see anything printed right here this is how you can Define the optional parameters and you can Define as many optional parameters as you want just make sure in the function us assign some default values to them otherwise if we simply remove these and reload in the browser we are going to see an error let’s undo this and I’m going to leave null right [Music] here now let’s define a road what we already had defined previously product slash ID and let’s just return a text it works and I’m going to return the ID as well as we already discussed if we provide any arbitrary text inside this ID variable it is going to work now let’s open our browser and let’s just provide product slash test we hit the enter and we see Works however our goal is to make it not working because we only want the ID to be number so if I type test we it should not work however if I type one two three any arbitrary number it should work how we’re going to do this inside this road whenever we Define this after this calling this get method we can chain another method in this case I’m going to use the method called we number we number accepts an argument and we’re going to provide a parameter so in this case I’m going to provide it and that’s it so we just Define that this rot should only work if the parameter ID is going to be number if I save this and reload in the browser we see it works however if I type test right here and hit the enter we see 404 the road was not matched that’s the whole idea now let’s see which URLs will be matched based on our road definition so the following Road definition will match the following URLs whenever the ID only contains numeric values it is going to match but it is not going to match anything that does not contain numeric values now now let’s see another example so we’re going to define the following Road where username needs to contain only Alpha Characters it cannot contain numbers or anything else it should only be Alpha characters from A to Z so it is going to match the following URLs but it’s not going to match the following URLs if the URL contains a numeric value okay let’s see another example in this case I want the username to be to contain alpha numeric characters numbers and letters is okay but anything else is not okay so in this case it is going to match the following URLs but it is not going to match the URLs which contains something else other than letter or number let’s see another example I want to Define road with multiple parameters we have language and we have ID so in this case language can only contain uppercase and lowercase letters in the ID needs to contain only digits the road will match the following URLs however it is not going to match the following URLs let’s see one last example in this case I’m going to Define list of allowed values so the language parameter can only be one of the provided values e n Ka a or i n in this case it is going to match the following URLs but it will not match the following [Music] URLs we can also apply custom regex validation logic to our root parameters for example we have three Roots defined let’s say that I want username to only contain lowercase letters not uppercase but only lowercase so in this case I’m going to Define right here here a we method I’m going to provide the parameter name in this case it is going to be username and then I’m going to provide the custom regex expression I’m going to define the following characters from A to Z and I’m using the plus sign which identifies that the following characters needs to be at least one so now if I save this and I’m going to open the browser and let’s try to access user slash Zur it is going to work and we see empty page we see empty page because we don’t return anything from here however if I use any uppercase characters inside here let’s say a is an uppercase I’m going to hit the enter I will see 404 because the rad was not matched in the same way we can Define custom reix validation Logic for other rootes so for example here I’m going to Define custom validation Logic for both parameters in which case I’m using an associative array syntax the length needs to be exactly two characters any symbol from A to Z and let’s use two character annotation however the ID needs to be digits let’s make sure it is a digit and also we need to make sure that it is at least four characters length so four comma and curly brace this is a syntax of r reix if you don’t know what is a regex how to work with it that is just out of scope of the following course but basically the following expression means that the ID needs to only contain digits but it should be also at least four characters now if I save this and let’s try to access in the browser we are going to have the following URL y/ product SL1 2 3 4 let’s hit the enter and it’s going to work and we see empty page because we don’t return anything from here however if we change this language code and make it three characters it is not going to work and we see 404 or if we return this into two characters let’s change this into Ka H but if we change this ID and make it three characters we’re going to still see 404 because according to the definition it should be at least four characters now let’s see the last example we are we Define the search let’s try to access the following URL search SL test if we hit the enter we see test right here because we are printing the search however if let’s say that my search keyword should contain slash if I try to provide for example 9 divided by 15 and I hit the enter it’s going to show me 404 because it tries to match the following URL and by default the Q parameter right here search does not consider SL character inside to make it consider SL character we’re going to use the following validation rule where search cury parameter contains any symbol and it should be at least one character so I’m going to save this and now if I reload this we’re going to see nine divided by 15 in lateral we can also Define names for each rot but what is the point of assigning name to a rot here we have Slab Road which renders about blade file and we have just slash root which renderers welcome now let’s imagine that we want to create a link to about page generally when we have a website we have the navigation and in the header we have the link to all the pages or most of the pages we might also have the link to the ab about page in the footer as well and maybe in the sidebar as well so a link to about page is used in let’s say three places and we want to change that URL so if we want to create let me create a variable called about page URL okay and we know that right now it is slab and whenever we use this about page URL it is going to be slab if we decide that we want to change the url from about into about us then we have to update all the places we have to update header we have to update footer and maybe if we have it in somewhere in the sidebar we have to update sidebar as well however if we associate name to every road and we can associate names in the following way name and then we just provide right here some string in this case it’s going to be logical if I call this about so we Associated name about to the about wrote and instead of having this hardcoded URL we can always generate the URLs with a name about page URL equals root and in this case we have to provide the root name in this case the root name is about now let’s have a look if I comment this out and if I print this about page URL let’s try to access homepage hit the enter we see a about page URL this is it however if we decide to change the url from about into about us if we save this and reload the page we are going to see updated URL so the generation of the URL should always happen based on on the road’s name that’s why it is always good practice to associate names to your [Music] roads now let’s define one more road which will have parameters product road with length and ID parameters I’m going to associate name product. view to the following quot now let’s generate URL based on the road name for the road which already has two parameters so first we’re going to Define this product URL with the road and provide the product name then we’re going to provide two parameters those are parameters which is required for the road Leng and ID we’re going to provide Leng to be whatever and ID to be whatever in this case e and one now let’s print this product URL but for this let’s remove what we have right here completely now I’m going to save this and let’s access in the browser I’m going to reload the page and we see the following URL now if I decide to change the format of the URL let’s say I want P slash language and then ID I save this I reload the page and this is how our URL looks like let me Define another rout and I’m going to call this user slash profile let’s create a simple function empty function right here and I’m going to give it also name to be profile now I’m going to Define another rout which I’m going to call current user and let’s say whenever current user is accessed I want to redirect user to the user profile page so in this case I want to do this redirect using the name so one way to do this is going to use a redirect function and provide root right here and provide the root name in our case this is going to be profile the second way will be to use to root function just providing root name we can comment this out and just like this whenever we try to access SLC current user URL it is going to redirect us to a road which has name profile in our case this is going to be it if we want to Define roads with the same prefix we can do this in the following way we can call the prefix on the road providing your desired prefix and then we’re going to call group method on this providing the function inside that function we can Define our roads in a regular way however the prefix admin will be used for every road defined in this function so in our case the following rout will be matched if the URL is admin users if I save this and if we check in our browser we can see users is not going to be matched but admin SL users will be matched normally in the same way we can Define the prefix for the root name we’re going to use root name and the value is going to be admin dot in our case we provide the group and inside this function we’re going to Define slash users root however I’m going to assign name to that road and this means that the URL is going to be matched with Slash users but the road name is going to be admin. users so if I save this any if we try to access slash users we are going to see these slash users however the road name is going to be admin. users typically when the road is not matched lateral will show 404 error for example let’s try to access SL contact we see 404 however we can define a fallback rout for every un Ed roads we can do this in the following way we’re going to call fallback providing function right here which will be executed every time road is not matched so if I return right here fallback save and reload in the browser we see fallback right here in this case you can render any view maybe you want to save that information somewhere but the idea is that you can match all unmatched URLs with the fallback method [Music] now let’s open Terminal and I want to execute a command and print all defined Road list for this we’re going to execute PHP Artisan Road list this will print six roads and two of them is defined by us slash and slout others are defined by a LEL application if we want to also display middle we for each Road we’re going to provide flag DV we hit the enter and it is printing the middle we as well for each road if we want to only print roads which is defined by us we can provide D Dash except Dash vendor flag we hit the enter and it’s going to print those two roads in a similar way if we want to Define roads which is defined only inside the vendor we can provide only- vendor we hit the enter and it’s going to print those four roads only if we want to Define all roads which are part of the API we can provide path equals API we hit the enter and in this case the application gives us an error that we don’t have any rows matching the given criteria which is actually correct we can even combine these flxs and for example print all the details about our roads we can print them except vendor and we can even provide path equals admin for example this is not going to print anything because the given path was not matched but I hope you get the idea once you deploy your Lal project on production it is recommended to execute the following command PHP Artisan wrot cach this will create cached version of your Lal roads is especially this is useful if your application has a lot of Roads the cache will help your application to match the road in a shorter time and this will increase the overall performance of your website however if you don’t want this cach anymore you can clear this always by executing PHP Artisan Road [Music] clear now let me give you a small challenge you should create a road which accepts two Road parameters these Road parameters must be numbers you should calculate the sum of these two parameters and print that sum pause right now spend some time to implement this then come back and see my [Music] solution all right now let’s Define the root we’re going to listen to the get method and let me call this sum and then we’re going to accept two parameters A and B you can call this whatever you want then we need to define the function however I’m going to also Define a validation Logic for these parameters we are number we are number and we can provide an array A and B both should be numbers then we’re going to accept right here float a and Float B finally we are going to return some of these two numbers a plus b let’s save this now let’s open the browser and try to access to the following rout sum one and two let’s hit the enter and we see three right here let’s increase the numbers 1 2 3 slash 4 5 6 let’s hit the enter and we see five seven and nine that works correctly controller is a class which is associated to one or more roads and is responsible for handling requests of that roads generally controller is a grouping of similar roads together for example product controller should contain only logic Associated to products but not anything else car controller should not contain logic which is not associated to cars we can create controller classes manually or we can execute Artisan commments doing this with Artisan Commons is more convenient and fast so this is how we’re going to do also PHP artisan make controller and we’re going to provide the name of the controller I’m going to call my controller car controller it is also convention that your controller classes should should end with controller suffix in our case it is car controller let’s hit the enter the output tells us that the new file was created under up HTTP controllers F folder called car controller okay we are going to open this up HTTP controllers car controller this is how car controller looks like by default now let’s create a road and associate action to that controller I’m going to define a function called index okay from this function I’m going to return hardcoded text index method from car controller let’s save this now I’m going to open roads file web.php and I’m going to associate that method what I just created to specific rout let’s define a rout and listen on SL car and provide the controller and the method the controller is going to be called car controller we’re going to provide class and the second argument of this array right here is going to be the method name the method is called index and just like this we provide the controller and the method instead of providing a closure function actually I’m going to change this into import so here we have just car controller but here is the import of our controller okay let’s save this and now let’s try to access this in our browser right here let’s change car hit the enter and we see index method from car controller if we have multiple methods defined in the car controller and we want to associate them to roads obviously we can duplicate this change the road right here and change the method however there’s a better version of it and we’re going to use grouping by the controller so in this case I’m going to use Road controller but I’m going to provide car controller right here car controller class this returns an object on which we can call group inside group we’re going to provide function and any root we’re going to Define inside this function will assume that the controller is the car controller so I’m going to take this rout put this right here but we don’t need the controller we only need the method name so this is how we can Define SL car we can duplicate this and we can have for example my cars right here which will have a different method associated like my cars or and so on you get the idea right so whenever we save this let’s check in the browser I’m going to reload this and the result does not change so it is still using this index method right here to render some text whenever the URL is matched in Lal we can also Define single action controllers if your controller grows and becomes very large it is recommended practice to split it up into multiple other controllers or create single action controllers single action controllers are controllers that are associated to a single route only to generate single action controller we’re going to execute the following commment PHP artisan make controller we’re going to provide the controller name like show car controller for example and then we’re going to provide a flag D- invocable that D- invocable flag makes the controller to be single action controller when we hit the enter we see that the controller was created let’s collapse this let’s go into controller section and we’re going to open this show car controller that controller is very similar to car controller however it has one additional method underscore uncore invoke that’s a special method and whenever we use that controller in the road that method can be executed however the usage of the controller should be also different now let’s go into web.php and I’m going to modify this slightly let me actually comment this out for now and I’m going to Define new controller new route slash carar on SL car we are going to apply show car controller class pay attention that I don’t provide the method anymore just like I we have provided previously I don’t provide method let’s change this using import so that we have showard controller without name space and we have the showard controller imported properly now if I save this let’s go actually in the showard controller and let’s return something like return uncore uncore invocable let’s save this now let’s go in the browser and reload the page and we see UND underscore invocable invocable controller is nothing else but addit invoke method to regular controller so in the same way what we can do is let me just delete this show car invocable controller completely then inside the car controller I’m going to create that function uncore uncore invoke let’s just return from here underscore uncore invoke we say this let’s open web PHP and here we are using show car controller and I’m going to change this into car controller now if I save this and reload in the browser we’re going to see uncore unor invoke which is coming from car controller however we have other regular method as well in our car controller and we can use this one as well let’s go into web and let me duplicate this and I’m going to change the url for one of them let’s give it different text inv vocable for example and right here on this car I’m going to provide the array we provide the controller and we provide the method as well so now I save this and if I just reload we’re going to see index method from car controller however if we provide invocable right here we’re going to see underscore uncore invoke before we start talking about resource controllers I’m going to delete just created car controller completely let’s delete the rotes as well in LEL a controller is a special type of controller that provides a convenient way to handle typical crowd operations for a resource such as a database table to generate resource controller using AR design we should execute the following command PHP artisan make controller we’re going to provide the name of the controller I’m going to call this product controller and then we’re going to provide a flag called D- resource once we hit the enter it’s going to generate this product controller let’s open this product controller and as you see there are predefined methods we have index create store show edit update and destroy there are seven default methods defined in the resource controller for typical crowd operations index is responsible to show a list of the resources create is responsible to show form for the resource using store we’re going to create the resource inside show we’re going to show a specific resource by the given ID inside edit we’re going to render the form for editing purpose for a specific resource ID in the update we’re going to update the resource by the ID and in the destroy we’re going to delete the resource by the ID now let’s open web.php and I’m going to Define Roots Associated to this product controller we can obviously Define Roots separately for each method what we have right here but there’s a oneliner in laravel which can do this thing rote Source we’re going to provide the name products for example and then we’re going to provide the controller name in our case this is going to be product controller class semicolon at the end and let me change this using import so we have product controller imported right here now if we try to access SL products it should execute the following route let me bring up the terminal and I’m going to execute PHP Artisan Road list this will print the list of the roads and let’s have a look so here we see the seven roads defined by us which corresponds to products Index this is an index method this is actually a root name and this is the method name so the root name for to create products is called products. store and it is mapped to the following Method products create is mapped to the following method and so on if we want to exclude a specific method from this definition we should provide right here accept method inside except we can provide array of methods we want to exclude for example I’m going to exclude destroy from this list let’s save this let’s bring up the terminal and I’m going to execute again PHP Artisan Road list now we don’t see products destroy method right here we only see six roads defined or if we want to only include specific roades in the Declaration we can provide only method as well inside only let’s say I’m going to provide index and I’m going to provide show I don’t want anything else from this product controller let’s bring up the terminal and I’m going to execute PHP Artisan Ro list and now we only see two roads defined from the product controller in the product controller as I mentioned we have seven methods but five of them is relevant for the API two of them is not relevant for the API for example the purpose of this create is to render the form as well as the purpose of this edit method is to render the edit form so these two methods are not relevant for the API if we want to Define resource for the API only we should do this in the following way instead of resource method right here we’re going to use API resource method once we Define this let’s bring up the terminal and I’m going to execute PHP Artisan R list hit the enter and now we have five methods defined we don’t have create method and we don’t have edit method right here let’s go even step farther and when we generate the controller if we want to generate it for the API meaning that if we don’t want create and edit methods to be presented in the controller we should execute the following Artisan command PHP artisan make controller we are going to obviously give it name car controller and then we’re going to provide d d API flag once we hit the enter it’s going to generate this car controller let’s open this very quickly and we see index store show update and Destroy we don’t see create and we don’t see edit as well then in the same way we can use this car controller right here to Define rules for the car controller we’re going to use API resource name we’re going to provide the resource name in our case we can call this cars and then we’re going to provide car controller right here let’s replace this with import as well we should see car controller imported right here however if we we want to Define product controller and car controller both at the same time as API resources we can use API resources name providing associative array where the key is the resource name and the value is the controller so we Define the car controller and we can provide as well products by specifying here product controller just like this we can delete this completely and now if we execute PHP Artisan Road list we are going to see API Roots defined for cars as well as defined for products in the later lessons we’re going to learn how to implement these methods actually and how to implement in general crowd operations how to render the data how to create the data how to delete the data as well okay now I don’t need this car controller and product controller yet so I’m going I’m going to delete them both and I’m going to also remove them from web.php [Music] now I have a challenge to you I want you to generate a controller with two methods sum and subtract Define roads SL sum and/ subtract which will be Associated to the controller corresponding methods both methods will accept two arguments and both arguments should be numbers when accessing slm Road it should print the sum of arguments and when accessing SL subtract method it should print the difference of these two numbers pause the video right now spend as much time as you think you need on this problem try to make it working and then come back and see my solution [Music] okay I hope you made it now let’s see my solution first of all I’m going to create controller let’s execute PHP artisan make controller math controller let’s hit the enter math controller was created now let’s open this and create two functions public function sum we’re going to except two arguments inside this function float a and Float B now let’s define second function subtract float a and Float B here we’re going to return some of these two numbers so we’re going to return A+ B and in the second function we are going to return Difference A minus B now let’s open web PHP and Define Roots root get on/ sum we’re going to accept two properties two parameters A and B and we’re going to associate the math controller sum method right here let’s put the semicolon and let’s replace this with import now let’s duplicate the and I’m going to call this subtract A and B and the method name will be subtract now we save this and we can check this in the browser let’s access sum sum five and 7 hit the enter we see 12 now let’s change the method name into subtract hit the enter and we see minus two and just like like this we made it working but if we change seven right here into something non numeric value such as a c and we hit the enter we are going to see an error subtract method argument B must be type of looat but string was given that’s because we need to validate the arguments of sum and subtract method so right here and right here we’re going to provide we number and we’re going to provide a comma B both A and B should be numbers so now if I save this and if we reload this in the browser we are going to see 404 because such type of URL is not defined in our RADS however if we change ABC into something which is numeric value which is number we hit the enter we see the result all right that was the challenge and we completed the challenge now I’m going to delete math controller and I’m going to also remove Roots defined in web [Music] PHP so far we have been creating and deleting controllers defining and removing Roots that’s because we have been learning and we did not need this code in our final car selling website now I’m going to start working on my car selling website and I’m going to define the controller which will stay in the project and I’m not going to delete this let’s open Terminal and I’m going to execute PHP artisan make controller and I’m going to call this home controller we hit the enter home controller was created now let’s go in the home controller and I’m going to create new function and I’m going to call this index and for now let’s just return index hardcoded string from here now let’s go into web PHP and I’m going to change this closure function into using home controller class and I’m going to render I’m going to use index method right here okay now I’m going to change this home controller fully qualified name into import so that we have import right here and we have much much shorter line right here let me associate name to this and I’m going to call this home as well now if we go in the index method we can return this hardcoded index or we can change this and return the welcome blade file as it was returned from this web PHP right here let me quickly undo this right here we be returning this view so now we change this into home controller okay awesome now let’s open the browser and in the browser nothing is changed we see lel’s welcome page however this welcome blade file is not exactly what I want so if we go under resources views we’re going to see about blade which is something we created and we have this welcome blade PHP as well so I’m going to completely delete this welcome blade PHP file PHP torm Finds Its usage in cached file so it asks me whether if I want to refactor or not I’m going to do refactor anyway it is a cached file so in this case what I’m going to do is just to return hardcoded index and in later lessons we’re going to start working on views and I’m going to create new view for the home controller index method and I’m going to use that new view right here but for now if I reload the homepage we’re going to see hardcoded index text [Music] views are files that are responsible for presentation logic in your LEL applications and are stored under resources views folder typically views are in format of Blade files blade is a Lal templating engine that helps you build HTML views efficiently it allows mixing HTML with PHP using Simple and Clean syntax blade supports template inheritance enabling you to define a base layout and extend it in other views it provides directives with different purposes for control flow blade also supports reusable components and Slots all blade views must have extension. blade. PHP we can create views by hand under resources views folder or we can execute the following Artisan commment PHP art is on make View and we’re going to give it a name the view name should be all in lowercase like index for example I’m going to hit the enter and index view was created under resources views index. play. PHP file if we open this we see this empty d right here with some comment now let me change this content and let’s write H1 and I’m going to write text hello from larel course I’m I’m going to save this now let’s go into controllers up HTTP controllers and I’m going to open Home controller and I’m going to change this return right here and instead I’m going to render View using view function and inside here I’m going to provide the view name which I just created now let’s open browser and I’m going to reload the page and we see hello from LEL course views can be deeply nested into sub folders under resources views folder for example under resources views I’m going to create a new folder called it home and I’m going to move my index blade PHP under home and now inside home controller when we try to render this view index we should change right here as well instead of rendering index which will not work anymore because there is no index. blade. PHP file under views folder instead it is available in the home folder we are going to render this in the following way home dot index the dot identifies subfolder so it is like a folder separator now if I save this and we check in the browser the result is unchanged this also works however if we want to create a View using artisan and directly put this in a subfolder we should execute the following comment in the view name we’re going to provide home. index as well so in this case it will throw an error because the view under home folder index view already exists but if you want to create for example home AB about we hit the enter and it’s going to create about. blade PHP under home folder obviously this is something what we don’t need at the moment so I’m going to delete this [Music] to render The View we used function called view there is a second method to render The View as well in this case we’re going to use view facade so I’m going to remove this and I’m going to use view facade which is coming from illuminate support facad so make sure you use the following facad following class we hit the enter that needs to be imported right here make sure it is imported if you’re using vs code and then we’re going to call method called make and here we’re going to provide the view name in our case this is going to be home. index so we save this and if we check in the browser the result is not going to change because we are doing the exact same thing however the view facade has couple of advantages for example right here we can provide another function called First and provide a list of View files for example first I can provide index IND and then I can provide home index well the first method will render the first available view so in this case if there is index blade file under views directly it will render it otherwise it will search under home. index so if we just copy this index plate PHP and put this under views and if we just change its content have hello from um views folder okay so I save this and if we reload in the browser we see hello from views folder now I’m going to again delete this index blade from views folder and it is going to pick up this index blade from home folder and the result will be hello from LEL course if we want to check if the view exists or not we can also use view exist function we provide for example home. index and if the view does not exist for some reason we can dump the following message view does not exist of course in this case the view will exist because there is home. index but if I change this into just index save this and we reload in the browser we see view does not exist I’m going to undo the change and return the code back when we were using view function just like this now let’s talk about how we can pass variables to views there are two ways to pass data to views one of them is to provide an associative array as a second argument of the view function and we can use this associative array when we are using view facade make function as well make method okay here I’m going to provide two Vari variables one I’m going to call it name and I’m going to provide my name and then I’m going to provide um surname which is going to be my surname awesome now we can access these two variables in the blade file let’s open blade file hello from blal course and I’m going to create a paragraph right here my name is and I’m going to print these two variables to print these two variables we’re going to use double curve braces and inside double curly braces we’re going to use PHP variable normally like dollar sign and the name the name is the variable we passed right here in the same way we can also output second variable called surname now if I save this Andre load in the browser we are going to see Hello from Lal course my name is Zur the second method to pass data to views is the following we can remove this associative array and we can provide additional variables inside The View using with method the first argument is the variable name name for example in our case and I’m going to provide zuro right here let’s move this with down and the second we can provide this with second times so here I’m going to provide surname is going to be my surname I’m going to save this reload the browser and the result does not change however if I comment out this line there is no surname declared in the blade file in the view file so it will throw an error now let’s uncomment this so that we don’t have any [Music] errors it is also possible to declare a global shared data and that data will be available in all blade files for this we’re going to open service provider up service provider which is inside up folder providers let’s open this and inside boot method we’re going to use view facade or this and we’re going to provide Shear method right here the key will be the variable name I’m going to call this ER and the value is going to be your value of the variable so let’s use a function date to create the current ER let’s put semicolon Right Here and Now the Y variable will be available in every blade file so if we open this index blade PHP and I’m going to create second paragraph right here y colon and then we can output y let’s save this reload the browser and we see y [Music] 2024 now let’s do a small challenge I want you to create a hello control roller with welcome method create welcome view as well using IGN and put it in the Hello subfolder from Hello controller welcome method render welcome view you just created pass your name and surname to The View and output in the blade file also Define the root SL hello so that when you access it it will output your name and surname now pause the video work on this spend as much time as you need on this then come back and see my [Music] solution okay now let’s see my solution first let’s open Terminal and I’m going to generate new controller in New View file PHP artisan make controller hello controller we hit the enter the controller was created now let’s create view PHP arst on make view well I’m going to create welcome view but I’m going to put this in the hello folder so hello. welcome this will create welcome view in the hello subfolder I’m going to hit the enter now look at this welcome blade PHP was created inside hello folder awesome now let’s create Hello controller from up HTTP controllers and let’s define welcome method from here we are going to render view called hello. welcome so this is the blade file we’re going to render and we’re going to pass two variables we’re going to pass name and we’re going to pass surname awesome now we have the controller we have the view created now let’s go let’s collapse everything let’s go under Roots web PHP and Define new root root get on slash hello we’re going to render hello controller method called Welcome let’s put a semicolon right here and we have these roots defined now let’s access this in the browser slash hello we hit the enter and we see empty our output let’s check hello controller this is because we don’t have anything defined in the hello welcome now let’s open resources views hello welcome blade it is an empty div and let’s change this and output these two variables let’s delete this comment and output name and surname we save this reload in the browser and we see my name and surname you should see your name and surname the data you passed from the hello controller like this now let’s clean up the code we created for the challenge let’s remove the root I’m going to also delete this hello folder completely including welcome blade PHP and I’m going to also delete hello controller cool we don’t need this in our final [Music] project besid the variables we are using in our blate files we can also use functions we can even use classes in their methods to Output certain things in the blade files let me actually remove these two lines now let’s use date function and print the current date so we already have this shared Global shared y variable which we printed previously but right now I’m going to use functions in Blade file to output something so we can use date function inside Cur braces just to Output the result the current ER in the same way we can do the following we can use Str Str to Upper function take our name and concatenate it with a surname and print it like this so if I save this right now and we check our browser we to access to the homepage we’re going to see the Y in my name and surname all in uppercase so in the same way way we can even use classes with name spaces to print something so for example I’m going to use St Str helper class and use the after method basically inside the following string we’re going to take anything that is after hello space so it should print world I’m going to save this reload in the browser and we see world right here we can also use application constants or we can use even Global constants like this all will work in your blade files and the result will be something like this now let’s open Home controller and I’m going to Define one more variable right here and I’m going to give it job name however the content will contain HTML Tags I’m going to use B tags and inside B Tags I’m going to write the developer now let’s open blade file and I’m going to Output right here my job this is going to be like this if I save this and we reload in the browser we’re going to see developer right here but the bags are printed well they are printed as you see so actually the developer is not inside bold whenever we output variables inside blade they are escaped in the the following way if we want to render it differently and if we want job to be inside bold instead of rendering boping and closing tags we should render it in the following way we are going to use let me remove this completely we’re going to use one curly brace and then we need double exclamation okay exclamation two times and inside here we can output job now if I save this and reload the page we’re going to see developer in bold let’s remove this and now let’s imagine that I want to print something like this in my browser the following expressions are very oftenly used in frontend applications such as vue.js if we want to print a variable in vue.js we need to do this in the following syntax in the following way let’s assume that I’m using a VI JS and I want to Output the following content if I save this and if I reload in the browser we are going to see an error right here right now blade is processing curly braces double curly braces and right now blade is trying to find a constant called the name and output it right here because we have these double curly opening and closing braces but let’s say that we want the output to be exactly like this what are we going to do in this case we’re going to put it symbol before these opening double curly braces this add symbol tells lateral blade not to process the following expression if I save this and if I reload right now I see the following output and this is exactly what I want okay and this output now later can be used by vue.js to render the name variable also in Blade there are directives every directive starts with eight symbol for example there is a for each directive okay let’s say that I want to Output a text starting with at at for each or at something if I do this if I save this and if I reload this I see it something however if I want to print 84 or 84 each this will throw an error because because we have a syntax err at the moment whenever blade sees 84 it assumes that we I want to iterate over something and it basically fails because I don’t provide all the arguments for this directive however my intention is just to print 84 in my browser so for this we’re going to use second times the at symbol 8 84 so if I save this and reload right now we see 84 in the browser and this is exactly what I wanted however imagine that just like we have here name and the same way let’s say that we have multiple such type of Expressions I’m going to copy and paste small amount of code where we have name age job hobbies and also we have this if directive which is also blade directive now if I save this and if I reload the first first one right here it’s going to fail because it will try to print the name of course we can go ahead and add eight symbols for all of them like this and it is going to work and we see the following result but doing this manually in five places to put this add symbol is not convenient there is better way to do this in leral Blade and it is called verba team directive so I mention that all directives in Blade start with at symbol so we’re going to use verba team directive for this and we need also end verba te directive down below so whenever there is something some content between opening verbatim and closing verbatim directives between here and between here Lal blade will not process these variables so these double curly Expressions will not be processed this if will not be processed and they will be outputed exactly as you see so if I save this and reload the page we don’t see any change so this is working as it should work however without this word button directives we are going to see an error we have syntax error and even if we fix this syntax error we we’re going to have a lot of Errors basically because we don’t have we don’t satisfy the blade requirements that’s why we need verb team Direct to Output it as we [Music] expect now I’m going to add one more variable into my home index view file let’s provide WID right here and I’m going to call these hobbies and in this case I’m going to provide an area let’s say my hobby is tennis and fishing it’s pretty different types of hobbies but I love both okay now let’s go into index blade PHP and I want to Output this array Hobbies as a Json array how to do this so for this I’m going to use JS helper class so I’m going to use double curly braces to output something and I’m going to use JS helper class this one illuminate support JS and I’m going to use from function for this and I’m going to provide the variable called Hobbies so this will actually output a Json let me save this and let’s go in the browser reload this and here we see Json parse and if we check this also in the page Source we see this Json Parts this from function encodes your variable into a proper Json format and if I want to create now a JavaScript variable which is the intention basically when you want to convert this into Json so we should create a script tag inside script tag obviously we need to Define a variable called hobbies for example and we can assign the following expression to Hobbies okay now I save this now we reload this and we see const Hobbies equals the following variable if we check this in the browser we obviously don’t see because we put this in script tag however if we bring up developer tools and if we go in the console we should see hob is global variable available and if we hit enter we see tennis and fishing hey if you are enjoying this tutorial so far maybe you want to check the entire course on my website the.com where you can find quizzes The Source Code of the project is available there you can find all the modules including the deployment section the T testing section which contains I think three hours of uh content regarding testing uh using pest framework and a lot more all right now let’s talk about what are laravel blade directives and how they are used blade directives are special keywords which is prefixed with Ed symbol used in laravel’s Blade templating engine to simplify common tasks like template inheritance conditional rendering iteration of data and more they convert these Shand notations into plain PHP code enhancing readability and maintainability of the code examples include if for conditionals for each for Loops extends for layout inheritance by obstructing these common patterns blade directives streamline template creation and reduce boiler plate code allowing developers to focus more on the content and logic of their views now we’re going to get familiar with the most common directives in LEL now let’s open resources views home index blade file and we are going to talk more about directives blade directives first of all let me remove this code from here and now I’m going to first talk about comments in Blade we can actually Define the comments we already are familiar with HTML comments which has the following syntax less than symbol exclamation Das Dash and there’s obviously the closing part of the comment so this creates a comment and in between these comments I can write some text now if I save this and we check in our browser we obviously don’t see anything if we check the page Source however we see the comment right here however there are cases when we don’t want the comment to be displayed in which case we’re going to use blade comments the difference between the HTML comment and the blade comment is that HTML comment is visible in the page Source however the blade comment is completely ignored by blade engine to define the blade comment we’re going to use double curly braces then we need Double Dash which is the opening of the comment then we write a comment single line comment for example and then we do Double Dash and double closing curly braces so this actually creates a comment and creating a multi-line comment is very similar we use double opening Cur braces Double Dash then we write multi-line comment and then Double Dash and double closing curly braces now if I save this and we reload the page we don’t see this comment right here we see additional empty lines from uh line five up to line 9ine but actually we don’t see the content which is the most important part for example if you have written some blade expressions for example outputting a name which you decided that you want to comment out you comment out this part completely and it will not be visible in the page Source now let me scroll down below and I’m going to talk more about the most basic blade directives let’s start with conditional directives if we want to write a condition in our blade file we can use it if directive it is the how every directive basically starts and if is the name of the directive so this is very similar to typical PHP if statement inside if we’re going to provide the condition for example if true then we can do something however every such type of Blade conditional blade directive needs its closing directive closing as well so in our case we’re going to provide end if with ADD symbol so whatever we write in between opening if and closing if directive this will be displayed for example this will be displayed now we save this we reload in the browser and we see this will be displayed of course if we write false here this will not be displayed I have prepared couple of slides which demonstrates the most basic directives and I’m just giving you quick overview what is possible when we actually start building the project our car selling website we will use these directives step by step in real application now let’s have a look so here we have an if directive if statement let’s imagine that we have cars array in our blade file so we check if the count of cars is more than one then we print there is more than one car however we also have possibility to write an else statement so if count of cars is more than zero there is at least one car in L’s case we write there are no cars and as I mentioned every if directive needs to have end if directive as well which which is going going to end that directive okay we can go even further and we can also have else if statements just like this is displayed right here if count of cars is more than one we’ll write something else if count of cars is exactly one we write there’s exactly one car in L’s case there are no Cars so that was all about if directive now let’s talk about unless which is actually the opposite of if directive so if you write unless false this actually will be displayed and this is the same as if true if we want to check if a variable exists if it’s a defined or not in our blade file we can use is set directive in the following way if cars variable is defined it will print is set inside paragraph otherwise it will not do anything in the same way we can use empty directive as well to check if the cars variable is empty or not these iset and empty directives are doing exactly as php’s native iset and empty functions we also have out and guest directives which is very relevant to Lal application using out directive we can check if the user is authenticated or not using guest we will check if the user is guest or not which is opposite of authentication we can also use switch directives in Blade here in this example we can check if the country is GE we display Georgia inside paragraph in L’s case we display unknown country of course we can add more cases and we can compare the country to addition country codes such as UK or us this is also very similar to Native PHP switch [Music] statement now let’s talk about four directive which is also very similar to Native PHP for Loop pay attention that every directives what we described so far has their ending directive as well for four it is end four in the similar way we have also four for each directive which gives us possibility to iterate over array in our blade template we also have one additional directive which is not available in Native PHP so this is called for else for else is very similar to for each however if the array is empty which we are trying to iterate then there is empty directive as well so in this case we iterate our cars and displaying the car model for each car however if the car’s array is empty in this case we are displaying they are are no cars and finally we have and for LS we also have while loop available in Blade which is exactly the same as php’s while [Music] loop now I want to talk about continue and break directives now let’s Imagine The Following in case we are iterating over numbers from 1 to 5 and we are displaying the number if I want to write a continue code one way to do this is the following I’m going to write an if statement if Nal 2 then I type continue which means that the following paragraph will not be printed whenever n equals 2 so n will be printed for 1 3 4 and five but not for two because we have continue code right here this is how we can use continue directive but there’s a second way which is much simpler we can replace this three line with just a single line providing the condition inside continue directive so in this case if the condition we are providing rate here equals true the continue will happen in this case and this is the equivalent of this pretty cool right so in the same way we also have break directive if we want to break when n equals four we can do this in the following way however the shorthand syntax will be like this from home controller we are passing hobes variable which is an array now I’m going to iterate over these arrays and print hobbies for this we’re going to use for each directive I’m going to iterate over Hobbies as let’s call the loop variable H and then I’m going to print H now I’m going to save this let’s check in the browser reload it and we see tennis and fishing now I want to talk about a special variable which is available inside loops and that is called Loop Loop if we try to Output this Loop variable it’s not going to work it’s not going to give us what we want because it is an instance of the class it is an object however I’m going to use DD to dump and die and this will print the loop variable and it’s going to stop the execution so we’re going to see what is this Loop variable it is an object and it has couple of properties it has iteration index remaining and so on and let me explain all of them step by step the iteration identifies which iteration the current Loop is used in and the iterations start with number one so we are dumping this Loop variable and stopping the code execution on the very first iteration so the iteration is one and basically we don’t allow every other iteration so what we can do is try to access the iteration through Loop iteration so if I comment out the stamp and if I comment out this H we save and reload we see there are two iterations the first iteration and second iteration okay now let me uncomment this DD because this is the most important thing so in the same way we have index and the index starts with zero we have remaining how many ele ments are remaining and there is exactly one remaining and so on and now let’s understand what each Loop property is actually doing so the index is the current Loop iteration which starts at zero the iteration is the current Loop iteration which starts at one there are remaining the iterations remaining in the loop we have count the total number of items in the array being iterated we have the first one and this simply returns true or false if this is the first iteration through the loop this returns whether this is the last iteration of the loop even returns whether this is the even iteration through the loop odd returns if this is the odd iteration of the loop depth Returns the level of the current Loop this is interesting if you have nested Loops one Loop into another the loop magic variable inside the outer loop will have a depth of one but the loop inside the nested Loop will have depth of Two And in the same way if you have third Loop inside the second Loop and if you have three Loops nested into each other the loop variable in the third Loop will have the depth of three and also Loop perant will return the p parent iterations Loop variable so if we are calling Loop parent on the first level of iteration like in our example if we try to print parent right here this will return null because there is no parent iteration right here however if I create a second iteration inside the first one and iterate something then Loop parent will will refer to the parent Loops Loop variable so the loop parent right here will be the same as using Loop right here of course right here we need n for each now let’s have a very quick look in the browser so we have Loop p in and let’s just print right here depth of it and I’m going to duplicate this and let’s print also Loop depth itself okay I can remove this because it’s going to throw an error now I’m going to save this and reload in the browser and look at this so we see a lot of 2121 2121 but what does this mean first of all we have two items inside hobbies and we are iterating these twice so totally there are four iterations okay so this code the line 22 and 23 will be executed four times all right so now the first output is the depth of this Loop second output is the depth of the parent Loop so this one has depth of two and the parent has depth of one and that’s why we see 2 one 2 one 2 one and 2 [Music] one now I’m going to leave this code right here but I’m going to comment this out not to pollute my output in the browser and we’re going to talk about conditional classes and styles so right now if we have a look in the browser we just see hello from Lal course which is exactly what I expect now if we go in the home controller I’m going to pass one additional variable and I’m going to call this country and in my case I’m going to provide GE right here now let’s go in the index blade let’s scroll down below and I’m going to create one div and conditionally I’m going to add some CSS classes to this so for this we can use directive called class so we use add symbol then we provide class right here and here we’re going to provide an associative array so here if I provide CSS class like my- css-class so this CSS class will be applied to the div in any case so let’s just generate lsum text so I save this I reload this we see Laur msum and if we check in the page Source we are going to see let’s reload the page uh okay down below we see this D which has CSS class my CSS class now let’s say that this class my CSS class must always be added to the div however conditionally I want to add another CSS class if the country code is GE so in this case I’m going to do the following Georgia CSS class should be added if country equals GE so now if I save this and reload we’re going to see Georgia right here because our country is actually equals to GE if we go in the home controller and change this country code into UK for example reload the page we don’t see Georgia CSS class eded right here in the same way we can add style attributes so right here on the same div I’m going to use style directive I’m going to pass an array and first I’m going to provide color to be green so this is something I want always to be added so if I save this right now and reload we’re going to see that color green was added and in the browser we’re going to also see that the actual color is green however now let’s add conditionally some styles for example background- color equals Canan should only be added if country equals g now if I save this and reload the background color will not be applied because country does not equal to G it equals to UK okay however if we change this into GE and reload we’re going to see that the background color was applied to it as well so the possibilities regarding this are endless you can provide as many elements right here inside these arrays as you want and you can provide any conditions right here you want to add or not add specific class or specific CSS properties to your HTML elements [Music] now let’s talk about how we can create and include sub views in our blade file I’m going to comment out this part I’m leaving this code so that you can refer it but when we move on the next section I’m going to remove all unnecessary piece of code and you can find them as a written form down below the lessons or you can download the source code at the end of each section and you will find these right there now let’s open resources views folder and inside views I’m going to create one folder called shared and inside shared I’m going to create a new blade file and I’m going to call this button blade PHP of course I could create this directly inside views but J just I’m showing you how you can also organize this and it is recommended to organize these partial blade files into subfolders now we have this button blade PHP which I’m going to do the following so inside here we’re going to have just a button and I’m going to Output two things I’m going to Output text and I’m going to also add background color to the button so for this I’m going to use style Direct itive and just like this background- color and I assume that we will have right here um variable called color okay awesome now let’s go into index blade and I want to include that button right here so for this we’re going to use include directive and we’re going to provide the location of the blade file so so if we would create the button blade PHP directly inside resources views we could include it in the following way button but because we created this under shared folder we need to include this shared dot button in the following way all right now if I save this and we reload in the browser we’re going to see an error because we don’t pass two variables color and text but we try to use these variables right here and this will throw an error to pass the variables we can provide the second argument as an associative array to this include directive in this case we’re going to provide color to be brown for example and we’re going to provide text to be submit now I save this now let’s open the browser reload the page and we see button so we see the button it has text submit and it has background color brown now let’s change this background color into something like yellow save and reload and now we see yellow button if we try to include a view which doesn’t exist let’s say shared search form in browser we’re going to see in error view shared search form not found however if we don’t want the error to be thrown instead of include we can use include if directive so the following directive will check if shared search form exists it is going to include that otherwise simply it will not do anything and also it will not throw an error there is also a directive include when the first argument is the condition the second argument is the the file the blade file to include and the third argument are the parameters given to that blade file include when will include the given blade file only if the first condition equals true or if the first condition is trable so in our example if the search keyword exists it is going to include shared do search results blade file however if the search keyword does not exist it is not going to include that there also exists include unless which is the opposite of include when include unless will only include shared. search results if the first parameter of this include unless equals false so in our example these two lines are equivalent there also exists include first directive which accepts an array of plate files and it will include the first available blade file so if there is admin button it is going to include that otherwise it will try to include button blade PHP first let me change this search form into button and make sure we have everything working as expected no errors and now I’m going to talk about how we can include sub views inside loop let’s imagine the casee that I want to iterate over something let’s say I want to iterate over cars as car and for each car I want to include a separate view file past the car and render each car in its own view file so how I can do this I’m going to use include directory right here provide the view name and I’m going to call this let’s assume that we already have this car. view file and I’m going to pass car right here so if we create car view. blade PHP file this will accept car for every car however we can do something similar in just one line and for this there exists each directive in Blade each accepts first it’s going to accept the view name in in our case we’re going to pass car. view we’re going to pass then the array which needs to be iterated cars in our case and then we pass the string variable name which will be passed to car view and each element from this cars array will be passed to car view with that given name car in our case so LEL will iterate over cars and for each car it’s going to render car view passing the car variable so these two piece of code what I have just selected are identical and additionally there’s four parameter also available uh which is assumed to be a blade view file which will be rendered if the cars array is empty so in our case we can provide car. empty let me quickly demonstrate this to you I’m going to declare a variable called cars but I’m going to just assign numbers to it let let’s assume this is an array okay so this is an actual array but in reality the array of cars will be array of objects but right now we just declared it to be numbers so car will be a single number and then we need to create car. viw file so if we go under resources views I’m going to create right here a file carv. blade PHP awesome so here let me create a paragraph and I’m going to Output car variable now if we check in the browser we see the following so 1 2 3 4 5 and then again we see 1 2 3 4 5 that’s because we are doing the same thing twice right here and right here however if we make this cars array empty the first one will not do anything the third one will throw an error because it will try to to render car. empty blade file which does not exist let’s have a look here we go car empty not found however if we create empty. blade file inside car folder then that will be [Music] rendered all right let me first comment out this part and then I’m going to talk about how we can use row PHP in our blade files for for example if I want to declare a variable the traditional way is going to use traditional PHP tags opening PHP tag and closing PHP tag and inside there we can declare a variable however there exists PHP directive and we use this in the following way we open with PHP directive and close with end PHP and in between we can declare variables we can create functions or we can do anything in the same way if we want to import a specific class in our file the traditional approach would be to create traditional PHP tags use and the class name however there exists use directive as well which gives us possibility to provide right here the fully qualified class name so these two piece of code is [Music] identical now it’s time for another challenge I want you to create a sub view alert blade PHP you can put this in a sub folder if you want which will take two variables message and color and use them in Blade file use style directive to add color to the alert element include that view in another blade file and pass these two variables there are many interpretations of this challenge but the main idea is that you create a second blade file include it in another blade file and you provide variables pause right now think a little bit about this create your own solution your own version of this Challenge and then come back and see my [Music] solution all right let’s see my solution how I would do this first we need to create alert blade PHP file and I’m going to do this in inside the shared folder because this is kind of reusable shared component PHP artisan make view let’s put this in the shared folder alert let’s hit the enter and it created alert blade PHP file okay let’s open this file let’s go into resources views shared and I’m going to open this alert blade PHP file so I’m going to leave this div and I’m going to assume that to two variables will be passed to it color and message and I’m going to use this color variable right here to give some style to the alert element but for style I’m going to use style directive as it is required let’s provide background- color to be whatever color has been provided however inside the alert I’m going to use message variable to actually output the message now let’s go into index blade PHP file and I’m going to include that alert include provide shared. alert and let’s provide two variables message is the first and let’s provide some message for example your account was created and let’s provide second variable called color let’s move this on a new line like this okay the color will be green and just like this we have created and included the component now if we open the browser reload the page we’re going to see your account was created alert so I can reuse this alert now multiple times I can provide a different text right here I can provide different color like red for example reload the page and we see this same blade file included two times with different text and different colors of course if we want to create like really real world type of alert component we need the text color as well and couple of other things but you get the idea we can always assume that inside alert we provide the basic styles for example color will be always white and we will also always have pting to be 15 pix let’s do like this reload the page and now we see that the color is always White and the there’s always some pading and we can provide additional CSS properties right here but the main idea is that we have variables and we output those variables now we’re going to move forward and start building the layout of our website but before we do this I want to delete all the content we created only for learning purposes such as I’m going to delete this alert blade PHP and button blade PHP so I’m going to delete the shared folder completely and if we open this home index plate as well we have a lot of content right here so I’m going to completely delete almost everything from here and from the home controller as well we can remove all these variables given to home index and just like this we have now clean project and we are going to work on index blade to actually render the content of our website the website we are working on now let’s create the main layout file using Artisan PHP artisan make View and I’m going to put that layout file under layouts folder and I’m going to call this file app so it’s going to be up blade PHP under layouts folder so this is created now let’s go under resources views layouts and let’s open this up blade PHP I’m going to remove everything and I’m going to generate boilerplate HTML code so we have the standard HTML structure you can generate this code by just typing exclamation mark in your PHP stor or vs code and hit the tab okay awesome now let’s start using blade directives right here the title is a document which I don’t want to be documented I want it to be something Dynamic okay so here I’m going to use yel directive and I’m going to provide right here name so that’s going to be section name so I’m going to type title right here so I want to Output the content for Section title and I’m going to right here provide extra hardcoded text like car sell L website you can put the name of the website whatever you call it okay or you can even leave this empty and just only have this title so the choice is up to you the most interesting part is that right here we are trying to Output the section with name title okay so I’m defining the layout and the layout needs header so I’m going to Define header right here and we can just type a hardcoded text like um your header so this is just your header okay so I’m going to Define footer as well and that’s going to be your footer and in between the header and footer we’re going to obviously have the main content again I’m going to use a yeld directive and I’m going to Output a section with the name content so I have the very very basic layout ready now let’s go into index blade PHP file and I’m going to try to use this layout let’s delete everything and we want to extend the layout we want to use this app blade PHP file in our index blade how can I do this extends except the blade view file name our blade file is located under a layouts folder and it is called app just like this we are extending our app blade PHP so even if I leave this right now as it is and I don’t do anything and if we check in the browser we see your header and your footer and if we check the page Source we see this very very basic HTML so we don’t see anything right here we don’t see anything in between header and footer but the basic layout is already rendered because of these extents but because we are extending we want to actually extend it and add additional things to this layouts up for example I want to define a section with the name title and we can provide right here any text for the title like home page for example I save this I reload the page and we see homepage right here because we defined the section right here title and that section title was outputed in the layout our definition that text now is outputed in layout awesome we also try to Output right here section called content now let’s define this section section however there are two ways to Define content for the section one way is to provide two parameters right here the first one is going to be the section name the second is going to be the value for the section so I want to Define much larger text than just a single line so we have possibility for this we just provide the section name and then we use end section and whatever we put inside in between the section and end section that’s going to be considered as a content for this section so in our case I will just type homage content goes here and let’s fix the typ hole and maybe we can put this inside H1 awesome now I save this I reload the page and we see in between header and footer we see this H1 of course you can put HTML of any complexity any html text as much as larger HTML as you want you reload and you’re going to see the whole HTML okay awesome and now if we check in the browser we see homepage content goes here in between header and footer okay we have the layout ready but we want to improve this layout for example if we look at the HTML link property we see en right here so we have language English defined always but what if our application is in different language let’s say Spanish I want this language to be dynamic based on the applications language also we see right here car selling website which is actually kind of title of our website but we already have this title written in file if we go under en and open this we see application name right here we can call this whatever we want for example we can call this car selling website or let’s just call this Carell okay so this is the application name and I want to Output the application name right here how can I do these things first let’s go into link and I’m going to Output right here the current application name I’m going to access this through up function this returns an application and then I can call get local method on that so if I save this right now and if we check in the browser Source we see if in right here so our current application language is actually in English if we go right here and change the application local into es for example then we reload we’re going to see es right here which is exactly what we want however the language codes can be in different format for example it can be escore uppercase es for example so we don’t want underscore written in our language program property so it’s a recommended practice to call St Str replace to search underscore in the language replace it with a dash and output only this information so now if I our language code is escore es the output will be es- es which is relevant for the link property okay this is one thing what we want to do I’m going to reverse this B into en next we want to Output the application name right here for this we can use config function in the config function we need to provide the configuration name and the configuration name is called app. name all right so where does this come from if we go into config folder open up PHP scroll at the very top we see application name which is taken from Ian okay from Ian whatever is the app name it is taken and inserted in the application name that’s why we are taking up name right here however we can fall back this to something else like LEL of course the fallback will never happen because we have that name defined right here in the and we also have fallback right here so application name will be always something but again this fallback doesn’t hurt it so it’s a good practice to have basically it is a method to prevent attack from Another Side to your website so it’s good practice to Define and we will need this as well so the name is going to be csrf Dash token and we’re going to provide the content for this token as well the content needs to be a result of the function we are going to Output csrf token function result now if I save this and if we reload we see right here csrf token metat tag and we see the content so this is unique string which regenerates once in a while and it is only valid for your website so if other websites will try to send information to your website without this csrf they will not be able to do this again we will talk more about csrf in the upcoming lessons and here we see the language as we talked and here we see the application name if I open p. file and change this application name for example if we call this car selling we save we reload we see application name changes right here as well make sure you download and open the HTML CSS project that has been provided under this video when you open this using vs code make sure to install live server extension as well we will need this to open this HTML project in in the browser so let’s open index HTML file and we can click go live button right here this will start the live server and we can browse and view this website in the browser here’s the website and how it looks like and now I want to take the layout from this HTML template and put this in our LEL project I’m going to copy everything from this index HTML let’s open our project and I’m going to insert this content just below the stock type HTML I don’t want to delete this HTML for now I’m just putting this at the very top I can put in create multiple new lines and let’s put this right here so this is a very long 800 line HTML content and we have to identify what is part of the layout right here and what is part of the actual view because this is an index page and index page contains not only layout but it actually contains the cars as well now let’s identify what is part of the layout and what is part of the content so if we start from this top so this is all part of the layout including the links including this header so this is also part of the layout let’s collapse this then we have this home slider this home slider is already part of the homepage so I’m going to take this out cut it and let’s put this inside index blade PHP inside content right here okay I’m going to paste it good now we have this main tag inside which we have a couple of sections we have to find a car form we have new cars section and that’s basically it so we need to take this entire main tag and put it in the index blade right here awesome let’s go into up blade again we can remove this extra new lines and then this is part of the footer and that is part of the layout so everything what we see right now is part of the layout now what we need to do is to Output the language right here output the proper CSF token output the application name as well let’s do this down below we have this old HTML so I’m going to copy this HTML tag let’s scroll at the top and put this right here next we also have csrf token I’m going to take this let’s scroll up and just below the title tag I’m going to put this here and finally we have this title so I’m going to get this and put this right here okay and in between the header and footer we need to also output using yel we need to Output content just like we had in the previous version okay now we don’t need this previous version so we are going to remove it completely let’s remove this extra new lines as well cool now we have this HTML ready however it’s not going to display nicely because we don’t have Javascript file and we also don’t have our main CSS file in our project but before we proceed let’s have a look on our website so we see bunch of content okay so we see this hero text and we see uh the search form and we see cars without any Styles because the CSS file is missing and if we check also the page Source we are going to see this entire HTML content including this header and home slider and all those cars okay this is pretty awesome now let’s inspect this and let’s have a look where the CSS and JavaScript files are coming from so if we reload the page we are going to see that it has CSS up CSS missing JS upjs missing and couple of images as well what we need to do is take those CSS image and JS files and put them in our project now I’m going to open this using Explorer File Explorer so right click on folder reveal in file explorer this opens the file explorer and here we see CSS image and JS I’m going to select all of them and I’m going to copy them and let’s go into our project and we need to put them under public folder we will improve this later but for now we’re going to put this in the public folder again I’m going to right click inside the public folder in PHP storm there’s open in Explorer in vs code it is reveal in Explorer I’m going to open this in Explorer here it see here is the public folder and I’m going to paste it right here now we have the CSS image and JS in the public folder I can close this they will be available right here as well and now let’s recheck it in the browser reload the page and we don’t see any errors in the console let’s close the console and we see I need to zoom out slightly and we see the homepage it is very identical to the HTML file what we just saw so because we successfully moved the layout part and the homepage part in our project if we have a look at the HT HML CSS template and navigate between Pages we see that the header is the same so the following page at new HTML has the exact same layout as the homepage we also have car details page and this one also has the exact same layout however if we go into signup page we don’t see this header anymore so this page has a different layout and this page has the same layout as the login page so if we think a little bit we can identify that we have two different types of layouts in our project the one which is related to the pay website like the homepage car details a new car and so on and the others which is for sign up which is for login or maybe for password resit so we actually have to create two different layouts let’s open the HTML CSS project and I’m going to open login HTML file and I want to compare these two files index HTML and login HTML so we already saw index HTML so it has all the links and uh the header right here as well which I’m going to collapse right now however in the login HTML we have all the CSS files we have these links but we don’t have this header then we directly have this main section so if we observe a little bit we can identify that everything what is above this body opening tag inside login HTML and inside index HTML is actually the same also in the index HTML we have this footer down below which is at the moment empty but on the real websites we obviously have some sort of footer right on loging HTML we don’t have this footer if we scroll down below we directly see this script tag which in index HTML only comes after the footer so if we select right now I’m going to select the content this content is not available in login HTML and if I delete this for just temporarily we can identify that now this looks very similar to login HTML so this is the content inside login HTML we can delete this and these two HTML files are almost identical except that we have additional CSS class to the body inside login HTML so I want to create now one layout which will be a basic layout only contain CSS in JavaScript files it will not contain this header tag and then the second layout will have this header tag let’s open our project I’m going to bring up the terminal and I’m going to execute PHP artisan make view layouts. clean I’m going to call this layout clean layout let’s hit the enter the file was created let’s go under resources views layouts and let’s open this clean blade PHP now let’s open up blade PHP and I’m going to copy the part which should be part of the clean blade PHP everything starting from the stock type HTML down below the opening body tag so I’m going to copy this part or cut this part remove it from up blade PHP and I’m going to delete everything from clean blade and I’m going to paste this right here now let’s open up blade PHP again I’m going to leave this header I’m going to leave the content and footer and I’m going to take this part which should be part of the clean layout as well so let’s go into clean layout and down below I’m going to paste this okay now we have this clean blade PHP which has this uh outputting of the language csrf and the application name as well and right here right here in this place we want to Output the its nested layout child layout content so in our case case that should be up blade PHP content so that content should go inside here right in this place so for this I’m going to use Yi and I want to Output child content so I’m going to call this section child content now let’s go into up blade PHP and first we have to extend the clean layout so we use extend directive layouts. clean awesome next we have this header and we can leave this then we have we have to define the child content section because right here the clean layout expects child content section let’s go into up blade and I’m going to Define section child content and in between the child content opening and section in between the child content opening and closing directives I’m going to Output the actual content as well however this header and footer should go somewhere as well right so they should be inside this child content as well so I’m going to take this header and put it in the child content take this footer and put it in the child content as well now let’s remove this extra new lines let’s save it and before we check the result in the browser let’s understand the flow again index blade which is the homepage extends the up layout this is the up layout it extends the clean layout this is the clean layout clean layout outputs child content right here and it also outputs um title right here as well so in up blade we Define the child content with a header we outputed the content which will come from its child view index play PHP so this content right here will be taken and inserted here in the following place and this content will be taken and inserted here in the following place and finally when we access index Blade the homepage we should see the correct result let’s save this and let’s check in the browser I’m going to reload the page and we see the same result let’s check the page Source let’s scroll at the very top and here we see the title we see language we see the header as well and down below we see somewhere probably footer as well if we open uplate PHP we see that the header tag is about 70 lines of code of course we can leave this right here but it is also good practice to move that into its own blade file so I’m going to cut this I’m going to open the terminal and I’m going to execute PHP artisan make View and I’m going to create under layouts I’m going to create another folder called partials and inside there I’m going to create header view file so the view under layouts partials header blade was created let’s go let’s open this I’m going to replace the content with the header tag and inside Apple blade I’m going to include layouts arals header blade file now we see that we only have seven lines of code in up plade which is how it’s supposed to be if our footer gets very large we can put this in its own partial file as well so we save this if we check clean blade as well uh this only contains the CSS and JavaScript files nothing else the header obviously contains only header which is exactly how it’s supposed to be and we have perfect setup of our layout let’s check the resle just to make sure that we don’t break anything we still see the header right here the reason why we created clean layout is that it is used inside login sign up or password reset pages so we have to create signup page and login pages and we have to use this clean layout right there let me create signup controller by executing PHP artison make controller sign up controller we hit the enter the controller was created let’s go under up HTTP controllers we have the signup controller and I’m going to create right here at the moment I’m going to create only one function create which should render the form so we’re going to return view okay um I want to render the view from a specific folder called out out sign up so this is the view I want to render let’s open Terminal again and let’s create new view PHP artisan make view out. signup we hit the enter the view was created let’s go resources views out sign up blade now let’s open the HTML project and let’s open sign up HTML okay let’s scroll down below and find the content section we identified what is layout and what is part of the page so here we see the main is part of the page again we have to take care of this page sign up class maybe but let’s take this main tag because this is what contains the actual form let’s go in our PHP storm and I’m going to delete everything and I’m going to paste right here this main tag okay good now we have this um sign up blade PHP but that needs to extend clean layout okay just like we are extending layout up on homepage and we Define the title and the content we have to extend the clean layout and Define the title and child content because the clean layout is using child content so let’s open signup blade let’s collapse this Main and we are going to extend from layouts. clean let’s define section title with signup title and let’s define section chart content and we obviously need end section as well okay awesome now let’s open web.php from Roots folder roots web.php and we have to Define new root for sign up root get sign up and we’re going to use sign up controller class create method let’s let’s replace this fully qualified name with import so that we have signup controller imported right here and just like this we can already have a look and see the result let’s provide sign up right here hit the enter and we see the sign up page which is pretty cool if we have a look in the HTML template we can see that the body has page signup CSS class this is something which is missing in our case so if we check our website we see the sign up page but if we inspect this check the body we don’t see the CSS class however if we check right here we see that it has this page signup class which adds additional ping top and bottom so we want this ability to add this page sign up CSS class to inside clean layout and it’s pretty easy much easier than you think so we extend these layouts clean right here and we also have possibility to Prov additional parameters right here for example we can provide CSS class which needs to be page Dash sign up now if we go in the clean layout we can use this right here we can do like a check if the CSS class exists or not or we can assume that it always exists and we can simply output CSS class if I save this right now and reload on the page we’re going to see page sign up CSS class was successfully added to body so in our example if we want to be 100% safe and make sure we don’t try to Output a variable which is not even defined we can do something like this we can use is set directive for this which we already mentioned in previous lessons we provide CSS class if that is defined we output it and we need end is set as well and just like this the result will not change we will still have this page output we also have additional extra white spaces in front of the class after the class which can be removed if we remove these white spaces right here awesome now we don’t have that however if we try to if we just forget to provide that CSS class and remove this completely it will not throw an error it simply will not use that class however as you see we see empty class attribute right here which we can also prevent if we go right here and if we move that class only if the CSS class is defined and we move that double quotes right here as well so now pay attention so the following content will only be rendered if the CSS class is defined now I save this reload and we don’t even see this CSS empty attribute but now if we go in the sign up and revert this back we save and reload we see this CSS class [Music] added now I have a challenge to you and I want you to promise yourself that you will do your best to implement this challenge only by yourself and you can check obviously my solution if you need but do your best to do this on your own and the challenge is the following it’s pretty simple in my opinion because we already did something similar in the same way like we created sign up page I want you to create a login controller new login route and copy the login form content from the HTML CSS project template project into your LEL project and create a login page on/ login URL so whenever we try to access SL login it should render the following login form coming from the Lal application pause the video right now span time and then come back and see my [Music] solution all right I hope you made it and now here’s my solution let’s first open HTML CSS project and let’s open login HTML we are going to copy this main tag which is the main form now let’s open our project and I’m going to create the controller and view file PHP artisan make controller login controller hit the enter PHP artisan make view out. login we hit the enter so the controller was created view was created now I’m going to hit double shift on my keyboard which gives me possibility to access through all my files you can hit contrl in p in vs code to do something similar so I’m going to open login controller file then I’m going to create the function create from here I want to render a view al. login now let’s open the view file which should be inside out slash login which we just created okay awesome I’m going to delete this div and I’m going to paste this main div what I just copied from the HTML CSS project I want to extend this from layouts. clean I want to Define section title login and I want to Define section child content let’s collapse this div and here we need end section as well let’s remove this extra new line and right here in this layout clean I want to provide the CSS class page- login oops we need key right here as well CSS class will be page- login now let’s open web.php and I’m going to duplicate this line and I’m going to Define login rout which should use login controller let’s replace this with import we have login controller imported right here and we need to use the method called create now we save this let’s check in our browser reload the page and we see login page we see one error which is coming from JavaScript it it is not that important we can close this and uh the main thing is that if the CSS class is available so let’s check this page login we see that so our login form coming from LL exactly looks like the login form coming from the HTML CSS project [Music] there are several more useful cases when working with Section related directives let’s open the layout up blade PHP here we have the empty footer tag now let’s assume that inside this footer tag we want to Output footer links for this we would use yel directive and let’s call this section footer links whenever that footer link section is defined the links will be outputed right here in this footer now let’s open index blade PHP which is the homepage and inside this content I want to define a section let’s define section Hooter links we obviously need end section and here I’m going to Define two links I’m going to Define link three and Link four and you will know right now in a few seconds why I defined link three and Link four and where is link one and Link two okay I’m going to save this and when we reload the browser we’re going to see link three and Link four at the very bottom left corner of the screen we can check this in the page Source we can zoom in and here inside the footer we see link three and Link four now let’s assume that we want this link one and Link two to be for every page now we provided this link three and Link four for homepage only if we go to another page those links three and four will not be there now I want to Define link one and two for every page okay so in this case I’m going to change this yel into the following so let me remove this completely so here we need to define a section footer links okay but instead of calling right here end section we want to call show directive so whatever we put right here in this case we’re going to put link one and Link two so the section will be defined but it will be also outputed so this is pretty much equivalent of calling end section right here and then calling yel with footer links so this is pretty much the same as a having show right here and of course this is much better so now if I save this and reload in the browser we still see link three and Link four why do we see this and Where’s link one and Link two if we don’t Define this section at all in index blade and I’m going to comment this out we are going to see link one and Link two in footer because we didn’t Define it and it took the default values whenever we Define that our content made an override of these two links however what we want is the combination of Link one two three and four how to do this for this we are going to use right here a directive called parent and we can use this parent in any place we can use it here we can use it here or we can use it here so it’s up to you where you want to use it in this case we’re going to put at the very beginning of the section and now this print will take the content of the parent section the parent section in our case is this so link one two and then three and four will be defined and will be printed in our browser and you see the [Music] result there are several more direct which are definitely worth mentioning one of them is his section his section directive checks if a specific section is defined or not and let’s see this on our example I’m going to remove this default content right here and let’s say that I’m just yielding footer links right here so if we open the homepage reload this we’re going to see link three and four because this is how we Define in index blade cool but if you don’t don’t Define these footer links I’m going to delete this completely then the footer empty tag is still rendered and let’s say that we want to avoid this if the footer links are not defined we don’t want the footer tag to be defined or it to be empty so how to do this let’s go into up blade and before yiing we are going to check if footer links section exists it if it is defined if that section exists then we’re going to use at the end we need to finish this with end if directive and inside the head section and end if we can put this footer so if the footer link section is defined we Define the we create this footer and output the footer links but if it is not defined we don’t even show this footer tag okay this is awesome now if we reload the page in the page Source we don’t see the footer tag at all however if we open index blade and uncomment these footer links we save we reload we are going to see footer with the links the next directive worth mentioning is section missing using this directive we check if a specific section is missing or not in our case if the navigation section does not exist then inside D with class pool right we render the default navigation using checked directive we can add checked attribute to input type checkbox or input type radio the check directive accepts a Boolean expression if the Boolean expression is false then checked attribute will not be added to the checkbox or radio button however if the Boolean expression is true then checked attribute will be added and finally it will be rendered with checked attribute in HTML in the same way there exists disabled attribute if it is a false the disabled attribute will not be added if it’s true it will be added in the same way there exists readon which will add or not add readon attributes to HTML input elements in the same way there exists required attribute which will add or not add required attribute and there also exists selected directive which will add or not add selected HTML attribute to option tag on the example what we see right now we are iterating over yards and whichever is the current y we are adding selected attribute to that option so in our case 2024 this is the current time when I’m recording this course to option with value 2024 will get this selected attribute the other options will not get that in LEL components are reusable piece of user inter interface that can be included in your blade views they encapsulate HTML markup Styles and logic into a single unit making it easier to manage and reuse code components can accept data as attributes and can include slots for more flexible content insertion lell provides two types of components class-based components and Anonymous components now let’s learn how to create Anonymous components first Anonymous components components are blade files located under specific folder inside resources views I’m going to create a new folder called components inside components I’m going to create a new blade file called card blade PHP this is a blade file and inside here I’m going to create a div and let’s give it a class card inside here I I’m just going to write a lurm Ipson text at the moment so this is a component because it leaves under a specific folder inside views now let’s see how I can use that component in another blade file let’s open Home index blade PHP and let’s try to use it right here at the top of the content section components can be included as HTML tags every component tag starts with ex dish so in our case ex dish card will be the component we want to include the components can be self closing text like this or it can have a separate closing tag like this so we have card component created and we have included this right here let me change this into self closing version now if I save this and if we ch check the browser here is lurum text which is coming from component if I duplicate this component couple of times I will see this lsum text repeated couple of times as well components can leave in sub folders as well for example if I copy this card blade and I’m going to move this into a subfolder of the components let’s create a subfolder and I’m going to call this let’s call this admin folder for example if we have a separate card component for admin I’m going to move this right there and I’m going to change the text right here and I’m going to call this admin card component now I save this let’s open index plate PHP and I’m going to use this admin component in the following way x- admin do card and then we have sell closing or we can have a separate closing tag so in this case the admin defines the folder and card is obviously the component name we can have deeply nested components we can create another folder inside admin and call it for example bootstrap and we would be able to render the card component from the bootstrap folder in the following way admin bootstrap card but every component starts with ex and dash of course this component doesn’t exist so it will show an error so so let’s just remove this bootstrap I would save this and if we check in the browser we will see right here admin card component to create the component using Artisan we should execute the following comment PHP artisan make component then we would provide the component name card and we can provide an optional flag D- view which will generate Anonymous components we are talking right now about Anonymous components we will talk about class components in the next lessons and using the following way we can create new component because we already have card component available this will not work and this will throw an error so let’s just change this and call it button when you are creating Anonymous component it really doesn’t matter how you name your component with uppercase b or lowercase B it’s still going to create blade file with all letters lowercase if we hit the enter the component created successfully we can check inside views components we see button blade PHP if we open this we see right here deal with a comment and we can change this into button with submit text for example we open index blade and we can include this in the following way x button now we save it we reload and here’s the button component if we want to create a button component inside admin folder we will do it in the following way admin. button let me remove any unnecessary files like this button blade I’m going to delete this I’m going to delete the admin folder also from the components so we know that we can put the components in a subfolders that’s clear we have this card blade and we are using inside index blade PHP P however we have this x button and X admin card as well which I’m going to also remove here we are using X Card component three times and if we check in the browser we see three times the same content would not it be great if we would have the possibility to customize the content every time we are using the excard component that is possible through component slots a component slot is a placeholder where you can insert custom content when you use the component it allows you to pass different pieces of content into predefined sections of a component making the component flexible and reusable there are two types of slots default slots and named slots now let’s see an example of default slot I’m going to open the card blade component and I’m going to remove this LM iom text and I’m going to use preserved variable variable called slot I’m outputting that variable inside in between the opening and closing html text now I’m going to open this index blade and I’m going to change how I’m using the EX card instead of using with self closing tag I’m going to have a separate closing tag right here and in between I’m going to write some content like card content one and now I’m going to duplicate this two more times and we’re going to have card content two and card content three now let’s delete these self closing versions now I save this and if we reload in the browser now we see card content one card content two and card content three that happens through slots whatever we put in between X card opening and closing text that will be taken and rendered instead of this slot variable right here now let’s talk about named slots there can be only one default slot however there might be multiple named slots now let’s update our card component into like this I’m going to create two HTML elements card header and card Booter inside card header I’m going to use use a variable called title and inside cart footer I’m going to use a variable called footer awesome so those variables by default do not exist and if we try to reload the page we are going to see an error undefined variable title which is obvious now let’s go how we use this excard component and I’m going to Define named slot to provide content for named slot we should use ex slot tag so I’m going to use ex Dash slot okay then we can provide the name of the slot so I’m going to give it title and then card title one so in the same way I’m going to Define X slot with name footer card Hooter one now I’m going to comment out or maybe completely remove these other cards and I have this single card with title name and footer name for slots this name given right here title and the footer name given here will be converted into a variable’s title and footer right here so if I reload the page we will not see error anymore instead we see card Title One content and card footer one instead of providing name attribute right here there is another version to provide content for title slot I’m going to delete this name and we can do in the following way x- slot colon title and x- Slot colum footer let’s delete the name here as well so whatever we provide next to this column right here that’s going to be converted into to a variable in our component okay if I don’t provide title and if I provide title two for example we will probably see an error on title because there is no title however we are trying to print that now this works exactly as it should work if we want to check if the default lot is empty or not we can do this in the following way the slot provides a method called is empty and we can check if the slot is empty empty then we can render some content else we can render the slot actually and just like this if we don’t provide anything any information in the default slot let me remove this completely then it will render the message please provide some content right here however if we provide this card content one reload the page we will see this card content one now let’s create class-based component PHP artisan make component let’s call this search form and pay attention right here that I start the naming with uppercase C and then I have F also uppercase so we have to name our class-based components with Pascal case every first letter of the word word needs to be an uppercase and we also don’t need to provide Das view we hit the enter and it created the component pay attention that the component was created under up view components search form so this command created two files one is under up view component search form and second is under resources views components search dish form okay cool now what is the purpose of this class class-based components give you a possibility to override the default location of the blade file by changing The Following part right here so inside render it is rendering component search form which we can change easily if we don’t want that place also if you have very complex logic of selecting data that you want to render in your component you can put this in the construct ctor right here we can also Define public methods right here let’s define test return something which can be used then inside the component in the following way dollar sign test and parenthesis so this test right here is available as a variable but because it is a function then we use the parenthesis right here now let’s open index blade and let’s include this search form component maybe next to the card I’m going to use x dash search- form okay so we save this and now we check in the browser and we see something and that something is coming from here from this method test now let’s open index blade PHP and I’m going to find the actual place where we have have this search form so this is the home slider I’m going to collapse it inside main we have this find a car form so I’m going to get this completely go inside search form and replace it right here and then in the index blade I’m going to use this ex search form like this now if I save and reload down below we see this search form which is coming from the component if I go in the component and delete everything this form will be gun as you see it is not there anymore this is pretty handy because right here in this search form we will need to have options for um maker maybe for model for States and all that information can be selected inside search form which will be available inside the component any public property or public method what we describe in the search form will be automatically available as a variable inside search form blade PHP we have the following search form class based component which has its own Associated blade file now let’s assume that whenever we use this search form component from here we’re going to pass action and method then we’re going to take this action and Method and we’re going to Output those two variables right here this can give us possibility to provide different actions inside the search form when we use the component from different places okay how we can pass those attributes and render them let’s open search form PHP and right here in the Constructor I’m going to accept two properties public string action and public string Method All right we Define those properties and they are both of them are required right now if I reload the page we’re going to see an error required string action so we have them required but we don’t pass them from here now let’s provide action equals something and Method equals something something now if I reload the page the error will be gone so we pass those two attributes we accept them right here but we don’t use inside the blade file now let’s replace the following part of the code and output these two variables action and Method Keep in mind that any Global variables any Global properties inside the component class and the global methods are directly available in the blade B that’s why because we have this action and Method defined as public properties we can directly access them under search form blade file now if I save and reload we don’t see any error and if we check the page Source if we search for form we’re going to see action is search and method is get and just like this we provided those two properties right here we can change it and just leave DH SLS and we can change this into post if we want preload the page and we’re going to see it like this however if we don’t want these properties to be required we can provide some default values for example search and get now this gives us possibility to not provide none of the properties or we can provide only one and for the second one it’s going to take the default values but let’s leave it like this reload the page and it’s going to take take the default Valu search and get and we don’t see any errors because we have provided default values for these [Music] properties now let’s open card blade PHP which is anonymous component and see how we can pass attributes to Anonymous components let’s open index blade and right here we are using this EX card Anonymous component let’s provide color equals red for example and in the anonymous component blade file we can already access the variable named color so whatever attribute we’re giving right here that attribute will be created as a variable in the blade file so let’s just output here color we save and we reload and right here we’re going to see red okay this is what we provided obviously we can provide any number of attributes right here and for all of them the variable will be created however there exists a specific dedicated directive to define the properties of the anonymous component and the directive is called props so we provide array right here and inside the array we’re going to Define what properties we’re accepting inside this Anonymous component so I’m going to accept color and I’m going to accept BG color right here okay so I expect these two properties to be passed to the uh Anonymous component however now you might have a question what’s the purpose of defining the props if we can just directly provide the color or PG color right here and we can accept them right here in the following place and we can display them that’s a good question there are couple of reasons one of the reason is that when we Define those props we have an explicit view of what properties are defined and are used inside this component that component might be multiple lines dozens of lines and we Define those props at the top on it’s a recommended practice to Define them on the very first line of the component okay and when we have a look on the very first line of the component we immediately see what properties this component accepts that’s the one thing and the second reason why this is a good practice is that we can provide default values for example on the BG color I’m going to provide the default value to be white and whenever the B color is not provided is not passed it’s going to be white so now let’s use this color and BG color right here card Dash text Dash and let’s use color variable here and then I’m going to add a second class card BG and let’s use BG color variable here now if we save and reload and I’m going to check the page Source let’s search for card and here we see that card text red card BG white the card text red is given because we are providing a color righted here and BG white is because we don’t provide BG color from here but we have the default value for BG color however we can obviously provide BG color here to be blue for example we save we reload and we see blue right here when we provide directives we can provide the attribute names with camel case notation like it is defined right here in the props or we can provide the T notation as well BG Das lowercase C color so this will also work we reload we still see blue right here however if we just provide full without without Dash but the C is lowercase still this will be a different variable and if we reload in the browser we are going to see white because right here we are using BG color with camel case naming and we don’t provide anything with camel case naming so that’s why it is taking the default value for the B color okay so far so good what if we want to provide variables right here let me Define two variables using PHP directive so one of them will be color let’s give it red and the second will be B color let’s give it blue so I want to use these two variables right here so we can use directly dollar color here and dollar BG color however those text will be evaluated as hardcoded texts not as very variables if we want them to be evaluated as variables and the values to be passed inside the attributes we’re going to use column in front of the attribute name so if we save it like this and reload the page we’re going to see now card text red and card BG blue this is exactly how we want and there is a shorthand version of the following line so I’m going to duplicate this line and I’m going to comment it out and we can have have a shorthand version whenever the variable name which we are passing matches the attribute name exactly we can do it in the following way so we can remove the value and we can use the dollar sign here and this is equivalent of this code and in the same way we can do for B color we can remove this part and now the following line is equivalent of this line which is pretty cool so if you want to use this shorthand version that’s good however if you have a different named variables like C right here and PG right here obviously you cannot do like this then you have to provide C right here and BG right here okay let me quickly undo this because we have now the same naming of our variables and now let’s test this in the browser reload the page we see right here and blue right here [Music] in components we have access to predefined variables called atributes so this is an object and we need to print this using Dum and let’s have a look what this variable looks like let’s reload the page and we see this is component attribute and beg so which has attributes property right here and it is empty array at the moment however if if I comment out this part save and reload we’re going to see that the inside attributes now we have two elements so one is color red and second is B color so the whole idea of the compute component attribute bag is that it contains all the attributes we provide whenever we use that component and it is excluding those properties which is defined using props directive so in our case we provide two properties right here color and V color but we don’t have props defined anymore we commented that out so it is taking all given attributes from here and inside attributes we have that all of them so if we provide right here language for example L equals n we save we reload now we’re going to see three attributes and languages inside there as well however if I now uncomment this code and we Define color and B color so then color and B color will be excluded from here so let’s reload we see only one attribute this is language for those attributes which is defined right here it is creating the LEL blade is creating separate variables for them however what is not defined using props it goes inside attributes and that is very good because we can use that attributes actually and we can output it right here in the following way let me remove this time so I save I reload we’re going to check inside the page source and right here we see link so the two string method of these attributes object is implemented in a way that it outputs the attributes properly as they should be outputed we can also provide test right here to equals something we save we reload and we see language and test output it right here so this is pretty cool now instead of test let me provide right here class and I’m going to add additional class let’s say card- rounded so this CSS class actually doesn’t exist I haven’t created any kind of styling for this specific class but that is not the main thing the main thing is how that CSS class will be added to the element so if we save this right now and reload in the browser look at this we have something something strange we have class card rounded and then we have another class so this card rounded is coming from the attributes if we go right here we are outputting everything from the attributes and class is inside that attributes however we have that second class right here which is what we have defined right here so in our case what we want is to merge the classes defined right here to the classes what will be provided to that element so this is how we can do this so instead of outputting attribute separately and outputting right here class separately on attributes we can use method called class this class accepts string and that should be the classes what we want to Define inside here so I’m going to take out these classes I’m going to delete this class attribute and let’s put them right here okay however pay attention that we need variables inside here let me use double quotes so we are going to use color variable here let’s delete these curly braces because we have a string here okay also so we have this card then CeX with color and cartex with BG so these are the classes which will be merged to class attribute given to this element so the card rounded will be merged to this one and then all the attributes will be outputed now if I save and reload we’re going to see we have language as well but we have all the classes merged into a single attribute so this is pretty cool in my opinion attributes object also has method called merge we can chain class method and merge method together but the purpose of this merge method is to merge the given attributes to the default ones we provide right here so for example if we don’t provide a language attribute right here let’s say that we want the default value on the card the Lang language attribute to have Ka which is the language code for Georgia so we’re going to provide right here inside the merge associative array where the key is the attribute name and the value is the default value k a right now we are providing language attribute so it is going to render the English however if I remove this save and we check this in the browser we’re going to see the language will be Ka so using the following approach you can Define the default attributes which will always be merged with the attributes given to your component if you use the following syntax this merge obviously can be used before the class method or after the class method it really does not matter the main thing is that it merges the attributes defined right here to the one given to the component here we are using card component and we have two slots defined title and footer now let’s assume that I want to add additional attributes to title or footer HTML Texs so let’s provide right here class for example and I’m going to give it card header blue now let’s assume that I want the following CSS class to be added to an HTML tag which renders the card header if we go in the card component we’re going to see that we have right here card header inside which we render the title so how we are going to take this class given to that slot inside here so the title basically is a variable which outputs the slot content in our case it outputs this card title one but actually it is an object and if we simply print using dump what is title we are going to see the following result so it it is component slot which has its content and it also has attributes and this attributes is instance of the exact same class we used previously right here the attributes okay so now what we can do is to access attributes title attributes and we can use that title attributes right here instead of this class so we can use title attributes we can provide class method right here in the same way we are doing exactly right here and we can provide card header CSS class now let’s move this down format it nicely let’s remove this dump and let’s just leave title as we had previously now when we save and reload if we check we see card header and card header blue this is exactly what we wanted of course if you need you can also use merge method on this title attributes in the same way we are using right [Music] here by default there are some keywords reserved for blades internal use in order to render components the following keywords cannot be defined as public Properties or method names with in the component for example if we try to Define right here method with a named data which should not be defined and then if we try to use that method in the blade file call the method and try to print the result in the browser we are going to see the following error argument number two data must be type of array string given something which is not very clear but this is because we made an override of existing data method which should not be done so whenever you come across error similar to this just check what are the reserved keywords and make sure that you don’t have any public Properties or methods defined with these [Music] names inline component is a component which does not have its Associated blade PHP file and the HTML content is returned from the components class render method directly now let’s execute the following Artisan command PHP artisan make component test component and we’re going to provide the flag D- inline we hit the enter the component was created let’s open the test component and here we have this render method from which we are returning HTML so inside this HTML every blade directive is supported we can use right here predefined variable called attributes we can also use slot right here the default slot or name slot any directives any blade can be written right here inside the string now since we have that defined let’s open index blade and let’s try right here to use this test component we’re going to use it in the following way X test component it’s pretty identical how we are using in general I’m going to provide some content inside there and I’m going to also add CSS class now because we are outputting all the attributes right here we are outputting the default slot we should see this rendered now let’s check this in the browser we reload the page and we see lurm ipsum right here and if we check in the page Source we are going to see the card right here as well so the CSS classes or any attributes we are going to add right here will be outputed on the HTML element on this T right there it is not very common to create and use inline components without blade files but still I wanted to show to you that so that you know that this is available we already have defined layouts and layouts are defined using template inheritance now it’s time to refactor our code and we are going to generate components and create rebuild our layouts using components let’s bring up the terminal and we’re going to create two components PHP artisan make component I’m going to call the first one up layout hit the enter and the second one is going to be base layout so the up layout will be the layout which will be for the homepage for example and the base layout will be the same as the clean layout What the clean layout does just I think the B layout describes it better that’s why I simply decided to call it base layout awesome so we have those two component classes now when we generated these components actually it generated two files for each component we have under up view components we have up layout and base layout but for each component for each class we have also View files up um up layout blade and BAS layout blade so what I’m going to do is just delete these components okay so we don’t need these blade files but we need to use these two blade files up blade and clean blade okay I’m going to also rename this clean blade and call it base blade let’s do refractor and now let’s open up layout and here is the components up layout blade file specified which I’m going to change into layouts up so this is the location of the blade file or the corresponding component let’s open base layout and I’m going to do something similar layouts base okay so we have the component classes ready we gave the correct names to the blade files now we are going to work inside these blade files so let’s open up blade PHP and Bas blade PHP so there are two approaches the first approach is to copy everything from this Bas blade PHP put this inside up blade but add this footer and this header okay so this is going to be the same however as we agreed when we implemented these this using template inheritance because our head tag is completely identical in Bas layout and in up layout we are extending the up layout from the Bas layout okay which previously was called clean layout but now let’s change this so I’m going to delete everything from this up plade or maybe I shouldn’t delete everything I’m going to take out this part and instead of using this extends directive we are going to use now component notation our base uh layout component is called X base layout okay because this is the class name Bas layout and we use components with ex prefix awesome so this is the base layout now let’s paste this include of headers instead of yel content we don’t want yel instead we’re going to use slots okay so here I’m going to use slot the default slot for the photo links we can leave the section we can obviously change this into name slot again but for now let’s just leave these footer links as a section awesome let’s open also index blade PHP from which we are extending the app layout so we should change this I’m going to take out everything what is inside this section content so let’s take this part completely out uh and I’m going to delete everything except these footer links I’m going to leave this for now because I want to put this in a proper place and here in this um index plate I’m using up layout so let me paste this everything here I’m going to also take these footer links and put this in the Uplay out inside it okay awesome now let’s have a look in the browser what happens what what was changed so we don’t see actually anything right now but if we check in the page Source what do we see we see body we see script right here but between opening body and script there’s nothing so if we go in the base plate PHP that is because uh we don’t have any kind of slot right here so we are yelding we are outputting the child content but now the base layout is used as the component right here in the up layout and everything what we see right here will be slot so inside base blade we are going to Output slot the default slot now we save we reload the browser and we see something the homepage actually was recovered and in the footer we also see these four links so two of them is coming from this up blade PHP and the other two link three and four is coming from this index blade PHP okay so so far so good now let’s take care of the login page because the homepage is done we recovered it nice maybe we have we have to adjust couple of things but uh we will do this so now inside the login we have this undefined variable slot because when we open login blade PHP we are using this pay layout as um normal blade file with extend in but we should use this as a component not with extend so I’m going to take out everything thing this main tag let’s delete everything um actually uh we need to delete everything but we have to then later pass this page login as well as the title okay let’s still it everything X base layout and let’s put this main tag inside there now we save we reload the page and the login page was recovered however the CSS class is not added age log l in as well as the title is not given as we want so if we check the page source for login URL or even for home we see there is no title right here uh and then we have this pipe in car selling which is the general name of the website now if we go in base blade PHP we see that we are still yielding title right here okay so this is what I want to change in the base blade we need two variables we need the title and we need the body CSS class and we should we should accept those as attributes as properties of the component so let’s define them right here props we have body class and I’m going to give its default value empty string and we need title as well and I’m going to give it also empty string now right here I want to Output title okay and if we scroll down below right here I want to Output body class we can call this obviously CSS class but we might want to add some CSS class to HTML tag as well for some reason so let’s call this body class now instead of is set we have to change this because it’s going to be always a set is set will always return true instead of is said we can just do if body class exists then then we output the body class inside the class attribute and finally we need end if okay great now we save this we reload the page the resle doesn’t change because we don’t provide these two attributes if we go in the blade login blade PHP now we can provide them right here title is login and body class equals h- login we save we reload the page now here we see login and here we see page login class now if we reload the page we see pading was added to the form around it and also right here we see the login title this is so cool so awesome let’s go on the homepage and we need to do uh the handling of the title right here as well so let’s go into up blade now we know that our base blade accepts two attributes body class and title let’s go in the up blade and we’re going to accept title right here so Props title we can give it default value empty string then whatever title is given to the up blade we are going to pass it to the base layout so because we’re going to pass title as a variable we’re going to use colum right here title equals and then V variable title or the shorthand notation will be dollar sign right here and remove this completely because the attribute name what is defined in the paas layout matches the variable name right here so we save this we reload this and we have to provide the title obviously it doesn’t work because we have to provide this title from the index blade now our app layout also accepts title if we go in the index blade right here we can provide title home page save and reload and here we see homepage uh written so our index blade is passing title attribute to up layout up layout takes that and passes it to Bas layout Bas layout takes the title and renders it right here base layout also takes the body class and if it is available if something was given it is adding it in um in theory if we need to provide body class from up blade as well to the base layout we can also do this as well from here we have to just provide body class equals something we save we reload the page and if we check the page Source we are going to see something right here but obviously we don’t need this so I’m going to Simply remove that all right now let’s define these footer links as a named slot and remove this section and use slots um for the footer links as well so right here inside the footer I am going to uh do the following so so we need these two links link one and Link two let’s remove the section completely okay so we need these two links but we have to Output right here the variable which going to be the name slot let’s call this variable footer links okay however what should happen if this is not defined so in this case uh so let me first leave this let’s do like this footer links and then if we go in the index blade if you scroll down below here is the section we have to change this and we have to use um X slot footer links like this great now let’s take these two links link three and Link four and put this inside let’s remove this section completely now let’s save this and let’s have a look in the browser we reload we don’t see any error which is good and down below we see link three link four then link one and Link two however we want it vice versa so here we have the footer links but we should put these down below right here awesome we reload and now we see correct ordering link 1 2 3 and four however we will have an error if we don’t want to Define these footer links for specific page like if I comment this out and I reload load the page we see an error that we try to Output footer links which which is undefined so in this case we have two options one is that we can check if the footer links is set we can output it only in this case or we can Define this under props so footer links will be an empty string by default now if I save and reload we see nothing simply we uh we have at the bottom link one and Link two but for link three and link four it doesn’t uh print anything it doesn’t print even error now if I uncomment this part the footer links again save and reload we see link three and Link four as well now one last thing what I’m going to do is to change this layouts partials header and create this component as well and use it right here as a component let’s expand the project and here we have these views layouts partials header blade so there are two options how we can do this first is to create class for the component like we created up layout and base layout so if we create for example header um header component and we change the view location for the header component and specify under layouts uh partials right here this is how we can do this is one option second option is to move this header blade into components maybe inside components we can create a folder called layouts and we can move this header right there which is something I prefer I don’t want to create a separate class for the nav bar or any partial U component what I’m going to have in my project so what I’m going to do is to create layouts folder here and then move move this header right there inside layouts components layouts now this partials folder is empty right here which we can delete and in the layouts we have this header blade PHP now if we go into up blade PHP we can change and use this in the following way X layouts do header so this is the component oops it should not be like this so X layout Dot header so this is the component and how we can use that let’s remove this line let’s leave it and let’s reload the page and have a look so layout header it should be layouts header in plural form reload the page and now we see header recovered and now we have everything the whole application is using components the complete layout uh because this doesn’t need any content in between we can change this into self closing tag as well well and this is how we can have [Music] it now it’s time for a small Challenge in a similar way how we transformed login blade PHP from using template inheritance into using component you have to change sign up page in the same way right now if we check sign up page in the browser we see something like this so we have an undefined variable slot and we have to adjust this and we have to make this working in the same way as login page is working okay pause right now spend as much time as you need and then come back and see my [Music] solution okay so here’s my solution let’s open sign up blade PHP and I’m going to delete everything right here and we are going to use x base layout component so the end the closing tag should go right here and we have to provide title to be sign up and we have to provide body class to be sign up page we save and we reload and we see page right there however the CSS class is not applied probably because it should be page- signup and not sign up page and just like this the sign up page is already [Music] working I also have Second Challenge to you in this case we’re going to create new component if we pay attention to login page and sign up page we see they are very similar to each other so we have this logo ipsum right here we have this Google and Facebook we have links right here and if we go on the login page so we see again logo here Google and Facebook and the form part goes right here okay so now I want you to create two components for Google and for Facebook because these buttons are duplicated if we scroll down below we’re going to find this is the Google button and this is the Facebook button okay let’s create a component and use them in the signup play PHP as well as in the login play [Music] PHP okay here is my solution let’s bring up the terminal and I’m going to execute PHP artisan make component Google button and we’re going to provide D- view we don’t want the component class to be generated we only want view file we hit the enter the component create and in the same way I’m going to generate bbfb button so we hit the enter the component created successfully now let’s open Google button blade and we’re going to open Phoebe button blade or FB button blade so in the sign up blade I’m going to grab this button for Facebook and we’re going to put this right here and we’re going to grab this button of Google and put this right here okay so then let’s go right here and we are going to use now the component X Google button and we can use self closing tag right here and xfb button and again we can use self closing take approach and let’s copy these two buttons right now open blade PHP scroll down below and replace these two buttons with these two lines we save and we reload and the result is not changed we still see Google and Facebook buttons and if we go in the sign up page we still see them right here in the future when we actually Implement register or login with Google and Facebook if we need we can add additional props right here we can also add additional props right now for the text or for the image we can also add slots you know all that kind of thing things already you can Implement your own version of Facebook or Google buttons with different props so it’s now up to you right now I’m going to leave this as it is we created reusable component already which is used in two places and this is very [Music] cool I have one last challenge to you we see that sign up blade PHP and login blade PHP are very similar to each other we already observed now I want you to create another layout similar to how we have up layout I want you to create guest layout which will extend from this base layout and you’re going to put all the code which is common for sign up blade PHP as well as login blade PHP inside the new layout so if you pay attention right now the logo right here the car image uh the link right here the link text changes and you can create a named slot for this and the form content obviously changes and you can create default slot for this but other than this form content and this link right here everything stays the same so if we go on the login page we can see we still see logo here we still see car we still see these um Facebook and Google buttons only part is this form and inputs and button in the link right here this is a little bit complicated challenge so I want you to spend as much time as necessary so you might need half an hour 5 minutes or 1 hour the main thing is that you should implement this by yourself okay after spending some time on this if you haven’t implemented or if you have implemented come back and see my solution [Music] okay awesome now let’s see my solution how I would do this first I’m going to create the component PHP artisan make component and let’s call this guest layout awesome so the component was created and the new component file was also created under components guest layout blade I’m going to move this guest layout blade into layouts folder and I’m going to also change rename it and it’s going to be only guest blade PHP now let’s open guest layout PHP class and right here I’m going to change the view layouts guest awesome now let’s open layouts guest blade and we’re going to extend from base layout X base layout however the base layout needs two properties properties it needs title and it needs body class so let’s accept those two properties right here props title let’s assign default Val mty string and body class empty string as well so now we provide title here and we provide body class here with dollar sign so we provide these two variables inside this base layout we need to put something which is common for the login blade as well as the sign up blade now let me copy one of the views content the entire content so let’s get this and let’s put this right here okay so we are already using this base layout so we can delete this line completely cool now inside main let’s format the code inside main what do we have so if we scroll down below we see right here logo this is logo which is common for login as well as for sign up so we are going to leave this inside the layout then right here we have text which is specific to login okay so because this is specific to login we need this to be inside login blade not inside guest blade so that should be part of the login as well as the form the entire form so I’m going to take out the this and right here I’m going to Output the default slot okay now if we go in the login blade I’m going to delete everything and we’re going to use ex guest layout okay and I’m going to paste this login title as well as the entire form obviously we need to provide the title and body class as well so right here we need Title to be login in body class to be page- login and the last thing what we need to take out or create slot is where’s that this is the form I see okay so here inside the form we have this Google button Facebook button and this link okay so this Google button and Facebook button can be part of the layout right and the text what we see right here here that should be named slot so the interpretation can be different so right now we have this ex Google button and x Facebook button um inside the login blade uh which can be theoretically inside the guest layout if we simply close the form right here so we have the form closing tag right here I’m going to delete this and if we close the form right here okay so then what we can do is to take out this part okay and put this back inside guest layout right here okay so this slot will be replaced by the form with the login Button as well as by the title but the Google button as well as the Facebook button will be inside the layout now if we save this and if we check the login page we see the result is actually not changed however this part don’t you have an account this part now is part of the layout okay and what we need to do is to create named slot for that so for this we can create Nam slot for the entire div or we can only create Nam slot right here so for example if we call our named slot um footer link for example then we go in the login blade and right here we can Define x- slot and we give it name footer link okay and we put this right here inside the footer link now we save we reload we still see link right here now let’s create sign up page so here we are going to use we’re going to take out this H1 and we’re going to take out this four like this and we’re going to delete everything and we’re going to use x guest layout then we paste everything here we need to provide title to the sign up page and we call this sign up and we need body class and we need to call this page- signup okay we save this we reload the page we need to go to the sign up page and now we see uh the error footer link because we don’t provide this footer link obviously we can check first of all if the footer link is given or not or we should say that the footer link must always be presented so in this case we don’t have this footer link named slot so let’s provide it x- slot footer link for the sign up page let’s go into let’s expand this form we scroll down below we see we have this button here and the footer link here so what we need to do is again move this form closing tag after the register button right here and this is part of the layout so we can delete this and this text is part of the footer link so we extract this we take out this and we delete this div which is Again part of the layout right here awesome so let’s delete this now we put this footer link information here we save it we reload the page and now let’s have a look already have an account click here to log if we go on login page we see don’t have an account click here to create one so we successfully implemented this name slot for to link and we have different texts for login blade and different text for um sign up plate okay and in the guest layout we have this entire form including the Google and Facebook buttons in the footer link Down Below in the future if we decide to have separate images the car images to be different for the login page and different for the signup page you can create another named slot right here just like we are outputting footer link we can output um image link or image uh element right here okay and then you would Define right here image element slot different for sign up page and different for login [Music] page now I have another challenge to you if you open index blade PHP file from the home folder we’re going to see that we have a lot of duplicated code so this code is related to car item because we have the exact same car item many times we see the exact same HTML code right here the challenge is the following you have to create new component car item component and you have to use this component right here inside the loop but at the moment because we don’t actually have any data related to cars just Create A Primitive for Loop from 1 to 15 and render the exact same car item component 15 times in this case we’re going to have right here only couple of lines but it will render the exact same component multiple times and we won’t have code duplication and in the future when we actually Select Cars from the database we will have an actual data we will slightly modify the component okay as always think a little bit spend the time on this Challenge and then come back and see my [Music] solution all right now let’s see my solution first of all I’m going to bring up the terminal and we’re going to create new component PHP artisan make component car dish item we can create class-based component or viewon component in this case I don’t want class Associated to this component so I’m going to provide right here D- view we hit the enter the component created successfully now let’s go under views components car item blade PHP this is the component let’s open index plate PHP file I’m going to copy single example of car item and put this in the car item blade PHP let’s expand this we see this car item with everything is dummy right now and hardcoded we’re going to modify this later now right here we don’t need this hardcoded HTML anymore so feel free to collapse everything and delete it so let’s collapse everything here we go and I am going to delete all car items from here just like this then we’re going to use for Loop and we’re going to iterate from 1 to 15 so let’s introduce I variable which equals to zero while I is less than 15 we’re going to increase I and obviously we need right here and four and in between the opening directive for four and for closing directive of N4 we are going to use ex car item just like this now we save this and let’s check everything in the browser reload the page let’s scroll down below and we see all car items and it is exactly 15 times now let’s reduce this into 12 and we should see only three lines of car not more just like this reload the page and we see exactly three lines of code now let’s clean up our blade files and remove the content which we created only for learning purposes but we don’t need them in our final project for example these text is something we don’t need also in the footer text we don’t need them let’s open index blade PHP from the home folder and we’re going to remove the following PHP directive we’re going to remove this EX card and we’re going to remove this ex test component as well let’s collapse this Main and we’re going to remove these footer links as well and we’re going to also open up blade PHP layout and we’re going to remove this footer completely now we don’t see if we reload the page we don’t see these text in the header as well as in the footer however there are few more things we’re going to do first let’s open web PHP and let’s add names to this sign up and login rotes let’s provide name for sign up obviously it is going to be sign up and for login it is going to to be loging cool next is we’re going to adjust the CSS files so if we open base layout CSS and JavaScript files more specifically so we have the following CSS file included with a relative URL so if we put slash right here this is going to be absolute URL if we remove the slash this is relative URL meaning that when we create Pages um which will have slash in the URL for example car SLC create when we create the following page which includes the following CSS file because we have the CSS relative the actual request to the CSS file will be like this like this and the following CSS file does not exist so this will give us an error and the CSS will not be loaded in the same way JavaScript will not be loaded so we are going to add slash right here scroll down below and we’re going to add slash right here as well in the next lessons when we create those pages we’re going to see that the CSS and JavaScript is loaded properly now let’s create car controller and render several Pages for this I’m going to open HTML CSS project and here we have a little bit more HTML files than we had previously I updated the project and you’re going to see the updated project if you follow this project basically so let’s open this index HTML and let’s open with the live server and right now at this stage we are going to create the following Pages we’re going to create add new car page in our PHP project we’re going to create my cars page we’re going to also create view car page and we’re going to also create edit car page all right let’s start first with the controller let’s bring up the terminal and we’re going to execute PHP artisan make controller we’re going to call this car controller and then we’re going to provide the flag D- resource let’s hit the enter car controller was created created now let’s open car controller which by default has seven methods so what I’m going to do now Implement those methods and render the corresponding blade files so from here actually let me use multic cursor functionality so I’m going to create cursor right here inside the index then hit the alt on my keyboard and create second cursor right here we’re going to scroll down below I’m going to create create another cursor right here I’m hitting alt whenever I’m clicking now I have three cursors one here second here and third here and in the same way I’m going to click alt and click right here now I have four cursors I’m going to delete this comment and I’m going to return view then we need semicolon right here but inside this view we’re going to provide the actual blade file name so let’s move up and I’m going to copy the function and I’m copying this function using control and shift which select is selects the entire word I have many cursors as you notice so control shift and right arrow and it selects all these four words I’m going to hit contrl and C then come down with this Arrow navigation and right here I’m going to to write car dot and paste all right in the following way of course when you get used to it you’re going to do it much quicker and this gives you possibility to easily Implement four methods car show here we have car create and here we have car index all right we are going to create these blade files but additionally we need one more method which is for search so let’s create new function search and we’re going to return view card. search now let’s create five blade files I’m going to bring up the terminal and we’re going to execute HP artisan make view we need car index we hit the enter next we need car show hit the enter we need car edit we need car create and we need car search okay we created five blade files now let’s open HTML CSS project and we’re going to copy uh HTML content from this project into our blade files let’s start with this add new so let’s move up and we’re going to find this main tag okay I’m going to select this entire main tag now let’s go in our project and find car create so this is this is the blade file which will be responsible for rendering car form and I’m going to paste this main tag right here okay in the same way let’s find my cars let’s find this main tag I’m going to collapse this header and here we have this main tag so I’m going to copy this main tag and open car index blade and I’m going to put this main tag right here and we also need to adjust the layout before I proceed so here instead of D we need X up layout make sure that the closing tag is also X up layout we need to do the same thing for create as well X up layout just like this and and here we need X up layout as well okay awesome let’s continue so inside edit we need pretty much the same um content as inside create plade PHP so let me copy this uh let’s open this edit X up layout X up layout and paste this main right here inside edit we need search as well so let’s open search where is shtml and let’s search for the main tag opening main tag right here let’s copy this and let’s change this into ex up layout and paste the main tag oops I copied something else let’s C copy this again okay it was pasted awesome and the last one is show blade PHP which is view HTML so again let’s search for main tag we are going to copy that and we are going to put this right here let’s change this again into X up layout okay awesome now let’s open web.php and we’re going to Define Roots let’s define this right here and we’re going to Define uh a couple of roots but we are we are going to use the resource type of definition so we’re going to use root resource we’re going to provide car and we’re going to provide car controller right here okay awesome let’s replace this with import I’m going to hit alt and ENT enter hit right here so that car controller was imported okay this is good and that defines as we know seven rules okay additionally we need search as well but we need to Define this search root Above This root so this is important if you define this below this root it is not going to work and I will explain why root get slash car search and then we are going to use car controller uh I think I have to disable this autocomplete this is the um PHP storms built-in autocomplete which if you’re using PHP storm this will work on your computer as well quite probably but I don’t want this aut to complete to um do the things instead of me because we’re going to learn a lot of things so I’m going to disable this quickly this can be actually disabled if we go to settings and then we need to go to um or maybe we can just type enable full line inside editor General code completion here we have this enable full line suggestions uh which actually downloads the models for PHP and couple of other things and it uses the AI so I’m going to disable this because I want to do everything by ourself because we’re going to learn so here I’m using car controller class and we need search method and let’s provide name for it as well this is going to be car. search okay now let me try to explain why this should be defined before this resource because the following line root resource for car defines seven roots in one of them is car to view car for specific ID and the root let’s execute the following common PHP Artisan root column list and we have car search right here and we have car and variable here as well so if this is below the following route then the following rout will always match car search because car this is car whatever and car search obviously is car whatever ever that’s why any any arbitrary string okay that’s why we need to have this car search to find this before the car and the variable whatever or arbitrary string okay awesome now we have these roots defined let’s actually open the browser and we can try to have a look for example car we hit the enter and we see my cars let’s access car create and we see a new car we have also car and specific variable which is car show I think we have car edit in some variable as well or don’t we um let’s open DRS again car ID and then edit my bad car ID and then edit this is again a new car because we have the exact same HTML and finally we have car search which looks like this since we have the controller and Roots defined now let’s update the links to these Pages for example when we click add new it should access car SLC create and in the same way sign up and loging should be implemented as well let’s open pH push Tor we are going to open header header blade PHP let’s um let’s actually we can fix the following as well it has HF SL which is actually correct this always go to goes to slash that’s okay we can leave that here we have this add new HTML and we’re going to change this to the following root root car. create awesome let’s collapse this we have sign up HTML this is going to be root sign up and we have this login HTML which is going to be root at login okay let’s go also into car item and clicking on the car item opens this view HTML and I’m going to change this into root car. show and right now I’m going to provide hardcoded number one but again we’re going to implement this uh correctly in the future so we’re going to save this I think one last thing what I’m going to do is also open index HTML index blade PHP sorry and we’re going to find this uh form not this index we need home slash index blade PHP and we’re going to find this form ex search form let’s open search- form and here we have this action and method which we actually don’t need so let’s open this search form we are going to remove this action and method that was only there for learning purposes awesome and I’m going to change this action into the following root this is going to be car dot search and the method needs to be always get we’re going to implement search with method get now if we open homepage and if I click right here it is going to redirect us to car search passing the C parameters which we don’t have yet implemented but the main thing is that the redirect to the search page works successfully a lot of travel makes it super easy to work with different databases using raw SQL a smooth quer Builder or the eloquent orm currently Lal directly supports five databases it is Maria DB t.3 and above MySQL 5.7 and above post SQL 10.0 and above SQ light 3.35 and above and SQL Server 2017 and above all configurations of the database happens under config database file here we’re going to find the default database connection name which is taken from file we see all the connections configured to sq light MySQL marad DB pgsql SQL Server we have the default migration repository table and we have the radi database as well everything related to database is right here but we control which connection we want to take fromen file the connection right here um is configured for different databases from the I file and let’s open. file we decide which database we want to use for example for DB connection we have provided that we want SQ light if we want to use use MySQL for dbit connection then we can uncomment the following code um we’re going to remove the hashes we’re going to change the DB connection into MySQL and then we’re going to configure the DB host Port database username and password for our MySQL in the same way we can change this into SQL server or uh postra SQL and we have to provide the correct host po database username and password however if we have this as a SQ light we can also provide the database location which by default is taken from database database.sql light however if we provide right here DB underscore database then we can provide a different path to our sqi database which we don’t want in our cas so I’m going to remove this line and our database is located under database.sql light additionally we have also uh option to provide the configuration through the URL for example we can provide right here database uncore URL and right here we can provide the full URL of the database we can provide the driver of the database then we can provide the username and password then we’re going to need Ed symbol here then we need host and port and then we can provide the database using the following URL we can also connect to the desire database okay so in MySQL example this would be MySQL let’s say this username is root the password let’s say it is password the host might be 1 127 001 the port will be 3306 and the database might be LEL or whatever okay we could connect to my SQL in the following way okay I’m going to remove the following codes which you can find under the notes everything uh but we know how to connect to the database and by default we are connected to sq light now let’s explore the existing database which comes with the default installation of LEL for this we need SQ light browser if you follow this with on PHP storm we can use the PHP storms built-in database tool but if you don’t follow on PHP stor I’m going to show you which um which software you can use to open SQ light files and browse it so let’s type in the Google SQ light DB browser the very first link will be DB browser for SQ light this is what we need to um download we can access slash DL and here we have these versions for different operating system um on Windows we can download make sure you download and install okay I already downloaded and installed on my machine so we’re going to open DB browser for SQ light this is opened and now let’s open the database we’re going to click this open database and let’s go to desktop Lal course database and database.sql light hit open and we see the following tables the following indices and we can also browse it so let’s explore the tables so we have the users table which has ID name email email verify date password remember token create that and updated that so we have this SQ light sequence table separately this is necessary for SQ light we have the sessions table with couple of columns user ID for which user the session is opened IP address user address payload last activity which is the uh date we have this password resit tokens table as well for email token and the date we have the migrations which we’re going to talk more about it soon in in in the next lessons we have the jobs and job batches table which is related to uh some background jobs we have the failed jobs which is also related to it and we have cash and cash locks so this is how the default uh structure looks like for the default installation of LEL and all those tables are created um through the migrations which we’re going to talk more about it if you are using PHP storm and you want to explore the database using PHP storm like I’m going to do in most of the cases then you can go into database and double click on this database SQ light file this will bring the following popup it will detect that this is sqlite file you might need to download the driver right here you might have that download driver button once you download it you can click okay and it’s going to mount the database right here and right here you will have this Main and tables and here we have all the tables we observed in the DB browser for SQ light we have these users with all columns we have those SQ light uh master and sequence and sessions and everything basically what we covered generally because I am doing this in PHP storm and I have this database tool integrated inside there it is going to be much quicker for me so I’m going to use the following database tool but whenever if you don’t follow this on PHP storm no worries you can always open TB browser for SQL light and whatever I’m going to do um you can do the same thing in the DB browser for SQ all [Music] right now let’s have a look at the our database schema which uh we need for our project here we have couple of tables and let’s start with the users uh I didn’t add all the columns to the users table because the columns what is already in the users table which comes with the LEL will you should consider that we are not going to touch it okay so we don’t touch them like the name email email verify data and so on here I mentioned the new columns which we need to add to the users table like phone for example Google ID and Facebook ID Google ID and Facebook ID will be necessary for oou for sign up and login with Google in Facebook and I had to provide ID right here because the users table has forign key into other tables so then let’s start with the car types so we’re going to have table for car types and we have only name like if it is Jeep or sports car or SUV and so on we’re going to save that information in the car types we’re going to have also uh fuel types and this is going to be like diesel or gas or hybrid or electric and so on okay we’re going to have makers The Producers like BMW Lexus Toyota and so on and we’re going to have models his corresponding models like Toyota Prius Lexus RX and so on we’re going to have also States list of states and cities because the our application is specific for a single country it is not like a global type of application which don’t have countries okay we have States and obviously there is different interpretation of States into different countries and you can create you can put records in the states table based on your country for USA we all know what it states for Canada um there I I believe they exist all also States but for different countries there are sometimes it is called regions so you can insert insert regions as well and then we have cities for each state so cities has connection to States okay so these are so-called Leaf tables which connects to the main table which is cars table each car will have ID the maker ID model ID the ER the car was released the price V code um millage um we have the car type ID fuel type ID user user ID who added this car we have the city ID where the car is located we have uh address as well which is a free text field we have the phone uh on which the buyers potential buyers should contact to we have the long text description where the seller can write any information we have this published at when the car was published uh when it appeared on the website okay potential sellers can also specify the publish dat to be in the future and the car will automatically appear on the website in the future we have also created it when the car was created updated it when the car was last updated and the deleted at if the car is deleted when it was deleted for each car we have also car images we have the ID of the image we have the car ID for which car the image exists we have the image path and we have the position as well and if we scroll up we also have favorite cars each user will have many cars in its favorite list so cars and users have many to many connection like one user has many cars in favorite list and one car might be added by many users into favorites all right I think we covered almost everything here we have the car features and car features and cars have one to one connections so these are just Boolean features whether the car has abs air conditioning power windows power door locks and so on you can Define if you want to customize this project which I really encourage you uh you can add as many features right here as you want or you can remove the features if you don’t want but for now I recommend to follow the course as I’m explaining with all the exact same fields and um then when you finish the project you can add additional features you can remove the features you don’t need and you can improve the project as you [Music] need Lal migration is a way to manage and Version Control your database schema think of it like a versioned blueprint for your database it allows you to Define the structure of your database tables like columns and the data types inside your code with migrations you can easily create modify and share database changes with your team when you run a migration Lal applies these changes to your database this helps keep your database structure consistent and makes it easy to roll back changes if something goes wrong migration are typically located under database migrations [Music] folder now let’s open the very first migration from the migrations folder but before I open it let’s understand the pattern of the name of the migration file the file name consists of a time stamp followed by a descriptive name of the migration the time stamp is the following right now which is set to 0000 1 0 1 0 1 and bunch of zeros right here so this specifies to year month day and the time stamp of the current time then we have this descriptive name the time Stamps will ensure that migrations are going to run in the correct order so in our case first this is the migration which should be executed then this migration will be executed then this migration will be executed and when we create more migrations we’re going to see that it has a different and the current time stamp right here now let’s open the very first migration create users table I’m going to call up the left side it has the following structure every migration file extends the migration class and it has Anonymous class inside this Anonymous class has two two methods up and down the up method defines the changes which will be applied to the database such as creating or modifying tables the method uses lal’s schema Builder to define the schema changes such as creating tables in our case the down method reverts the changes made in the app method providing a way to roll back the migration this method undos the changes like dropping the table which was created using up method we’re going to learn how to create migrations but this is the general idea so the name of the migration the class which is an anonymous class extending the migration we have up and down methods now let’s explore each migration which comes with the default installation of Flavel in more details let’s expand this up and we see that we are creating users table providing ID string name email which must be unique we provide the Tim stamp email verify dat which can be also null we provide the password we provide the remember token and the timestamps such as created at and updated at we also create second table which is password reset tokens table which has email which is a primary key of the table it has a token and it has timestamp created at which can be null and there is a third table sessions which has ID as a string and primary key we have the foring ID which relates to users and the foring ID can actually be null because if there’s a guest user the user ID will be null because the session is created for the guest user there’s also index added on the foring ID we also have IP address which can be also n we have the text user agent which can be also null we have the long Tex some payload of the session and we have the integer last activity which also has index let’s explore other migrations like create cach table and create jobs table let’s open this create cache table first it creates the following tables with um string key with value and the expiration date of the cache and we have cach locks as well with key owner and expiration as well and in the jobs table it creates three tables the jobs table with its own columns it creates job batches table and it creates failed jobs table as well and all these tables are available when whenever we execute whenever we create new project basically which behind the scene executes the might migrations it creates all these tables right here now let’s get familiar with the migrate Artisan comment for this we’re going to open the terminal and I’m going to execute PHP Artisan list migrate this will give me all the available commments for the migrate Nam space and we have few of them like my mate fresh which drops all tables and reruns all the migrations migrate install which creates the migration repository we have the uh migrate refresh which resets and reruns all the migrations basically the difference between this refresh and fresh is that fresh drops all tables and then reruns migrations but refresh executes down methods uh in the reverse order it reverts all the migrations and then re reruns them we have reset as well which simply reverts uh roll backs all the database migration so this executes only down methods in the corresponding order we have roll back as well to roll back the last database migration and we have the migrate status as well which shows the status of each migration okay let’s explore these Commons PHP Artisan migrate colon status we hit the enter and we have the following status so we have three migrations in our project and all of them have the status of Ren now let’s execute PHP Artisan migrate colum fresh hit the enter let’s scroll up to see the result dropping all the tables which will stand preparing the database creating migration table and then running the migrations now let’s execute PHP Artisan migrate refresh we hit the enter let’s have a look so it is rolling back the migrations I mean calling down for each of the migration in the reverse order first it is calling down for jobs then for cash then for users and then running migrations first for users for cash and for jobs so if you want to execute any specific commment from this migrate namespace you can first execute this um PHP Artisan list migrate to have a look at the commons for the migrate namespace and then you can easily use it again let’s execute PHP Artisan migrate um resette for example with the enter it roll backs all the migrations and now if I open the database reload it we don’t have those tables we have only only these core tables which is necessary for our project uh in any case like the migrations table SQ light master and sqq light sequence as well now let’s apply our migrations PHP Artisan migrate which will simply execute all unapplied migrations we hit the enter and it run those three migrations and now we can reload the database and we can see those um tables so in the same way if you are using DB browser for SQ light you can um reopen the database if you execute reset for example I just executed PHP Artisan migrate reset then you can close this database and reopen it and you’re going to see updated tables right here so every time you make some changes um you can execute migrate for example you can close this or directly reopen the same database in you’re going to see all updates so this is how you can kind of refresh the database in your DB browser before we create our first migration let’s first update the existing create users table migration because we need to add couple of columns to the users table according to our schema so we need to add phone Google ID and Facebook ID all right let’s duplicate this string email and change this into phone and we’re going to make this with the length of 45 and we’re going to make it also unique but we’re going to make it also nullable because the users registered through Google or Facebook uh they will not have phone numbers Okay Google or Facebook will not provide it and we’re going to make this nullable for that reason uh then we need to Define Google ID with a length of 45 and we’re going to make it nullable as well and next we need Facebook ID which is going to be nullable as well because the users registered with normal sign up form not with Google not with Facebook they will not have Google ID or Facebook ID inside the user table that’s why we’re going to make them nullable now since we have the those columns defined we are going to execute migrations let’s open the terminal and we’re going to execute PHP Artisan migrate fresh so that we’re going to drop all the tables reapply them so that users will have those new columns we hit the enter the tables were dropped reapplied let’s open the database refresh it and we see right here users which has phone Google ID and and Facebook ID columns as [Music] well now let’s create our first migration and the first table we’re going to create is going to be car types table let’s execute the following Artisan commment PHP artisan make migration and we’re going to provide the migration file name create underscore car types uncore table there’s a convention that you should whenever you’re creating new table you should call your migration file create your table name underscore table this is exactly what I’m going to do right now hit the enter and it created the following migration file now let’s open this create car types table here we see this and pay attention to the Tim stamp so this is the current time when the migration file was generated let’s double click and open this and it also has create table create command inside up method and inside down method it has drop uh command as well whenever you name your migration file in the following way create your table name table Lal will automatically generate the following code with the table name and with these ID and Tim stamps columns okay this is awesome now let’s actually provide the content so if we have a look in the picture of our schema for car types we have only name which is varar 45 characters okay so we don’t need this time stamps which is actually created at and updated at columns we’re going to remove this and on table we’re going to call St string name we can provide the second argument 45 as a length and it must be required so just like this we have created our first migration for car types now let’s create the second one for fuel types as well PHP artisan make migration create fuel underscore types table we hit the enter the migration was created let’s open it and let’s remove this time stamps we provide table string um let’s provide name with 45 as well so if we check fuel types which we have um right here it also has name as an only column except ID which has varar of 45 okay we just created two new migrations in now we can execute [Music] them let’s bring up the terminal and first I’m going to execute status commment phpr artison migrate status and this shows us that three migrations files are executed but two of them are pending and these are the migrations we created create car types table and fuel types table as well we can execute these migrations using PHP Artisan migrate as we already covered it but we can also pretend the migration run and print the actual SQL statement which will be generated using the following comment PHP Artisan migrate d d uh pretend we hit the enter and now pay attention running migrations so this is the first migration and here is the SQL code generated create table car types ID integer primary key Auto increment not null name varart not null okay depending on which database you you are using the generated code might be slightly different for um MySQL it might be slightly different uh for sqlite this is how it looks like for mssql it might be slightly different and this is the power of LEL it is database agnostic so we write the following methods and larel knows based on the database connection how to generate the code for the specific database that is very cool now let’s execute PHP Artisan migrate hit the enter two migration files were applied and if we check the database reload Lo it we’re going to see car types table right here and fuel types table as well and again if you’re using DB browser you can click open database again double click on it it’s going to refresh it and we see car types and fuel types with idend name columns right here as well now let’s keep creating more migrations for our project and let’s create maker table and model table and also States table and Ci’s table let’s bring up the terminal and execute PHP artisan make migration create makers table we hit the enter let’s execute create models table we hit the enter next create States table and create CTS table so we created four new migration files let’s go into database migrations we had previously these two now we have four more and the time stamps are very close to each other as you see so this is the current seconds okay let’s open this create makers table actually we’re going to open all four and we’re going to provide the content uh um starting from the makers so the makers need ID and if we have a look again in our database schema it only needs name nothing else so we don’t need time stamps on table we need string name with a length of 45 that’s it that’s all what we need in the makers so we can close this makers table and the down basically is ready by L so it simply drops the makers table so we can close this makers uh now this models is a little bit interesting so the models table has maker ID as well this is a new type of column it is a foring key type of column okay so let’s delete the time stamps and first let’s define string name with a length of 45 cool now here let’s define this maker ID on table we’re going to call foring ID method okay we provide the local column name which is maker ID and we provide using which table the uh following column is constrained so there’s a constrained method and we have to provide the table name like makers in our case so the following line creates a new column inside models table calling maker ID defines the foring key onto make makers table um maker table’s primary key okay so lot ofel knows that there is ID primary key inside maker table and it creates this maker ID of the model table to connect to maker uh tables ID column this is cool so we created these modules now let’s do something similar for States we need only name string name with the length of 45 inside States and inside cities we need string name with the length of 45 but we also need Bing ID and this is going to be state ID which has constrain on States table okay cool we Define four new migration files let’s close all of them let’s bring up the terminal I’m going to clear this up and let’s first execute PHP Artisan migrate column status we see four of them is about to be executed and then we can execute phpr design migrate hit the enter all four we are executed and we can reload the table and we see cities we see States we see models and we see makers now let’s keep working and now let’s create two more migrations one for car stable and second for car featur table and those two uh tables have most of the columns cars table and car features table okay let’s go with it PHP artisan make migration create cars table we hit the enter and second is going to be create car features table okay awesome let’s open create cars table in car features table as well let’s start with a create cars table okay what Fields do we need inside cars table so we need ID which is there we need maker ID in modu ID which will be foring keys so let’s define right here foring ID maker ID which will be constrained by maker table okay let’s duplicate this line and let’s change this model ID which will be constrained by models table next we need Y and price which will be integer values okay so on table uh we’re going to call integer y let’s duplicate this and integer rice next we have VIN code which will be varart 255 and Mage which is going to be also integer so let’s duplicate this and let’s create first millage and then right here we need string Vin which will be 255 with the length of 255 by default it is also 255 if you hit control on your keyboard and hit Mouse on the string method you’re going to see that it has length null but then this length is taken from this Builder default string length and if we follow this we’re going to find out that by default it is also 255 so we can actually close this and we can delete this to 55 but I actually like this to be explicitly visible that the length of V code is um the maximum is 255 actually the the in practice the wi code is 17 characters so we can set this into 17 but because we are using actually varart it doesn’t really hard so we can leave this to 55 okay then we have um after millage we have a car type ID fuel type ID user ID and CT all will be foring IDs so we create uh car t type ID which will be constrained by car type stable let’s duplicate this three more times so this is going to be fuel type ID constrained by Fuel types table this is going to be user ID constrained by users table and this is going to be CTI ID constrained by CTS table next we have address and phone let’s provide string right here address 255 and let’s duplicate it and second will be phone with 45 characters after phone we have this long text description and then we have time stamp so on table let’s call long text description but whatever is nullable we have to provide to be nullable as well like the description is nullable so right here we have to provide nullable column nullable method as well so this is the description next we need Tim stamp Tim stamp of published at which also should be nullable after description we have a publish dat and then we have this created at and updated at time stamps right here and this if uh we hit control again and click on the time stamps we’re going to see that it creates these two columns and both of them are nullable actually so this is fine and after these Tim stamps we need another Tim stamp which is going to be deleted at column okay so we we defined all the columns for our car table now let’s open create car features table and provide the content for it so here we have all of them are uh tiny integer type of um columns um the same as Boolean basically uh so we have to provide Boolean right here which will be inter interpreted into tiny integer so we need Boolean right here that uh needs to be abs and we can provide the default value to be zero okay so when we provide Boolean LL will automatically convert this into tiny integer because our database uh sqi does not support Boolean so it supports tiny integer but if your database uh supports Boolean such as for example post SQL then the column would be created as Boolean column now let’s duplicate this um couple of times uh because the format is the same for every column we just have to provide the names like ear conditioning power windows air conditioning then we have power windows we have power door locks power door locks we have cruise control Bluetooth connectivity cruise control Bluetooth connectivity next we have this remote start in GPS navigation we’re going to duplicate this few more times remote start GPS GPS navigation we have heater heater seats it’s called heater seats uh heater maybe it’s a typo so it should be heated heated seats uh then we have climate control climate control and we have two more it’s a rear parking sensors and sensors and the last one should be uh leather seats and finally our car features table does not have ID it has car ID based on the schema and it has the relation to the car table based on the car ID so it has one to one relation so here what we are going to do instead of defining ID I’m going to provide unsigned big integer provide the car ID and make it as primary key okay so we actually don’t Define the constraint like we defined for other relations but we have the car ID and then later on the model level we are going to implement the relation between the car features and cars uh tables so this is how we’re going to have it and we also don’t need time stamps on the car features so we are going to remove it as well okay just like this we Define these car features now we save it and we can execute migrations PHP Artisan migrate we hit the enter these two tables we are created and again we can check them right here cars and car [Music] features now let’s learn how to roll back our migrations for for this first open migrations table and observe the content of it so in DB browser let’s reopen the database so that it should be refreshed then on migrations we can right click in browse table so this gives us the same content and we just need to understand how the content looks like so here we have this migration table name and we have the pitch as well okay I prefer to have a look in the PHP storm so I’m going to open this PHP storm so this bch means uh that the migrations which we are run together they were grouped in a single batch so these first three migrations which comes with LEL we executed together so they were are in the first batch then these two what we created are in the second batch then these four tables are in the third batch and these two tables are in the fourth batch okay so this indicates that the migrations are executed if I delete for example these two lines and then try to execute migrations again a lot of will try to execute the migrations but because the tables already exist in the database we are going to have an error problem right so I’m not going to do this but you can try to do it so what I want to show you how you can R roll back the migrations HP Artis on Migrate colon roll back we hit the enter and the last uh two migrations last batch was basically uh rolled back and if we check right now if we check right now migrations table we don’t see last two tables right here so the last was actually rolled back okay so we can reexecute it obviously phpr design migrate and they will be reapplied if we want to roll back certain number of steps we can provide dash dash steps in roll back D Dash steps right here and let’s provide three for example we hit the enter uh actually it should be step not Steps step d d step equals three we hit hit the enter and last three migrations we are rolled back so let’s reexecute them so in the same way if we want to roll back specific number of patches like uh patches or pch in a singular form PCH equals two it is going to roll back last two batches so this is uh because we actually did a roll back and then we executed migrate again now these three um migrate migration files are in the same batch and these three are in the same bch so if we roll back last two batches these six migrations will will be rolled back so we can hit the enter and we’re going to see uh bch equals 2 create fuel type table create car type table okay what just happened oh excuse me um when we provide the batch not excuse me uh when we provide the batch it actually roll back specific batch not the last couple of batches but specific batch so in our case because we provided bch equals 2 we rolled back the second badge which was create car type stable and fuel type stable okay this is how it works okay now let’s execute my great again and those two tables would be applied again if and if I reload they will have now higher bch right here higher uh pitch number okay and just like we can pretend running migrations we can also pretend rolling back migrations like pretend hit the enter and it’s going to generate the SQL codes if it is like um rolling back the last bch migrations like create fuel types and create car types table okay so I think this is pretty cool and we can also execute um refresh with Das Das step like I want to roll back and then reapply last three migrations for example we hit the enter it’s going to roll back and reply last three steps and obviously which we already covered we can simply reapply um this refresh or fresh which will drop everything reapply it which is exactly what happened right now and if we open this migrations table again now we see the ID starts from one this is because all tables were dropped and also ID started from uh one the auto increment and every migration is executed in a single batch [Music] last two tables for which we don’t have migrations are car images table and favorite cars table for all the others we already generated migrations now you have a challenge and you probably guessed what is a challenge you have to create migrations for these two tables favorite cars and car images you can do it in your desired order however I recommend to maybe first create C images because we have just created cars and car features and then you can create favorite car stable but again the ordering doesn’t matter you can do it as as you as you prefer okay so pause right now create these migrations also implement the code uh for for these migrations implement the app method of uh migrations for these two tables and then and you can come back and see my [Music] solution okay so here’s my solution PHP Artisan migrate uh excuse me make migration create car images table we created the first migration second is create favorite cars table we hit the enter both we are created now let’s open create car images table and we are going to Define uh table ring ID car ID which is constrained by cars so car images table has relation to cars so this is how it should be and also this table has string string um image path which should be 255 this table also has position which should be integer so we provide integer position and the table does not need time stamp so we can remove it and let’s check the schema so car ID image path and position integer which is correct next we have this uh favorite cars let’s open it and we have two foring IDs table foring ID car ID which is constrained by cars table and the second is going to be user ID which will be constrained by users all right so we save it let’s bring up the terminal PHP Artisan migrate hit the enter the migrations we are applied we can check the database we see car images and we see favorite cars as well and we are going to see them in DB browser for SQ light as well uh this is the browse data for um specific table but we need the database structure we see favorite cars and car images eloquent orm or object relational mapping is lal’s built-in library that allows developers to interact with databases using PHP objects rather than writing row SQL cues each database table has a corresponding so-called model that is used to interact with the that specific table eloquent provides a simple and intuitive active record implementation for working with database including methods for common crud create read update and delete operations it also supports relationships allowing you to Define and work with the associations between different database tables eloquent simplifies data manipulation and retrieval making database interactions more readable and maintainable eloquent models are located under app models directory and they typically extend the eloquent model class so the user model is a specific class which extends the following class illuminate Foundation out user but if we expand this out user it finally extends this modu class and when we generate new eloquent model classes we are going to see that all of them extend from illuminate database eloquent model class the following [Music] class now let’s open the terminal and try to generate new model class for this we’re going to execute the following Artisan comment PHP artisan make model and we have to provide the model name I’m going to provide fuel type in Pascal case naming uppercase F and uppercase t so when we hit the enter it generated the model file which is located under app models fuel type we also have possibility to generate migration and controller alongside with the model so if I open up moduls and I delete this fuel type and reexecute PHP artisan make model fuel type by provide DH m flag to generate migration alongside with a fuel type we can also optionally provide c as well to generate controller we hit the enter and it generated three files the model file the migration file and the controller file now let’s have a look under database migrations let’s open this create fuel types table and as you see it generates the proper code to create the table fuel types if we don’t have fuel types table this would be awesome this would be exactly what we want but we already have migration so we don’t want the migration also we don’t plan to manage the fuel types from from the user interface so we don’t need the fuel type controller as well so I’m going to delete all three files and let’s generate just the model PHP artisan make model fuel type hit the enter and the model was generated if you want to see information about the model we’re going to execute PHP Artisan model colum show and we provide the module name such as fuel type in our case we hit the enter and it give us a every information about the model such as what’s the model class name what database it connects to what is its corresponding table name fuel types what attributes it has and what relations and what observers it has now if you open fuel type model the class looks like this it extends illuminate database eloquent model and it is a very simple class and it has only one trade has Factory we don’t specify what table the model has mapping into the database by default laravel considers the table name of the class to be snake case version of the class name but in plural form for fuel type laravel assumes that the table name is fuel lowercase underscore types in plural form okay if the model name is car LEL will assume that the table name will be cars if the model name is car image Lal will assume that the table name is car images with underscore and if the model name is TV uh remote controller for example the the table name will be tvcore remote uncore controllers in plural for so this is how Lal defines uh what’s going to be the corresponding table for the model however we always have ability to provide custom table name so for example here we can provide protected property called table and we provide a different name such as car under _ fuelcore types okay and now if we execute PHP Artisan model colum show fuel type we hit the enter we see the information that this this model maps to car fuel types but we don’t see anything in the attributes because that model that table excuse me that table car fuel types table does not exist in the database okay so in our specific case we don’t need to customize the table name however this is how you can do it okay so I’m going to comment this out sometimes there are cases that you want to customize the primary key by default Lille assumes that the primary key of the table is going to be ID okay however if we override protected primary key camel case uh property and we provide something different such as fuel type ID for example then Lal will assume that there’s a column inside fuel types table which is called fuel type ID and this is the primary key of the fuel types table okay so this is commented out let me remove it and if it is removed LEL assumes that the table name is fuel types and the primary key is fuel type ID okay this is something also we don’t need and we are not going to need in our project so I’m going to remove it and all the nodes you can find under the video as well or maybe I can leave it and comment it out just like this okay if you want to disable auto incrementing of the primary key then you can provide public uh incrementing property and set it into false so this will disable Auto incrementing feature sometimes if you want to um change the primary key type from number into string you can provide key type equals string right here by default the key type is going to be integer and always always the primary keys will be integers if if uh the primary key is not defined to be a string inside the migration okay but in our case uh we have all primary keys to be numbers so their actual values will be also numbers but if we provide key type to a string even though the fuel types um in the database has the integer right here when we select the data through models the value of the ID will be string again again this is something we don’t need we can comment this part out as well and we can put this on next to each other okay there are cases when we want when we don’t have time stamps such as created it and updated it on our models and this is exactly on our case we can disable those time stamps by providing time stamps equals false this is something we are going to need because our fuel types table does not have time stamps such as created dat and updated dat in the database cool if you want to customize the created it and updated it column names you can provide constants const created it um and the column name right here such as create date for example in the same way we can provide second constant which would be updated a equals such as update date for example and Lal will assume that there exists create date and update date columns in the database of course if the time stamp is not disabled so in this case I’m just giving this information for you to learn what is possible through models or how you can customize it okay but we are going to then go back to what actually is necessary for our project okay and finally if we have only create date on our model and we don’t have update date we can simply set the updated at to be null which means that we’re disabling the update updated eight column and we can leave this create we can completely remove it and it means that the there exists created at column inside this database table but there is no updated Ed column okay so again this is all for learning purposes so we can comment this out as well but what we definitely need is Tim stamps false because we don’t have created it and updated eight columns into um our table now let’s generate remaining models for our project we have a bunch of them to generate so let’s execute PHP artisan make model uh car type is one of the models we want to generate uh let’s generate maker let’s generate model let’s generate state city car car car features car images and um favorite cars is something which we actually don’t need to generate so that is all we can clear this up now let’s open model class and we have to fix something okay because by default the template uses the following illuminate database eloquent model class now we have two model classes in this file and we have to we have to fix that so let’s give alas to the imported model class as a Lo quent model and then take this and extend right here okay great now our model is fixed the next thing what I’m going to do is let’s go into car model and I’m going to use second trait which is called Soft deletes whenever our database table has deleted at column just like our cars table has right here okay deleted that column then we have to add soft deletes trade into our car and whenever you use soft delites make sure that the following import is also added under use okay this soft deletes manages that automatically for us whenever we call delete on the car model instance it is not going to actually create uh sorry it is not going to actually delete it from the database but it is going to set deleted at column into the database so this is something we need to add [Music] if we open car controller um in methods like show and edit for example and in um update and in Destroy as well so we have string ID which is assumed to be the ID of the car however Lal supports soall it Road model binding so right here instead of accepting string we can try to accept an instance of the car model which we just generated okay let’s hit the enter make sure that the car model is imported at the top awesome and then instead of ID we can call this ID obviously but uh more relevant will be to call this car so we expect right here an instance of the car and whenever there is an ID in the URL LEL will select based on the ID will select the car and provide an instance of the car model right here in this model in this method and this makes it very easy so we already have an instance of the car a record of the database converted into an object okay and in the same way right here let’s change and accept car inside edit we need to accept car here as well and in Destroy as well instance of the car awesome we don’t yet have any records in the database but we’re going to leave it like this because uh this is how we’re going to have finally okay also when we are generating Roots such as if we open car item for example we have right here root car show whenever we implement this component uh we will have an instance of the car okay and we can provide an instance of the car right here and LEL will take the primary key of this car and provide it in the route so this is going to also work I have to return this into one because we don’t have an instance of the car at the moment but because we are talking about uh Road model binding uh I had to mention this part as well but I’m going to leave these parts because whenever we actually have cars in the database then we will get instance of these cars right [Music] here we disabled time stamps on fuel types but there are bunch of models for which we also need to disable time stamps the only table which has time stamps is cars table if we have a look again again into database schema image we don’t have created that or updated it columns in any of the tables except the cars table so we’re going to leave them on the cars but disable for every other model now let’s start with the car features um we can actually open all of them then I’m going to collapse the left side and we can start from here on maker we have to disable it time stamps equals false then on model we can say time STS equals false let me actually duplicate uh or copy this code on States we have to disable on car features we have to disable on uh car images we have to disable on car types we have to uh disable then we have City we have to disable as well and I think we are done so so we did on all models we disabled the time stamps the only model for which we need is the car model now we’re going to move further and we want to insert some data manually in the database so that we can start reading that data and then obviously we’re going to learn how to insert that data uh through code uh through our modules okay so first let’s open DB browser and I’m going to show how you can do this in DB browser and then I’m going to do this in PHP store let’s refresh the database and let’s open fuel types let’s browse fuel uh types table we have to click the following plus button to create new records and I’m going to create like four records and I’m going to type guess right here we hit apply then we have uh diesel basically I’m not going to do this for all the tables just I’m showing to you how you can do it so in in a DB browser if you are not familiar with it electric and finally um hybrid Okay click on apply and the records we are inserted inside the fuel types table and in the same way we’re going to insert records into other tables now let’s open PHP stor and I’m going to open the database uh fuel types and we don’t see them because I think we have not saved the file we’re going to click on file and write changes okay this will affect the changes into the database file and if I reload right now into fuel time y we’re going to see those uh Records right here okay now let me open car types and I’m going to click plus sign couple of times and let’s insert sedan right here then we have hchb for example then we have SUV and for example we have Jeep just couple of them will be enough then I hit control and enter to save everything now let’s open open makers and let’s create two records Toyota and second Fort hit the enter Then control and enter and it’s going to submit that let’s open modules and create four models okay uh two of them for the maker ID one which is Toyota Let It Be Camry for example and cor Corolla and then we have like F150 and escape and provide maker ID too okay we save it uh next we’re going to open States and create like two states for example California and New York okay then Open Cities and create uh four cities two of them with state ID one two of them with state ID 2 we have to provide Los Angeles here we provide s franisco uh franisco like this then we provide New York and let’s provide Buffalo okay and I’m going to create also one user okay let’s provide uh John John at example.com let’s provide some dammy phone number email verify dat I’m going to leave this empty password I’m going to leave it empty or it is required I cannot make it empty so let’s just provide one to three I don’t care the password um the Google ID Facebook ID I’m going to leave them now remember token created it and updated it I can leave them now as well so and finally I’m going to create a couple of cars and let’s create like four cars uh maker ID one one two two one two three and four then we have y we can provide something and 200 and um 20 20 anything doesn’t matter okay let’s provide different 2015 okay for the price is let’s provide 10,000 20 30 and 40 okay for win we can just provide one two three and four um it should be 17 characters but uh we are just testing right now okay it does doesn’t matter for the mid AG as well we can just provide one two three and four we are testing car type ID maybe 1 two 3 and four one two three and four user ID for all of them will be one city ID 1 2 3 and four uh for address we can provide test for all of them for phone we can provide 1 2 3 4 5 six and I think that’s it and we can also provide the published but let me save everything so far uh cars deleted it oops I made a mistake the deleted at should be null I made it required okay let’s open the migration file create cars table and we’re going to make this deleted at nullable and in ideal case we have to execute PHP artisan migrate freshh or refresh but this is going to drop all the tables and reapply migrations and it’s going to work but because we already create some records inside car types and inside uh fuel types and so on I don’t want to lose that data because if I execute migrate fresh or migrate refresh we’re going to lose that data this is something I don’t want so I already changed the migration the next next time if I decide to execute PHP migrate fresh or refresh it is going to create the deleted a column to be nullable but right now I’m going to fix that column manually from here right click modify column and I’m going to turn off this checkbox not now okay create table uh it is going to actually do the following code behind but I don’t care okay this is this is the code it is going to generate I can copy this code click okay now it uh did the following code behind what described finally I have cars table which has um the deleted that column to be knowable if you are doing the same thing in using DB browser okay inside cars uh we have this modify table and you can find that deleted add column which is not null but if we just refresh double click then if we click uh and modify table it should be knowable because we updated this from PHP storm but basically you have to turn this off and on from DB browser okay awesome now let’s uh create these four records um one two actually one one two and two one two three and four uh let me actually duplicate the same thing for ER price for fee Mage car type ID field type ID user ID will be now for all of them CT 1234 address we can provide test and phone from 1234 again and that is all let’s click on submit and it creates four cars we can provide uh the current date as well which will be published at date uh okay like this awesome so we created the data now let’s open Home controller and here we have this index method which is rendered in the browser right on the homepage and now let’s try to select the data right here so cars equals we’re going to use now car model app models and make sure it is imported every time when we are using it and then I’m going to call get which will simply select all the cars available in the database okay so let’s dump this information let’s print that information for this we have a couple of options one of them is dump and let’s provide these cars right here let’s save it and reload the page and we can see right here there are four items into this collection okay and all of them are instances of up models car and if we expand it inside attributes we’re going to see the data that data is ID maker ID module ID and so on the data what we just created into the database okay awesome so this selects all cars select all cars now let’s select specific cars like the cars which are published for example okay let’s say we don’t want unpublished cars to be displayed on the homepage for this select published cars for this we’re going to do the following on car we are going to call method called we the first argument of the Weir method is the column name like published the second argument is the value actually our model is called published it right and the second argument is the actual value so if our column would be like published Boolean type of column then then we could provide right here true or one but because our column is published at column we have to find all the cars which has a non null value inside published eight for this we can use uh the following operator exclamation equals does not equal and we have to provide null right here so basically this we function is multi-purpose function we can provide two arguments right here which means that uh the published at should be equal something whatever we provide but if we provide three arguments it means that publish dat does not equal to null and after that we can call get okay let’s actually dump this information and it’s going to print four cars because all cars have publish it value but if we open it and change for example on the first one I’m going to set the published that value to be null okay then we have three published cars then if we open the browser reload the page we are going to see array with length of three so we totally see three cars which are published if I said n again on the second one and then reload the page now we see two cars right right here okay if we want to only select the first car let’s do like this select the first car then we have to do the following we can call we if we want or not where where is optional in this case uh for example published it does not equal to null and this then this is the most important one then we are going to call first okay we just want the first object based on the following condition and in this case we can print car which will be an actual model up model’s car instance and it has its own attributes so this is the first car which is published with ID3 so this is pretty cool obviously if we don’t want to provide this we published at we can directly call First and this is going to select the first available car and it will probably have the ID one because we are not filtering by published column however there exists simplified version if you want to select the car based on the ID for example car find and provide the specific ID for example two and in this case we can print it and we’re going to see that the car right here will be the car which has say id2 let’s reload the page expand it car with id2 if we want to sort cars by specific column we can use also order by let me comment out these things and later I’m going to remove but I’m going to also leave these under the lesson or inside the source code so let’s comment this part let’s say I want to sort cars by created it created it in descending order or maybe published at in descending order and then we’re going to call get on this now let’s adjust the published Ed column into the database like all of them are the same let’s set this to be 10 for example oops I mistaken we type dot right there let’s Pro provide right here to be 12 oops okay here we need 12 well it provides the time stamps for some reason uh I mean the visibility is for the time stamps which is something I don’t want uh let’s change these minutes maybe 50 let me do this from DB browser for SQ light or cars browse and we need to go to the right side we provide different time 50 right here uh let’s provide 51 here maybe 52 here and and this is going to be 53 okay and let’s save everything uh write changes uh if I reload right here the changes have been applied now we’re printing we’re selecting cars and printing those cars with published at descending order now if I reload we see actually this should be order by excuse me order bu reload the page now we see four elements right here and if we expand the first one is with id4 and that one has the highest publish date okay the next one with highest published at date uh is which has the ID3 okay the next one is which has probably ID 2 and the ID one okay this is um how we can sort the cars by published at column if you want to limit meet the cars by specific criteria for example if we want to only select two cars then we can use this limit function and obviously we don’t need order by we can provide order by but we don’t also it is not necessary we can just provide cars limit to and it’s going to always select the two cars okay and we can also use the combination of all these properties like uh we can provide uh let me duplicate copy this part where uh the publish dat is not null then we can call um something some another we close for example we uh user ID equals to one then we can provide order by as well we can provide limit and finally we can call get only so we can do all this combination now I save reload it is returning two cars and all the Weir Clauses are actually um correct so if I provide we user ID equals 2 it is not going to return anything because there are no cars for the user ID 2 but there are cars for the user ID one in the database and just like this instead of writing row sqls we can write any select any ques with the following methods on every model of course this is not specific to car we can call these methods on every eloquent model now I’m going to comment out this part and let’s see how we can insert the data into the database let’s scroll up a little bit and let’s say that we want to insert a new car in the database for this we have to create an instance of the car model using new car like this then on the car we can provide each properties individually so I’m going to copy the columns what we have in the database so that I don’t have to type them manually and let’s duplicate this many many times like this then I’m going to use multic cursor and I’m going to paste um these columns from the database and then we have to provide some values for each column like let’s just type one there so make maker ID one model ID one y we can provide whatever uh we can provide price one to three we can provide the VIN code to be one to3 millage something one to three car type ID one fuel type ID one we can provide the user ID uh everything so the address should be string we can leave it integer but we can provide string as well like some lurm Ipson for example we can provide the phone to be string as well the description should be a very large string or we can leave it also empty because it is actually nullable inside the published at uh we can provide the current date or we can leave it null as well if we provide the current date we can provide the Now function right here and created it can be now as well or it is going to be automatically provided automatically set by eloquent so we actually don’t even need to set any values to create it and update it so I’m going to remove them delete them and then on the car I can call Save okay before I call this in the database of the car table we have four cars now let’s open the browser and reload it and we don’t see any error which means that the code what we have in the home controller actually worked now let’s open cars table and we see one more record right here and here we see the data what we just provided so it is as simple as that to work with the eloquent models to save the data there are cases when you have the data in the form of associative array from which we want to create the data um record in the database okay let’s say that our data looks like this uh let’s put a comma right here oops okay so I’m going to comment out the above part creating car in the following way and then down below we have the following car data okay and let’s say that we want to create record out of it we can call Car colon colon create providing that car data which will create the record in the database and return just created record so finally here we’re going to have just created car okay which is pretty cool the second approach like this is the um approach one second approach is to approach two is to actually first create the instance of the car car let’s call it Car 2 equals new car then on Car 2 we can call F so we want to fill the car 2 with the car data so this will populate all the properties of the Car 2 model and then once we call this um field then on Car 2 we can call Save and there’s a third approach which is to create car three with a new car and in Constructor of the new car provide this car data and then which behind the scene we’ll call as well so this is probably shorthand notation of this then on car three we can call safe okay so this is good and this is Handy however there’s one important consideration when filling the data so all these three approaches is filling the data from the associative area from here okay but for security reasons it is not allowed the model to be filled with arbitrary data let’s say that we don’t want the user ID to be filled from that associative array okay user ID should always be the currently authenticated users ID and we don’t want it to be provided inside the fields so it should not be provided something if we expect this data from the client let’s say if we expect the data from the the user from the browser the user from the browser can send any information inside the user ID it can actually create the car on behalf of somebody else which is something we don’t want right so for security reasons filling the model data with the associative array by default is not allowed is not uh is blocked unless we activate it so if we open now car model we need to Define right here a protected array feelable so which Fields can be filled so in our case I’m going to copy and paste all the properties of this car we can copy from here as well select every every column from here and paste here so I’m just going to paste all the properties just to test the code what we have written right here okay but you should be careful what you allow the users to feel we’re going to talk more about this security and everything but for now let’s just put everything in aailable this means that every column what we have right here can be provided using this field approach the approach one approach two or approach three uh whatever we don’t put inside this fillable will not be filled and will not be provided in the database for example if I comment out the user ID then the user ID will not be provided when we provide this car data so there is a second uh property which is called guarded guarded and this excludes um the fields so if we provide guarded to be an empty array and if we comment out this fiable completely this means that every column of this model can be filled but if we provide um user ID here for example this means every column can be filled except user ID okay by default the guarded is null so if we don’t allow anything to be filled we should leave it null or we should not present it but if we allow any column to be filled we need to create this guarded detected property with the empty array so in our case um so this is kind of um wh list I’m sorry this is kind of a blacklist what is not allowed okay we put right here what is not allowed but it’s more common to Define what is allowed then what is not allowed so in our case I’m going to uncomment this fillable and we Define everything except the user ID and we want to see an error I want to see an error because user ID is required and we are are filling with the data but the user ID will not be filled so we should see some sort of error I’m going to comment out the approach two and approach three and let’s reload in the browser and we see this error table car has no column named VIN code that’s my mistake that should be Vin not VIN code now let’s reload the page and now we see uh n constraint failed inside the uh Vin that is because in the fillable we also have VIN code that should be Vin again now let’s reload the page and this is what I expected now we have this null constraint failed for user ID because we are filling everything except the user ID and the user ID is required that’s why the car is not created now let’s uncomment this user ID let’s reload the page and we don’t see any error the car was created in the database Let’s Open Cars table reload it and we see one more car with approach one now let’s comment the approach one and uncomment the approach two it’s going to do the exact same thing but let’s reload the page we have one more car we have now seven cars and we can comment this out and uncomment the approach three and reload the page and total toally we are going to have eight cars in the database the data is is the same for all the last three cars because we have we are using the same data but the records are created as you [Music] see now let’s open remaining models and we’re going to Define feelable protected property on all these models we already did this for cars uh let’s open the database car features let’s start with the car features and I’m going to copy all the columns what we have right here then we need to Define aable array semicolon here and I’m going to paste all the columns and let’s use now this multic cursor functionality in PHP storm we’re going to hit the inner button the middle button of the mouse the wheel and uh then we can do it like this or you can Define this obviously um one by one so we Define this for car features let’s go into car images uh the rest is slightly easier because there are not many fields so for images we need image path and position right for car type we need only name let me copy these fillable and for City we also need only name but we also need state ID right for fuel type we need only name for maker we need only name for model we need name and maker ID for State we need only name now let’s open user model as well and we’re going to add the new columns to the user model inside failable like we have phone we have Google ID and we have Facebook ID as well if we have a look at our schema we’re going to notice that all tables have primary key ID the only table that does not have primary key ID is these car features it has car ID to be primary key so we’re going to open car features model and we’re going to change its primary key into car ID as it is defined inside the migration based on our schema make sure you do this because based on the primary key we’re going to do the updates or deletes of these car features now what should we do if we want to update specific car let’s say I want to select a car which has id1 so I’m going to call find with id1 then on that car I want to modify the price let’s open the database open cars find the car which has id1 and it has pricey one as well okay let’s modify the price and provide 1,000 right here then on that car we’re going to call Save method which will which will affect the changes to the database now if we open the website reload it we have this in the home controller index method so the code was executed if we open cars and reload we’re going to see that the price of the car is 1,000 this is one way how we can update the data let’s comment it out now let’s see second way on the car model there is a static static method called update or create okay the IDE doesn’t autocomplete this but this doesn’t mean that the method doesn’t exist so the method exists feel free to use it update or create and we’re going to provide two arrays right here the first array and the second one the first is the condition which cars needs to be updated so here we have to provide for example I want to update all cars which has VIN code 999 and price equals 1,000 okay let’s have a look if we have such cars which has price 1,000 and VIN code 999 no there doesn’t exist such car but there exist cars which has been code 999 and price is 20,000 so let’s modify the price and set it to 20,000 so this is the wear condition and now let’s provide right here the actual property actual data that needs to be updated actually I’m going to move this like so okay so the first one is condition second one is what properties we want to update let’s say that we want to update price for every such type of car and we’re going to increase the price into 25,000 okay now let’s save reload the page we don’t see any errors so the code worked let’s open car stable reload and we see price is 2 5,000 however that only does for a single car that does not do for all the cars if we want to do this for all the cars we need to do it slightly differently okay by the way this updates the car and it also Returns the just updated car so if we just dump the car which has been right now updated we reload the page it gives us the following output now it updated the second car because the first one this one was already updated so if I reload the page the second one was updated now the second one was the first car which had VIN code 999 and price 20,000 so if we provide right here the condition based on which the car doesn’t exist in the database then it will try to create new car with the data we are providing okay let’s change this VIN code into 9999 and there is no such car in the database which has VIN code 9999 and the price 20,000 in this case LL tries to create new car with the following data but we will have an error because we are only providing price nothing else let’s reload the page here’s the error maker ID is um required fi in the database but we are providing null now this is because as as I mentioned we are only providing price right here okay let’s take the data we have Above This is the car data okay which is not commented out actually let me copy this comment it out and let’s put this right here now we have this car data I’m going to minimize this and I’m going to provide this car data right here okay now if it does not find that car it’s going to create new car with the following data and let’s provide VIN code to be 9999 because this is the car we want to create if it doesn’t exist okay so we save it we reload it we don’t see any error we see only output this is the new car that was just created if we check the database we see new car which has VIN code 9999 and it has all the other attributes we defined inside this car data and the last thing what I’m going to show to you regarding update is how to do a mass update how to update multiple cars for this uh let’s first comment out this part for this we’re going to write a cury like on car we’re going to write we condition for example I want to find all the cars which has published it to be null which is not published yet which also belongs to the user with ID one and then I’m going to call update on those selected cars and I’m going to provide associative array right here okay the properties which I want to update we can say published it to be now oops h to be now additionally we can provide other properties like set the price uh right here set the price equals 100,000 whatever we can provide any properties we want but right now for Simplicity we’re going to just update the published at date so the cars which are not published and belong to the user one will be published let’s have a look in the database how many cars are there which are not published actually all of them are published so I’m going to set null to those cars the publish that date okay so these five cars should be published when we execute the following code let’s save it reload the browser we don’t see any error so it worked we reload the page and we see published at the current date set on those cars in the following way we can do Mass update of multiple records but this one only updates a single record or if it doesn’t exist it is going to create it okay so the idea of this is going to work only on one record if the record doesn’t exist obviously it is not going to create multiple records with the exact same data right so that works only on single record based on your needs you need to decide which approach you’re going to do this one this one or if you want to obviously update multiple cars you can do this one as [Music] well now let’s talk about how we can delete data through eloquent models so let’s as as always we have a couple of options so first let me select the car we want to delete we can select by any criteria we can provide right here we close we whatever conditions you want and finally then you can call first to get the very first car based on these wear conditions or we can simply select the first car easily and then on that car I’m going to call delete method okay so this is the approach one now let’s save it and let’s reload the browser okay the car was deleted let’s open now cars table and car with id1 should be deleted let’s reload the page we don’t see that the record is gone that is because we have soft deletes activated if you scroll on the right side we’re going to see deleted it is actually populated so this is what soft deletes does on the car PHP model let’s scroll up here we have the soft deletes and this is why we added this deleted add now if we try to select car with id1 again and delete it again it is going to give us an error it does not select that car so when we call Car find with one no it doesn’t exist that’s why the car is the the car is considered ing the soft deletes and it doesn’t select the car which is already deleted okay how we can work with the actual deleted data there is a different approach for this uh we need to use with trashed as well and we’re going to talk more about this in the next lessons I don’t want to over complicate this simple lesson but right now we just proceeded delete however if we do this delete on a fuel type for example find the first fuel type and delete the record will be actually deleted from the database because the fuel type doesn’t have deleted at uh column right there and we also don’t have the same trait soft deletes on the fuel type [Music] okay this is one way how we can delete the data second way is to delete um data by IDs so on car model we can call D destroy and provide a single ID as an integer or we can provide array of IDs one and two I want to delete cars with one and two okay the car with id1 is already deleted let’s provide two and three right here let’s comment out this code we save it we reload the page then we check car table and we see now cars with id2 and three are also deleted okay uh we can also provide the IDS right here not as an array but as regular arguments like this uh in this case it doesn’t do anything because the cars already deleted but it also doesn’t throw any kind of error but this will also work and the next method to delete specific cars by certain criteria is the following we can provide we let’s say we want to delete all cars which are not published okay so we published at equals null which belongs to user ID one and then we’re going to call delete on that now let’s check on the database which cars will be deleted uh published it is not null on any of the cars but we can set null on those cars okay I saved it and those cars will be marked as deleted uh let’s let’s comment out this code okay we publish that is null we user ID equals 1 let’s delete those cars awesome reload the page now let’s check cars table and here we see deleted at is set on those cars and finally we can call truncate method on the model on any model uh truncate which will delete every car from the database so we can comment this out save and reload and the cars should be deleted but truncate actually deletes those cars from the database it doesn’t doesn’t mark them as deleted but it actually deletes them so you should be very careful when you execute truncate in this case we that didn’t need those cars anymore we learned how to select how to insert how to update the data and I’m okay the data to be gone but you should be very care ful when you need when you execute the following truncate [Music] method when generating orm models I noticed that we named our car images model incorrectly we named it in a plural form if we notice every other model we have in a singular form except car features and car images the whole idea of the model is that it should be in a singular form because whenever working with an instance of the model it is a single record of that class in the database for example when we create new car we have we we’re going to create this using new car new car type we have a single instance of a city when we are working with an object and so on the car features is kind of exception because inside car features table a single record contains multiple features such as ABS air conditioning power windows and so on however when we create a new image it is going to be new car images which is not quite accurate so what I’m going to do is to rename that to refactor it and call it into car image node car images in PHP storm we can right click on this we can click on refractor rename and it is going to change the class name as well as the file name however if you don’t follow this on ph storm you can do this manually you have to update the class name and rename the file as well and just like this now we have car image in a singular form as well but as we decided we’re going to leave car features into a plural form because a single record in the database contains multiple features [Music] now I have five challenges to you here you see all the challenges the first one is to retrieve all car records where the price is greater than 20,000 second fetch the maker details where the maker name is Toyota insert a new fuel type with the name electric update the price of the car with id1 to 15 ,000 and we’re going to delete all car records where the year is before 2020 okay pause the video right now Implement those five challenges and then come back and see my [Music] solution all right let’s see my solution how I am going to do these challenges let’s start with the first one and we’re going to retrieve all car records where the price is greater than 20,000 okay cars equal on car model I’m going to call where price is greater than 20,000 finally I’m going to call get and then we can print or iterate over the cars it doesn’t really matter car records where the price is greater than 20,000 double check it looks correct next is to fetch the maker details where the maker name is Toyota so here we have the maker maker where name is Toyota and we’re going to call first next to insert a new fuel type with a name electric we have a couple of ways to create new fuel type let’s call Fiel type create and we’re going to provide associative area right here name is electric this is the simplest way in my opinion however we can create a new instance using new keyword assign name to it and then call save as well but I prefer this this is a easiest way the next is to update the price of the car with ID one uh to 15,000 so again we have a couple of ways right here but on the car I’m going to call we ID equals to one and then I’m going to call update providing the attributes with which I want to update like price set to 15,000 and the last one is to delete all car records where the Y is before 2020 so on car I’m going to call where Y is less than 2020 and I’m going to call delete so that is all and we can execute this and have a look so let’s dump cars let’s dump maker and we’re going to see that the electric is created and the price is updated and right here the cars will be deleted reload the page okay we’re dumping something we don’t see any errors let’s now open uh fuel types here we have second electric we had one electric but now we have second electric next is we updated the price for the car with ID one to 15,000 so here we have 15,000 and all the cars which has year less than 20,000 was uh 2020 actually was deleted we don’t have such cars anymore but if we change this into 2010 and reload the page we are going to see that it should be marked as deleted here we go it is marked as deleted hey if you are enjoying this tutorial so far maybe you want to check the entire course on my website the.com where you can find quizzes The Source Code of the project is available there you can find all the modules including the deployment section the testing section which contains I think three hours of uh content regarding testing uh using pest framework and a lot [Music] more in lal’s eloquent omm relationships Define how different database tables are related to each other eloquent supports several types of relationships including one to one which is how our cars and car features are connected to each other one to many which is how our cars and car images are connected to each other many to many which is how our cars and users are connected to each other and it also supports polymorphic relationships which is not an example of our particular project these relationships allow you to easily retrieve and manage related data using methods on your models for example the car model has one one to manyu relationship with car image model meaning that each car can have multiple images defining relationships in eloquent involves creating methods in the model classes that use predefined relationship methods like his one has many belongs to and belongs to many this simplifies complex database queries and enhances code readability leral has very comprehensive relationship system in this beginner’s course we are not going to learn every single detail of these relationships instead we will focus on the most important ones and the most common ones and learn how to define and use them in our [Music] project now let’s open car model and start working on onetoone relationships we’re going to add right here two relations to a different models let’s scroll down below and right here I’m going to add public function and we’re going to name the function whatever we want but later we can access to related object based on the following name so here I’m going to call this features then I’m going to return the following thing this has one and we have to provide the relational model name in this case we’re defining relation to car features so I’m going to use car features class right here we need semicolon at the end obviously and we need to also Define it is not mandatory but is a good practice and we should do this uh we should Define the return type of this method let’s define it has one and that has one is a class imported from illuminate database eloquent relations has one make sure that you import this if your id/ editor does not automatically import it okay PHP storm or vs code whatever you’re using the Hasan method has second argument as well and the second argument is the field is the column name in the database using which the two models relate to each other in our case the car model inside which we we’re defining this method in the car fi featur model the column name which is the foring key column name is the car ID and based on the car ID car features table connects to the car however the car ID column right here is optional because LEL automatically guesses this foring key name based on the current model name current model name is the car inside which we’re defining this relation and the foring key name is guessed in the following way Lal converts the class name into snake case version which will be lowercase car and it appends underscore ID so even if we remove this foring key right here the relation will still work however just want to you to know about this you if you have a different uh Convention of naming your foreign key is like if this is called my car ID or if this is called ID for example you have to provide this foring ID in our case I’m going to delete this and we have this relation defined uh next the second relation which I’m going to Define is the primary image we know that car has many images but car will have a single image which will be its primary image and I’m going to assume that the primary image will be the image which has the lowest position in most cases it’s going to be position one so the image on the First Position will be my primary image so I’m going to define the following relation this has one we’re going to define the relation into car image we can optionally again provide forign key name car ID but this is the default one is also car ID guessed by LEL and let’s define right here has one and then we have to provide additional method right here just to make sure that Lal will take the image which has the lowest uh position among the all the images of that specific car so in our case we’re going to use the method called oldest of many by default this oldest of many is looking at at the created at column and it is taking the record which has lowest created at date time but we can provide right here a column which LEL should look at uh when taking the oldest of many record okay in our case we have to provide position right here so among many images of this specific car L will take take the one which has uh lowest position and it’s going to return that as primary image of the specific car there is a second method called latest of many if we want to take the image which has the highest position uh of all the images of that specific car and if we don’t provide a position right here a Lal will take this latest of many based on the created Edge column in our case we need um L oldest of many based on the position so this is what we [Music] need now let’s open Home controller and remove every code what we have in the index method and let’s understand how we can access relational data with onetoone relationship how we can read that data update delete or even create let me Select Car using car find and I’m going to provide one right here so I’m selecting the first car at the moment I think we deleted all cars from the database so I have to very quickly create a couple of them here is what I did I created a single car then I added a record inside car features for that car and I also created two images with dumy image path inside car images table which has which is for the car I just created so two images for the car car features and the car itself this is what I did now if we open Home controller we’re selecting this car and now I want to access this relational data such as car features for example let me use DD and on car I’m going to call features we can access this relational data with the name of the method we defined right here so we we called our method features so we can access uh with features name as a property to the car now if I save this and we open our project on the homepage reload it we see right here car features an instance of the car features which has couple of attributes and it has car ID 1 ABS 1 air conditioning one power windows one and everything else is zero this is exactly how I defined so using the following way we we are accessing the car features now let’s try to access primary image because this is also what we defined on car we’re going to call primary image save and reload here we have car features and here we have car image which has position one okay this is how we’re accessing to the primary image if we open car model and change that method from oldest of many in to latest latest of many then if we reload we’re going to see that the position will be two okay however this is not what we want we want oldest of many and just like this we are accessing the features in primary image of the car however if we want to update features let’s say for example then on the car features this is an instance of the car features then we can interact with the car features exactly as we interacted with the car model when we learned the basics of create read update or delete car features is an instance of car features class so here for example we can provide ABS to be zero and then on car features we can call save this is one way how we can do or on car features we can call directly update and providing ABS to be zero both ways is going to work so let me comment out this part and I’m going to change this DD into just dump to print and don’t die so now if we reload the browser we see that the page was rendered now let’s open um car features reload the page and we see ABS was changed into zero in the following way obviously right here we can provide um any additional features for that specific model what we want now let me try to delete the primary image as well so car primary image we’re going to call delete in the images table we have two records but if I reload the page then if we check car images table we’re going to see that the first image is gone with position one now let’s learn how to create relation first let me create duplicate of the car I’m going to very quickly do this let’s change its ID into two everything else is the same however there is no car features available for the car with id2 this is exactly what we are going to do right now let’s go in the home controller uh I’m going to comment out everything right now and let’s Select Car with id2 now on that car I am going to call features but I’m going to call features as a method not as a property and then I’m going to call Save on that relation features and here inside the save I’m going to provide an instance of car features let me just Define this instance of car features right here let’s also import the car features make sure that it is at the top okay awesome we created car features with all the columns what we have in the database and now I’m going to take these car features and I’m going to pass inside the save now I save the file I reload it we don’t see any errors which is good let’s go in the car features reload and we see second record right here which has everything false just like we provided right here when we are creating an instance we in the following way passing associative area in the Constructor make sure that you have feelable attributes properly defined however because we are creating these car features through uh relation we don’t need to provide car ID right here instead when we are creating in the following way from the car feature save LEL will automatically assign the corresponding car ID to the car features now let’s learn how to define one to menu relationships let’s again open car PHP and right here I’m going to Define another public function but this is a relation to all the images not a single image but collection of images so I’m going to call my function images from here I’m going to return the following thing as many previously we used has one now we are using has many we provide car image class and as I mentioned as a second argument we can provide the relation name which by default is car ID so we don’t need to do this that’s awesome as a return type we have to Define has many relation and again make sure it is imported in the following way so we just defined this relation of has many now let’s go into home controller and learn how to access this relation I commented out all the code inside this home controller index so now let’s Select Car by id1 then on that car we can access to the relation through images with the same name what we Define in the method now if we have a look in the browser reload it we’re going to see a colle collection eloquent collection there’s only one item and that item is instance of car image and that has id2 car id1 image path and position as well if we have a look in the car images table in the database we see that there’s a single image only for that car let’s duplicate this let’s give it id1 for car id1 test and position one I’m going to save it now let’s reload the page and I see items too now there are two car images for that specific car now let’s learn how to create relation as many relation so I’m going to create new image for this first I’m going to create an instance of car image and in the Constructor let’s just provide image path to be something and we have to provide second argument second column position equals um let’s provide position two okay and I’m going to just delete that second image right here okay so we have only one image on this car now I’m going to try to create new image on that car images I’m going to call Save passing the image as argument now if I save this and reload in the browser we don’t see any error which is good now let’s open car images reload it and we see second image right here there’s a second option second way how we can create image on the car on that car images I am going to directly call create and it is not necessary to create an instance of the car image instead we can provide associative array of attributes like image path something two for example and position three let’s comment out this part we save it reload it let’s check the database table and we see one more image in the database there is also possibility to create multiple images with a single commment let’s say the following one car images I am going to call method called save many we’re going to pass an array right here where each element of the array is an instance of car image so we have to provide new car image right here and provide attributes columns for the car image like let’s provide position four and I’m going to duplicate this with position five okay or another way is to call on car images create many which does not require to create instances we have to provide array but each element of the array can be directly an associative array not an instance of car image so that’s the difference now let’s create six and seven position images okay awesome now if I reload the page this will create two images this will create two more images and finally we’re going to have a lot of images let’s reload the page let’s check car images reload it and here we go now let’s learn how to define many to one relationship and how to work with that related data again let’s open C PHP and I’m going to Define new relation to car type we know that car belongs to car type so every car has one car type but car types have multiple cars now let’s define this relation and we’re going to use the following method this belongs to car type class again the second argument will be the uh foreign key name we can Define it car type ID D but LEL is intelligent enough to identify that because car belongs to car type class it will try to search column named carore typeor ID even without providing so we don’t need to provide it however if your foreign key name is different such as my car type ID for example you can do it and you can provide this forign key okay awesome let’s find this uh return type which will be belongs belongs to and as always make sure that it is properly imported right here okay we defined this this relation car type and we can also Define the inverse relation so if we open car type from here we can Define cars just like we defined images inside the car where car has many images inside car type we can Define that car type has many cars so this has many car class and we Define here has many class as well okay and as always make sure that import is edit right here so I’m not going to mention this every time but whenever you define this has many if your IDE PHP storm or vs code does not automatically import this as many or as one or belongs to you have to write it okay so we defined these relations and now let’s learn how we can access that parent relation or how we can select data by relation let’s go in the home controller I comment out all the code let’s scroll up slightly and now let me select um the first car as as I generally do car find one awesome now let’s try to access to car type in the following way it’s pretty straightforward let’s dump with is the car type of the car reload the page and we see instance of car type which has two attributes and it its name is actually sedan okay let me try now to select car type by its name car type where name equals Edge and let’s select first and let’s assign to a variable car type should be car type single car type now I want to select all the cars and there’s a special method for this where belongs to car type and then we can call get so using the following way laravel will return all the cars which belongs to the given car type that is awesome now let’s just print those cards save reload the page and we see a collection but because there are no actual cars based on the following car type it returns an empty collection okay let’s fix this let’s go into car types and see what is its ID it’s ID is two now let’s go into cars and change the car type ID into two for both of the cars now we have two cars with the car type ID of hchb and here we are trying to select the cars which belong to hatchback let’s reload the page and here we see two items those are two cars which belong to cart type ID hedback that’s pretty handy and because we selected the card type right here now we can try to access all the cars of the hedback in the following way so this is one way probably long way how you can do the same thing but let’s try to access let me Dump Car type cars we Define this relation of cars in the car type model and we can access to all cars for the following given car type in the following way so that code actually is the equivalent of this so if I simply replace this part that’s pretty cool okay let me comment out this part and it’s going to give us the exact same result all right I commented out all the code about now let’s select the first car and I’m going to select a different car type and I want to change the association of that specific car from whatever it has right now into this new car type one way to do this is to change car type ID to be selected car types ID and then on that car we can call Save which will update the car type ID in the database so the sedon has car type of one our first car has car type type of two in the following way we are changing the car type ID from two to one but there’s a second way to do this and on that carard I’m going to call Car type relation and then I’m going to call associate providing the new car type all right and that is all and then we have to call Save on the car now let me comment out this part and let’s just reload the page now let’s check the database in car table and as you see C type ID was changed from two to [Music] one now let’s learn how to work with many to many data first let’s Define relations we have one many to many relation example in our database schema and that is cars related to users through this favorite cars table all right let’s open car model and I’m going to define the following relation public function let’s name the relation favored users favored users all right um favored awesome let’s return this belongs to many okay this is a new method uh this the car belongs to to main user and here we have couple of more parameters to provide the second argument to provide right here is the many to many table Name by default LL will take those two model table names like the cars and users and we’ll assume that the pivot table the table in between this table has the name like cars users but this is not our case so we have to provide the pivot table name which is favorite cars this is how we call the table name then we have to provide the foring uh pivot Keys like what are those two columns car ID and user ID so Lille will uh the first uh like foring pivot key is the column using which the pivot table relates to current model in the current model is the car PHP so by default Lal will assume that that is the current model name snake case version s uh suffixed with underscore ID so Lal will assume that the forign pivot key is carore ID which is actually correct this is exactly what is the column name in our database car ID right here the second argument is the related model column name so what using which column the this pivot table connects to the related table which is the user model okay and this is user ID so Lal will guess this car ID and user ID by default so we don’t need to provide them however if the names are different then we have to provide them okay so in our case we can just omit those two columns awesome let’s define now belongs to manyu return type here and it should be imported at the top we defined favored users right here now let’s open user and we’re going to define the inverse relation let’s call this favorite cars okay let’s return this belongs to many car then we have to provide the table name favorite uncore cars and then again the column names which level will assume U correctly so we had to provide right here the current model name which would be user ID and then we have to provide car ID but again LEL will do this instead of us we don’t need to provide them so here we need belongs to many okay we Define this relation because we don’t have model defined for these favorite cars whenever new record is created inside the favorite cars the created it and updated eight columns will not be managed we don’t even have have those created at and updated at columns defined in these favorite cars but uh in a different example you might need those two columns created it and updated at okay LEL actually gives you possibility to provide second method right here with time stamps and if you provide this with time stamps Lal will assume that this pivot table has those two columns created at in updated it and whenever we’re trying to create uh Records inside this pivot table through this relation LL will automatically provide those created that and updated it columns for us we can add uh obviously we don’t need this in our case but the with time Stamps will be used only when we are creating records through this favorite cars relation but not vice versa not from favored users relation if we want to manage uh the time stamps from this favored users relation as well we need to add this with the time stamps right here as well however as I mentioned we don’t have those created de and updated columns so we can completely remove them but just for your for your information I wanted to mention that part as well now let’s open Home controller in the index method comment out everything and learn how to select that related data I’m going to select again car with ID one and on that car we have favored users which will return all the users which added that specific car inside watch list inside this fa cars favored users okay let’s dump this and have a look in the browser reload the page this returns empty collection because there is no records there are no records in the favorite cars let’s open favorite cars and I’m going to add two records car ID one user one car ID 2 and user one okay great I believe we have at least two cars don’t we yeah we do have and at least one user we do have awesome now we are selecting all the users which added the first car into its favorite cars reload the page and we see a single user which is an instance of up models user and that user is our user what we have in the database join example.com so we can access in the reverse way for example we can let me duplicate this and we’re going to change the variable into user and change the model into um user as well so let’s comment out this part we selected the user let’s import the model app models user model and then I’m going to access favorite cars of the user user favorite cars we are using the exact same name of relation what we defined in the models right here awesome so we save it we reload it and we see now a collection of two items where each of them is an instance of up models car and those are two cars what we have defined um in the cars table in the database now let’s say we want to create new records in this pivot table so how we’re going to do this let me select the user and that on that user let’s say that the user added a couple of more cars in the watch list okay so we are going to do the following on this favorite cars relation as a method we’re going to call method called attach and we have to provide array right here with the ID of the cars okay so for example one and two uh let’s actually remove everything from the favorite cars okay now the the particular user does not have anything in the favorite cars we selected that user and through this favorite cars relation we are attaching cars with id1 and with id2 additionally if there are couple of more columns in this pivot table um additional columns you can provide those additional columns as a second argument of this attach method like column one which has value one in our case we don’t have it but you know how to do it if you have it okay so this is when you attach when you just create new records how however and let let’s actually try this let’s reload the page everything is good let’s open now favorite cars and we have two records right here now let’s say that I want to delete delete every favorite car which exists in the database and synchronize with the new values okay instead of attach for this we have a second method called sync which deletes all existing values in his favorite cars and creates new one for example that new one might be three we at the moment don’t have car with ID3 but I believe that still work no that doesn’t work so if we create let’s do like this if we open cars duplicate that with ID3 save that now in the favorite cars let’s create okay so we created again those two cars in the favorite cars so user with id1 has car with ID one and two in the favorite cars the sync will remove them and only the third car I save I reload we don’t see any errors let’s open favorite cars and we see only single record car ID3 this is how the sync works also if we want to provide additional columns like I showed to you how you can provide additional columns in the attach we can provide second argument right here but the method is different it is not sync it is sync with p values okay and then we can provide right here an associative array with column one value one or whatever you have in your database okay great let’s comment out this part again and the last thing I want to show to you how you can delete detach that data on that user through favorite cars I’m going to call detach and provide the IDS we want to detach CCH for example one and two but we want to leave ID3 uh let’s uncom the user we need the user at the moment we have only one record right here um ID3 but we can again add ID one and two for user one now we have three cars and I want to detach one and two so the cars which have ID one and two so I save this I reload it let’s check favorite cars and those were removed if I want to detach everything I can just call detach without any argument so in this case if I reload there will be no favorite cars uh for the user id1 this is how you can work with the main tomain data and obviously you can do this through inverse relation as well we used favorite cars right now but you can also use favored users as well if your like main class is car and you want to work with the users adding attaching users to that car or removing users from that [Music] car okay now let’s define all the remaining relations on every model we might need in the project so we have C type generally my personal convention is to have belongs to relations at the top and then has many relations so I’m going to move this car type um at the top right here and then I’m going to Define all the remaining belongs to relations okay so we have a couple of them in this project based on the based on the database schema we see that the car has um maker ID so car belongs to maker and model and fuel type and user as well and CT as well so there are a bunch of so let’s define them fuel type return this belongs to fuel type and here we need belongs to as well so we have to type this it’s going to take some time but we have to type this then we’re going to Define maker return this belongs to maker you know what I’m going to try to speed up a little bit and I’m going to just copy and paste this method couple of times okay so I have maker the next one is model so I’m going to change the name right here and the actual model up models right here uh next is probably the user who is the owner of the car so we can call this user but I prefer to call this owner okay and that is user okay great but in this case I want to also Define the actual foreign key name like this is user ID uh through user ID it is not owner ID so it is user ID based on which the current model the car model connects to the user table okay I had some issues that in certain cases LEL was trying to use owner ID instead of the user ID so let’s just provide this foring key right here the next is to provide City and the related class will be city um I think we finished belongs to relations so we have let’s remove it we have features uh then we have primary image and we have images as well and we have favored users okay great now let’s open next model which is car features the car features has only one relation and this is belongs to car let me duplicate this belongs to and put this here uh but we’re going to change this car and car here okay let’s move up we have this belongs to imported which is great and car features belongs to car that is correct now let’s continue and let’s open car image and car image belongs to car car model here next let’s open car type and the car type actually already has cars relation defined here which is has many cars so this is something I will need in couple of other methods couple of other models so I’m going to copy that and let’s go into City and City also has many cars City also belongs to state so let’s define belongs to relation but I’m going to do this above cars so public function State return this belongs to State model belongs to okay so we have these cars copied let’s open other models such as fuel type and I’m going to paste this right here maker I’m going to paste this right here however maker has multiple models so I’m going to duplicate these cars and let’s change this into models and the actual model will be model up models model okay that is good let’s now open model which has multiple cars many cars and we have state which has many cars and state also has many cities so we can Define cities here and City model right here okay and the user also has many cars the user actually is an owner of the car so the user has many cars I believe we defined all the relations but let me double check inside car we have the city and owner and model and maker and fuel type and car type I think that’s everything what we have in the schema perfect double check features features has um belongs to car that’s great image belongs to car car type has multiple cars city has belongs to State and has many cars fuel type has many cars maker has many cars and many models uh model has many cars state has many cars and many cities and user has many cars the one thing we probably missed is that model belongs to maker so we Define here relation to maker return these belongs to maker class belong belongs to that’s it a factory in Lal is a tool to generate fake data for models it makes easy to create test and see data it defines how a model should be created including the default values for attributes using factories you can quickly generate multiple instances of a model with realistic data which is helpful for testing and database seting factories in LEL are typically located inside database factories folder by default there’s only one Factory user Factory if we open it this is how it looks like it extends the factory class which is coming from illuminate database eloquent factories Factory it has the main method called definition which returns an array associative array and the key is the field name the column name for the user table and the value is how the data should be generated so in this case right here we are using the fake function which always generates the fake name here it generates fake and unique email address here it takes the current date here it takes the random string and so on using the following way we’re going to Define factories for every hour model to generate some C data to generate new factories we’re going to execute the following comment PHP artisan make Factory and we have to provide the factory name like I’m going to create new Factory called maker Factory okay which will create a factory class for maker model I’m going to hit the enter however if we want to generate the model itself and the factory at the same time we can do the following make model maker and provide flag called dasf this will create maker model alongside with its related Factory class which is something we don’t need at the moment but you should know now let’s open this maker Factory and updates its definitions so from here we’re going to return the name and I’m going to use now this fake function which is is using the php’s faker package which always generates some fake data it has bunch of methods and one of them is called word so every time I want to generate new word for my maker class okay let’s also open user Factory and I want to generate uh random fake phone number for the user so I’m going to update this and let’s use this fake method and then I’m going to call method called numerify and I have to provide the format like I want to numerify the following string and I’m going to provide this hashtags right here this will generate three digigit number and let’s provide couple of more okay so every time when we try to create new user using Factory it’s going to have n digigit phone number inside there now let’s talk about the naming of factories in the discovery conventions by default factories as I mentioned are located under database factories and if the factory name is named properly uh it lateral will automatically connect to the corresponding mode model for example if we have a maker model which is located under up models and we create maker Factory in the database Factor stable uh folder then LEL will automatically detect it Discover it and connect that factory to that model OKAY however if we name our maker Factory something different for example we call it car maker Factory then Lal will not be able to connect that car maker Factory to the maker model and we have to do this manually now let’s open maker model and do this manually to do this manually we have to Define new function right here and that function should have a specific name like that should be new Factory static protected function and that should return an instance of the factory in the following way whatever we’re going to call our Factory let’s say it is car maker Factory we are going to call new on that factory okay so in our case we don’t have this car maker Factory but if we had then we should return it like this or we can return maker Factory if we want but that doesn’t make any sense because our maker Factory has the convention based name okay but I hope that makes sense uh but this is not enough when we Define this new Factory static function and we return the the factory new instance then we have to go to this car maker Factory and we have to also Define protected model right here and that model should be maker class only after this that maker Factory car maker Factory whatever we call it will be connected to this maker model okay just like this okay because we follow the convention I’m going to remove this I’m going to remove that new Factory method from here as well and we can try to generate some [Music] data now let’s see how we can generate data using factories let’s use maker Factory what we just created and then on that maker model we’re going to call method called Factory on that factory there exists a couple of methods one of them is make that creates an instance of maker model and returns that so right here we have this maker model and we can print that however if we want to create new maker record in the database we should use right here create instead of make make simply creates makes that record an instance of the maker moduel it returns it but it does not put that in the database however create method is what inserts the record in the database now if we open makers right here we see that we have two makers all right let’s open browser reload it and right here we see maker instance of maker and there’s a new word new name Amit so that’s a like a fake word it doesn’t mean anything but in the database in the maker table we see new record okay so that’s the difference between the make make simply creates an instance of the maker class and returns it but it does not put the in the database the create puts it in the database however if we want to create multiple records in the database we can also provide right here count let’s provide count 10 for example and execute that reload the browser and now the returned result is a collection instead of a single instance now this more specifically is Makers array makers collection as we see and it has 10 items inside there each of them is an instance of maker and if we check Maker’s table in the database we’re going to see 10 more records made in the maker table in the database if we want to just create instances of maker models and don’t put them in the database we can use right here make method again so this creates the instances of maker modu and returns it but don’t does not put them in the database we also have options to provide additional properties in the men make method right here or in the create method right here for example I want that every maker to have a specific and hardcoded name or maybe we can use um different example let’s undo this and I’m going to use now user Factory I’m going to provide create and let’s provide name right here to be zura so this creates let’s un let’s comment out this part so this creates new user with the name zura and that puts the user in the database as well however if we want to create multiple users we can provide count right here and all users will have name zura we can execute this now let’s open users table and right here we see 10 more new users with name zura obviously we can provide right here as I mentioned make which simply creates an instances of user classes and returns them but does not put them in the database there is specific method which gives you possibility to override specific fields and that method is called State you can provide associative array and you can provide your Fields right here in this associative array so that does the same thing as providing name zoraa right here in this make and that obviously works for create really it doesn’t [Music] matter the following code will create 10 new users however I’m going to introduce a new method called sequence which gives you possibility to alternate different values when overriding the fields for the models so here I’m going to provide two arrays the first one will have name zura and the second one will have name John now when we execute the following code it is going to create 10 users the first one will have name zura second one will have name John then the third one will have name zura and the fourth one will have name John and so on in the user table right now we already have 11 columns this is the last 10 records we created 11 um records excuse me these are the last 10 records we created I’m going to delete them okay now let’s open the browser and reload it and now let’s check the users table now as I mentioned we have zoraa John Zur John and so on sequence method is pretty powerful method which gives you a possibility to provide different values when creating uh multiple records for example inside the sequence we can ALS o provide um closure function we can provide regular F function or Arrow function as well let me provide Arrow function and we have to accept an instance of sequence in this Arrow function we need arrow and then I’m going to return associative array where I’m going to return name but the name will be something Dynamic such as for example name space and then I’m going to use sequence index okay I’m going to comment out this sequence method and I’m going to leave this now the sequence index increases for every new user because we have 10 users the sequence will increase from 1 to 10 and for every new record before it is inserted into into the database the name will be changed with name one name two name three and so on let’s open our users I’m going to delete again these last 10 records let’s reload the browser let’s reload users table and now we see name zero name one name two and so on obviously if we want to name it to start from name one we have to Simply add one right here but this is how sequences are working a factory stating LEL is a way to define specific variations of data when using modu factories states allow you to Define different sets of attributes for the model and making it easy to create various types of data without duplicating the code if we have a look at the following code this creates 10 users and all of them will have email verified at to be now if we open user Factory we’re going to see that email verifi dat right here is set to now now but we are actually overriding the state from here however in the user Factory there exists a method called unverified which defines the state and inside the state which is an nrow function we are returning the following area email verified at equals null so instead of executing and providing state right here we simply can provide unverified right here the method which is defined inside user Factory that does the same thing and if we execute the following code it is going to create 10 users and all of them will have email verified at toal by default there also exists one predefined State method similar to unverified and this is called trashed that trashed will create records and each record will have have deleted it to be something so we have deleted it column only on cars when we create the cars we don’t want the cars to be deleted but if we want to create deleted cars we could provide trashed when creating cars and that is going to create cars which have some value inside deleted dat obviously this is not relevant for users but because we’re talking about States I wanted to mention that there is a predefined trashed um state which provides some value inside deleted Ed column when creating new records using factories we have possibility to add a certain call back when the record or records is created or when the record or records are made and that happens through after creating and after making callback methods so after making will be executed when we call right here make and after creating will be called uh when we call create right here and that callback function is executed for every single user that is created and that is very helpful because inside that callback function you can put information you can uh create some logs or you can even create additional information for that specific user for example we create user and then we can create uh like additional cards for that specific user or we can add additional information inside the database table for that specific user now let’s create new Factory for model PHP artisan make factory model Factory now obviously maker and model has one too many relationship now let’s see how we can create relational data Factory with models but first we have to open model Factory from database factories folder and I am going to Define name right here to be fake word great we can close this now let’s go in the home controller and let’s define Factory with models so we’re going to use maker Factory and then let’s create five factories for example and each Factory needs to have five models so for this we can use method a magic method called has and whatever is the relation name from maker to uh model so the relation name from maker to model is called models okay so basically we have to provide right here uppercase m models has models and we can also provide count how many models it should create for each maker so the name the relation name is converted into a so-called Pascal case so if this is models this is going to become uppercase a moduls so if this is called my models then we should have has my models like this okay let me undo the change and finally we’re going to call create and now this is going to create five five makers and five models for each maker now let’s open maker table uh I believe we can delete everything else from here and let’s also open models and we have four models right here let’s open the browser reload it now let’s open moduls and we have 25 more moduls inside here and five more makers inside here and the maker ID is is uh taken from the just created maker from the makers table okay uh these has models has additional capabilities for example if we want to override certain state right now our models table has only name so if we want for example to overwrite that name and provide specific model for every maker like test for example let’s create just one maker and one model for that maker and let’s reload the browser and and let’s go into models reload it and at the bottom we have new uh model which has the name test so this associative array gives us possibility to provide additional or override the fields um inside this relational model uh also this H model has ability to provide right here instead of array we can provide a function so if we provide function that function except array of attributes um attributes and we can also take the parent model which is maker in our case so I can accept the maker and then I have to return an array uh from here return associative array so this is helpful sometimes we want to take some information from this parent model like maker some property and let’s say that the child model has the Cent models certain property for example if in practice we’re going to create later we’re going to create cars and users and every car has phone and in most cases that phone will be a phone from the users table okay from here so if we change this and let’s say that we are creating user right here uh with has cars let’s imagine the following case and right here we’re accepting user this is user and then we are overriding those uh the the phone so from here we can return phone to be the same as user phone and every car will have the same phone as just created user isn’t this awesome for me this is really cool let me undo this because we are not yet creating users and uh cars let’s talk about makers but I just wanted to show you how you can do this thing also this has models is a magic method uh and that only works if there is a relation defined on the models inside the maker however there also exists uh I’m going to comment this out there also exists a general method called has and right here we can provide other Factory such as model Factory and then we can provide count um three for example so now this is going to create one maker and it’s going to have three um models so let’s reload this let’s reload this and now let’s refresh the browser and inside makers we have one more maker and for that maker with ID 20 there should be three more models in the models table if your relation from maker to models has a different name so if it has models name then this code is going to work however if the relation name is different for example car models then we have to provide that relation as a second optional argument inside this H function okay if the relation name is called models which is um like a singular lowercase version of the relational class model class right here then we don’t need to provide that relationship right here because LEL guesses that automatically based on that model name okay however if we have a different name like what I mentioned car models right here we have to provide that relationship here okay I’m going to remove this because we have a very standard name it is called models that’s why we don’t need to do anything [Music] here now let’s see a reverse example where we create model uh for the factory and we create Factory as well so the following code will try to create five mod models however this is not going to work because in the model Factory we don’t have a maker ID defined and that is actually mandatory column in the database however when we create model we want to create it for a specific Factory and that’s why we can provide right here magic method like we had has models we can provide magic method called for and the relationship name so if we open mod PHP it has relationship called maker then we have to provide maker here so we want to create five models and all of them should be for the same maker okay U this is going to create one maker in five modules we can also provide additional fields for this maker for example name to be um Lexus okay so it’s going to create new maker with the name Lexus and five modules so I’m going to save it reload it let’s open makers uh table reload it we see Lexus right here and if we check moduls table we’re going to see five models all of them has maker ID 21 which is actually Lexus there is a generic method called four inside which we can provide another Factory like we can provide maker Factory and we can also provide like state for example to be Lexus similarly what we had above so these two lines of code are doing the same thing however make sure that the relationship name should be maker from model it should be maker otherwise if it is for example car maker right here then we have to provide again the this relationship name as a second argument of these four method car maker right here so if we name our relationship in a um standard way then we don’t need to do this we also have possibility to use an existing maker so if I Define in maker right here maker Factory call create then we can use that maker object and provide for the maker object right here let’s create five models all of them will before the maker created above and obviously we can provide state or anything to this maker what we want now let’s go ahead and Define the remaining factories PHP artisan make vectory uh car type vectory um hit the enter the next one is going to be the fuel type Factory hit the enter we’re going to we have already have maker Factory we have modu Factory let’s create State Factory let’s create C victory victory uh we’re going to create car Victory let’s create car um car features Factory and car image factory car features Factory and car image factory okay great now let’s open victories and let’s start with the um where’s car type here’s car type Victory Fuel type Victory State City um let’s open then car factory car features and car image and we’re going to Define definitions array for every Factory let’s start with the car type Factory here we’re going to have name and the name should be some some fake in almost all cases we’re going to use fake function so we’re going to start um assigning some values using fake function which gives us a huge object of Faker PHP and then then we can call certain methods on that so in this case we’re going to um use the method random element but we have to provide the values and the faker will take randomly one element from this array like we can provide sedan here we can provide SUV we can provide truck uh why did I provide all in uppercase uh we can provide like van um Coupe or how it’s pronounced I don’t know and like cross over that’s enough uh let’s go in the fuel types and here let me copy this line to save some time paste here and in this case we have to provide um yes for example we can provide diesel Electric and hybrid okay the next is to go into State Factory which has a name and there actually exists State um I believe there is exist State why why it doesn’t have to complete I don’t know but there exists a state function in the definition so we’re going to use that and it’s going to create new random State now let’s open City Factory the name will be fake and here we need City here it is uh the city actually needs state ID as well but we are going to handle this when creating the data okay so we’re going to leave this right now and then we have car factory which is the largest one and we are going to spend some time on this so we need to provide maker ID here and here what I’m going to do so I’m going to select some random ID from the makers table from the database so I’m going to use maker model then I’m going to use the function called in random order so that function exists and that returns makers in random order so because this is in random order I’m going to pick the first one and then I’m going to take the ID of the first one okay awesome then we need model ID however the model ID should be from the same maker okay it doesn’t make any sense on the car to have maker ID to be Lexus ID for example and the model ID to be something which is from Toyota so doing the same thing for model what we did for maker doesn’t make any sense because because it is going to pick uh any model ID in random order and we don’t have any guarantees that it will be from the same maker so here we’re going to use function we have that ability as well inside that function we’re going to have attributes and then from that attributes we’re going to take the maker so this is where’re going to what we’re going to do so on model we’re going to call we we’re going to set select all the models which has maker ID to be from attributes maker ID this attributes maker ID is already generated this generated maker ID so we take it and filter models based on this maker ID then we can call in random order then we can take the first and then we can take its ID and of course we need to return that awesome next we have y here which is going to be fake y next we have price and for the price I’m going to get um random number in some range so let’s use fake uh and on that fake let’s take random uh there’s no such method random integer we have random float and here’s what I’m going to do on that random float we’re going to provide um first is the maximum decimals and we can provide two then we are going to provide the minimum and maximum values like minimum five and maximum 100 okay so this gives me any random float number from five to 100 okay I am going to cast this into integer so this is how I’m going to cast it into integer so any decimal things will be lost and now I have an integer value from five to 100 and then I’m going to multiply this on 1,000 and this gives me a random integer value from 5,000 to 100,000 okay next is to generate VIN code and for this uh we are going to use Str Str Str Str um support class and we’re going to call random and provide the 17 which is typically the VIN code length but I’m going to also use St Str to uper to convert that all into uppercase okay next we need millage sorry if I don’t pronounce this correctly um then we are going to call again random float on that from five to 500 let’s cast this on Integer and we’re going Tok multiply this on 1,000 awesome then we have car type ID which I’m going to pick a random ID from the database like car type in random order we take the first and ID next we have fuel type ID and let me duplicate this fuel type ID into the model will be fuel type make sure it is imported after fuel type we have the user ID I’m going to duplicate this again then we have City ID I’m going to duplicate this again user user ID City ID let’s use City model here user model here and next excuse me I lost field type ID I’m going to move this up so C type ID field type user and City ID after City ID we have some address so let’s provide some fake address okay next is provide to provide the phone and for phone I’m going to use a again function we get array of attributes then I’m going to select the user user find based on the attributes user ID and then I’m going to take the phone of that user awesome next we have the description which should be some text I’m going to use fake text with 2,000 characters maximum 2,000 characters and finally we have published a which is a Tim stamp and I’m going to use the following way to assign a time stamp randomly so I’m going to use optional so this optional means that it is going to generate uh the value randomly okay it is it might not also generate the value and this optional has also probability like 0 um n so in 90% of the cases this will generate whatever I provide here so it is going to provide date it is going to generate date time date time and I also want to provide date time between so I don’t want any Daye time but I want let me move this down I want date time uh minus one month in the past and plus one day so the if I remove this optional this will always generate the daytime between minus one month and plus one day adding that optional and that optional can be added on any method right here we can also add this optional to this um uh not right here but we can add this optional to and like a VIN code for example or or any any other uh property okay so this with 90% probability generate the following data okay so we generated the car factory we defined the definitions for carfactory let’s open car factory car features Factory and this basically is pretty simple so I’m going to copy and paste this part so we have car ID which I left this hardcoded one or we can completely delete this because we will provide let me actually delete this uh because we’re going to create these car features for the cars and we’re going to Define for which cars the feature is created when actually creating the data every other property right here ABS air conditioning power windows and so on all of them are bullan values okay you can um just take the time and um type this or you can go into you can go into features car features and we can copy those columns all of them and we can paste them and we can do the thing okay I try to save some time but I also don’t want to do things and you feel annoyed that I did it in a very Rush way so I want you to follow with me and um just create one then duplicate it couple of times and just change the names okay I hope you define this now let’s open a car image factory and we’re going to define the last one it is going to have um a car ID but I’m not going to provide car ID as well so we just need image path which will be um something random like uh let’s use image URL random image URL okay good and then we have have to provide a position the position is kind of interesting uh I’m going to provide function here with array of attributes and then I’m going to return I’m going to find uh car based on the attributes car ID I’m going to access its relation called images and then on that relation I’m going to call function called count to get how many images that car already has and for that new image which should be created uh through the following definitions I’m going to add one however when we actually create images we might even overwrite this position completely okay so you should also keep that in mind okay that’s it it we have the definitions for all the factories now I want to create data for many to many relations I want to create a user with five cars and we’re going to add those five cars in favorite cars table for the created users because we already have defined uh the definitions for all the factories cars can also be created now let’s use user Factory we’re going to use has and then I’m going to use car factory count so this creates um let’s provide five here this creates user with five cars but here I’m going to provide the relation so without uh the relation it is going to create a user in five cars and that user will be user ID for that five cars right here I’m going to provide the relation name which is called favorite cars I think this is how we named favorite cars in our user we can always access and see double check it make sure it is correct and then we’re going to call create okay great now let’s open the browser reload it and let’s have a look in the database let’s open users a new user should be created this is the new user which was just created then we should have five cars let’s check the last five cars were created and there should be also records in the favorite cars let’s also check what is the user ID of those five cars it should be a random here we see it is random user ID it’s a 26 28 29 so it is random random this is how we defined in the car factory however if we check favored cars we see five records and all of them all these five just created cars are for the same user which was just created for this uh Rosalia okay and in the following way this is how we can Define find one to many relationships if we want to provide if we have uh this pivot table the favorite cars pivot table which has different columns additional columns and we want to provide some information inside that additional columns we can use a second method called has attached okay here uh let me duplicate this has attached first we have to provide the factory like we are doing here then we have to provide additional columns like column one and its corresponding value one whatever it is and then we have to provide this relationship name so in our case we don’t need any additional columns inside this favorite car table so this is something we don’t need this is something what we need and we test it and it works perfectly [Music] a cedar in laravel is a class used to populate the database with simple and test data Cedars allow developers to quickly insert predefined data into database tables making it easier to set up a consistent development or testing environment they are typically defined in the database seeders directory and can be run using the PHP Artisan DB column seed command seeders can call other SE ERS and use eloquent models to insert data ensuring relationships and constraints are maintained this helps in simulating real world data scenarios for development and testing purposes now let’s open only one CED database Cedar in our project and if we check its run method we see the following code this uses user Factory and it creates a single user with name test user and email test example.com [Music] to create new Cedars we’re going to execute the following Artisan commment PHP artisan make column Cedar and we have to provide the cedar class name let’s create users Cedar class hit the enter the class was created now let’s open user Cedar and and every Ceder has run method we should put creating user code inside run method I’m going to copy this database Cedar user Factory create into user Cedar and let’s just change the names into test user 2 and test 2@ example.com to run seeders we’re going to open Terminal and we’re going to execute the following comment HPR design DB colum seed the following command will run the default Cedar which is database Cedar however we can provide custom class or the Ceder using the following flag D- class equals users Cedar when we execute this seeding database was completed now let’s open users table and as a very last record we see test user two which was written in inside users Cedar by default running Cedars are not all loow on production because it is going to maybe delete the database maybe create something in the production database based on the environment variable up which right now is set to local but when you deploy the application and production this needs to be set to production okay so and you are not by default allowed to execute ceders if you still want to run ceders on production you have to use the flag Das Das Force additionally if we run the migrations and we want to execute Cedar classes as well we can use the following command PHP Artisan migrate D- seed flag this will execute the migrations and also it will execute the default Cedar which is database CER the dash dash seat flag can be applied to migrate refresh and migrate fresh as well if we want to use one Cedar into another Cedar for example let’s put users Cedar into database Cedar for this we’re going to open the database Cedar and we’re going to use this call method providing a single class or array of classes and here we’re going to use users Cedar class in the following way when we execute the default Cedar it is going to first create the user then it’s it is going to execute the user Cedar now let’s bring up the terminal and I’m going to execute PHP Artisan migrate fresh D- seed this will drop all the tables create them and also apply the seeders and finally it is going to create two users let’s open now users table every data is deleted right now and we only have two [Music] users first I’m going to delete users Ceder because I don’t need second Cedar I’m going to put every code to create data in my database Cedar let’s delete this user Cedar completely let’s delete the comment as well next I added couple of comments in Sample data using which we’re going to create CED data for the database so we have to create car types with the following data using factories we have to create fuel types with the following data we have to create states with cities and here I have States alongside with its cities we have to create makers with their corresponding models right here here I have typo and we have to create users cars with images and features so this this is going to be the most challenging one let’s do it one after another and you can treat this as a challenge okay so you know what should be created right here you can pause right now you can try to do this on your own if you are not able to do this on your own then come back and see my solution it is going to be uh pretty clear like step by step we’re going to make it very clear and we will know how to define a very complex see data through factories inside our Cedar okay this one is pretty easy we’re going to use car type vectory then I’m going to use sequence and here I’m going to provide array of those values so here I have U whatever like nine values so I’m going to take all of them I’m going to put them right here inside the sequence but each element inside the sequence needs to be attributes for my car type so I am going to create array like this name corresponds to the value so we have car type Factory sequence then we need to call count and this count should be the exact same number how many elements we have here like 1 2 3 4 5 6 7 8 nine so we have totally nine elements and finally we’re going to call create okay awesome so when we execute this it is going to create uh the following the nine car factories and it’s going to try to use the following sequence okay awesome next fuel types now you can do this on your own I assume because it is very identical to the car type let’s use fuel type vectory let’s use sequence we need array four times and then we can use the following values name corresponds to gasoline and then let’s change the second one into diesel electric and hybrid we call count four then create great next is to create states with the corresponding cities okay so in this case we’re going to iterate over our states and create each state with its own cities okay let’s do this for each States is a state then we’re going to call State Factory and here I have to provide um State method so that State method is different from that state obviously so that State method gives us possibility to provide the values as we already learned in the factories section so we have to provide custom name for our state and this is going to be State actually we have here State as a key and the value will be cities right so we’re going to take this state name and provide it when creating new state however we need to create related data as well and for this we’re going to use Hees method inside Hees we’re we’re going to use City Factory we need to provide count and we need to create as many cities as many elements we have right here and in this case I will just take the count count of cities variable okay how many cities that specific state has the same amount of cities we’re going to create next we’re going to call sequence and in this case I want to generate array like this for cities okay so if I provide array like this inside the sequence for cities then I’m good so uh we have the count the exact number of the cities and then I just need to provide the sequence in the correct order in this case I’m going to use uh the following way so I’m going to use uh array map function which accepts a call back so I’m going to uh provide Arrow call Arrow function here okay uh that map obviously needs the second argument the C is to iterate so I’m going to iterate over my cities in inside the call bag I’m going to get CT and then I am going to return the following array where the name corresponds to CT so this returns an array all right and that array basically will look like this where each element is also array and it has name and the CT name so this sequence is kind of like a multi-purpose function we can provide here an array like we did um like we did right here or we can even provide multiple Arguments for example if I remove the square brickets right here and we just provided multiple arguments this is going to also work so in our specific example we can leave this array map as it is or we can use three dot notation to destructure this and provide um separate values inside the sequence both is going to work okay we can leave this as an array map and finally on that state Factory we are going to call create awesome so in the following way states and cities will be created now we have to do something similar for makers and its models okay let’s iterate over our makers we have maker and models then on maker Factory we’re going to call state to provide the name for the maker then we’re going to call has that is going to be model Factory we’re going to provide count which will be count of models and then we’re going to provide sequence which will be array map we provide an arrow function we accept model inside this Arrow function we return name corresponds to that model and the second argument of this array map is the array which needs to be iterated and this is going to be models finally we’re going to call create on that um maker Factory and that is it and the last one the most challenging one is the following so we’re going to create users okay cars with images and features first we’re going to create three users then we’re going to create two more users and for each user from the last two users we’re going to create 50 cars with images and features and add these cars to favorite cars of those two users pretty complicated right all right let’s break it down and do it step by step first we’re going to create three users so this is pretty straightforward user Factory count three create okay this is good if if we check user Factory we are going to see that um sorry uh I want to check car factory because we’re going to create Now cars inside car factory the user ID is the random user ID and we need something some users to be presented in the database that’s why first we created three users and now if we treate if we try to create cars the user ID already exists in the database so the following code will pick up a random user from these three users CTI ID also exists in the database we created cities fuel types car types we we created makers and models as well so all of them is created above okay and now we have to create cars alongside with users okay now let’s break break down the second part then create two more users okay let’s start with it user Factory count two okay then what do we need to do and for each user from the last two users create 50 cars okay for each user we have to create 50 cars with images and features and add these cars to favorite cars of those users okay let’s let’s remove this part um for for a moment like create 50 users and add those cars uh sorry create 50 cars and add those cars to favorite cars of these two users so we should do this in the following way the user has each user has 50 cars so we can use car factory we can call count 50 okay but we have to also provide the relation name of uh from user to car and the relation name is favorite cars because we want to add those 50 cars into favorite cars of these two users okay so here we need comma Now we created two users each user will have 50 new cars added into favorite cars that is pretty correct finally we can call create on that okay however we need to also create images and features for those 50 cars so on that car create we are going to call additional has each car from the 50 cars has something else uh they are going to have images and in this case we’re going to use car image factory oops car image factory we’re going to call count we can create as many images because it is not specifi right here how many images uh each car should have we can provide whatever we want I’m going to create five images for each um for each car but I need to also provide position for each um for each image okay so images should have different positions from one to five okay for this I’m going to use sequence okay and I’m going to provide function inside the sequence we are going going to accept an instance of sequence right here and I’m going to return array which will have position some value okay I’m going to move this down so position should be some value so I can use sequence index plus one but the thing is that finally we have to create um 100 cars totally and 500 images so for each two user we are creating 50 cars and for each car we’re going to create five images so totally we’re going to have 500 images and that sequence does not iterate over the over specific car it iterates from 1 to 500 not one to five so if we execute the following code and I’m going to leave this right now because I want to show this to you if you execute right now the sequence will be from 1 to 500 which we can fix later okay but anyway let’s leave the sequence so we have provided car images and additionally we need to also provide features so I’m going to use his magic method has features because every car has relation to Features somewhere and using this magic method like has features we can provide um that each car should have its own features okay awesome now we created uh I think we did everything inside this Cedar and now we just need to try to execute this and see if we have any errors let’s bring up the terminal and I’m going to execute PHP Artisan migrate fres D- seed let’s hit the enter and have a look okay we have very first error and let’s see we have some issue inside car types okay I know the reason the reason is that inside the sequence we have to provide arrays not a single array because we have just one array and inside there then we have nested arrays this this doesn’t work so sequence accepts um elements multiple arrays not single array okay we’re going to remove this array parenthesis right here and we have to fix this in other places like here we’re going to remove this and also if we scroll down below when we create this array map we have to destructure this and provide separate arguments inside the sequence so each paer of this name the associative array will be provided as a SE separate uh parameter of the sequence method and we should do this for makers as well and now we should be good so let’s save this and retry this again okay seeding database it needs couple of time because it is creating something okay we have another error okay we have bed method call to undefine Method car image from car okay we have to provide relation and name as well when we Tre try to create uh images like the car has and right here uh we need to provide image’s name and you know why because if we open car factory the relation to images is called images right here but the actual model is called car image if we call these car images then it would probably work but but we have car image right here we call the relation images and that’s why we have to provide the relation name I’m going to provide images right here we need comma now let’s try this once again PHP Artisan migrate fresh D- seed okay cing completed successfully and now we need to check the database let’s start with the users we totally should have five users and we do have so let’s open States we have the following states for each state we have couple of cities totally there are 50 cities we have cars we should have 100 cars in our database here we go we have 100 cars and all the data is provided very nicely let’s check car images this is something we we need to come back and look at this so we have five images for each car but the position as I mentioned starts from one and goes up to whatever it is 500 okay so this is something we need to come back and fix it let’s go into database Ceder scroll up and find where we provide the position so the sequence starts from one and ends with 500 so because I’m creating five uh uh images for every car this is what I want to do so I’m going to take that sequence index and I’m going to uh take the remainder when dividing this on Five okay and then I’m going to add one so whenever sequence is zero then the following expression will give me zero + one will give me final position one when the sequence increases like when it is one then this gives me two and so on and when the index reaches five then five divided on five the remainder will be zero and this will give me one again so using the following code the position will be alternated uh from like one to five or I could do also in the following way I will just show you the maybe the easier to understand way here we provide sequence and we provide the following let me comment out this part this is extra comma we need comma here okay position one and then we duplicate this several times position two position three four and five so if we format the code now this will do the same thing right here so for first car it is going to be position one second position two and so on and for the next car for the sixth car it is going to start with the position uh one again this is probably easier to understand but the above code this code will do the same thing so I’m going to leave both actually uh we need this comma here okay now let’s save this and let’s execute the migration fresh with D- seed again seeding completed successfully and let’s check now car images table and we see that the position is from 1 to 5 for every car and just like this we defined ideal data for our project and we can already start working on outputting these data on the [Music] website now let’s open Home controller and we’re going to select cars and render those cars on the homepage let’s use the following way to select cars car where I’m going to select the cars which are published so I’m going to provide published it to be less than now I want to select cars which are published in the past okay so then I’m going to sort those cards using order by Method with published add column in descending order latest published car at the top I want to limit the result with 30 and I want to get those cars now let’s pass these cars to the view through associative array great now let’s open homepage page index blade PHP file and here is where we simply iterate from 0 to 12 and we are rendering uh we using this ex car item instead of this for Loop I’m going to use for each we already have cars available in this plate file because we passed it from here okay we use cars as car here we need end for each and we are going to provide car right here so I’m going to provide this in the following way assuming that the component will accept a prop with name car let’s open this component car item component and let’s define inside props a single prop called car now we accept car right here now let’s use this car and um just display the information right here so here we have hardcoded image instead of hardcoded image I’m going to use car primary image image path next here we have the um city of the car so car city is a relation on the car name scroll down below we have here y I’m going to use car y here we have the maker name I’m going to use car maker name and here we have model name car model name let’s move this down like this here we output the price car price here we have the car type car uh car type name let me double check what is the relation um to car type the relation is called car type we could call this type as well but car type is also fine so car car type name and here we have car fuel type name and just like this we defined the car item component exact exactly um as it should be now if I save and if I reload the browser um okay attempt to read property image path on now I have a typo here I can’t access primary now let’s rad the page again and the homepage was rendered and we see latest edit cars we see these are dummy images we see cities right here we see y we see maker model we see price we see car type and we see fuel type as well and all the cars are unique we are displaying 30 cars on the homepage and finally we have to also fix the root to the car show page here we have hardcoded one but we’re going to replace this and provide the either the entire car object or we can provide just ID if we provide the object LEL will resolve this automatically and takes the primary key of that [Music] object now let’s have a look at different ways how we can Cur data for example if we don’t have orm model created for our table we can still cure the data from the Cars table using the following way we’re going to use DB support class for this and DB table we provide the table name cars and the then we can call any CER Builder method such as get to get all cars however if we have car model then we obviously know how to CER the data but there is a specific method to create the CER Builder instance and that method is called qer we can create that qer instance and then on that qer we can use any methods from the qer class such as we order by limit and so on okay to get a list of all cars we can do the following way to get the first car we’re going to use the first method we can also get a single value from the car for example I want to get the highest price I’m going to order by cars with a price descending order and call the method value specifying the column name and this will return a single um integer or string value highest price from the database if you want to get a list of values for a specific column we can use a method called pluck we ordering uh cars by Price descending then calling PLU for Price column gives me a plain least onedimensional plain array of prices from the car table or I can provide a second argument in the plaque which will index those prices by that ID column so the second code will give us an associative area we key will be the car ID if we want to check if a record exists or does not exist in the database we can use methods like exist or does not exist if you want to specify inside select which columns we want to select we can use the select method and provide the column names we can also provide aliases using as keyword like we have done in the first case uh right here or right here if we we can also use additional method called add select to select for example wi code here and price here but we can also add millage for each car and after that we call get and each car will have three columns V code price with the name of car uncore price in the millage if we want to select the distinct records we can use distinct method on the select like if we want to select the distinct maker ID and distinct module ID from Cars if you want to limit and take the off use the offset as well on the car we can use limit and offset methods but there’s Alternatives as well like skip which is equivalent for offset and take which is the same as limit if you want to select how many records exist in the database with some conditions or even without the conditions we can simply use count method we can use this count method directly on the car model which will return how many cars totally exist in the database if you want to select minimum maximum and average prices for example we can use mean Max and AVG methods on the CER Builder providing the column names for example the first code will return the minimum price of published cars inside the cars table the second will return the maximum price of published cars and the third would will return the average price of published cars in the database if you want to group cars we can use Group by Method provide the column using which we want to group for example we can use also this select row method which we’ll go which we will cover in the next lessons as well we’re going to select the car ID and count as image count and group by this car ID this will return car ID and how many images that specific car has and this will return array of cars car image instances and if we just print the first cars from that array we’re going to get something like this it is an instance of car image but it only has two attributes car ID and image count this is exactly what we selected if we access search page on our website we see that it’s still outputs dami data now let’s fix that let’s open car controller search method and let’s Select Cars so let’s use car we I want to always Select Cars which are uh published so publish that is less than now then I’m going to call order by to sort it by published it in descending order and that gives me CER quer Builder instance then on that CER Builder I want to do two things first I want to calculate how many cars there exist with the search criterias like car count equals on the Cy I’m going to call count next is to actually get the cars so cars equal on my cury I want to call limit to select only 30 cars and then I’m going to call get now I have car count and I have cars and I’m going to pass them right here cars and car count great now let’s open car slash search Search Blade PHP and let’s find the corresponding place where we need to Output them let’s scroll down below here we have found random number cars and this is where we need to put found car count cars and if we check in the browser that was the place where the random hardcoded number was outputed if I reload right now we see found 80 cars now let’s scroll down below and find the place um where we have these car items here it is this is the car item and we have this code duplicated main times so I’m going to collapse that actually I’m going to delete now those car items there’s plenty [Music] oops let’s see okay here we go so I deleted now we are going to iterate over received cars as car and we are going to use x car item providing the car right here because the prop name matches the variable name we’re going to provide we can do this in the following way now if I save and reload we see found 80 cars and those are cars selected from the database and those are 30 cars the pagination is dummy at the moment but we’re going to come back to this now let’s see different ways how we can order data using cery Builder we already saw an example of order bu but we haven’t mentioned that we have ability to provide multiple order by methods so we can do this couple of times provide the first order by column and its direction second order by column right here and its direction we can also use predefined latest and oldest methods latest method is going to do the same thing to order records by created that in descending order and the oldest method is going to do this thing to order by created it in ascending order however there is also possibility to provide additional column on latest and oldest methods like in this case we are sorting latest by published at so this is going to to the same as order by publish dat in descending order we can also select any records in random order and the method is called in random order and then we can get cars in random order so that’s a good thing if you want to always display random cars on the homepage you can do it like this also if we want to remove ordering an existing ordering let’s say we have this query Builder which is ordered by published at in descending order and we want to remove this ordering we can call reorder which removes existing ordering and then we can apply a new ordering order by price for example or we can also provide new column in the reorder method like if it is sorted with publish dat we call reorder price it removes publish dat and applies um the price in [Music] ordering when we open the listing of the cars and click any of the cars it is going to open hardcoded content right here and now let’s fix that part for this let’s open show blade PHP file from resources views car folder and we have to adjust this here we need maker so this is going to be car maker name let’s move this down then we need to Output car model name we need to Output car y here then we need to Output the city car city name this is the date when the car was displayed so let’s just output car published at date okay scroll down below now this is the image section so this is the primary image so let’s just output car primary image image PA and down below we have all the remaining images so we need to iterate using for each over car images as image and we need image right here and we have to provide image image path here image image path cool let’s delete all these hardcoded images let’s scroll down below what else do we have so here’s the detailed description we can provide here we need to provide the description of the car car description but let’s assume that this might have um content like HTML type of content so let’s use and output this with entities with unencoded okay and this is also part of description so we are going to remove REM this here we go we have then car specifications and these are car features okay uh we are going to get back to these car features in a moment but let’s scroll down below and find where we output the price and everything else so I think that’s the part here we have make this is car maker name then we have our model name we have car y this is car type so we have car car type name and we have car fuel type name what else do we have so we have the user Avatar who is the owner of the car we also have the username we don’t have actually avatar for the user but we have the username so here we’re going to use car owner and we have the relation to user through owner name car owner name and we can also output how many cars the owner has like car owner cars count it’s pretty handy car owner cars count let’s understand this car PHP it has owner method and through owner it connects to user and then user class has cars which relates how many cars that user has and we can access to that relation and then through that relation uh if we access this as a method then this returns qer Builder and then on that Q Builder we can call count okay great then here we have the phone number and we need to Output it for this I’m going to use St Str um helper class let’s use Str Str and I’m going to use method called mask we’re going to provide car phone and I’m going to provide the symbol which should be used for mask and I’m going to provide also the integer after how many digits uh it should apply this mask so here in this case we’re going to provide minus three which means that first uh the the last three symbols will be masked okay so we’re going to take this and we are going to put this right here as well now I’m going to save this and re reload the browser uh car maker name okay undefine variable okay let make sense let’s open car controller we have not passed that car let’s find show method here we have this car but we have not passed that car to car show blade file so let’s provide it here save reload now we see the name y whatever we see the price I believe this is hardcoded price we can come back to this but we have like the name how many cars that uh has the last three characters is masked we have some detailed description as for the car specifications this is something we have to fix the CSS needs to fix to be fixed as well I recently made some changes in the HTML CSS project inside CSS you probably have the latest version you probably don’t need to do this I’m going to copy that up CSS and put this in my project inside up CSS which comes from the public folder let’s replace everything awesome now reload the browser and we see these car specifications now on the right side we don’t display all the information like we don’t display VIN code we don’t display millage or address let’s open PHP storm go into show blade and here we also have this hardcoded price let’s replace this with car rice and now if we scroll down below we have make model ER let me duplicate this and this should be Vin then we have car type fuel type and we need address this is going to be car address and we probably need millage as well so I’m going to put this after WI okay cool reload the page and now we have a lot of information actually the whole list of information what we need to have last thing what we’re going to do on this page is this car specifications so this is hardcoded at the moment and if we observe that part which is above we’re going to see a lot of duplicated code so this is the lii which has the color red this means that uh it doesn’t have that specific feature and this feature is leather seats okay anyway so we have a lot of Li elements inside these car specifications and this is something I want to fix for each Li I want to create uh separate component so let’s open Terminal I’m going to execute PHP artisan make component car well I’m going to create this as view only component so I’m going to call this in a lower case car specification so this is going to be the component name Das D view PHP artisan make component okay now let’s open car specification blade PHP file let’s open show blade PHP file as well and I’m going to copy this liit tag one of the LI tags let’s take this one and I’m going to put this in the car specification however this one has color green which means that it’s um it is a checkbox we need the second SVG icon as well like this one here and we need to alternate based on the value okay now we have two SVG icons here now let’s accept prop props value and here let’s check check if value is true then we display this SVG the green SVG in lse case we display this red SVG we need end if here I’m going to use default slot okay cool now let’s go right here and we have to adjust this so let’s start from the first one we’re going to use X car specification and we have to provide value the value will be car features abs and we have to provide the actual content like the label as well let’s finish this car specification and the label will be ABS now if we save this reload the page we see an error okay the problem is right here yes car X car specification okay well this should be an array that’s my bet there should be an array now we save it reload it and we see ABS which has minus so this is the car with ID 23 now if we open the car with ID 23 ID equals 23 find that and let’s find its features we want to find features car ID equals 23 ABS is zero if I set the ABS to be one and save that then reload the page we’re going to see now the ABS turns into green and in the following way we are going to follow and implement the other specifications like I’m going to duplicate this many times I can delete all Lis right now don’t need them anymore collapse them to easily delete them okay cool let’s delete them and maybe I need labels corresponding labels okay let’s duplicate this multi times okay and then I’m going to copy labels for all of them using multi cursor I’m hitting alt on my keyboard here and here I just want to copy labels for all of them creas control Bluetooth connectivity remote start GPS navigation system heated seats climate control rear parking sensors and leather seats okay I have a lot of cursors created for every label then I’m going to hit shift on my keyboard and hit end on my keyboard so this selects the whole entire line and all these labels are selected so then I’m going to hit contrl and C just to copy all of them now let’s scroll up move up find that specification area and I’m going to create now again multiple cursor the first cursor goes right here then here so if you want to create previously we had multiple cursors already created like right now I have two cursors if I click somewhere else hitting alt it’s going to create the third cursor but if I click somewhere else without alt it is going to create only one cursor right here in this place so the first cursor here second here with alt then I’m pressing alt okay okay now I’m going to hit shift again and in this case home button and delete everything and hit control and V to just paste that rear parking sensors is the last one but there was something else after it as well so I just created uh not in enough ex car specifications okay I copied like maybe 11 lines but I had 10 cursor points that’s why one was lost maybe one maybe two was lost after rear parking sensors there was something else we need to scroll down and find that it was leather seats okay now let’s delete all these Allis because we copied the ual labels I’m trying to be cautious don’t to delete too many lines okay now I duplicate this and the last one was leather seats okay now we have a lot of X item specifications the only thing we need to adjust is to provide uh the corresponding uh Keys column names right here so let’s expand this and expand the column names and let’s start with the first one which is air conditioning so we can copy the column name and instead of ABS we can paste it right here next we have power windows we can copy the column name and put this right here next we have power door locks we can copy this put right here next we we have abs which is correct next we have cruise control which we can copy and put this right here next we have Bluetooth connectivity copy the column name put this right here we have remote start we have GPS navigation we have heated seats we have climate control oops uh we have climate control here then we have rear parking sensors and finally we have leather seats okay now this looks good um let’s save the file I’m going to open car features and I’m going to quickly test this I’m going to select all the features and I’m going to set zero for all of them now let’s open reload the page see minus in all of them now I’m going to put one in all of them and using PHP sh we can very easily do this you just need to select all the cells and put zero or one there okay then we need to hit this submit button right here so now we I reload and I see checkbox on all of them so our implementation of car specifications works perfectly and we have I believe very ready car details page as well let’s go back and open another car like this one Chevrolet Tahoe 2005 price every information different seller different phone number eight cars detailed description and different specifications if we access SLC car URL we’re going to see this hardcoded my cars page now let’s try to implement this for this let’s open car controller and we’re going to find index method here we are going to select the cars which belong to the currently authenticated user because at the moment we don’t have authentication implemented in our project we’re going to use hardcoded user ID 1 and select the cars for the user ID one so cars equal user let’s find with id1 and that we’re going to import that user up modules user and then I’m going to call cars um Q method on that and I’m going to also call order by I want to sort the cars by uh created at in descending order and finally we’re going to call get so I select the cars and let’s provide the cars right right here now let’s open car index blade PHP and we have to scroll down below where we iterate over our data inside tbody and we have to iterate over given cars is car okay let’s move this end for each below this TR right here and we can delete remaining TRS because those are hardcoded and we’re going to work inside that TR to Output the correct data so here for example we need to Output car primary image image path next we have car y car maker name car model name here we have the date when the car was created or when the car was published we can decide which one we want to display I’m going to display when the car was created car created it however I want to display just the date not the time okay so this will display the daytime uh let’s display this and then I’m going to come back to it and so here we have um whether it is published or not and we can use if car published at exists then we print yes if not we print no this is something which we have to provide car. a edit and the car entire object we can collapse this and this is a link to car images uh well we can skip that right now when we Implement car images page then we can come back to this and this is the button to delete the car and I’m going to come back to this later as well now I save this I reload the page and here we go so we see the cars for the user for the user one so we see um the basic information we see date with time which we need to change and only display uh date without time we have the published flag this one is not published and we have this edit images and delete button as well if we have a look at the HTML CSS project we can see that the edit and images buttons have different colors and they look slightly differently that’s because there is uh these buttons are styled under page M cars so what we need to do is to add page my cars to this page so let’s scroll up and inside X up layout um do we support this page class let’s open up Dash layout or up blade PHP okay we don’t accept page class we accept it probably in the base layout but we don’t accept in this um up plate PHP so let’s take like body class which by default will be null and then let’s provide body class here like this okay now from here we provide body class to be page my uh well we have to remove this column page my cars is it correct I mean the naming page- my cars it looks correct so we save it and reload in our LEL and we see that the buttons got blue and the delete is red and the styles are properly applied next is to fix that date right here and for this we are going to use use carbon package in LL there is by default um it comes with LEL it’s a carbon package working with a date carbon is a very um powerful date manipulation Library okay so we can create an instance of carbon providing this car created at and then on that we can call format I’m going to put this in parenthesis I’m going to going to call format on this or we can create a method in the car model so if we open car. PHP scroll down below we can add new method here get create date we’re going to return new carbon we provide this created it and we’re going to call then format on this providing year month day okay now U and we can specify that this returns string now let’s take this method name and use it right here so on car we’re going to call get create date and let’s check in the browser reload the page and we see just the date here we are using for each but if there are no Cars I want to also display um some information that there are no Cars the user has no cars and so on instead of for each we can use for else then oops like this for else then we have to provide right here empty directive and inside we need TR then we need TD I’m going to provide call span to these five let’s provide also text Center pting uh Dash large and inside here I’m going to write the following text you don’t have cars yet and we’re going to put a link to car create page as well so for else empty and finally we need end for else we save it we reload it we don’t see any changes right now but if we open car controller and change the user uh ID from one into three for example I believe three doesn’t have any cars uh no it has uh let’s change it into four maybe five it looks like all of them have some cars user okay all three all users have cars let’s search for user ID equal five and these are the cars for the user ID five which I’m going to change and assign it into user 4 now fifth user doesn’t have any cars so I reload and I see the following page you didn’t have any cars yet a new car clicking on this should open this a new car [Music] form now let’s Implement watch list page first let’s create blade file HP artisan make view let’s call this watch list but we need to put this inside car folder car. watchlist cool now let’s open car controller and I’m going to add additional function right here called watch list okay okay then I’m going to return a view from here car. watch list I’m going to select the watch list cars right here so cars equals let’s find user with id4 again we are doing this uh with hardcoded approach so to do we come back to this okay so we find the user and then I’m going to call F favorite cars on that user then we provide cars to be the cars now let’s open just created watch list blade file inside car and we have to copy and paste some content from the HTML CSS project here we have watch list HTM HML and we’re going to find this main tag here it is I’m going to copy and here we’re going to use x up layout and put this inside X up layout okay if I save this uh we have to Define the root as well so let’s open web.php duplicate this car search and I’m going to call this car watch list and we should change this into watch list as well and the name will be car watch list as well now let’s open the browser and access car watch list hit the enter and we see my favorite cars right here which again at the moment is hardcoded now let’s open this watch list blade and we have bunch of car items we need to delete pretty much all of them so I’m going to scroll at the very [Music] bottom where it is here it is here it ends okay oops sorry so this is what what I’m doing we have this car items listing and I’m going to leave my cursor right here and then scroll at the very bottom until I find it’s matching close using tag here it is so this is it now I can delete from the top so from here up until here I’m just trying to do this slowly so that you can learn but in practice when you get used to it so you can you you’re going to speed up your working process a lot so for each cars is car and we’re going to use x car item providing car right here now we save we reload and we see the items which are in the watch list so we see that the page does not have uh the heart icon highlighted like it is right here on this HTML CSS project so this is watchlist. HTML so the heart is highlighted here but not here and we have to fix that let’s open HTML CSS project again and we are going to find the heart icon which is highlighted so this is inside this car item let’s scroll down below here we have this SVG uh and I’m going to select this SVG let’s go go into our car item scroll down below find that SVG and I’m going to put the copied SVG here the width is 20 pixel here we have the 16 pixel we can reduce this to 16 pixel okay always now we probably have two icons um one which is not which is highlighted which is fielded and the second which is not field now based on some flag we need to decide which one we should display okay so if we are rendering this car item from the watch list we know that all the cars are inside the watch list so on this props inside this car item let’s add a additional prop um is in watch list let’s call this is in watch list and by default we’re going to provide false it is not in watch list then based on this flag is in watch list we are going to do the following so I’m going to add extra class on this SVG which is not fi SVG so this should be hidden if it is in watch list let’s format this nicely and in the same way the second SVG should to be hidden if it is not in watch list now because all of the items are in watch list if I reload the page uh we don’t provide watch list don’t we or maybe do we have this hidden class let’s open up. CSS and find hidden class and here we go here we see only one icon but that is not the one we want so maybe maybe we should inverse this so hidden uh if this is in watch list and hidden if this is not in watch list now we save and we reload and we see that this is filled however the styes right here is again different so we need to inspect this and have a look so we have this pitting hard icon it has text primary B um BTN heart text primary let’s have a look we have just BTN heart not text primary let’s add the following class as well reload the page and we see this in Orange nice orange color however because we add this text primary it will be in orange color even on the homepage uh right here uh which well this should be this should be in or orange color but not fi so let’s check we have this car item is in watch list this is always false we are going to print what is the value of this is in watch list when rendering on the homepage so it is always false then why do we see this field one we shouldn’t see this field one right so again we did something wrong so the first first one this should be hidden if this is in watch list and this should be hidden if it is not in watch list reload the page that is correct however if we go in the watch list page this is the issue the watch list page we’re going to provide is in watch list and we are going to provide um well we can provide always true at the moment because if we are rendering this from watch list page it will be in the watch list in any case so let’s remove this dump reload the page we see this orange but not fied if we go into car watch list page then we don’t see also it fied let me return this damp again and we see that this is false is in watch list I have a typo is in watch list this is it s was missing right here save reload remove the dump and reload building realtime applications not the real time but the real world applications is challenging you always make some typos you always have some issues but the good thing is that when you finally make it you feel that satisfaction now I want to talk about one very important concept and this is called eager loading now imagine the following case we’re selecting five cars we are iterating over our cars and we are just printing the car city name however this line uh has accesses the relation City and this line makes select for every city so finally the following Cod code will make six queries one select will be to select these those five cars and then there will be five subsequent queries for each car to select its Associated City okay and even right here the first select and the last select uh is the exact same even the ID is 15 that’s because the first car and the last car both are for the same city okay how to fix that problem uh and that problem actually is very common problem this is called n plus one problem cers problem and this problem will get even worse if you try to access multiple relations like we are trying to access U City and we are also trying to access car types now number of curers will be much more it will be actually uh 2 * n+ one so one quer to select cars and then for five cars and then there will be 10 more cies five for each relation and imagine that we’re now selecting 30 cars or 100 cars the number of C is made for cities and car types will be 200 for if we are selecting 100 cars so this this is very common problem and that problem is the might be the number one problem on your website to which degrades the performance um and the load time of the website how to deal with this problem we can provide with method on the qer and we can provide the relation names right here we can provide just a single relation name City or car type but we can provide both so in in this case this line does not make select for every Cy instead there will be totally three selects made the first select will be to Select Cars the next select will be to select cities for all the selected cars in the next select will be to select car types for all the selected car types totally three qies and it really doesn’t matter in this case if we we’re selecting five cars or 400 cars there will be still three curers made on the database this is pretty handy now imagine the case that we are accessing nested relations like we are accessing cities states name in our case without this eager loading it is going to make again a lot of requests so want to Select Cars want to select the city even though we don’t need city um and the next one we don’t need any information from the city but we need just information from state so we are not using information from City but it’s still is going to make um to cities and then States cities states and so on to fix that we can provide nested relations inside with right here with city. State and again we can provide multiple relations in this with method now when we are trying to access CT and State totally there will be three Qs made one for cars second for cities and the third one for States we can do the same thing if we provide such type of nested array inside with like city which is an aray and it has inside their state or car type so this uh selects cars with city and state and car type as well there is possibility to provide this with and like activate this eager loading by default if we provide protected dollar sign with property on the car so here we have those three relations defined inside car protected with like city state city. state car type and fuel type now when we write the following select without with inside car this selects five cars then we try to access city and state but totally this is going to make five queries one query is going to be to access the cars the next query is going to be to access cities based on the relation the third query will be to access States fourth one for car types and the last one will be for fuel types and here are all CES made okay there’s also also possibility to provide additional constraints additional wear Clauses when implementing eer eager loading for example we want to select car with images but right here we are providing also a closure function as a value of this associative array of images okay pay attention on that cury here in this function we are accepting the qer and on that qer we are adding additional re Cloud where the position is one which means that I want to select cars with images but only those images which has position one so finally when we try to access right here on this following line uh images when we dump the images the images array will always be one and it will be an image which has position one and here are the cers made for this first to select cars and the second one is to select car images for the already selected cars but the position needs to be one as [Music] well now we know what is eager loading or and how we activate the eager loading let’s implement this in our project for example on the home controller and on the home page so I’m going to give you this challenge to you you can think a little bit try to implement this and come back back and see my solution but I’m going to also give you hint how to do this if we open Home index blade PHP from here we are actually iterating over cars and we are using this car item so let’s open car item here this is the place we are accessing relations of car like here we are accessing the primary image City and so on you have to identify all the different Rel relation types we are accessing from this car item and then you have to provide those relation names inside with method right here okay enough speaking try to implement this and come back and see my [Music] solution all right here’s my solution let’s provide with the method here we need primary image we need City we need car type we need fuel type we need maker and we need model so these are the relations as I remember we are using inside the car item but I’m going to double check so primary image we are using CT we are using scroll down below we are using the model maker car type and fuel type and that is all now since we Implement those relations now totally the following code will make the code on our page will make um let’s count how many selects it will make and maybe this also try to guess how many selects pause the right now and try to guess how many selects will be made on the homepage okay now let’s count it together the first select will be to Select Cars the next one is to select primary image then the third one is for City fourth one for C type uh fifth one six and seven so totally there will be seven cures made on the homepage and it really does not matter if we’re selecting 30 uh Records right here or even 100 but without this with now I have another challenge to you if I comment out this with can you guess how many selects will be made on the homepage okay let’s count this together as well one select will be made to select cars now when we try to access to this primary image second select will be made third and so on I’m not going to count all of them but the point is that for every car we are going to make select for every relation totally we have 30 cars and how many relations we have 1 2 3 4 5 and six so totally this is going to make 180 selects just to select the relations and plus one to select the cars you see the difference right 181 select versus six select um this is how powerful eager loading is and this is why eager loading uh is the best thing what you can do on your website uh the probably the very first thing what you should check if you have correct eager loading implemented on the website if your website doesn’t work [Music] fast now I have additional challenge to you I want you to implement this eager loading on search page watch list page and my cars page okay I hope you did it now let’s see my solution on the watch list page after whenever I’m trying to access favorite cars so if I try to access with properties this gives me collection but I am going to access as a method which Returns the CER Builder instance and then on that I’m going to call with let’s move these favorite cards down I’m going to call with on this and I need need the exact same relations I defined in the home controller because the car watch list is using car item component and car item component is accessing the same relations which what we have added in the home controller so we’re going to open Home controller and I’m going to copy this with method and put this right here and semicolon at the end now let’s find search method and we’re going to do the exact same thing on search because search is also using the same component car item component now let’s access index page which is my cars page and here we don’t need all the same relations for this let’s open car index blade and identify what relations we are using so we are using primary image so let’s put right here cars with primary image next what do we have we have model we have maker let’s provide maker and model do we have anything else no in the listing we don’t have anything else so these three relations inside car controller index will be totally enough in the W list method I forgot to call get method after providing with without the get obviously we we cannot have any kind of cars so this get should be [Music] here sometimes when we select data we want to join to another tables and filter the data by another table or simply select the data from another table I assume that you are familiar with typical database joins this is how we’re going to implement the same thing in l through eloquent we have right here cars and let’s say that I want to filter those cars with State okay how we’re going to do this on cury I’m going to call join and I want to join to cities right then I’m going to provide the first argument of the join method is the table name I want to join the second argument is the the column name from the related table cs. ID the third argument is going to be the operator using which we’re going to do the comparison equal sign and the last argument is going to be the column name in the current Table like cars CT ID Now using the following way we joined to cities and now let’s say that I want to filter those cars based on the state ID so then I can add extra we Clause right here where cities. state ID equals 1 and in the following way we are going to have filtered data for the state id1 on the search page now let’s open the browser let’s go to search page and now look at this we have totally found seven cars only seven cars and we see only seven records and all of them belong to the same state and this is a probably Los Angeles State because we have um cities um around Los Angeles if I comment out this part reload the page we’re going to see 80 cars and we’re going to see 80 cars in the listing as well so that’s the one use case how you can use join and in which case in why you want to use join the second reason is that you might don’t want to make make an extra quy for example on City even though we have that City inside with a second extra query will be made to select city right so what we can do is the following on cury we can call Select to select everything from Cars plus we are going to select cities. name as cityor name now we select um the select does the select accept multiple arguments we’re going to see then right here inside the cars let’s just dump cars at zero we save reload and the first we have the first car right here and if we expand its attributes we are going to see CT name right here now if we access this is using the car search now if we access car item component uh here we are accessing through relation car city name and this makes the request and right here this also makes request what we can do is remove move this city from here okay and here instead of relation city name we can access ccore name because that is already selected okay however in this specific case I’m going to leave this accessing through relation because that is not um very expensive operation for our website to just make one select for City but but sometimes that separate select might be very expensive Cy that’s why uh if you are still making the join uh why not selecting it so there’s you should always choose between like the readability of your code um and the performance you should take something in between making your code super super optimal while you have like 100 users monthly active users on the website doesn’t make any sense rather it’s it’s better to uh focus on code readability because the relations also is going to work very fast okay let me comment out this part uh you can also apply joins um multiple times on your table for example here we are joining on cities and filtering but we can also apply additional join on let’s say car types where car types ID equals to cars car type ID and let’s say that I want to filter cars which has car types name equal sedan right so we can use this combination as well in this case I assume I doubt there will be any records uh oops where is that yeah there was nothing found because uh the two wears like the cars which are in state one and also uh they are sedan it doesn’t exist but if I change this into two maybe it exists yeah it was found and here we see that um car type ID is one which is San and this is here we see name as well sedan and the question is probably why do we see right here name sedan in state ID as well because when we don’t provide anything with this select by default Lal selects everything so everything from joined tables and that’s why everything from cars from cities and from car types is selected and that’s why we see right here state ID and name however it’s a good practice to provide if we are doing join it’s a good practice to provide everything from Cars table only and nothing else now I reload the page and we don’t see here state ID or name because we are only selecting information from the Cars table okay so this was inner join example however there is also a separate method called Left join left camel case join uh and we also have right join and it works in the exact same way like it works in regular databases in MySQL or in in even SQ light um I’m not going to provide more information about that right now because it’s a pretty straightforward it’s the the syntax is the same the table name First Column equals second column and um the left join Works differently right join Works differently and I assume that you know what’s the difference between inner joint left joint and right join uh if you take this course if you want more advanced joins and more additional we Clauses on the join you can do this in the following way let’s say we’re selecting cars joining into car images and right here in this join we can provide closure as a second argument uh we accept instance of join clause and on the join Clause we can call on our own condition how we connect these two tables together like cars ID equals car images car ID and we can provide extra we right here car images position equals one so we are making the join to car images but only those images which has position one we can also add extra or on like car’s ID equals car images car ID or and second condition whatever you want so this a pretty Advanced uh case uh you won’t find this very often but I just wanted to show to you that in case you need it you you know that that this course has a slide on that information and you can come back and find this [Music] out we already covered the most common wear Clauses in L but there are even more let’s see couple of examples how we can use wear Clauses or what additional wear Clause methods exist in LEL we can apply multiple we Clauses just like we are doing right here this is pre pretty straightforward however every we method accepts three argument by default and the second argument can be the operator and that operator can be any valid operator supported by your database like in our case we are using equal sign greater than or even like where are we providing the string with with parenthesis the we method also accepts an array and in which case we can provide multiple we Clauses as array each of them like array of sub arrays where each sub array is the column name operator and the actual value now let’s see an example of or wear Clauses sometimes we want to select very old cars or very new ones and for this we’re going to use or we like in our case we your is less than 1970 or where the year is greater than 2022 we also have we are not Clauses we are not dedicated method and in this case this is going to Select Cars where millage is not greater than 100,000 obviously we can write is less than or equal to 100,000 with we close but just for your information you should know that there exists we not as well there exists also we any clause which gives you possibility to provide multiple columns and if any of the provided columns satisfy the condition then the car will be in the final result so in our case if address or description contains the text York inside there then the will be selected there also exist wear all CLA in which case all Fields provided in this array needs to contain the word [Music] York now let’s cover a couple of more wear Clauses which are not so often used for example this we between or we between in our case we are selecting cars which has Y in between in 2000 in 2020 we can also provide or where between if we need so there also exists we are not between and or we are not between so in our case we are not selecting cars which are between 2000 and 2020 which means that we’re selecting cars which are outside of 2000 and 2020 years the next one is we we null we are not null or we are null or we are not null if we want to select all the cars which are not published yet this is the code how we can do it car we are null published at get if you want to select the cars which are published then we’re going to use we not null published at and get again we can always use or we are null or we are not null if we need to use or we CLA as well the next one is we are in we are not in or we are in or we are not in for example if you want to select cars which are for maker one or two we are going to use we in maker ID one or two if you want to select the cars where the maker ID is not in one or two we would use we’re not in maker ID one and two we are in we are not in also accepts additional cury for example if you want to select the users which are signed up with Google we would use the following select user we are not n Google ID but this returns a quer we are not calling get method we just return the quer then we could use that quer to provide inside wein method car wein user ID in the given qer finally the generated SQL looks like this select everything from Cars where user ID is in and second select right here so this gives us possibility to provide extra additional subcy inside this we in the same way we can use or we are in or we are not in the next is we date we month we day we year and we time these are pretty straightforward all of them works with dates the first argument is the column name which typically contains datetime values and the second arguments are depending on which method we are using for example in the first case uh this just make sure that the published dat is a specific date like 2024 07 12 the second method where month makes sure that the publish date is a specific month like July we day make sure that publish date is the first day of the month we are year will return cars which was published in the last year in 2023 and the last one we are time simply I think this this is going to be very rarely used but we can select the cars which we published at a specific time hour minute and second the next one is we column or we column if we have like two columns created it and updated that and we want to select those records cars or users or whatever where the created Ed and updated it columns are the same which typically means that the record was not updated after it was created so if you want to select records which were not updated after it was created we can use this Weir column the second example is to select the records we the record was updated since it was created where the updated at is more than created at we can also provide multiple conditions inside we column in the following way array of sub arrays there are also exists we are between columns we are not between columns or we are between columns or we are not between columns we don’t have a specific example in our project so I took this example from Lal official documentations so we select the patients where the patient weight is between minimum allow weight and maximum allow weight or we can take the patients where the patients weight is not in between minimum allow weights or maximum allow weights and finally there is we full text method as well our current database which we are using for this project sqi does not support full text search but if we are using any other database like MySQL postgress and so on it supports full text and if there exists full text index on the database then we can search cars or whatever information in the following way considering that full text index where full text the column name and the search keyword BMW for example now let’s have a look at the following example car we Y is more than 2010 additional Weir price is more than 10,000 or where price is less than 5,000 so imagine that we want to select the cars where the Y is more than 20110 and the price is either greater than 10,000 or less than 5,000 so the generated SQL looks like this and here is a problem if we want to have the price condition grouped together let’s say that the Y condition must always be there and the price condition should be grouped together then this qer has a problem so you should be always careful when using or we in your applications and the recommended practice is to use this logical grouping so in our case we can use another Weir like we have the first Weir to compare the ER but here we have the second Weir which accepts a callback function as well so we provide the Callback function inside this callback function we accept this Q with a builder and then we can add those two conditions where price is more than 10,000 or pric is less than 10,000 and because we have provided closure function and we use that grouping the generated SQL looks like this now as you pay attention we see that the r is more than 2010 and the price condition is grouped inside parenthesis and this is exactly what we wanted now let’s see an example of where exists let’s say we want to select cars that have images and we don’t want to select any car that doesn’t have image so in this case we can provide a method called where exists we can provide the function and closure function that function accepts a query parameter right here so we take that query and on that query we can select something from car images but we are connecting to the outside select so select ID from car images we column car images car ID equals cars. ID so here the equals is not we can obviously provide the second argument to be equals but if we don’t provide second argument equals and if we only provide two arguments right here LEL will automatically assume that the parameter the operator excuse me the operator using which we’re comparing these two columns means equals the nested select right here means to select car images for the parent car so this finally it’s going to create nested select using this we exists or we can do it in the following way as well we can directly provide viy inside we exists car image select ID we column car imagees car ID equals cars ID so this two piece of code is doing the same thing and this is what generated SQL looks like select everything from Cars where exists and the nested select to ID to select ID from car images where car images car ID equals cars [Music] ID now let’s talk about sub CES the Weir method accepts a closure function and that closure function accepts the CER filter we can pass that function to a couple of other methods like or we we’re not um and and couple of others as well but in our case we are selecting sedan cars but we are using this nested select approach so let’s Analyze This nested select first cury select name from car types where column cars car type ID equals car types ID and we’re just selecting one okay so this nested select will be executed for every car and it simply is going to select name of the car types and in the outside this Weir has second argument equal and sedan as well so inside this wear so whatever is written inside this wear will be a value which equals sedan that quer is the same as the following one we have that subquery in its own separate variable car type select we column cars car type ID equals car types ID limit one and we’re providing the subquery inside this where where the subquery equals San and the final generated SQL looks like this select everything from Cars where something is selected here equals San and that something is Select name from car types where cars car type ID equals car types ID line one this limit one is important otherwise the following select will select multiple values and the wear condition will not work because multiple values cannot be compared to a single value here we have another example we’re selecting cars which has price below average price so here inside this we first we have the price Which is less than and the closure function so in previous example first we had the closure function and the subq then we have the operator and the static value here we have it in a reverse order we have static value not the static value but actual column and that column operator and then we have this subquery inside subquery we’re selecting using select row we’re selecting average price from Cars so we’re simply selecting cars which has price below average and the generated SQL looks like this if we want to debug our SQL cies there are couple of functions for that one of them is dump which dumps the cury with its parameters it is going to dump the actual generated SQL as well as the parameters which are bound to this we close in our case we have only one parameter this is 100,000 the second method is DD which dumps the SQL the parameters and it dieses stops the code execution there also exists 2 SQL which dumps the row SQL which has parameters replaced already this does not print separately parameters and separately prepared SQL statement instead it is going to dump a single row SQL parameters already injected inside SQL and the last one is DD row SQL which dumps prints the row SQL and it simply stops the [Music] execution in Lal there are multiple methods to implement pagination the easiest approach involves using paginate method on either the query Builder or on an eloquent cury for example I’m going to delete everything right now and on that cury I’m going to call method called paginate which returns an instance of paginator and I’m going to assign this into cars then when we provide cars and car count right here we can completely remove this car count and we’re going to take care of how car count will be displayed in the search blade in a moment this method the power of this pinate method is that it automatically handles setting the C’s limit and offset according to the page the user is currently viewing by default the C page is identified by the page cury string parameter in the HTTP request Lal detects this value automatically and inserts it into the pagination links generated by the paginator awesome let’s open Search Blade PHP we don’t change the iteration we have these cars as an instance of pator and we leave it like this now let’s search for car count and this place we are going to change we’re going to use cars total method for this and finally let’s render the pagination links on cars I’m going to call method called links so we save it now let’s have a look in the browser we reload the search page and we see found 82 cars which is coming from now paginator total method and if you scroll down below this is the pagination links generated by L this is our hardcoded pagination uh right here it is collapsed uh we’re going to take care of the templating in the next lesson but let’s understand why we see preview and next right here or where are the other links I’m going to inspect this and I’m going to collapse this D and here we have another D which has class hidden by default the default template Lille uses for pagination is taln CSS template and the template has different pagination links on different screen sizes like it has preview and next on small screens and um the full pagination links on large screens and it adds this hidden class on the pagination links on large screen okay so if I remove this hidden class now we see the summary of the pagination as well as the pagination links and again we’re we’re going to work styling of these pagination links in the next lessons now if we Mouse over or if we click any of the links right here we’re going to see in the URL page equals 4 if you scroll down below if we just remove this hidden class once again then we see that now we’re showing 46 to 60 results and the active page is four right here this is what I mentioned LL automatically manages the pagination links based on the Cy parameter and it automatically generates also these links based on the Q parameter and based on the pageat result we can use this next button now we are on page five obviously the summary is hidden but we are vieing different results set and um that is all now I think we can customize the pagination links there are several ways to customize pagination the first way is to provide New View name inside links method right here for example let’s call this pagination the view doesn’t exist that’s why we’re going to get an error the error tells view pagination not found the second way is to not provide pagination here but open up service provider in inside boot Define what should be the default pagination view for this we’re going to use paginator illuminate pagination paginator and on that we’re going to call default view for example pagination again if we save this and if we reload we’re going to still see the same error view pagination not found and the third method is to customize existing TN CSS view now let’s open Terminal and I’m going to execute the following Artisan comment PHP Artisan vendor column publish D- tag equals LEL D pagination we hit the enter now it copied directory from vendor Lal framework illuminate pagination resources views into our resources views vendor pagination okay now let’s have a look inside resources views vendor now we have a pagination folder and there we have bunch of pagination examples for bootstrap 4 five default one this is semantic UI simple buop four simple buop five simple default blate simple tnd blade and tnd blade so the tnd blade is what right now Lal is using by default so we can customize this if I simply remove everything from here and just leave one one one we save this reload the page we are still using the default one so I’m going to comment this out reload the page and if we scroll down below here we see 11 one which is coming from the following tallwind blade PHP so you should choose which approach you want in your desired specific case but right now I’m going to create new view called it pagination and I’m going to use that pagination view instead of modifying the tnd blade PHP and actually we don’t even need that vendor folder right here I just show to you how you can publish it and customize it but you know what I’m going to delete this vendor folder completely let’s uncomment this and set the default view to be pagination and then I’m going to create new view let me create this using Artisan PHP artisan make view agation we hit the enter the view was created actually it created um yeah it created only view yes I thought I created component and I thought that maybe it created the component class as well but no we created just the view so here we have this pagination blade PHP the pagination blade PHP right here accepts an instance of paginator and I am going to Define this right here for my PHP storm so that PHP storm autocompletes all the methods it has slash asterisk two times then I’m going to define the variable paginator is an instance of length a paginator so this is the class uh which instance the paginator is is okay great we can print that right now let’s use Cur braces DD paginator and we’re going to see all the properties of this paginator here we see that so it is an instance of pagination length of we paginator it has its own items let’s expand it it has items it has per page current page path and so on it has options as well and a couple of other things okay now let’s start step by step implementing pagination first let’s open Search Blade and let’s take this nav which is the our pagination template and let’s copy I’m going to copy not cut because I have to modify and then when I Implement everything in the pagination blade then I will delete this now okay so here I have this pagination if I save this right now and reload it we see pagination two time which is fine now let’s start in the following way first we need to check if the paginator has more pages if it doesn’t have more pages we should not even display pagination at all so if it has more pages then we display the pagination okay this is the first step next step is to take care of the links so here we have the this is the first page link this is the previous page link then we have links for each page and then we have next page link and the last page link so the first page link this one and the last page link I’m going to remove okay we’re going to use only preview and next and then the first page link right here will always be displayed and the last page link will also always be displayed that’s why we don’t need a separate like the first page Links at the top and at the beginning okay now what we are doing we need to check let’s use if directive we need to check if paginator is on first page or not if it is on the first page we need to disable the previous page link uh button link whatever okay so if it is on first page then we have to disable this however in else case if it is not on the first page we have to show it let me copy this a and if it is on the first page I am going to remove this hre and I’m going to change this into span now we have span instead of a if it is on the first page link which means that it is disabled however if it is not the first page then right here we have to Output previous page URL now if I save this reload the page we are on the first page and this is actually disabled if I Mouse over we don’t see any horor effect however if I change page into two scroll down below then I Mouse over now it is enabled and it takes me to the first page so that part already works and we can do something similar for the next page as well so right here let’s write if a gator has more pages then we need to display the link and if in else case if it has more pages then we have to display the link if it doesn’t have more pages then we have to display right here span okay let’s format this nicely and I think we are good now let’s reload the page the last page I believe is um how many links do we have okay we can take care of we can check everything at the end I just wanted to check that the last part was working but we can check this everything at the end okay now we need to iterate over the links and render them however there exists a special uh variable already available which is called elements so let’s print elements what is it scroll down below it is an array at the moment it contains only one element inside there and that one element is also array and this is links those are the pagination links so in the nutshell we need to iterate over these pagination links however if we go into another page like page four for example scroll down below okay we have to increase the pagination uh number of pages so instead of 15 right here I’m going to provide five which increases the total number of pages and let me try to access page number seven scroll down below now look at this inside this array elements array we have three elements uh the first one which is array of 10 elements then we have string and then we have second array which has only two elements inside there okay now this is something we need to take care of and we need to handle properly okay let’s go into pagination and let’s start iterating over our elements for each elements as element then we need to check if is string if the element is string it means that it is that three dot here we have this three dot if it is string it is a three Dot and we are going to display it in the following way imagination item let’s remove active class it doesn’t need and right here we’re going to Output the element this is a three dot however if it is not string and if is array elements or element then we have to iterate over element so here I’m using nested Loop for each element is Page and the URL this is how we have those elements right page and URL okay great now I have the page and URL and I’m going to grab this a link and I’m going to put this right here however we also need to check well right here we need to Output p and right here we need to provide URL however we need to also check if the current page is the loop page so that instead of a we’re going to display Span in this case so let’s use the following if if page equals paginator current page here is the current page okay paginator current page will always return what is the current page in the URL query parameter and if it is the same as the page right here in this Loop it means that we are on that page so we’re going to display pan in else case we’re going to display a link and let’s take this and display span right here let’s remove this hre and let’s also add class active okay I think we are done if I scroll down below we can remove this two three four awesome so this is for next this is for current pages and this is for preview I save it I load it and you you see bunch of pages right so we see one two whatever so we have a lot of pages and I believe we can reduce this if we use method on the pagination called on we should provide it here on each side and let’s provide one on each side of the current page on the left and on the right side we want only one page to be displayed so I reload it and now this is how we look it okay so we see the current page is seven um before that we have only six nothing else and on the right side we have only eight if I activate eight I scroll down below then we see nine and seven here and just like this we always see one page before and after then we see three dots and at the end and at the beginning we see uh two Pages now we can open search plate PHP and we can remove this hardcoded now and just like this we have pagination implemented if we want to go to the last page we are going to click um 17 right here then the pagination is gone the pagination is gone because in this pagination blade PHP I used incorrect method has more pages instead of has more pages I should have used has Pages if the paginator has Pages not more pages if I reload right now we see this pagination links the last one is disabled however I noticed something if I Mouse over on this one I see that the link is not correct so let’s open pagination scroll down below and right here we are going to use pator next page URL save reload and this one takes me to the page [Music] 17 now let’s output correct pagination links on my favorite cars page and on my cars page as well let’s open watch list method right here and instead of calling get right here we’re going to call Page inate and let’s provide 15 here so we’re going to display 15 items per page we provide cars let’s open watch list blade PHP here we have this my favorite cars here we iterate over cars and right here we’re going to display page Nation links this is going to be cars links and I’m going to provide also on each side to be one I save it reload it scroll down below okay it is working perfectly so there are totally four pages and that’s why we don’t see more than that but navigating between Pages works perfectly fine great however I also want to display how many cars the user has in its favorite cars section so maybe next to this my favorite cars right here on the right side we can display this pagination summary for this we’re going to do a kind of custom solution here so I’m going to wrap I’m going to introduce a new div let’s give it class CSS class FES uh justify between and items Center okay then we need H2 and then I’m going to check if cars total is more than zero and if in this case we’re going to display a div with class of pagination Das summary I’m going to create paragraph as well and inside the paragraph I’m going to write showing we’re going to use cars first first item item car’s first item then we need two here we need cars last item then we need off and we need cars total results or cars okay we save it we reload the page and here we see showing 31 to 45 of 50 results we know that when we create C data the user has 50 cars in its own watch list in its own favorite cars list that’s why we see totally 50 results if we go on the first page then we see from 1 to 15 of 50 results I believe we don’t need dot at the end but the summary is there which is great so let’s go to search page and I think that we have this pagination set to five and we’re going to increase that so I’m going to search for method search then change this page8 into 15 and then let’s open index and we are going to change this as well if we try to access car right now there are no cars for this specific user user five but let’s use user one reload the page now user one has multiple cars let’s change this g into pinate for 15 now let’s open car index blade PHP scroll down below here we have this nav let’s remove this nav and use cars links and again I’m going to use on each side we need one save and reload scroll down below we see only two links because there are not many cars for that specific user however if we change this page inate from 15 to five we’re going to see much more links right here okay this is great let’s return this back into 15 [Music] leral also supports simple pagination which is simplified version what we already covered for example I’m going to change this pagate into simple paginate save it and if we reload the page we’re going to see just preview and next links we don’t see all the links in the pagination and there are couple of other restrictions regarding the simple pagination simple pagination is more lightweight it um it is less expensive in terms of how many Q are made on the database so if you only need next and preview links then this is what you are going to use also simple Pate doesn’t support total number of Records in your application so we cannot actually use Simple pagate on our watch list because right here we are displaying total number of Records we cannot also use it on search page because we are using 82 or we are using the total number of Records right here okay and on these Pages we need those pagination links so it doesn’t make sense to use the simple paginate in our case but I just wanted to give you information that if you only need next and previous pons and nothing else no total a number of Records no actual links then simple page8 is what you should use if I try to use right now simple paginate on watch list simple paginate we are going to see error let’s go back reload the page and this is the error method total does not exist and this is exactly what I mentioned simple page n doesn’t support that and also the instance um right here the instance of cars is different it is not what we previously covered length paginator it is simple paginator I’m going to Simply undo this but now you know that if you need simple paginate it is there if we are using simple paginate and we also want to customize the pagination buttons these preview and next buttons we can provide again in the same way we can provide view to the links method in the car index here we can provide a new New View file or we can Define uh the default view file for simple pagination and we can do this in the following way paginator default view simple View and provide pagination D simple for example in this case because we are not going to actually customize it I’m not going to create this pagination simple but if you want it you can customize the view in the following way or again you can publish the vendor BL pagination blade files and you can also customize the default simple pagination file from there now I’m going to show you several more cool features regarding pagination first let me reduce these five so that we can have everything easily visible on the page I don’t want too many records next after we call paginate we can call couple of more useful methods such as for example if we want to link each pagination button into a different page we can use method called with path for example if we want to link this to a different page as I mentioned like user SL cars page if we save it reload it then if I Mouse over on this we see that the URL is user cars obviously we don’t have that URL it doesn’t support that URL but uh if you need that it is there and sometimes that P might be very helpful the next one what I’m going to show is to provide additional query parameters such as for example if we have sorting applied on the website and we want to keep that sorting we can provide that sorting uh cury parameter we’re going to learn how to take those cery parameters from requests and reply it right here here but for now let’s just append additional query parameter on the generated links appends associative array sort in price we save it reload it and now if I click on page two we see in the URL sort equals price and then we have page click on page three sort equals price and then we have page three which is pretty cool if we want to save preserve all Q parameters what we currently have in the URL in this case we have to use with quy string so that is going to preserve all the other Q parameters what we have in the URL so reload the page now we have sort query parameter in the URL we navigate between pages and sort will stay there if we add additional query parameter for example name equals Zora hit the enter Then the generated links will also contain name equals zura in the URL that is pretty cool however if I just leave up and sort and comment these with C string and if we have additional CER parameters such as name Zora for example then when we navigate between Pages name zoraa will be lost okay so depending on your use case sometimes you want to preserve all the Q parameters sometimes you only want to provide your own parameter through a pens method and the last method I want to mention is fragment so here I can provide if I have a specific section on my page which has ID cards then I can provide the fragment and generated links will have hasht cars in the URL this is also pretty cool and you can use these methods in combination together like all of them or a couple of them as you want but based on your needs now you know what possibilities there exist in lot of pagination and you can always come back to this video and remember how each of them works if you want to access request data there are two common ways one is to accept request variable in your road call function function or in your controllers method for example in car controller index I’m going to try to accept instance of illuminate HTTP request and LEL will automatically inject that variable because I am accepting it right here and let’s just dump what is that request but the second method to accept the same request variable is through request Global function request like this now if we dump both of them save and reload in the browser we’re going to see the following result so we see request printed right here and the same request printed right here and this request is a very large object containing bunch of properties and even more methods we have information about like cury parameters about uh files cookies headers the request URL method and a lot of other things if we want to to accept the road parameters like we’re accepting right here and we want to also accept request it is common practice to put your query parameters after request or any other variable which will be injected by LEL so here let’s accept request and only after that we should accept car now let’s access the following URL car SL1 and I’m going to also add cury parameters like page equals 1 it doesn’t make any sense providing cury parameters on the um car details page but um I just want to demonstrate you something that’s why that’s let’s put this page equals 1 as well now I’m going to copy this URL and we know this URL how it looks like and the request URL looks like this right now let’s try to access some important information from the request we have this request variable and we can access request path in the following way which will output car /1 we can also access request URL which will give us the entire URL but without Q parameters we can also access request full URL which will provide the entire URL including qer parameters we can also access request method which will in our case gives us get if we have obviously if we submit the form with the post method then the request method will give us Post request class has a lot of methods if you want to test if the request method is get or post we can use method called is Method so this if will be satisfied only if the request method is post we can use the method is XML HTTP request to detect if the request is made using Ajax if you want to test if the specific URL uh satisfies the following pattern like if it starts with admin slash something then we can use method is we can also use root is method which will in this case so the is accepts right here the path and root is accepts the route name so if we have every rad for admin users starting with admin dot then we can check this using rout is if we want to check if the request expects J or not we can use this expects Json method as well now let’s see few more useful methods they are not as commonly used as the above ones which I just mentioned but maybe you need them in certain cases so I’m just going to mention them very quickly full URL with C we already see we already saw what is this full URL but we have full URL with qer which gives us possibility to provide additional qer Pro before retrieving the URL so in our case the URL will look like this so it will have quer parameter sort equals price and it will also have right here page equals 1 I’m going to mention few more methods from request they are not as commonly used as the above ones but maybe you need them in certain cases so I’m just going to me mention them very quickly one of them is fully Ur URL with C we also we already saw what is full URL doing it is returning the entire URL however if you want to return the URL plus add additional query parameters this is exactly what is doing so the output will be that the URL will have page one as well as new query parameter sort equals price we also have similar method called Full URL with without cury let’s say that we want to remove specific cury parameters only one cury parameter or several cury parameters we can do the following in this in which case the URL looks like this the other one I I want to mention is host which will return the host of the URL we also have HTTP host which will return with the port and we also have schema and HTTP host which will return the following response we also have possibility to access specific headers from the request like if I want to get the information about the content type we can do it like this it might output something or it might output null we can uh get the request beer token if we are doing beer authentication in our websites beer token is mostly used when building rest apis so it is not as common for building websites and the last one I want to mention is the IP address so if I save this everything and reload the browser we’re going to see bunch of outputs right here and we see that um the header basically right here from the line 81 is actually null this is null which is the be token but everything else is populated the IP address the host with schema and so on now let’s open Home controller index method and learn how to return responses with different ways and in different formats okay so there are couple of ways to return response and one of them is very primitive we can just return the variable as we want for example we can return hello world as a string from here and if we simply reload the homepage we’re going to see Hello World string right here we also have possibility to return array from here we can put anything in the array the interesting thing is that we can also return collection of models for example if I call car get to return all the cars I reload in the browser we’re going to see Json LL is intelligent enough to detect what we are doing and in this case LL is serializing models orm models car model objects and returning Json if we pretty print this we’re going to see how each model looks like it has all the information that is necessary and that is very useful if we are building apis right we also have possibility to return single object if we call first method right here reload now this is a single car object so that was like implicit returning of response so where we return some object some string some array and Lal converts that into appropriate response however we have dedicated response function as well in this response function we can provide pretty much anything like string array collection object whatever we want let’s provide something like Hello World however this response function has additional features we can provide for example status code like 200 or if we are creating new record and we want to return uh with a different status code like 2011 we can do this from here this is how we can do it now if I reload the page we see Hello World however if we inspect the website and if we check Network and reload once again we’re going to see that the status code is 2011 which typically means that the record is created when building rest apis which is not our case just I wanted to mention how we can return different status codes we can even return 404 reload the page now we see that this is the there is the content but the status code is 404 age not found additionally we can also provide um couple of like um headers on that response for example we can provide like a content type to the application Json uh and we can chain those header um methods like we can do this multiple times this is header one it’s corresponding value one we can have header two and it’s corresponding value two also if you have any questions what is available what methods are available in this response you can always take that response object you can dump this right here which will give you in the browser what type of object response is this is illuminate HTTP response okay and then by the way you can do this on any model in LEL so if you are interested what methods are available there so this is I think very important thing so you can do this in any um Lal class then we open lal’s official documentation lal.com we go in the documentation scroll down below on the left side we click on API documentation and then we can search for that class that class is illuminate HTTP response we can put that class right here it’s going to bring us couple of things like the first one is what we are looking for and right here you’re going to find all the methods like status to get the status code of the response uh content header this is what we right now used we can provide some cookies um get call back throw response micro and there are a couple of other things so you can have a look always at the official documentation what methods are available in your object whether this is response or something else and then you can use those methods we know that we can return array which will be converted into Json however if we want to explicitly specify that we are returning Json on the response we can do the following we can create response and then we can call method called Json and provide data the data can be anything it can be object it can be array it can be collection and let’s put just one two and put the semicolon here and if we reload right now we see here Json if we want to return view but also control the status code of the response as well as what headers we’re going to pass we can do this in the following way we can call response then we can call view provide our view name and then we can provide right here data which will be passed to The View and we can provide then status code whatever we want like uh 44 2011 what whatever okay and then we can provide also additional header or multiple headers we have couple of methods regarding headers like we already cover covered header but we can provide with headers as well which accepts an associative array like this where the key is the header name and the value is going to be the header [Music] value there are several ways to implement redirect in Lal first of all we have to return whatever we are redirecting because redirect constructs response and we have to immediately return that response with the appropriate header so let’s do redirect and we can provide the URL right here for example we want to redirect user to car SLC create we save it and if we reload the homepage we will be redirected into car cre create page now let’s see a different example of redirect I’m just going to call redirect and then I’m going to call root this root accepts a root name so instead of URL we can provide card. create right here and if we try to access homepage again we will be redirected to car create page if we want to redirect user to a UR L which requires parameters we can also provide additional parameters right here for example if we want to redirect user to car show page and we can provide right here ID equals one we save let’s go on the homepage okay uh it is not ID it is called car reload the page and we are redirected to specific car page however we can also provide right here the entire car object on redirect so we can search car first we provide it right here then we try to access the homepage and we will be redirected on the first car page if we want to implement redirect on an external URL then we can call redirect a which means outside of the website https google.com we save it again try to access homepage and we are redirected to google.com now this is the end of this YouTube tutorial if you like the course so far maybe you want to check the entire course on my website the cod.com where you can find much more than what is available on YouTube you can find written lessons quizzes you can find the certificate of the completion the entire deployment section testing section and a lot more thanks for watching and I will see you in the next video

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • PHP Syntax, Variables, Database Insertion, and Login System Tutorial

    PHP Syntax, Variables, Database Insertion, and Login System Tutorial

    The source material offers a tutorial on PHP programming, starting with basic syntax, variables, and data types. It progresses to more advanced topics like superglobals, form handling, and database interaction using prepared statements to prevent SQL injection. The tutorial includes building a calculator and a search system as practical exercises. Arrays, constants, loops, sessions, and error handling are discussed, along with implementing an MVC pattern for better code organization. The material also teaches security practices like sanitizing data and regenerating session IDs. The focus is on creating a login and signup system with error handling and form persistence.

    PHP Study Guide

    Quiz

    1. What is a superglobal in PHP, and why are they useful?

    Superglobals are built-in variables that are always available in all scopes. They provide access to information from various sources like forms, cookies, sessions, and the server environment. They are useful because they allow developers to easily access and manipulate data throughout their PHP applications without explicitly passing them as arguments.

    2. Explain the purpose of the $_FILES superglobal.

    The $_FILES superglobal is used to retrieve information about files uploaded through an HTML form. It provides details like the file size, name, temporary location, and file type, enabling PHP to validate and handle uploaded files effectively. This allows developers to manage file uploads, check file sizes, and verify file extensions.

    3. Describe how cookies work and how the $_COOKIE superglobal is used.

    Cookies are small text files that a server embeds on a user’s computer to store information. The $_COOKIE superglobal is used in PHP to access the values stored in these cookies. Developers can retrieve information about user preferences or track user activity using cookies and the $_COOKIE superglobal.

    4. What are sessions, and how is the $_SESSION superglobal used to manage them?

    Sessions are a way to store information about a user on the server-side across multiple requests. The $_SESSION superglobal is used in PHP to store and retrieve session variables, allowing developers to maintain user-specific data and state during a browsing session. This is important for login and other user management features.

    5. What is the purpose of the concatenation operator (.) in PHP?

    The concatenation operator (.) is used to join two or more strings together in PHP. It combines variables and literal strings to create a single, unified string. Concatenation allows developers to dynamically build strings by combining different pieces of data.

    6. Explain the difference between = (assignment), == (comparison), and === (identical) operators in PHP.

    The = operator is used to assign a value to a variable. The == operator is used to compare two values for equality, without considering their data types. The === operator is used to compare two values for identity, meaning they must be equal in both value and data type.

    7. Describe what operator precedence is and how it affects the evaluation of expressions in PHP.

    Operator precedence determines the order in which operators are evaluated in a PHP expression. Operators with higher precedence are evaluated before those with lower precedence. Parentheses can be used to override the default precedence and control the order of evaluation.

    8. How do you create an if statement in PHP, and what is its purpose?

    An if statement in PHP is created using the if keyword, followed by a condition in parentheses. The code within the if statement’s curly brackets is executed only if the condition is true. if statements allow developers to execute different code blocks based on certain conditions.

    9. Explain the purpose of a for loop and how it is structured in PHP.

    A for loop in PHP is used to execute a block of code repeatedly for a specified number of times. It is structured with three parts inside the parentheses: initialization, condition, and increment/decrement. The initialization sets a starting value, the condition determines when the loop stops, and the increment/decrement changes the loop counter with each iteration.

    10. How do you start a session in PHP, and why is it important to do so?

    A session is started in PHP using the session_start() function. It’s important to start a session at the beginning of any PHP script where you intend to use session variables to store user-specific data and maintain state. By starting the session the server is able to connect all the activity of the client to a specific user ID.

    Essay Questions

    1. Discuss the importance of data validation and sanitization in PHP web applications. Explain how superglobals like $_POST and $_GET are used to retrieve user input, and describe common techniques to protect against security vulnerabilities such as SQL injection and cross-site scripting (XSS).
    2. Explain the different types of operators available in PHP, including arithmetic, assignment, comparison, logical, and string operators. Provide examples of how each type of operator is used in practical PHP code.
    3. Describe the different control structures available in PHP, such as if, else if, else, switch, for, while, and foreach. Explain how each control structure is used to control the flow of execution in a PHP script, and provide examples of real-world scenarios where each control structure would be useful.
    4. Explain the concepts of local, global, and static scope in PHP. Describe how variables are accessed within different scopes, and discuss the implications of using the global keyword.
    5. Describe the process of connecting to a database using PHP Data Objects (PDO). Explain how to prepare and execute SQL statements, bind parameters, and retrieve data from the database. Discuss the importance of using prepared statements to prevent SQL injection attacks.

    Glossary of Key Terms

    • Superglobal: Predefined variables in PHP that are always accessible, regardless of scope.
    • Cookie: A small text file that a web server stores on a user’s computer.
    • Session: A way to store information about a user on the server-side and remember it across multiple pages of a website.
    • Concatenation: The process of joining two or more strings together.
    • Operator Precedence: The order in which operators are evaluated in an expression.
    • Assignment Operator: Used to assign a value to a variable (e.g., =).
    • Comparison Operator: Used to compare two values (e.g., ==, !=, >, <).
    • Identical Operator: Used to compare two values to see if they are the same and are of the same type (e.g., ===, !==).
    • If Statement: A conditional statement that executes a block of code if a specified condition is true.
    • Else If Statement: A conditional statement that extends an if statement to execute a different block of code if the initial condition is false and a new condition is true.
    • Else Statement: A conditional statement that executes a block of code if the if condition is false.
    • For Loop: A control structure that executes a block of code a specific number of times.
    • While Loop: A control structure that repeatedly executes a block of code as long as a specified condition is true.
    • Incrementing: Increasing the value of a variable, often by one (e.g., ++).
    • Decrementing: Decreasing the value of a variable, often by one (e.g., –).
    • Control Structure: A statement that controls the flow of execution in a program.
    • Variable Scope: The region of a program where a variable can be accessed.
    • Local Scope: Variables declared within a function or block of code that are only accessible within that function or block.
    • Global Scope: Variables declared outside of any function or block, accessible throughout the script.
    • Static Scope: A static variable retains its value between function calls.
    • Constant: A value that cannot be changed during the execution of a script.
    • Database: A structured collection of data stored in a computer system.
    • SQL: Structured Query Language, a standard language for managing and manipulating databases.
    • Data Type: The type of data that can be stored in a variable or database column (e.g., integer, string, date).
    • Varchar: A variable-length string data type in databases.
    • Integer: A whole number without any fractional part.
    • Float: A number that contains a decimal point
    • Signed/Unsigned: Specifies whether an integer data type can store negative values (signed) or only positive values (unsigned).
    • Auto-Increment: A feature in databases that automatically assigns a unique, incrementing value to a column, typically used for primary keys.
    • Primary Key: A column in a database table that uniquely identifies each row.
    • Foreign Key: A column in a database table that refers to the primary key of another table, establishing a relationship between the two tables.
    • SQL Injection: A security vulnerability where malicious SQL code is inserted into a database query.
    • Hash: A one-way function that converts data into a fixed-size string of characters, used for security purposes.
    • Salt: A random string added to a password before hashing to increase security.
    • PDO (PHP Data Objects): A PHP extension that provides a consistent interface for accessing different databases.
    • DSN (Data Source Name): A string that contains the information required to connect to a database.
    • CRUD: An acronym referring to the basic database operations: Create, Read, Update, and Delete.
    • Model: A class or component responsible for interacting with the data storage, such as a database.
    • View: The part of an application that is responsible for presenting data to the user.
    • Controller: A class or component that handles user requests and interacts with the model and view to generate a response.

    PHP Fundamentals and Database Interaction Overview

    Okay, I have reviewed the provided text and created a briefing document summarizing the key themes and ideas.

    Briefing Document: PHP Fundamentals and Database Interaction

    Document Purpose: To provide a consolidated overview of PHP concepts covered in the provided source material, focusing on superglobals, operators, control structures, functions, data types for databases, SQL operations, sessions, hashing, and basic MVC principles with error handling.

    I. Superglobals:

    • Definition: Superglobals are built-in variables that are always available in all scopes.
    • Examples:$_FILES: Used to grab information about files uploaded through an HTML form. “Using this super Global here just kind of like allow for us to grab information about files that the User submitted using a HTML form” This is useful for file size checks and extension validation for security.
    • $_COOKIE: Used to store or retrieve information from cookies stored on the user’s computer.
    • $_SESSION: Used to store or retrieve information from session variables, which are stored on the server. Example: “I could for example create a dollar signore session and inside the bracket I’m going to make sure to include a name for this session variable here so I could call this one username”. Sessions are useful for storing user-specific data like usernames.
    • $_ENV: Contains environment variables, which are sensitive data not meant to be accessible to users or other environments. “Environment variables are essentially very sensitive data that you want to have inside the particular environment that the user is working in so you know data that should not be accessible to either the user or other environments”
    • $_SERVER and $_GET are to be discussed in later videos.

    II. Operators:

    • String Operators: Used to concatenate strings. The . operator is used for concatenation: variable C = variable a . ” ” . variable b;.
    • Arithmetic Operators: Basic mathematical operators like +, -, *, /, % (modulo), and ** (exponentiation).
    • Operator precedence can be controlled using parentheses. Example: (1 + 2) * 4.
    • Assignment Operators: Assign values to variables. = assigns a value. +=, -=, *=, /=, etc., are shorthand for performing an operation and assigning the result back to the variable. Example: variable a += 4 is equivalent to variable a = variable a + 4.
    • Comparison Operators: Used to compare values.
    • ==: Checks if two values are equal (without considering data type).
    • ===: Checks if two values are equal and of the same data type.
    • !=: Checks if two values are not equal.
    • !==: Checks if two values are not equal or not of the same data type.
    • <, >, <=, >=: Less than, greater than, less than or equal to, greater than or equal to.
    • Logical Operators: Used to combine multiple conditions.
    • && (AND): Both conditions must be true.
    • || (OR): At least one condition must be true.
    • Alternative symbols for AND and OR: and , or (less common).
    • Incrementing/Decrementing Operators: Increment (++) or decrement (–) a variable’s value. variable a++ increments after the current expression is evaluated, while ++variable a increments before.

    III. Control Structures:

    • Conditional Statements: Used to execute different blocks of code based on conditions.
    • if: Executes a block of code if a condition is true.
    • else if: Checks another condition if the previous if condition is false. “the else if statement basically is just a chain that we chain behind our if statement and says okay so if the first if condition is not met then jump down and check for the next one in the chain list”
    • else: Executes a block of code if none of the previous if or else if conditions are true.
    • Switch Statements: Provides an alternative to multiple if/else if statements, especially when comparing a single variable against multiple possible values.
    • Match (PHP 8): A newer feature similar to switch, providing a more concise syntax for value matching.
    • Loops: Used to repeat a block of code multiple times. “a loop is a way for us to spin out a blocker code multiple times by just writing one block of code”
    • for: Repeats a block of code a specific number of times. Requires initialization, condition, and increment/decrement expressions. “a for Loop is a very basic way for us to spit something out depending on numbers”
    • while: Repeats a block of code as long as a condition is true. “as long as this variable here is equal to true then I want to Loop something out”

    IV. Functions:

    • Definition: Reusable blocks of code. “A function is essentially just a blocker code that performs a specific task and then if you want to perform the same task that function that perform then you simply go and reuse the code”
    • Scope:Local Scope: Variables declared inside a function are only accessible within that function. “as soon as we declare a variable inside a function it is locally scoped within that function so we can only access it within my function”
    • Global Scope: Variables declared outside functions are accessible globally, but require special handling to be used inside functions (e.g., using the global keyword or passing as parameters).
    • Static Variables: Static variables inside functions retain their value between function calls.
    • Parameters and Arguments: Data can be passed into functions as parameters, allowing functions to operate on different data.
    • Return Values: Functions can return values, which can then be used elsewhere in the code.

    V. Constants:

    • Definition: Named values that cannot be changed after they are defined. Defined using the define() function. “When you create a constant that you use capitalized lettering because it shows other programmers that this is a constant so it’s just kind of a visual indicator for other programs to know that this is a constant”
    • Constants are in the global scope.
    • Good practice to define all constants at the top of the script.

    VI. Database Interaction (MySQL):

    • Data Types: Used to define the type of data that can be stored in a database column. “each column inside a table needs to be defined with a data type in order to tell our database what kind of data do we expect to be put inside this column here”
    • INT: Integer numbers. A common device width to define is 11. “a typical thing that we do when it comes to just making websites is we just Define 11 in here as a default”
    • BIGINT: Large integer numbers.
    • FLOAT: Floating-point (decimal) numbers.
    • DOUBLE: High-precision floating-point numbers.
    • VARCHAR(size): Variable-length strings. The size parameter specifies the maximum number of characters.
    • TEXT: Large text strings. ” using text for for example comments and blog post and that kind of thing is kind of what we need to use this data type for”
    • DATE: Dates (YYYY-MM-DD).
    • DATETIME: Dates and times (YYYY-MM-DD HH:MM:SS).
    • Signed and Unsigned: For integer types, SIGNED allows negative values, while UNSIGNED only allows positive values, effectively doubling the maximum positive value that can be stored.
    • SQL Operations:CREATE TABLE: Creates a new table.
    • INSERT INTO: Inserts data into a table.
    • SELECT: Retrieves data from a table.
    • UPDATE: Modifies existing data in a table.
    • DELETE FROM: Deletes data from a table.
    • Primary Key (ID): A unique identifier for each row in a table. “basically whenever we have a table we want to make sure that we can find data inside this table very easily which means that having a ID for all the different rows we have inside the table is going to make it a lot easier to find it”
    • AUTO_INCREMENT: Automatically assigns a unique, incrementing value to the ID column for each new row. “Auto increment which is a type of column that’s going to automatically increment or increase the number one so we can easily find things using ID so that’s just for example to make it easier to find different posts inside our website”
    • Important: Do not manually change primary key IDs after they have been assigned as this will break relationships with data in other tables.
    • Database Connection (PDO): PHP Data Objects (PDO) is a consistent way to access databases. “PHP data objects is a way for us to create a database object when we want to connect to a database so basically we turn the connection into a object that we can use inside our phsp code and just refer to that object whenever we want to connect to a database”
    • Data Source Name (DSN): A string that specifies the database driver, host, and database name.
    • Try/Catch Blocks: Use try/catch blocks to handle database connection errors.
    • Prepared Statements: “prepared statement is going to go in and and just pre compile the query we have so so therefore the code is going to execute a lot faster because we’re basically telling it hey in the future we we need you to run this query but we are just not going to insert the data inside just yet we’re going to do that later which means that it’s going to pre compile everything and have it all prepared and ready when we actually finally do pass in all the bits of data” Helps prevent SQL injection attacks.

    VII. Sessions:

    • Definition: A way to store information about a user across multiple pages. “Sessions are basically information that you store on a user that has to be remembered across multiple pages”
    • session_start(): Starts a session. Must be called at the very beginning of the script. “So right now we don’t have a session going on inside ex example so we could actually go in and copy paste this information paste it over here just to make sure we have a session started on both pages and then with this we’re now going to go back inside the website refresh it”
    • $_SESSION: A superglobal array used to store and retrieve session variables.
    • Session ID Cookie: Stored on the user’s browser to identify the session.

    VIII. Hashing:

    • Definition: One-way algorithm that converts data into a fixed-length string. Used to securely store passwords. “hashing is whenever we perform a oneway hashing algorithm on a plain piece of text for example a password and then we basically convert it into a fixed length string that you can’t really look at and tell what exactly is this supposed to be”
    • Hashing algorithms are designed to be irreversible and computationally expensive.
    • Salt: A random string added to the data before hashing to increase security. “Essentially a salt is a random string of text that is going to be included inside the data that you provide the hashing algorithm so it’s going to mix the salt together with the text that you provided it and then it’s going to Hash it afterward to create a more unique and even harder to crack hashing algorithm to make it even stronger”
    • Pepper: A secret string added to the data before hashing (similar to a salt, but not randomly generated). “And essentially we’re just going in and we’ll combine in these three pieces of data up here so we have the sensitive data that the user gave us inside whatever input we have inside the website uh we do also have a piece of data called a salt and then we also do have our pepper”

    IX. Basic MVC (Model-View-Controller) Principles & Error Handling

    • Structure: The material references separating code into different files (e.g., including a “hash_password.in.php” file in an “includes” folder). It also hints at the idea of a Controller component handling user input and calling on Models (presumably for database interaction).
    • Error Handling: The code demonstrates basic error handling, such as validating user input and using if statements to check for errors. It also demonstrates a basic error handling setup where an empty array is used to store error messages that can then be displayed to the user.

    Key Takeaways:

    • PHP provides a variety of superglobals for accessing different types of data.
    • Understanding operators is essential for manipulating data and creating complex logic.
    • Control structures are critical for controlling the flow of execution in PHP scripts.
    • Functions are essential for code reusability and organization.
    • Securely storing passwords using hashing with salts is a must.
    • Basic MVC ideas such as utilizing controller functions can help to break code up and make it more maintainable.
    • Proper database interaction requires understanding data types and SQL operations.

    This document provides a high-level summary. Deeper dives into each of these topics can be found in the original source material.

    PHP Superglobals, Operators, Control Structures, and Variable Scope

    Superglobals, Forms, and Data Handling

    • What are superglobals in PHP, and why are they important to understand?
    • Superglobals are built-in variables that are always available in all scopes of a PHP script. They provide access to information about the server, the environment, and the user. Understanding them is important because they are essential for handling data submitted through forms ($_POST, $_GET, $_FILES), managing sessions and cookies ($_SESSION, $_COOKIE), accessing server information ($_SERVER), and more. They act as the primary interface between the PHP script and the external world.
    • How can I prevent users from crashing my website by uploading very large files?
    • PHP provides the $_FILES superglobal, which contains information about uploaded files, including their size. You can use this information to validate the file size before saving the file to the server. By checking if the file size exceeds a certain limit, you can prevent excessively large files from being uploaded, thus protecting your website from crashes or performance issues.
    • What are cookies and sessions, and how are they managed in PHP?
    • Cookies are small files that a server embeds on a user’s computer to store information. PHP provides the $_COOKIE superglobal to access and manage cookies. Sessions are a server-side way to store information about a user across multiple requests. PHP uses the $_SESSION superglobal to access and modify session variables. You must call session_start() at the beginning of each script where you want to use sessions. Closing the browser typically ends the session, though this can be configured.
    • How can I use PHP to retrieve data submitted through an HTML form?
    • When a user submits an HTML form, the data is sent to the server using either the GET or POST method. In PHP, you can access this data using the $_GET and $_POST superglobals, respectively. For example, if a form has a field named “username,” you can access the submitted value using $_POST[‘username’]. Always sanitize and validate user input to prevent security vulnerabilities.
    • What are operators in PHP, and what are some common types?
    • Operators are symbols or keywords that perform operations on one or more values. Common types include:
    • String Operators: Used to concatenate strings (e.g., .).
    • Arithmetic Operators: Used for mathematical calculations (e.g., +, -, *, /, %, **).
    • Assignment Operators: Used to assign values to variables (e.g., =, +=, -=, *=, /=).
    • Comparison Operators: Used to compare values (e.g., ==, ===, !=, !==, <, >, <=, >=).
    • Logical Operators: Used to combine or modify boolean expressions (e.g., && (and), || (or), ! (not)).
    • Incrementing/Decrementing Operators: Used to increase or decrease a number (++, –).
    • What are control structures in PHP, and why are they important?
    • Control structures are language constructs that control the flow of execution in a PHP script. They allow you to make decisions, repeat code blocks, and execute different code paths based on conditions. They are fundamental for creating dynamic and interactive websites. Key examples are:
    • If/Else/Elseif statements: Conditional execution of code blocks.
    • Switch statement: Multi-way branching based on a value.
    • Loops: Repeated execution of code blocks (e.g., for, while, foreach).
    • What are the key differences between the local, global, and static variable scopes in PHP?
    • Local Scope: Variables declared within a function have local scope and are only accessible inside that function.
    • Global Scope: Variables declared outside functions have global scope and are accessible throughout the script, except inside functions, unless explicitly accessed using the global keyword or the $GLOBALS superglobal.
    • Static Scope: Static variables declared within a function retain their value between function calls. They are initialized only once and persist across multiple invocations of the function.
    • What are constants in PHP, and how do they differ from variables?
    • Constants are named values that cannot be changed after they are defined. They are defined using the define() function or the const keyword (in PHP 5.6+). Constants are always in the global scope and can be accessed from anywhere in the script, including inside functions. Unlike variables, constants do not require a dollar sign ($) prefix. It is convention to name constants using capitalized letters to distinguish them from variables. Constants are useful for storing values that should not be modified, such as configuration settings or mathematical constants (e.g., PI).

    PHP Syntax Fundamentals

    PHP syntax dictates how to write PHP code without generating errors. Here’s an overview of key aspects:

    • Opening and Closing Tags: PHP code must be enclosed within opening and closing tags, such as <?php and ?>. The PHP parser searches for these tags to identify PHP code within a page. You can embed PHP code directly within HTML using these tags.
    • Semicolons: Each PHP statement should end with a semicolon (;), which signals the end of the statement to the PHP parser. However, the closing PHP tag ?> automatically implies a semicolon, so the last statement before the closing tag doesn’t strictly need one. It is recommended to include semicolons after every statement for consistency and to prevent errors.
    • Pure PHP Files: When a file contains only PHP code, the closing tag can be omitted. This is the recommended practice to avoid potential issues caused by accidental whitespace or new lines after the closing tag.
    • Embedding PHP in HTML: There are two ways to embed PHP inside HTML:
    • You can directly embed PHP code within HTML tags, echoing HTML elements from within PHP code.
    • Alternatively, you can split up a condition using opening and closing PHP tags around the beginning and closing of the statement to allow HTML to be written as HTML.
    • Comments: It is good practice to use comments in PHP code to explain what the code does. Comments are not outputted in the browser.
    • Single-line comments can be created using two forward slashes (//).
    • Multi-line comments can be created by enclosing the comment between /* and */.

    PHP Variables: Declaration, Data Types, and Superglobals

    Variables in PHP are named memory locations that store data. They are essentially labeled boxes that hold data, making it easier to refer to and handle data within code. In PHP, a variable is declared by using a dollar sign ($) followed by the variable name.

    Here’s a detailed overview:

    • Declaring Variables: To declare a variable, a dollar sign ($) is used, followed by the chosen name for the variable. For example, $name declares a variable named “name”.
    • Variable Names:
    • Variable names must start with a letter or an underscore.
    • After the first character, variable names can contain letters, numbers, or underscores.
    • It’s customary to begin variable names with a non-capitalized letter, and subsequent words in the name should start with a capitalized letter (e.g., $fullName).
    • Assigning Data: Variables are assigned data using the assignment operator (=). For example, $name = “Danny Crossing”; assigns the string “Danny Crossing” to the variable $name.
    • Referring to Variables: To access the data stored in a variable, refer to the variable by its name, including the dollar sign. For example, echo $name; would output the value of the $name variable.
    • Variable assignment: It is possible to assign the value of one variable to another. For example, $test = $name; will assign the value of the variable $name to the variable $test.

    Data types that can be stored in variables:

    • Scalar Types: These variables contain only one value.
    • String: Represents a piece of text. For example, $string = “Daniel”;.
    • Integer (int): Represents a whole number. For example, $number = 123;. Note that integers should not be enclosed in double quotes; otherwise, they will be interpreted as strings.
    • Float: Represents a number with decimal points. For example, $float = 256.78;.
    • Boolean (bool): Represents a true or false value. The values can be true or false. In certain contexts, 1 is evaluated as true and 0 as false.
    • Array Type: Arrays store multiple pieces of data within a single variable. For example, $names = array(“Daniel”, “Bella”, “Feta”);.
    • Arrays can be created using the array() construct or with square brackets []. The square bracket syntax requires PHP version 5.4 or higher.
    • Object Type: An object is a data type.
    • Superglobals: Superglobals are built-in variables that are always accessible, regardless of scope. Superglobals are accessed using a dollar sign $ followed by an underscore _ and a capitalized word. Examples include:
    • $_SERVER: Contains information about the server environment.
    • $_GET: Used to collect data from the URL.
    • $_POST: Used to submit data.
    • $_REQUEST: Used to collect data after form submission.
    • $_FILES: Used to retrieve data about files uploaded to the server.
    • $_COOKIE: Used to retrieve values from cookies.
    • $_SESSION: Used to manage user session data.
    • $_ENV: Used to access environment variables.

    PHP Superglobals: Understanding and Usage

    Superglobals are built-in variables in PHP that are always accessible regardless of the scope. Unlike regular variables, which may have limited accessibility based on their scope (e.g., local variables within a function), superglobals can be accessed from anywhere in the code.

    Key aspects of superglobals include:

    • They are predefined variables within the PHP language.
    • They are automatically available without needing to be explicitly declared or defined.
    • They can be accessed from any part of a script, including within functions and classes.
    • Superglobals are referenced by creating the dollar sign $ but then creating a underscore _ followed by a capitalized word.

    Here’s a list of common superglobals in PHP:

    • $_SERVER: This superglobal holds information about the server environment, such as server names, document roots, and request methods. For instance, $_SERVER[‘DOCUMENT_ROOT’] can provide the root directory of the current script.
    • $_GET: Used for collecting data submitted via the URL. Data is appended to the URL as name-value pairs.
    • $_POST: Used for collecting data submitted through HTML forms using the POST method. This method is commonly used for submitting sensitive or large amounts of data.
    • $_FILES: Used for accessing data related to files uploaded to the server. It allows you to retrieve information such as file size, name, and extension.
    • $_COOKIE: Used for retrieving values stored in cookies. Cookies are small files that the server embeds on the user’s computer to store information about their activities.
    • $_SESSION: Used for managing user session data. Sessions allow you to store information about a user that persists across multiple pages of a website.
    • $_ENV: Used to access environment variables. Environment variables are often used to store sensitive data that should not be directly accessible to users.
    • $_REQUEST: Used to collect data after HTML form submission.

    HTML Forms: Data Collection, Submission, and Security

    Here’s information about HTML forms, based on the provided sources:

    • HTML forms are used to collect data from users.
    • Forms can include various input elements like text fields, drop-downs, and buttons.
    • Key attributes of the <form> tag:
    • action: Specifies where the form data should be sent for processing. This is typically a URL or a PHP file.
    • method: Defines the HTTP method used to submit the form data. Common methods are GET and POST.
    • Form Input Attributes:
    • name: A reference name is needed so the data can be grabbed once the data is sent to the next page. When grabbing data using the name attribute, you grab whatever the user input.
    • value: With drop-down menus, the data selected when referencing the name will be the data inside the value attribute.
    • Labels: Use labels to improve form accessibility, especially for users with disabilities.
    • Submitting Data:
    • GET Method: Submits data via the URL, making it visible in the address bar. It is typically used to get data from a database.
    • POST Method: Submits data in the body of the HTTP request, so it is not visible in the URL. It is typically used to submit data to a website or database. It’s also useful for submitting more sensitive data.
    • Superglobals: $_POST is a PHP superglobal used to collect data from forms submitted with the POST method.
    • HTML Special Characters: When having anything shown inside the browser using PHP, escaping it using HTML special characters is important to prevent users from injecting code inside the browser. There are a couple of different ways to sanitize data, depending on the purpose.
    • HTML Entities: HTML entities can be used to sanitize data.
    • Form Validation:
    • Required Attribute: Though it can be added to form inputs, it is not secure to rely on HTML, CSS, or JavaScript for security.
    • PHP for Security: Server-side security (using PHP) is essential for validating and sanitizing user inputs to prevent malicious attacks.
    • Error Handling: When creating any sort of error handlers inside a script, it can be checked if any of the inputs have been left empty when the user submitted the form. You don’t want the user to be able to submit the form if there is no data to submit. It needs to require that they submit all the data.
    • Action Attribute: When submitting a form and sending the data to the same page that the user is on, one way to do it is to open PHP tags inside the action, then include the server super global and target PHP self. It is important to note that this is prone to hacking.
    • File Uploads: The $_FILES superglobal is used when a HTML form allows users to submit files.

    Databases and Queries: A Quick Reference

    Here’s an overview of databases and queries, based on the provided sources:

    • Databases:
    • A database is used to save user information, and is used whenever a website has to remember something.
    • A database is made up of tables where similar information is gathered. Tables give the data structure.
    • Each piece of data corresponds to a column. Each entry (or data) corresponds to a row.
    • Relational Database Management System (RDBMS):
    • There are many different types of database systems, called RDBMS.
    • MySQL is a commonly used database system, especially with PHP. MySQL servers are not the same as MySQL PHP functions.
    • Setting up a Database
    • XAMPP includes both Apache and MySQL servers. The Apache server is the web server where PHP runs. The MySQL server is the actual database server.
    • To manage a database, use a dashboard like PHPMyAdmin.
    • To create a database, select ‘databases’ and type in a name.
    • SQL:
    • SQL (Structured Query Language) is used to manipulate databases. With SQL, you can create tables, insert data, select data, or delete data.
    • To use SQL, make sure the correct database is selected. Then, click the SQL tab.
    • There are typical SQL lines of code that are used repeatedly.
    • It is useful to practice SQL directly inside a database.
    • Data Types:
    • When inserting data, each column inside a table must be defined with a data type. This tells the database what kind of data to expect.
    • Common data types include INT for integers, VARCHAR for character strings, DATE, and DATETIME.
    • INT stores numbers. BIGINT stores larger numbers.
    • VARCHAR stores strings. You need to define a parameter for the length of the string.
    • TEXT stores long text.
    • DATE stores year, month, and day. DATETIME stores date and time.
    • Queries:
    • A query is a request for data from a database.
    • CREATE TABLE: Used to create a new table in the database.
    • INSERT INTO: Used to insert data into a table.
    • SELECT: Used to select data from a table.
    • UPDATE: Used to modify existing data in a table.
    • DELETE FROM: Used to delete data from a table.
    • Prepared Statements:
    • Prepared statements prevent users from writing SQL code directly inside an input.
    • The query (SQL code) is sent to the database first. Then, data submitted by the user is bound and sent to the database afterward. Because the query is separate from the data, SQL code will not impact the query.
    • Prepared statements can use either named parameters or non-named parameters.
    • With non-named parameters, user data is replaced with question marks.
    • With named parameters, each piece of user data is replaced with a name. With name parameters, the order does not matter.
    • Joins:
    • A join is used to select data from two or more tables at the same time.
    • Types of joins include INNER JOIN, LEFT JOIN, and RIGHT JOIN.
    • With INNER JOIN, data is selected from two tables that have matching data.
    • With LEFT JOIN, the table on the left is the primary table. Even if a user does not have a comment, all the users will still be shown.
    • With RIGHT JOIN, the comments on the right side are the focus.
    🔥 PHP Full Course 2025 – Learn PHP from Scratch! 🚀
    PHP Mastery Course: From Basics to Advanced with Practical Projects & Exercises in One Video.

    The Original Text

    so welcome to a new version of my PHP course now in this video we’re going to talk a bit about what exactly PHP is and what you’re going to learn in this course here and why it’s going to be a little bit better structured than the previous one I have on the channel so let’s go and talk a bit about what exactly this course is and who it is made for now here at the beginning it is going to be a beginner friendly course so to speak my main goal is to make sure that people has never done PHP before and might find a little bit intimidating because they’ve never done a programming language before will be able to get into this course here and don’t find it overwhelming so that is going to be my main priority as we going on with these lessons here it is quite normal to find PHP intimidating if this is your first programming language so don’t be scared that this is going to be overwhelming cuz I will try to make it as understandable as possible for people who has never done any sort of programming before with that said of course this course is going to get more and more complicated and more and more advanced as we go on but here in the beginning it is going to be very beginner friendly so with that said let’s go and talk a bit about what exactly PHP is and what you can use it for now PHP stands for hypertex preprocessor actually it stands for PHP hypotext pre-processor it is what you call a recursive acronym when you have the word itself inside its own spelling now PHP is a language that are used mainly for making websites but it can be used for other things as well like for example creating a desktop application if you know how to do it but it is something that is more commonly used for web developments one of the reasons it’s so easy to use for web development is because you can very easily embed it into the HTML when you start creating a website using HTML and CSS and it is also a very easy language to learn compared to many other programming languages out there and one of the things about PHP you may not know is that is actually considered a serers side language meaning that the phsp you’re going to program is going to run on the server of your website but not actually inside the client which is inside the browser so languages such as HTML CSS and JavaScript which actually runs inside the browser these languages run differently than PHP which is actually running on the server instead this means that when you’re writing PHP inside your website you can’t actually see the code inside the browser which you can when it comes to for example HTML CSS and JavaScript so PHP is completely hidden since it runs in the server instead so with all that said let’s go and talk about the elephant in the room is PHP dead because when it comes to websites on the internet right now currently in 2023 we have more than 78% of websites out there that we know of that are using PHP as their backend language this means that PHP is currently massively dominating when it comes to the backend languages that we use for websites out there today but one of the reasons I do often hear that PHP is a dead language and you shouldn’t use it anymore has a lot to do with the fact that PHP is only used mainly for web development whereas other languages such as python is used for all sorts of things including you can also use Python for web development so if you were to take the Python programming language and say okay how many people are using python nowadays versus people who are using phsp then python is going to have much higher numbers however these are actually not the numbers you should look at since we need to look at how many people are using python 4 when it comes to web development versus people who use PHP for web development and when it comes to this PHP is much much much higher numbers than when it comes to python it pretty much BS down to the fact that some people on the internet don’t like PHP because it’s more specifically suited towards web development whereas a language like python can be used for many other things besides web developments so if you’re sitting there you want to learn specifically web development then PHP is by far the language that I would recommend using when it comes to web development of course python is also an amazing language to use for web development if you want to use D Jango as a framework but PHP is just more the more popularly used language when it comes to specifically web development so just to mention a couple of websites that do actually use PHP we do have Facebook which uses a version of phsp we do also have Wikipedia canvas is also a very popular website that uses PHP and then we do also have WordPress which is not really a website but more of a Content management system which is also the most popular content management system out there today so if you plan on using WordPress at some point in the future I do recommend that you learn PHP since it is what they use when it comes to plugins and just the the WordPress CMS system in itself learning PHP is definitely something that I highly recommend if you’re just planning on going into web development as a web developer but now let’s go and talk a bit about Theory versus practice when it comes to implementing PHP inside your website because when it comes to learning any sort of programming language like for example PHP then things will be a little bit slow in the beginning it is just a very typical thing when you learn a new programming language that you have to learn all the theory first and then later on you start getting into some more practical examples so you can actually see oh okay so that’s how we use it inside for example our website I will try to include as many examples as I can as we go throughout this series but it is important to know that there will be a lot of theory here in the beginning so you don’t need to worry too much about it if you’re looking at these lessons at the beginning and thinking to yourself okay so I can’t really see how this code that we’re learning has to be used inside a real website just keep following the lessons at at some point you will get to a point where you get a realization of oh so this is how we need to use everything everything that we learned inside a real website but now let’s go and talk a bit about how I am going to approach this course here it is my experience that people become very easily overwhelmed when it comes to teaching a backend programming language like PHP so it’s important to split things up into multiple lessons to make sure that people can digest it a lot easier that being said when it comes to teaching PHP you can roughly divide PHP into three different categories when it comes to learning PHP as a language you have the actual PHP language which is just learning PHP and how to write it and how to Output things inside your website you know just plain PHP programming and how to actually write things that do something inside your website then after learning PHP you’re going to start learning about databases and how to actually manipulate databases by pulling out data or inserting data inside the database a database is a place where we store information for example if you want your website to remember things about your users and then the last thing you need to learn about is security Now security is a huge when it comes to PHP since you are essentially manipulating data from the user and a lot of that data is going to be sensitive data so it is important to take security very serious when it comes to PHP because it is something that is crucial to learning PHP and you can’t learn PHP and just go into it with the mindset of okay so security is just kind of like like an offside thing security is something you need to do and it is something you need to look into at some point and it is something that we will start looking into a little bit further into the course later near the end I do want to point out here that I do know a lot of people think it’s very important that you teach all security at the beginning when a person starts learning PHP but in my experience a lot of people will get overwhelmed if you teach everything when it comes to security at the same time as you also try to teach a complete beginner the basics of PHP so in order to digest things a lot easier we’re just going to focus on phsp then later on we’re going to start learning how you need to implement security into the PHP you already learned of course there is going to be moments where we can’t avoid talking about security and when those moments come we will of course talk about some security but any security that isn’t directly related to any sort of lesson that we’re learning about is not something we’re going to talk about until later on so with that said let’s talk about some frequently asked questions since I do want to answer some of the questions I have received in the past in my comment section will I include documentation for each lesson yes there will be documentation for each of the lessons that I teach inside the description of the video so if you want to Deep dive a little bit further into the lesson that we’re learning about then you can of course look into that documentation and learn a little bit further about what we’re learning will we do procedural or objectoriented PHP programming now here at the beginning we will focus on doing procedural PHP programming since I do know that it’s easier to get people into PHP when it comes to procedural programming later on in the course we will of course Deep dive a little bit further into objectoriented PHP programming but when it comes to just PHP here at the beginning like I said it’s going to be procedural and just to mention it for any beginners watching this you don’t need to look up object oriented PHP just focus on procedural PHP and learning that and then later on we will get to do objectoriented PHP and talk a bit about what exactly it is will I cover a framework like larell now something people may not know about especially if you are a beginner when it comes to learning any sort of language like HTML CSS JavaScript PHP python whatever you’re trying to learn there will always B Frameworks now Frameworks is a way for us to follow a well framework in order to build things much easier much faster and just kind of like to automate some things for us and a lot of things when it comes to especially PHP and Security will actually be automated when it comes to doing something using larell for building PHP applications however since this is going to be a phsp beginner course and I do think it’s important that people shouldn’t even look at a framework until they learned the basics of PHP we will not cover any sort of Frameworks in this course here at most it is going to be a separate course at some point in the future but for now it is not going to be part of this course here so with that said I hope you enjoyed this little introduction here in the next episode we’ll talk about how to set up PHP and how to install a local server on your computer since we did talk about PHP being a serers side language so we do need to have a server in order to actually write PHP inside a website and again just to mention this for the beginners here you don’t need to freak out when I say you need to install a local server on computer it is something that takes literally a minute to do and it’s not something that’s going to break your computer anything it is something that everyone that does web development at some point will have to do when they start learning how to make websites so with that said I hope you enjoyed this little video and I’ll see you guys in the next [Music] [Music] one so in order to set up a website using PHP we have to install what is called a local server and there’s a lot of different software out there in the internet that you can get in order to install a local server on your computer I do know that some people are a little bit scared when it comes to installing a server on your computer and I just want to point out that there’s nothing to be scared of everything is going to be fine and you’re not going to install any sort of viruses anything setting up a server is something that is actually quite easy to do and anyone that does websites do it quite frequently so it’s not something that new people should be scared of doing it’s something that takes a couple of minutes to do and then you have something running on your computer so when it comes to installing a server there’s many different servers you can choose from you have lamp Vamp examp limp there’s many different kinds of servers I did also hear about something called Ducker from one of my subscribers in the last video so it’s just interesting to see that there’s so many different ways to do it what we’re going to use however is a server called exam and the argument I have for using exam is that it’s easy to set up and it’s the one I’ve been using for many years I’m just really comfortable using xam so going inside your computer you can see that we have this website here that I just found called Apache friends.org I’ll go ahe and leave a link to it so you can actually see it on screen here basically this is just going to be a piece of software that you’re going to download that we’re going to start and then it’s going to run our server on our computer this means that we can actually run a website that is using PHP on our computer without having to upload our website to the Internet so this makes it very easy to just work on our website offline on our computer just like if you were to just make make a HTML website as you can see we have a couple of different versions We can install in here we have for Windows Linux and mac and you can also see what version we’re going to install in this case here this is going to be release 8.2.0 which is the PHP version that we’re going to run on This Server here so once you figured out what operating system you’re sitting on I I bet you probably know already you’re going to go and click the button for that one so I’m going to click windows then it’s going to install the program for you and if it doesn’t you’re just going to go and click up here where it says click here then we’re going to accept the privacy up and then we’re just going to go and download the latest version which is 8.2.0 so we have the latest version of PHP here so I’m going to go and download it now once you have it downloaded you’re just going to go and double click it so we can make sure to install it on our computer and it is important that you take note of where exactly you are installing it since we will have to go in and do a couple of changes to it now if you do get a popup like this don’t worry too much about it since this is only going to be relevant if we were to install this inside our program files inside our main drive so with that I’m just going to click okay and then we’re going to choose where we want to install this program so we’re going to make sure all these are ticked on and then I’m going to click next then I’m going to select where I want to install this now as you can see I have it inside my C drive but not inside my program file so I can just go and install it directly on the C drive so I’m just going to go and do that click next then I’m going to choose a language in this case it’s going to be English and then we can just go ahead and make it set up our program on our computer so it’s just going to unpack and install now if you do insist that you want to install this inside your program files then I do have a Link in the description where you can go in and actually make sure there’s no warnings popping up when you try to run this program inside the program files but like I said if you just install it directly inside the C drive like I did here we’re not going to have any sort of issues now once you have it installed it’s going to ask if you want to start the control panel now if you want to wait with later for now let’s just go ahead and not do that because I do want to show where exactly this is installed so you can just open it up from inside your computer so with that I’m going to click finish and then you’re going to go into a installed xamp which is inside in my case the C drive so I’m going to go into this PC inside my C drive then I’m going to go down to the bottom here and then you can see I have xamp inside the XM folder we’re going to have the actual server files which means that we can scroll down to the bottom and actually run this control panel that we were just asked about so we can just go and click the xamp dash contr control.exe open it up and then you can see we have a little software in here now the important thing for you to know about in here is that we have two services that we need in order to actually get PHP working one is going to be the Apache server which is the one that we need in order to actually run PHP and the second one is the MySQL server which is used in order to get access to our database so what I can do is I can start these two and then you can see we have them running another tip that I have for you is to make sure that you go down and actually dock this at the bottom since this is the program you’re going to have to start every single time you need to start working on your website this means that we need to go down and actually dock it or pin it to your taskbar so you have easy access to it next time with this running we now need to set up our website inside This Server here which is very easy to do so we’re going to go back inside our folder where we have XM installed and then you’re going to go up to the top here and then you’re going to go inside the folder called HT docs now in here you’re going to find a bunch of files and these are just mainly to welcome you into the XM software so if I were to go inside my browser here and inside the URL I’m going to type Local Host and then you can see we get this little website here and this is basically what we see with these files inside the HT docs folder this is basically what this is so we don’t really need to have this so what I can do is I can go back inside our folder and then I just go and delete all the files that we have in here now the important thing for you to know about this folder here is that this is going to be the place where you start creating your websites every time you want to create a new website inside This Server here so what we can do is we can go and create a new root folder so I’m going to right click and say I want to create a new folder I can call this one my website just to give it some kind of name of course you’re more than welcome to call whatever you want it to be but in my case I’m just going to call it my website and now what you’re going to notice is that inside the browser I can go back inside and type Local Host and then you can see we get a list of all the different websites that I have inside this folder here this means that if I were to create a second website go in here create a second one my second website then you can see if I were to refresh in here we now have a new website that we can open up using this server here so if you were to click my website you can now see that we have this website open so going inside your preferred editor my case this is going to be Visual Studio code I’m going to go ahead and create my first file which means that I’m going to save this file inside this folder that I just created a very good advice for you is to go inside and actually dock the HD docs folder on the side over here so have quick access to it so what I can do is I can go ahead and go inside find xamp take my HT docs folder and dock it over here on the side so in this sort of way I have quick access to it whenever I have to open my folders here so I can click it go in here let’s just go and delete that second website since we don’t actually need it I’m going to go inside my root folder and create a index.php now this is the moment where some people are going to get confused if it came directly from my HTML course because when it comes to phsp we want to make sure that instead of creating HTML files we create a PHP file the main difference here is that we actually allow for PHP to be run inside these files here you can still write HTML just like you can before so you don’t need to freak out about your website breaking or anything like that or not being able to write HTML inside these files just because it’s called PHP and the same thing goes if you have an existing website that you want to convert into a PHP website you can just take all the different HTML files that you have and just change the extension from HTML to PHP on those and it’s going to work inside your server and it’s not going to break anything by the way I should say that because some people do worry that it is going to break something so I have to say it with this file here I’m going to save it and then you can see we have this front page here so if I were to go back inside my website I can refresh my website and then you can see we get a completely blank page and that’s because right now we have the index file running inside our server now depending on the editor you’re using because in some cases the editor is just going to work straight away but if you are using visual studio code it may ask you something down here at the bottom it says cannot validate since a PHP installation could not be found this is a very typical thing when you have a new version of Visual Studio code so if you have not set up phsp already inside this software you are going to have to set it up manually inside this text editor here so what you can do if you were quick enough is to make sure you opened up the little link it gave you if not then we’re going to go up into file go down to preferences go inside your settings then you’re going to click on extensions and then you’re going to go down to PHP and from in here you can actually set it to where you want to have the executable path set up inside a Json file so where to click this you can now see that we have this one line called phsp Dov validate do executable path and this is where we need to set in the link for our PHP installation which is again inside the exent folder so if I were to go back inside the XM folder go back you can see we have a folder in here called PHP so I’m going to click it and then you can see we have a php.exe file down here at the bottom this is the one we need to link to inside this executable path inside Visual Studio code so what I can do is I can copy my path here go back inside paste it inside the double quote and then we’re going to write back slash php.exe now if you covered the path directly like I did here you want to make sure these are not back slashes but instead forward slashes otherwise you’re going to get an error message and once you did this you’re just going to go and save the file and then you can close it down and now we have it set up so that we can actually find the PHP version that we’re using once we start creating a PHP website so just to kind of test this out let’s go and start up a regular HTML website now I’m just going to go and zoom in for you so you can actually see what is going on here and what I’m going to do is I’m going to go inside the body tags and create a pair of PHP tags which we use in order to write PHP inside a website so what I can do is I can write angle bracket question mark PHP question mark angle bracket and then anything that goes in between here is going to be considered as PHP so just to follow a very popular tradition here let’s go ahead and go inside and write Echo double quotes Hello World close it off with a semic on save it go inside our website refresh it and then you can see we get hello world so with that we now know that we have a server running so we can actually write PHP code inside our website and have it display inside the browser and with that in the next video we’re going to talk a bit about PHP syntax so we can actually write PHP properly inside our website so hope you enjoyed and I’ll see you in the next video [Music] now before we get started we need to talk a bit about the syntax of writing PP code since syntax is what is going to allow for you to write PHP code without having to create too many errors so in the last episode we talked a bit about opening and closing TX when it came to writing PHP inside a document like for example your index. PHP file and the important thing to know about here is that whenever you create these opening and closing tags your PHP is going to be parsing this page and search for these open open and closing tags until it finds one and then it’s going to see that phsp code inside those tags we can now very easily just take our phsp code and embedded directly inside our HTML like I did on screen here so you can just have the body tags you can have for example a paragraph tag and then right on theath you can just include some PHP code so it is very important that anytime you want to create PHP code you need to have these tags so you need to memorize these tags since we have to use them constantly whenever we want to create any sort of PHP code so when it comes to writing PHP code we do also need to talk about ending of each statement with a semicolon since semicolons is what is going to tell our code that this is a finished statement so as you can see inside my code here I have a very basic pair of PHP text and a echo which we haven’t talked about yet but essentially a echo is something we use in order to Output things inside our browser so if I want to Output some text or a string as we call it then I can Echo a string which is wrapped in double quotes and then end it off with a semicolon to tell it that okay so this is the end of the statement go ahead and Echo this out inside our browser but something you may not know is that the closing PHP tag actually automatically implies a semicolon which means that if I were to take an example like this one where we have two Echoes that Echoes out some code then the last statement doesn’t actually have a semicolon because that is actually implied by the closing PHP tag at the very bottom and I just want to point something out here because even though technically we don’t need to have a semicolon inside the last statement it is something that I do recommend that you do every single time it is also something most people do and it’s just for the simple reason that it doesn’t hurt anything to put that last semicolon and it also teaches you that every single time you create a statement you have to put a semicolon because a lot of times one of the errors that people they type in my comments is when they forgot to put a semicolon or they forgot to close off a parentheses or a curly bracket or something so teaching you the mindset of putting semicolons after each statement is something I highly recommend you do because you have to get into that mindset but now let’s talk about when we have a file that only has PHP inside of it because up until now we talked about this page for example the index a PHP file but in some cases we do also have files that are purely phsp the way we do it when we have this pure phsp file is you want to make sure you have the opening tag at the very top of the page every single time because otherwise your PHP is not going to be working but when it comes to the closing tag we actually want to omit it we don’t want to have a closing tag at the end this is actually the recommended thing to do so just like with the example you see here we have this file that only has a PHP tag at the very top but there’s no closing tag at the bottom it is for the simple reason that in some cases if you were to close off the PHP tag at the very bottom but then accidentally leave a empty line or a space or something then things can go a little bit wrong having talked about that let’s talk about a more advanced example of embedding PHP inside HTML in this example here you can see that I have a pair of body tags so we have some HTML and inside these body tags I have a PHP statement this is called a condition and conditions is something we will talk more about in the future so you don’t really need to know what a condition is right now but essentially I have a condition here where if something is true then run the blocker code inside the curly brackets and in between these curly brackets I did just like before I Echo out or output some text inside the browser or a string as we call it and as you can see I actually included some HTML tags inside that string so we have some html text but with a paragraph tag wrapped around it and this is something you can do whenever you want to create HTML inside a web page you can actually Echo it out using PHP so you can write HTML and content using phsp in this sort of way um but this is not really the most optimal way to do things because you may notice a couple of things here first of all the text is completely orange and that’s the typical color when it comes to writing a string inside phsp and because of that we run into some issues with the HTML not actually having any sort of syntax checking we don’t have any coloring of the HML just like the body tag up and below so writing HML like this inside H string is something that is going to get quite messy and it’s going to get confusing and you don’t really have any automated syntax checking cuz it’s not seen as HTML by your editor is seen as a PHP string so what you can do instead is you can split up your condition using the opening and closing PHP tags around the beginning of the statement and the closing of the statement so on the next slide here you’re going to notice that the if statement is going to get moved up next to the opening PHP tag and then I’m going to close it right after that line and then the curly bracket at the bottom there is going to have a opening and a closing PHP tag as well because by doing that we now allow for HML to be written in between those curly brackets but we can actually write it as HTML and the editor is also going to see it as HTML and actually check it for syntax and that kind of thing and color it so it looks really pretty so doing it that way is really the optimal way to do it I think when it comes to writing HTML the last thing I want to talk a bit about here is writing comments inside your PHP you have seen some of it already but I just want to just sort of like go through it since there’s a little bit more to it whenever you create phsp code write comments because at some point you’re going to forget what the code does and you have to return to it and you have to go through the code and see what it does when you could just have created a comment early on to tell future you what exactly the code does so creating comment is a very important thing a a comment is not going to get outputed inside the browser it is just there for you as the developer to see so we have talked about creating a single line comment here using two forward slashes and because this is a oneline comment we can’t go down to the next line and continue writing then it’s going to see it as not a comment uh but we can create multiple line comments by instead of using two forward slashes we can use a forward slash and a multiplication symbol and then close it off again using multiplication forward slash because in this sort of way we can now create multiple lines in between these two opening and closing tags when it comes to writing a comment and just like that you now know the basics of syntax when it comes to writing PHP there is of course you know more advanced things we could go into but I think this is a good beginning to understanding how to write phsp and not get any sort of basic errors inside your browser whenever you try to create any sort of basic phsp code so with that said I hope you enjoyed this little video and I’ll see you in the next one [Music] so in the last video we talked a bit about PHP syntax and today we’re going to talk a bit about how to create variables and data types now I do think it’s a really good idea that we go inside our edit on this video and just talk a bit about this so we have some practical experience writing PHP code and with that we do need to actually start up our website and I thought why not do that together since that is something we haven’t done yet so what you need to make sure you do every single time time you want to see your website inside the browser is first of all you need to have your editor open which is step one then you need to make sure you’re opening up examp so you want to open up the software make sure you actually start the Apache and MySQL server then you want to go inside your browser and then you want to go into the URL and type Local Host and when you do that you can see all the websites that you have inside your HD docs folder in my case here I do have two websites you should not have two you should only have one so go and pick the one that we created together in the first episode and then you can see we have our website in front of us here and that’s the basic step in order to open up your website when you’re running it inside a server like examp so now we can go back inside our index.php and just to kind of talk briefly about the last episode because I know some people were little bit confused when it came to embedding HTML and PHP together so if I were to go inside I can create a regular HTML paragraph and I can go and create this is a paragraph and just write some text inside this paragraph here now what you can do is you can create the PHP tag so the opening and closing tag so angle brackets question mark PHP and then you can say question mark angle bracket so what I could do is echo which we talked about is how to Output things inside the browser I can say this is also a paragraph and we do need to make sure we remember that semicolon even though because this is the last statement inside this particular PHP tag here we don’t technically need to have this last semicolon but like I said it is best practice to remember to do it every single time because it doesn’t hurt anything to do it so let’s just go and do it every single time and when you do this you can go back inside your website refresh it and then we can see we have two pieces of text we have this is a paragraph and this is also a paragraph So we have two paragraphs inside our website and just to show something a little bit more complicated you can also go inside existing HTML elements and create PHP so I can go in between here and I can open up my PHP tags and then I can write something additionally in here so we would have to again because we need to make sure to Output whatever we’re doing using PHP and I can go ahead and Echo awesome paragraph semicolon save this one go back inside my website and then you can see we included this awesome paragraph in here and this is just to kind of show that we can mix and match PHP and HTML together in any sort of way that we want by embedding it directly inside the HTML but now this is not what I wanted to talk about in this video here I do actually want to talk about variables and data types because we do have variables and data types which we use constantly when it comes to writing phsp code so this is something we have to memorize so let’s go and talk a bit about what exactly a variable is now a variable is when we have a memory location inside our application that stores some sort of data which is a very confusing way for beginners to understand what exactly a variable is because a lot of people don’t understand what is memory location and that kind of thing so instead just for practice here let’s pretend that a variable is a box and that box box has a label so you know when you’re moving into a new house you put you know some writing on the box whether it’s kitchen utensils or uh for the the kids room or something so you know what’s inside the box but then you do also have something inside the Box some actual data so whenever you grab this box by referring to the name of the box then you grab whatever is inside the box as well and that is technically what a variable does so when you reference to a variable you grab the data and it’s just a very easy way for us to refer to data and label it so we know exactly what what the data is now when it comes to PHP uh the way you refer to a variable or the way you declare a variable is by creating a dollar sign so if I were to go inside my PHP tags here I can create a dollar sign which means that now we are declaring a variable and then we can call it something so we can come up with a name for this variable that we think makes sense to the data that is inside the variable so in this case here I could say that this is a name so I could say that this is a name and it’s going to be equal to some kind of data so now we’re initializing this variable by assigning a piece of data to it so in this case here I could say that it is a string which we talked about before called Danny Crossing so now every time I refer to this variable called name I’m going to get a value called Danny Crossing so if I were to go below here and just echo which means that we’re outputting something inside the browser and I can go ahead and Echo out name or the variable called name so we need to remember the dollar sign here if I were to do this go back inside my website you can see that we’re echoing out Denny cing so in this sort of way we can create boxes or labels for pieces of data that we can refer to in order to better handle data inside our code so in this case here we created a variable called name and you can call whatever you want but now we do also have naming conventions when it comes to naming these variables here so in this case you can see we call this one variable name but we can also go in and either start it with a letter or a underscore in order to name this variable now the customary thing is to start with a non-capital Iz letter and then make sure that any other new words inside this variable name starts with a capitalized letter so if I were to write full name instead then we start with a non-c capitalized F and then a capitalized n for name so whenever you have multiple words inside the variable name then you just make sure the first letter of that second word or third word or fourth word is going to be capitalized and again it’s not really a customary thing you have to follow but it’s it’s the way that people do it so I would recommend doing it the same way so people don’t misunderstand what your code does or why you named your variables in this way that other people don’t usually do it and just to mention it when it comes to any other letters that isn’t the first letter inside the variable name then you can also go ahead and create either underscores or you can create numbers so we can say one but make sure you stick within letters underscores or numbers when it comes to the variable name after the first letter inside the variable name so now let’s go and delete what we have here and talk a bit about data types because when it comes to data types inside PHP we have many different data types we’re not going to talk about all of them in this video here since some of them are a little bit more complex than others uh but we will talk about some of the base types that we have inside phsp the first one is going to be what is called Scala types and Scala basically just means that the variable contains one value to it and the first example of that would be we could create a variable that is called something like string and a string we did already talk about what kind of data that is so in this case here we could say uh Daniel so as we know already a string is a piece of text now we do also have numbers so I can go below here and I can create a integer or a int and I’m going to go and name this one a number so we can just write some sort of random number here and this is going to be a value for a integer notice that we’re not using double quotes around the number because if I were to do that then all of a sudden this is going to be a string so it’s not considered a number inside the PHP language anymore it is actually considered to be a piece of text just like a string up here and you can actually tell by the color that it actually changed it to text now we do also have something called a float which is something that we see happen a lot in many other programming languages which is essentially when you have a number that has decimal points so if we to write something like 25678 then this is going to be considered a float because it has decimal points and then we do also have one more scaler type which is called a Boolean now I’m just going to go and write bull even though it is spelled buoen we’re just going to write bull for short and this one is going to be a true or false statement so essentially is something true or is it false and the values for that is going to be false or it is going to be true now it is also important to mention here that if you were to have numbers in here and you were to run this as a Boolean then one is also going to return as true and zero is going to return as false but in most cases we do just use true or false when it comes to this type of data here and just because I talked about it in the last video let’s go and create a comment for this section here so you know exactly what this is so we’re going to create a oneline commment and I’m going to call this one scaler types now the next one we have is actually one that we’re not going to do too much with here in the beginning but we do also have a array type so we can actually go and create a common and call this one array type and essentially a array is when we have a variable that has multiple piece of data inside of it so just like Scala types which means contains one value in the case of an array we have multiple values inside one variable so so could for example create a variable called array and I can name this one equal to multiple pieces of data now we do have two different ways you can create an array one is by writing array parentheses semicolon and then you can add multiple pieces of data in here which could for example be a bunch of string so I can go in here and say we have one string which is called Daniel and then I can create a comma and then add a second string which could be Bella then I can add a third piece of data and I can just keep piling data on inside this array here so we can say feta which is also a string and then we could of course rename the array to something like names if that makes a little bit more sense to what exactly this piece of data has inside of it but essentially this is going to be a bunch of data inside one variable and just to mention it since I did mention there was another way to do this instead of creating array parentheses you can also do a square bracket and then close it off using a square bracket as well just like this now if you just started following this course here you should have a newer version of PHP but if you do run PHP 5.4 or lower then these square brackets are not going to work when it comes to writing a PHP code so if you run a older version of PHP then you do have to do it the way by creating this array around it but just like I said if you’re a little bit confused about why we use arrays inside our code and you may have questions about it don’t worry too much about it because we will get to talk more about arrays in the future for now like I said you’re only going to have to worry about these different scaler types here I do want to mention one more data type though even though it’s not one you should concern yourself with here at the beginning since this is something that’s a little bit further ahead in this course here but we do also have something called an object type so we can say object type and an object type is essentially just when we have a object that is equal to a variable objects is something we create based on classes which is something we again are not talking about right now but when we do instantiate a class we do actually create a variable that is equal to an object based off of that class so could for example say that we have a variable called object and then we set it equal to a new object which is going to be the name of the new object so we could for example say car parentheses and semicolon and this would instantiate a new car object which of course right now can’t find because we don’t have it but once we do have a class called card that we can instantiate then this is not going to throw an error message but like I said we’re not really going to worry too much about arrays and objects right now this early on in this course here so don’t worry if you get confused about because that is perfectly normal even though we’re not really supposed to talk about erasing objects yet I still thought it was important to just kind of like mention them because it is something that is very used inside PHP so knowing about them so you have kind of like a a little bell inside your head when we talk about objects in a future episode and you think to yourself oh wait I heard about that at some point inside this course here and then you might go back to this lesson here and think oh yeah we talked about objects in that early lesson oh now we get to talk about what exactly it is so don’t worry too much about right now it is something that you just need to have kind of like in the back of your head it’s not important right now the only thing you need to worry about right now is that we have these Scala types and when we actually create the variable we declare the variable and then we initialize it by assigning a value to it the reason I mentioned that is because it is possible to go down and create a variable and let’s just go and call it names and not assign anything to it and when you do this depending on the context of when you use this variable it is going to default to a certain value type so if you were to use this one in a string context then it will just go and say oh okay so this is supposed to be a string automatically and then it’s just going to assign a empty string to it and it will actually do something that looks like this so we just have an empty string that doesn’t have any sort of value inside of it and this is what it’s going to default too and the same thing goes for integers floats and booleans and arrays and objects they all default to something so in this case here if I were to go ahead let’s just go and use these up here so as a default a string defaults to nothing so just an empty string with double quote by the way an integer is going to default to zero and the same thing goes for floats they also default to zero and when it comes to booleans they default to faults and just to mention it here when it comes to an array so if we were to create a array because we did talk about them in this video so we do also need to just kind of mention this it is going to default to a empty pair of square brackets and when it comes to an object day default to null which means nothing null is not a concept that we’re going to talk about right now but it just basically means nothing however when it comes to declaring a variable you should always initialize it the reason I say this is because sometimes when we do create variables we don’t know what should be inside the variable just quite yet and in those cases we just declare a variable but we wait with assigning any sort of value to it and when those moments happen you should not do it this way because you do risk getting error mess messages inside your code so make sure that you always assign something to it by initializing the variable so with strings you put empty double quotes with a integer you put a zero the same thing with floats if you put a buo and always set it to false arrays are just going to have these square brackets here and objects are just going to be null so these are going to be the default values you should always put inside a variable if you don’t know what kind of data you should put inside of it just quite yet otherwise your interpreter is just going to throw you a warning in a lot of cases so so just go ahead and make that into a Happ and here at the end before we end up the episode I just want to say that it is perfectly normal to be completely overwhelmed with all this information here because this is a lot of information I’m dumping on people especially if this is your first programming language this is going to be completely new and this is going to be a lot of information I just want to say that is perfectly normal to be overwhelmed and in the future we will get to do many more practical examples where we do actually use variables for something and we use many different data types and it is something that is just going to be a bit more natural when you actually to start seeing how these are used in Practical examples and when you get that little oh okay Epiphany moment where okay so this is how we use these different things we’ve learned up until now then at that point you will remember things a lot easier okay so don’t be worried about if you can’t memorize all these things cuz no one expects you to memorize all these things in one sitting it is something that sticks with you as you start practicing PHP along the way just to give a short example here at the end just so people know exactly how we can use variables inside our code if I were to go back and sign up body tags here and at the very top I’m going to go ahead and declare a variable called name going to set this one equal to a string called Danny Crossing and what we can do here is we can go below and create a paragraph inside HTML then I can just go and say hi my name is and then we’re going to open our PHP tags close it off again comma and I’m learning PHP then what you’re going to do is you’re going to go up and grab your variable name and you’re going to go inside your PHP tags and you’re going to Echo out your variable name semicolon and when you do this and go inside the browser and refresh it you can see that now it says hi my name is Denny cing and I’m learning PHP so in this sort of way we can take data or variables and we can use them inside our code or inside our HTML if you want to do that to Output data in this sort of sense like this is a very basic example but just to kind of show that we can use variables to reference to data that we assigned to variables and just to mention one more thing because something we can also do is we can go down and say I want to create a new variable and I just go and call this one something like test just to give it some kind of name I can assign equal to name so in this case here we have a variable that is assigned equal to a variable and I were to take this name and copy it down instead of the echo you’ll now notice that we still do get hi my name is Danny Crossing and I’m learning PHP and that is because this first variable here has a piece of data assigned to it and then the second variable down here has that same variable which has data inside of it assigned to itself so we can also assign variables equal to variables in this sort of way here and with that we now know a lot about variables so I hope you enjoyed this episode here and I’ll see you in the next [Music] [Music] video so in the last video we talked talk a bit about variables and data types and in this video we’re going to talk a bit about predefined variables or what you also call built-in variables now a predefined variable is a variable that exist inside the PHP language so in comparison to a variable from the last episode where we created it ourselves by saying we have a variable by saying a dollar sign and then we give it some kind of name so we could for example say name set it equal to some kind of value like Daniel and then we have a variable but now this is a userdefined variable which means that we created it ourselves but we do also have variables inside the PHP language and these are called super globals which means that we can access these variables from anywhere inside our code no matter what the scope is inside our code now scope is something we haven’t talked about yet but it is something we’ll get a little bit more into once we start talking about functions in PHP so for now just know that super globals can be accessed from anywhere inside our code now we do have a list of super globals that we can gain access to and each of these do something different when it comes to grabbing these variables so I’m just going to go ahead and list them out here one by one and talk a bit about them and explain what exactly they do and what you can use them for inside your code and just keep in mind once we do this I don’t expect you to memorize all of these in the first go we will actually get to use more of them as we start you know continuing these lessons here so you will get more practical examples to just kind of help you understand how we use these but for now I’m just going to give a short description of what exactly they do and then we’ll talk about more of them in the future episodes now the first you need to know is that whenever we want to define a super Global or a predefined variable is that we reference them by creating the dollar sign but then we create a underscore followed by a capitalized word so for example we could access the server variable and you want to make sure you add these square brackets afterwards and then semicolon so we could for example go inside and say we want to get the documentor root which is going to give us information about the root path of this particular website here so in order to access it inside the browser would do of course need to Output it by echoing it out so if we were to go inside my website refresh it you can now see that we get the C drive xamp HT docks which funny enough is the folder that we talked about in the first episode where we installed xamp so this is the location of the website inside our computer so what I could also do is I can go underneath here and just sort of copy paste this and I could also get some information about the PHP unor self then go inside the browser refresh it and then we can see we get some more information here so now we get the my website which is the name of the root folder that we’re inside of right now and we also get the name of the file that we’re inside of right now and the reason these are written right next to each other is of course because we have them echoed right after each other we could also go down below here and say we want to Echo out a HTML break which is if you know HTML which you should know by now is how to create a new line so want to save this go inside you can now see that these are the two different pieces of information that we get using the server super Global and there’s many pieces of information you can get about the server and there’s a huge list that I will include inside the documentation inside the description of this video here but for now we just going to take a couple of examples here just to kind of show you a little bit about what I can do uh the next one I want to show you is going to be the server name so if I were to go down and copy paste the break I can also go in here and grab the server uncore name if I were to do that you can now see that we get local host and that is of course because we’re working on a local server right now so if if you had your website on a online server that would be the name of that server we can also copy paste one more time and we can do one called request method underscore method and what this will do is tell you how this page was access so in this case here you could for example say that this is using a get method but if you were to access a page using another method like a post method then you can also see that when you output what kind of request method you were using now if you come from the HML CSS course that I have on my channel you may have heard something about get and post methods and that is essentially when you have a form inside a website you know just a regular form you can fill in using HTML and inside the form we have two attributes we have a action and we have a method and inside the method you just simply state if you want to submit the data using a get or a post method and that is essentially the information we’re getting here in a couple of episodes from now we will do a exercise together where we will be using this particular method in order to graph some data so in a couple of episodes from now do take note that we have a dollar signore server request method since we will be using that particular one in a future episode now the next one we’re going to talk about is going to be dollar signore getet which is another Super Global that you may have some bells ringing in your head about because we just talked about get and post methods so essentially when it comes to handling data and submitting data from page to page inside our website we can do so using a get or post method like I said using a HTML form so when we do that we can use a get or post method in order to grab that data from inside the URL which means that I can go in and instead of all this stuff that we just wrote here I could go in and say that we want to grab a piece of data so dollar signore get square brackets semicolon and I want to grab a piece of data that might have a label labeled as name now currently we don’t actually have anything like this inside our website but what you could do is you can go inside your website go go inside the URL and say that we have our current page which is index.php and then you can add a question mark name equal to Danny and because we have this name equal to Danny inside our URL after the question mark we’re now accessing a piece of data inside the URL which could have been submitted by a get method so this is how it would actually look like if you were to submit a piece of data from a form using HTML so if I were to go inside my code and actually Echo this out because like we talked about we do need to Echo in order to output something inside the browser if I were to do this because I have this inside the URL and refresh it you can now see we get Danny and that is because right now all the data inside the URL is going to be accessed as an associative array which means that we have a bunch of data with labels that we can access using this get method here so if I were to go in here so what I could also do is I could add a ENT symbol which is the ant symbol and I could add in a second piece of data which in this case could be I color is equal to Blue so if we were to add in a second piece of data we could also go in and say we want to Echo out a piece of data which is called I color so if we wrote I color saved it refreshed it you can now see we get Denny blue using get methods is something we use quite often inside PHP since we do submit data from page to page constantly whenever we do something using phsp so knowing this is something that is very important for you to memorize however we do also have have a post method and that is going to work a little bit different because a post method will also submit data but a post method is not going to be visible inside the URL just like a get method is so essentially I could still have the same information submitted but we can’t see it inside the UR else so even though we might still have data accessible to us that we submitted to this page we can’t see it inside the browser which is very useful when it comes to submitting more sensitive data so in case someone is standing behind you and looking over your shoulder as you’re submitting data inside a website they can’t see it so it’s going to be more secretive when you submit it there’s of course many different benefits to using a post method over a get method it really depends on what kind of users you’re trying to get here the main rule of thumb is that if you’re trying to get data from a database or just get data that you want to show the user then we use a get method and if you want to submit data to the website or to a database inside the website then we use a post method a very good example of this is if you have a login system and you want to lock in the user when they’re typing in that login information and then submit the data then we don’t want that data to be seen so that has to be submitted using a post method but once they log in and they have this user profile page inside their website that they can visit then all the data inside the profile page could for example be grabed using a get method so again a couple of different ways to use these but now we do also have something called a request method so if we were to go down here and instead say request and do this and actually go back inside the URL and refresh it you can now see that we’re still getting Danny so even though I used a request method instead that still looks for the name label inside the URL we actually still get Danny and this is because a request method is going to be looking for get post and cookies when it comes to looking for data inside this website here the thing about using request though is that even though it is kind of like this super super Global where we can get both get methods and post methods and cookies and we just use one thing to get all three of these is that you don’t really know what you’re grabbing whenever the US to submit something so if I were to for example submit a form but also were to go inside and say that I want to just manually add some data inside the URL then if you don’t set it up properly and validate it properly and sanitize everything once they submit the data then it can kind of go in and do some security damage so the rule of thumb here is whenever you know that you’re just going to be handling post or get data just go ahead and use the get or post method instead so just kind of forget about this one for now just remember that we have a get and a post method and and just don’t look at this one for now the next one I want to talk about is going to be the files super Global so we have one called files now this one is going to be used whenever you want to get data about a file that has been uploaded to your server so in case where you have a HTML form again we’re talking about forms here inside HTML forms we can allow users to submit files when they actually want to submit their form so for example a picture or PDF document or something they want to upload to the website then they can do that using a HTML form and whenever a user does that we need to double check all sorts of things about the file once they actually upload the file to make sure that this file should be uploaded to our website because let’s say for example a user decides to crash our website by uploading a file that may be very very very large in file size then we want to have something to double check the file size of that file that the User submitted and we can do that using our super global call file since we get all sorts of information about the files that the User submitted for example the file size we can also get information about the name of the file uh what kind of extension it has is it a PDF file or is it a file format that we should not allow to be uploaded inside our website so using this super Global here just kind of like allow for us to grab information about files that the User submitted using a HTML form the next one I want to talk about is going to be one called dollar signore cookie now a cookie is essentially a small file that your server embeds on the users computer which means that we have a bunch of information we can store on the users computer and using this super Global here we can actually store or grab information about cookies inside our website and in the same sense we do also have one for a session so I can also grab a session variable so in this case here we could for example grab some information about um let me actually go and demonstrate this one so if we were to go some of PHP tags I could for example create a dollar signore session and inside the bracket I’m going to make sure to include a name for this session variable here so I could call this one username and if I were to go inside and store this username inside the browser using a session this could for example be a username called Crossing then I can access it by simply reference to this particular session variable that I just created called username then if I were to go inside the browser and refresh it even though we don’t have a session running we can actually gain access to this one because it’s inside the same page so right now you can see that we have this cring stored inside a session variable so we can store information about the user inside this session which is on the server side this means that if I were to close down the browser and actually close down the session we are running inside the website it is going to forget about the session variable unless I set it again inside the website which I do actually do right here because it’s not the same page and again we will get to talk much more about session variables and cookies in the future episode for now just know that we have these super Global session and cookie variables that we can use in order to grab data from inside a session or inside a cookie and the last one we have that I just want to mention here which we should definitely not get into right now because this is heavy stuff for a beginner uh but we do also have something called a EnV which is a environment variable that we can gain access to inside our PHP code environment variables are essentially very sensitive data that you want to have inside the particular environment that the user is working in so you know data that should not be accessible to either the user or other environments um but this is not something we’re going to talk about right now this is something we’ll have for a later episode and just so you have all of them right in front of you so you can see how they all look like these are all the super globals that we have inside phsp again it’s very important for you to know that I don’t expect you to memorize all these especially since we haven’t actually used these in any sort of practical examples inside our code so far but the reason I wanted to discuss super globals is because right now we will get to talk a bit about a couple of these in the upcoming lessons so instead of telling you that oh by the we have something called super globals and we’re just going to use two of them right now I thought it was a really good idea just to introduce you to all the super globals that we have so you know that they exist and what they do so in a future episode whenever we visit some sort of lesson that is related to for example sessions inside our tutorial then you know that there’s something called a session super Global because we talked about it so it is important that you know that these exist but I don’t expect you to memorize any of these just quite yet in the next episode we’re going to talk a bit about operators inside pH P which is something that isn’t quite complicated it’s it it’s pretty simple but it is the last lesson that we need in order to do a practical little exercise together where we build a calculator together since this is kind of like a tradition on my channel that we build a calculator using whatever programming language we’re using right now and when we do get to that episode we will talk about the server and the get super Global since we have to use those in order to do our calculator exercise which is why I wanted to talk about these right now since we have to use them so why not introduce them to you this early on and before we end off the episode here I just want to mention that there is another Global that we haven’t talked about just called Global which is a way for us to gain access to variables that we created from any sort of scope inside our code and the reason I didn’t mention it is because we will get to talk more about Scopes once we get to our function episode which is not far from now but once we do get to talk about creating functions we do need to talk about something called the local and the global scope inside our code and that particular super Global is relevant when we come to that particular episode so I will talk about that once we get to that episode there so with that said I hope you enjoyed this video and I’ll see you in the next [Music] [Music] one so now that we know how to create a variable and a super Global we can now talk about how to create a form inside our website and actually submit data that we can grab using PHP and do something with it using HTML forms together with PHP is something we do quite frequently with PHP and it is one of the main things that we actually use PHP for when it comes to handling any sort of data inside a website so if you don’t know how to create a HTML form I do have a very thorough HTML tutorial that does talk about how to create a HTML form that I will link in the description if you have the need for it we have to remember that this is a PHP course so talking about too much HTML and CSS is something that my subscribers actually told me not to do so if you don’t know how to create a HTML form and you want to know the specifics of creating a HTML form then watch that tutorial inside the description with that said I do have a form inside my index. PHP file here so as you can see I have a very basic main tag that has a form inside of it and inside this form I just simply have a input for the first name I have an input for the last name and I do also have a select which is a drop-down that allow you to pick your favorite pet type so just a basic form that allow for you to type some basic data inside the form and then submit it and just because I know some people don’t use labels inside their form do make sure that you use labels whenever you create a form since it allow for people with disabilities to better read your form so this is a important thing I do see some people use paragraph tags instead which I’ve done too in the past so I’m also at fault for doing that um but I’m also seeing people not use any tags whenever they create these labels for their form so just make sure that you use a label element when you want to create a form tag again this is not supposed to be an HTML tutorial and now I’m sitting here teaching HTML when it comes to a form we have talked about inside my HTML course that we do have a action and a method attribute inside the form tag and when it comes to these two different attributes here these are the ones that we use in order to tell our PHP how we want to submit the data and also where we want to submit the data too so in this case here you can see that I did actually tell it that I want to include my data and send sended to a PHP file called form handler. PHP which is inside my includes folder so as you can see inside my root directory I do also have a includes folder that I just simply created by creating a new folder and inside this form handler. PHP I have nothing inside of it so right now we have a clean file you could have called this anything you want so form Handler of test.php just something it doesn’t have to be form Handler it’s just kind of to tell us what exactly this is but in this case here I do have this empty PHP file so just to start with here let’s go ahead and open up our PHP tags and just like we talked about in my syntax video we do not want to include a closing tag because this particular file here is going to be a pure PHP file and when you do that it is best practice not to have a closing tag so now going back to the index of phsp file you can see that we have this post method that I set inside my form now we do have two different ways we can submit this data either using a post or a get method now a get method is going to actually submit the data inside the URL so you can see it whereas the post method is not going to show the data inside the browser so the general rule of thumb here is that whenever you’re submitting data and allowing the user to submit data then you want to use a post method and whenever you want to show something to the user inside a page then you use a get method so just kind of rule of thumb there but you know of course it’s not going to be in 100% of cases but in 98% of cases that is going to be how you’re going to do it and just to kind of show it here because I did talk talk about this in the last episode when we talked about super globals if you want to submit a form and send the data to the same page that you’re inside of there is a way to do it which is to go inside your action open up the PHP tags like so and then you just go in here and you do actually just include the server super Global that we talked about so we’re going to Echo out the server super Global and Target the phsp self so this is one way to do it just to mention it but with that in mind you do also need to do something else here so don’t just post this and use this because this is actually prone to hacking or xss which is called cross- site scripting uh so therefore you should not just post this just like it is right here uh so for now we’re just going to go and send it to a separate document which is how you do it pretty much most at a time I do see a lot of people in my comments they they want to know how to send data to the same page as the form is on which is of course you know in some cases you might find a use for it but in most cases you will be submitting the data to another page so in most cases is this is how you’re going to do it and now that I mention security here for a second because I know some PHP people will maybe point this out um whenever you have any sort of include files that are just pure PHP files you’re supposed to have it inside a private directory inside your server and that’s not how we’ve done it right now everything is public at the moment but we will talk more about Security in a future episode we’ll we talking about private folders and public folders and where to include certain phsp files and where should your HTML files be for now we’re practicing right we’re practicing PSP so this is how we’re going to have the directory right now so that was a lot of information that wasn’t really supposed to be included inside this lesson here but I thought it was important to talk about so I just wanted to mention those things so with that said as we talked about we have a action and a method now when we send this data to the other page we need to be able to grab it somehow and that’s something we need to talk about because inside your HL form all your different data or inputs should have a name attribute because because this is the reference name that we’re going to grab once we send the data to the next page whenever you grab the data using the name attribute you’re going to be grabbing whatever the user input so right now for example inside a text field uh whatever the user typed into the text field is what you’re going to be grabbing on to reference to for example first name but inside a select down here if you have a drop down the data that you’re going to be selecting when you reference to for example in this case here favorite pads is going to be the data that is inside the value attribute so again just a little bit of HTML knowledge there for the the non-html people who should know HTML by now but let’s go and talk about how to actually grab this data inside our form handler. PHP file so once I submit this form inside my website which by the way looks something like this if I fill in information for example Danny Crossing and then I choose a pet so in this case here I do actually have one of each of these types of pets and I don’t want to make any of them cry so I’m just going to select none for now cuz I’m a good dad once once I submit this it is going to send it to whatever I set inside the action attribute so going back inside our document here if I were to go inside the form Handler you can see we have nothing in here which means that if I were to actually submit this data inside the website you can see that we just get a blank page and burning eyes warning here a little bit late but the warning came so right now nothing is happening this is the exact same thing is just an empty page inside HTML or something like that so what we can do is we can go back inside our code and the first thing you want to do is you want to check if the user accessed this particular file in the proper way because it is possible to just go inside the URL inside your website and just go up here and type the address of that particular file that is inside the includes folder which by the way is also why we have private and public folders inside our directory which is something we’ll talk about later because those allow the user to not be able to access the private files just by going inside the URL however we always need to think in security whenever you do PHP always think security so the first thing we’re going to talk about here is going to be how to let the user not access the code if they didn’t access this file using the form that they had to submit the way we’re going to do that is using something called a condition which again we will have a more thorough tutorial on a little bit later but essentially a condition looks like this so we have a if statement that says if something is true then run the code inside these curly brackets that we have here which are these right here so so whatever condition you want to set inside this statement has to go inside the parentheses so if for example true then run this condition here which will always be true because true is true right um so what I can do is I can go inside of here and I can use one of the super globals that we talked about called server which I did mention that we had to memorize because we would be using it in a upcoming lesson which is going to be this one so we have this super Global here and what I want to check for is a request method so requestor method now just to kind of show you here because if I were to take this server super Global and let’s comment this out for now and go up here and use a method called V dump actually this is a buil-in function but if I were to use Vore dump which would actually output some data about this particular super Global inside the browser so we were to do this just to see whatever this is outputting I can go back inside the browser refresh it and then you can see we get string three get which we’re not supposed to be getting oh I forgot to set this one back to post so let’s go and do that for a second inside the form um so go back inside the website refresh it again and now you can see we get well we actually have to resubmit it so we go back again resubmit and now we get post so this basically tells us that we access this particular page using a post method which means that we can go back inside our code and say okay so if the user we just comment this V dump out because we don’t need it anymore if this user access this page using a request method that is equal to post then we allow for the code to be run inside these curly brackets here and this brings me to a good point because some people including myself in the past by the way have been doing this in a different way so instead of checking for a post method we would actually go in and instead check for a is set function which basically goes in and checks if something has been set currently so if were to go back inside my form and inside my button down here I could actually add a name attribute and set this name to submit which means that now if I were to submit this form I also submit a a post super Global that has submit inside of it so I could go back in here and check for a post super global Post and then we can check for brackets go in here and check for a submit so this is also a way to do it but it’s not considered to be the best way to do things so you should be using uh this method down here to do it so every single time you submit data to another page you want to run this condition because that has to be checked for every single time then once you’ve done that you go inside the condition here and then you want to grab the data and we can do that the same way that I just showed using the other if statement so that is by using a post super Global so we can create a variable which we talked about is kind of like a container and we can name it something like first name and I want to set it equal to some sort of data now in this case here I want to grab a post super Global which is the data that we sent to this page here and I can grab it by referencing to the name attribute inside the form so if I go back to the form I can actually go and delete this name attribute down here because we don’t actually need it and I can grab the first piece of data and this one has been set to first name so if I copy that go back inside my PHP and paste that in now I’m grabbing the data from the form however we’re not actually doing this in a very secure way we did talk about cross site scripting so if we were to go back inside my form here just go back again uh if I were to go inside this form you can actually write code into this form here and that is going to allow for users to hack your website or do certain things to your database that might destroy it inject JavaScript in into your website which is not a good thing so you want to make sure that you sanitize your data every single time the rule of thumb here never trust data that is submitted by a user which means that you always need to sanitize data that the user was able to submit so we go back inside our code here and what you want to do is you want to use a built-in function inside phsp which is called HTML special characters so what I can do is I can say HTML special characters and what you want to do is you want to grab grab the data so the post method here and you want to put it inside the parentheses of this particular buil-in function and now there’s a couple of parameters you could put behind this particular function here but for now this is pretty okay so we’re not going to do anything else what this function does is that it takes your data and it converts it into HTML entities which means that we can no longer inject code inside uh the fields that we posted inside our form those are going to get sanitized so we don’t see it as code but we just see it as HTML entities which which means it’s not going to be picked up as code a good example of this just to kind of demonstrate it if it were to go inside my index file I can go right above my form and I can create a HTML Ampersand so if I were to write this HTML entity and save it and go inside my browser you can see it’s going to be picked up as a Ampersand cuz that is the HTML entity for a Ampersand which means that if I were to actually go inside my form and write a Ampersand because it might be part of some code that I’m maliciously trying to inject into this website here to break it um then it’s not going to be seen as this symbol up here but instead it’s going to be seen as this right here which is definitely not some sort of JavaScript code so just to kind of talk a bit about what exactly that function does you know that’s what it does uh so you want to make sure you use this particular function every single time you grab data from a user to make sure they don’t inject any sort of malicious code into a website so we do have two more pieces of data so I want to just copy this down down and I want to change the next one to last name and then I want to make sure that we go inside the post method and we go back and check what is this one called it is called last name so we can go back inside here and copy that in the next one I can call uh pets or something and then we go back we check what did I call this one I called it favorite pet so I can post that in here and it is important to keep in mind here that the naming of the variables doesn’t matter you could call this one test but it wouldn’t be very descriptive so we have to make sure whenever we create a variable that we know what it does by describing what exactly it does so this one would be the first name this would be the last name and this would be whatever pets I submitted so this should technically probably be a little bit more descriptive favorite pet like so now with that said I do also just want to mention this we do also have another function so right now you can see they have HML special characters but we do also have one called HTML entities which almost does the same thing as HTML special characters but instead of just taking special characters and converting into a HTML entity HTML entities takes all applicable characters that you could use for example any sort of other non-code characters and it converts that into HTML entities as well but again in most cases we do just use HML special characters so just keep that in mind for now that we do have this one and I will of course leave documentation to that particular function if you want to check it out inside the description but just know that we will be using HMO Special Care characters in most cases now that we have the data we can start doing something to it so I could go down here and just do some sort of code so I could say I want to Echo out uh a string and I want to Echo out these are the data that the User submitted and then I can go down below and I could also Echo out a break just to get a HTML break so we can actually jump down to next line we could also written a PHP new line which would have been something like this this but let’s just go ahead and do a break uh so what I’ll do here is I’ll jump down to the next line and I want to Echo out a piece of data so in this case I want to grab my first name and I want to Echo that one out then I’m going to be copying these two lines and paste it below last name and then we want to write our favorite pet so just like so we can copy paste copy paste the favorite pet and with that we can now go back inside the browser and refresh the page just to reset everything and then type something else in so I could for example say Danny Crossing and then we could choose a pet let’s just go and choose a dog in this case here cuz Bess is sitting right there I don’t know if you can see him but he is just kind of sitting here at the back he’s a bit tired um but I could choose dog and submit this one and then you can see these are the data that the User submitted Denny cusing Dog so now we grab the data and we could actually Echo it out inside the page just to kind of show what data we grabbed from inside the form now of course in most cases you would not just be echoing out data but instead you would be going in here and actually doing something with the data so for example inserting it inside a database or run a certain function inside your website to to do something with the data but just to kind of show that this is where you would actually start doing things with the data so what you could also do is so we don’t get stuck inside this page because this is just meant for a page where we run phsp code that the user is not supposed to have anything to do with this page is only for us as a developer so what I’ll do is I’ll send the user back to our front page using a header function so I can go in here and say we want to set a location colon and then we want to set the location that we want to send the user to so in this case we want to go back One Directory so I’m going to sayt dot slash and then I want to go inside index.php so with this header function here we now run the code and once we get down to the last bit of code we now send the user back to the front page so if we were to do that go back inside the website let’s just go ahead and refresh it here if I were to submit this data you can now see that oh we went back inside the front page because we just ran the code inside the other page and then we get sent back again to the front page which by the way brings me to just another little security thing um if I were to go back in here we can also run a else statements which basically means that if this condition turns out to be false then instead of just getting stuck inside this page here I want to to send the user back to our front page so if the user got in here in some sort of weird way by not actually posting the form but they just went inside the URL and typed in the address for this page here then they still get sent back to the front page because they access this page illegitimately so including this down here just as a fail save is just kind of like a good thing to do with that said I do want to address one more thing that I often get comments about and I just want to just say this once and for all whenever you create any sort of error hand inside this script here that you created yourself for example if I were to go down here and let’s say I want to check if any of these has been left empty when the User submitted the form so they went inside the website and they did not fill in the first name they did not fill in the last name and then they submitted it then what should happen well of course we don’t want the user to be able to submit the form right cuz there’s no data to submit but we do want to require that they submit all the data and one way you can do that is going inside your phsp code so I can create another condition so I can say we have a if statement and inside this if statement I want to check for a method called empty so basically this one checks if a variable right now contains no data inside of it so if it’s empty essentially so I can take the first name and I can put it inside here and if this one returns true it means that there’s no data inside the variable which means the user did not submit a first name so what I could do is I go in here and I could say I want to exit the script because I don’t want the rest of the script to run I just want everything to stop right here and then I might want to send the user back to the front page so again we copy this header and we send the user back to the front page maybe with an arrow message or something so what people tell me is Daniel you silly little man you can just go inside your HTML form go inside the attribute for example inside this first input here and you can write required if you do that then the user cannot submit this form right I can’t tell you how long I’ve been waiting to gloat about this cuz people they keep telling me inside the comment section even though we have this required attribute you can still submit the form it is very important for me to point out that any sort of front end whether it being HTML CSS or JavaScript is not going to be good security let me demonstrate for you if I were to go inside my form Handler the PHP and just for now so we don’t accidentally exit anything or something like that and I’m just going to go ahead and delete all these header functions here because I I want to stay inside this page if something happens let’s just go and delete everything here uh so we stay inside this page and Echo out all the data once we submit the form so if I were to go inside my website and I refresh the browser right now we have a required attribute inside this form here so if I were to try and submit this without typing anything inside this first one I’m going to get this little error message here so it says please fill out this form right so we can’t possibly submit this right now because it’s telling me when I click it that I need to fill out the form however if you know a little bit about browsers you know that we do also have a depth tool built into every single browser at least every single mutton browser so what I can do is I can rightclick and I can inspect anything inside this website here so when I do that we get this little depth tool that opens up at the bottom here now let me just go and zoom in so you can actually see what is going on here so right now if I duck this one over on the right side so you can actually see uh you’ll notice that inside this dep tool we can see everything about the front end of our website which means that we cannot see any sort of PHP but we can see every single HTML CSS and JavaScript inside this web page here which means that we can actually change it I can go inside my input and as you can see it says required so I can just go ahead and delete that one and if I do that and now go back inside the website so I can close this down I can now submit the form even though I did not input anything inside the first input so it’s very important that you know that any sort of front end HTML CSS JavaScript or at least as long as it’s not backend JavaScript like for example node.js or something but any sort of front-end javascripts is not going to be any sort of security so always use server side security when it comes to security inside your website and a really good server side language to protect your website with is of course phsp because it runs in the server so any sort of time you do anything with phsp inside your website or handle any sort of data from the user inside your website you should always sanitize and run error handlers using PHP in order to check for any sort of thing that the user might do in order to try and hurt your website so that’s very important so with all that said this is the basics when it comes to submitting data using a HTML form and then doing something with the data using PHP so hope you enjoyed this lesson and I’ll see you guys in the next one [Music] today we’re going to talk a bit about operators inside PHP and operators is something we use all the time whenever we do anything inside PHP now essentially a operator is something that helps us with logic connecting data together or math or any sort of thing that has anything to do with operations inside code and when it comes to operators we have many different types and I’m just going to cover the most essential ones that I know we’re going to be using for the next many couple of lessons uh so we’re not going to cover all the operators that exist out there we will talk about the ones that you will be using most of the time operators is also something we’ll have to learn a little bit about in order to actually do our projects in the upcoming videos since we have to do that one calculator uh project that I promised but we can’t do without talking about operators first so we have to talk about how to do various kinds of operations the first kind we’re going to talk about is something called a string operator and a string operator is a way for us to conect connect Different Strings or just different pieces of data together inside one string so to speak so essentially let’s say I have two different variables I have variable a and I have variable B and if I want to connect these two together what we could do is we could create a variable C and say we want to set it equal to hello world but I already have this data somewhere else I already have it inside variable a and variable B so what I could just do instead is I could connect these two together to create one string so what I could do instead is I could actually go inside variable C and instead of just rewriting everything again because we already have the data so there’s no need to rewrite it right so what I can do is I can take variable a and I can say I want to connect these two together by writing a punctuation and then I can include variable B so in this sort of sense we can concatenate two pieces of data together by using this punctuation in order to say well I have this data and I have this data and I want to combine them using this punctuation here I do also want to mention that you should be leaving spaces so don’t do this but instead do this and if I were to actually go and Echo this out so if I go below here and say I want to Echo out variable C what I could do is just kind of take a look at how this looks like cuz it’s not going to look exactly like we think it is if I refresh it you can see we get hello world because we can catenated these two together um but we don’t have a space in between the words so how do we create a spacing between two pieces of data well the way we do that is by going in and say well okay so I I just concatenated two variables but what if I want to concatenate a string together with this so what I could do is I could for example say that I have a string and I want to create a space inside this string and then of course we need to concatenate the string with variable B by creating a punctuation so just like this we now concatenated a string in between these two variables so we created a small space here so yes this is a way to to create spaces between data by just concatenating a empty pair of double quotes uh so what we can do is we can go back in refresh it and then you can see we get that little bit of spacing there and this just kind of like a really neat way to you know connect two pieces of data together so we don’t have to recreate it again so we don’t have to rewrite hello world inside a new variable so we just use old data we have already and just combine it in here and with this we do also have something called arithmetic operators so if we were to go in and paste that in and delete what we have already a arithmetic operator is essentially math it’s just like you learned in elementary school I think you learned this kind of math so essentially like plus minus multiply division uh we do also have some other things like um we do also have something called modulo and exponentiation so we do also have some high school things added in here but what I could do is I go in here and just simply Echo out some data so I could say 1 + 2 and we’re going to Echo this out now this is actually just a arithmetic operator when we add two numbers together like we just did here so in this case here of course if we would to save this and go inside my browser you can see we going to we’re going to get three because 1 + 2 is equal to three and the same sense we can do with all sorts of operators so we can also go in and we can you know minus we can also go in and multiply we can also go in and divide if we want to do that uh but we do also have this called modulo which is essentially when we go in and we want to have the remainder of something specific so in this case here let’s actually go and take 10 and say we want to divide by three or not divide modular by three uh essentially what you’re doing here is you’re dividing 3 into 10 and when you can’t do it any further then you need to see how many numbers are left over in the end 3 6 9 and then we can’t do anymore right but we we got to nine which means in order to get to 10 we have one more left so this would actually equal one if we were to go back inside the browser and refresh it so as you can see we get one and then we of course do also have to the power of which is basically going in and writing two multiplication symbols so if we take 10 to the power of three if we were to go back inside and refresh the browser you can see we get a thand because 10 to the th to the power of three is a th000 so we can do you know basic math calculations here uh but we do also have something called U procedence which is something something that goes in and helps us a little bit when it comes to doing a little bit more complicated math because let’s take an example here I do actually have an example on the side here in this example here you would normally if you know math from back in you know like back in the days when you learned math in school you would know that in this case multiply always comes before plus and minus which means that we have to say 4 * 2 which is 8 + 1 which is 9 so if you were to go ahead and do this go back inside my browser refresh it you can see we get nine however if I want to change the procedence of what gets calculated first inside a arithmetic operator or just a basic uh mathematic equation I can use parentheses order to do so so if we were to go in here and say you know what I want plus to go first so in this case here I write parentheses around one + 2 which means that these two are going to get calculated together first before anything outside the parth gets calculated afterwards so 1 + 2 is 3 and then 3 + 4 is 12 took way too long for me to calculate but this should end up being 12 so if we go back inside the browser and refresh it you can see we get 12 so we do also have something called operator procedence whenever we use parentheses we can do calculations and we can use more than one parentheses so we would to do uh 4 minus 2 then I can also use parentheses around here and then of course uh once we calculate these two together we’re then afterwards going to calculate these two together and then we’re going to multiply at the end there so again you can use this many as you want with that said we do also have something called assignment operators and what we can do here is basically assign things to something else which means that if we were to go in and say uh variable a is equal to two so in this case here I just assigned two to variable a and it is important to note here that we do not say equal to two cuz there is a small difference between saying that it’s equal to something or that we assign something to something it’s not really that important to know but I I just thought I’d mention that it’s not equal to it’s that it gets assigned to because variable a is a space in the memory so if you assign a piece of data to that space in memory then it’s not the same as saying that it’s equal to basically we just assign data to um to variable a that’s that’s what you need to know here with that said this is how we can assign a piece of data to a variable which we have done plenty of times up until now but let’s say I want to do something a little bit different let’s say I do also want to say variable a is going to be equal to itself plus something else what you could do is you could go in and say variable a + 4 and this would actually work out this is variable a which is 2 + 4 and then it gets assigned back to variable a which means that now now variable a is going to be equal to 6 right however this is extra code and this is just not how we want to do things we’re essentially double writing variable a which uh is not really considered best practice so what we can do instead is we can just go ahead and delete and do something like this so we can say plus equal to 4 so whenever we use any sort of arithmetic operator which we talked about which is plus minus multiply divide because we could also do divide if we wanted to do that but whenever we do something like this we’re essentially saying go ahead and take variable a and set it equal to itself plus whatever is after the equal sign so in this case we would also still get six so if we were to go and Echo this out so we’re going to Echo out variable a then you can see we get six inside the browser and the same way like I said we can do with any sort of operators that we learned about previously like minutes ago uh so I could go in and say multiply so in this case here it’s 4 * 2 so I would to go back in you can see that we get eight but now let’s talk about the next operator type which is something called a comparison operator and this is something that you will be using very often whenever it comes to any sort of conditions inside your code uh we have talked a bit about conditions in the past you know when you have a if statement says if this code is true then run whatever code is inside this like the curly brackets below so to give an example here let’s go and delete what we have here and let’s go ahead and create a if statement we haven’t really talked about if statements in depth we will get to do that I believe in the next video but let’s just go and create an if statement essentially when you have an if statement like this with the if keyword whatever is inside the parentheses has to be true in order for the code inside the curly brackets to run but let’s go and create a couple of variables here just to to talk a bit about a comparison operator so let’s say we have variable a and variable a has a piece of data assigned to it which is two and I can also go ahead and say we have something called a variable B which is going to have something like four assigned to it now what I can do is I can go inside my parentheses here and I can say is variable a equal to variable B what you’ll notice is that I’m actually using two equal signs here so I’m not using one because this means that we’re assigning something to variable a so a is going to be equal or be assigned variable B um and that’s not the same thing as doing two equal signs when you do it like this you basically checking if two pieces of data are the same and we’re not really checking for data types here we’re just checking if they’re the same what I mean by that is if I were to actually let’s go and output something so let’s say if this is true then Echo out this statement is true just to Echo something out inside the browser so if we were to do this and go back inside Firefox here refresh it you can see we get nothing so far and that’s because of course these are not equal to each other two is not equal to four but let’s say I went down and changed this to two and went back inside my browser now they’re going to be equal to each other right cuz two is equal to two however if I go back in here and say what if variable B is not a number but let’s say this is a string like it’s still two but now it turned into a string so is this going to be equal to each other what is your guess cuz we’re going to go in and find out now it is still going to be true and that is because we’re not checking for data types in this case however if I go back down to the equal signs and write a third equal sign now we’re checking for if they’re true and if they’re the same data type so we’re taking for two things now so if we go back inside the browser refresh it here you can now see oh it’s not outputting anything and that’s because it’s not true because this right here is a string data type again we can go and remove this just to test this go back inside the browser and now it is going to be true so two equal signs means that we’re comparing two pieces of data and three means they we’re comparing two pieces of data but also if they’re the same data type with that said let’s go and go back to the first one so two equal signs means we’re just checking if they’re equal to each other right what I can also do is I can replace one of the equal signs or the first equal sign I should say with a exclamation mark if I do this then I’m checking if they’re not true so right now because 2 is equal to 2 this condition down here is actually going to turn out false so if I were to save this go back inside the browser you can see that we’re not going to get anything but if I were to go back inside my code and make this four again then they’re not equal to each other which means that this condition is going to be true so if we were to go back in refresh it you can now see that we’re going to get this statement is true and with that we do of course also have three equal signs we replace the first one with a exclamation mark so this is going to check if they’re not the same data type or if they’re not the same number and we can also do other things and just comparing if they’re equal to each other we can also go in and say what if one should be lesser than the other numbers so right now we’re checking is a lesser than b which in this case is going to be true so if we go back in you can see that we actually output this statement is true but if we were to change this one to a five so we have you know is five lesser than four this is going to be false so we were to go back in you can see we don’t output anything and just like you learned in school we can also take for other things so not just lesser them but also greater than or we can also check for lesser than and equal to the other piece of data so in this case here if 4 is equal to four then this is going to be true right cuz it’s lesser than or equal to B so we would to go back in refresh it you can see we get an output and just to show one last thing there is also another way of writing this right here so is not equal to each other we can also write like this which does the exact same thing we’re just checking if they’re not equal to each other and we’re not really caring about data type in most cases just to mention it I do this one it’s just the way that I think is easier for me to make it make sense so this is the one that I use and with these this is a perfect time to talk a bit about something called logical operators because logical operators whenever we go inside a if statement like this one down here let’s say right now I’m checking is a equal to B which in this case is going to be true because 4 is equal to 4 so if we were to go back in and actually refresh you can see that we get this statement is true now let’s say I want to check for more than just one condition what you could do is you could copy paste a condition and put it inside another condition and now all of a sudden we start doing something called nesting nesting is something that most people frown upon because it starts creating very messy code I personally have done it in the past and I I regret doing it because it looks extremely messy but essentially you want to try and avoid having as many conditions inside other conditions as you can like in some cases you can’t avoid it but of course you know if you can then you should try not to and one way we can do that is by going inside the original condition here and say okay so what if I want to check for something else as well let’s say I have another pair of variables and this one is going to be C and this one is going to be D and this one is going to be two and this one is going to be six what I can do is I can go inside my condition here and say I want to check if this condition is true so is a equal to B which right now is true right so we output something inside the browser but I also want to check is c equal to D so what I can do is I can write and is variable C equal to variable D so right now we’re checking for two different things so the first condition has to be true but also because we wrote and the second condition also has to be true so both of these have to be true whenever we use and so would to go and do this go back inside the browser refresh it you can see oh we don’t get any sort of output because one of them is not true but let’s say instead I don’t want to check if they’re both true but I instead just want to check that one of them is true what I can do instead is I can write something called or so if I write or we’re basically saying this has to be true or this has to be true and if one of them is true then I’ll put something inside the browser so in this sort of way you can use logical operators in order to you know perform multiple conditions or multiple pieces of logic inside the same condition and it is possible to chain as many of these behind each other as you want so you can also go ahead and say we want to check for a and and then we can check is variable a equal to variable C then we can also do that and we can change as many of these behind each other as we want I do want to mention something here though which is something you will see in most cases when it comes to people doing programming which is that people don’t really write or or and uh because we do have another way of writing these and even though this may not make sense to a lot of people why we choose to do this instead um that’s just kind of like how people do it instead of writing or what you can instead do is write two pipe symbols and this means the exact same thing as writing or and instead of writing and we can use two ENT symbols and these two mean the exact same thing as or or and now the pipe symbol one is is the reason why I think this is going to be a little bit annoying for most people because the pipe symbol is not really the easiest thing to figure out where is on your keyboard I’m using a ntic keyboard which means my layout is going to be different for Americans or other people around the world but this is called a pipe symbol so pipe as in PIP PE pipe this right here so my best suggestion is to Google this to figure out where it is on your keyboard layout if you want to figure out where it is in my case I have to hold down alt and then the button right behind my backspace button and that is going to create my pipe symbol but now let’s talk about something here because right now I just chained three of these together but how exactly do U operator procedence function when it comes to this just like when we talked about the parentheses around you know when we were doing math uh we could determine what was going to be happening first but in this case here what is happening first are we going to be running these two first because we’re checking that one of these has to be true or we running these two first and then running the other one like what exactly is going on here when we use a Ampersand or a pipe symbol if I were to save this go back inside my browser you’ll notice that we get this statement is true which means that right now if I were to go and check this this statement is true but none of these are going to be true which means that we’re going to take the pipe symbol and this is where the divider is so essentially we’re splitting apart these condition checks and we’re saying Okay so this over here has to be compared first which which means that both of these have to be true but in this case none of them are so this is going to fail right but then we do also have a pipe symbol that says well okay so even if this fails we still also have this other side to check for and if this one is true then we’re still going to print something out inside the browser so in this case here as you can see we printed out this statement is true because the pipe symbol is going to be the divider that checks with these different conditions here so the pipe symbol is going to be the last determiner of what exactly is true inside this condition check here but now we do also have one last one that I want to talk about which is called incrementing and decrementing operators and these are essentially a way for us to do something inside Loops most of the time we can use them outside Loops if you want to um I can actually demonstrate this so if I were to go ahead and say variable a is going to be equal to 1 if I then go below here I can also Echo out variable a just so we can see EX exactly what this looks like inside the browser and then you can see we get one because variable a is equal to one however we do have something called a increment which means that I can go ahead and say variable a and add a Plus+ in front of it which means that we’re adding one to variable a which means that if we were to go inside the browser we now get two so a increment is basically just a way for us to add one to a piece of data and I can also go ahead and do a minus minus and this case we’re going to subtract one so we want to go back inside the browser you can see that we’re going to get zero however we do also have something called variable A++ which is a little bit different because basically the order of when we add one to this variable here is going to be changed so in this case here when we had Plus+ we say that we add one to variable a and then we Echo it out whereas if we were to go ahead and do plus plus after variable a we want to say that we want to Echo out variable a and then we want to add one to it so we would have go and do this what do you think we’re going to get inside the browser we’re going to get one so even though inside our code this is going to be two we don’t actually Echo out two because we’re adding one to it after we output it inside the browser so it would to go below here and actually say Echo and say I want to Echo variable a one more time then the second Echo is actually going to be two and the same thing goes for minus minus of course we can also say minus minus and then we’re going to Output a which is going to be equal to one and then we’re going to subtract one to it which means that the second time we Echo it out it is going to be zero so want to go back inside the browser and do this you can see we get one and zero and why does this matter you might be asking well in some cases when we start talking about loops inside programming and Loops is something that we will get to talk about a little bit in the future but essentially a loop is a way for us to Output the same code multiple times inside the browser as long as a certain condition is still true so let’s say I want to Loop out something until a certain number is lesser than 10 then we’re going to add one to the number that we’re checking for every single Loop and then when we get to 10 then it’s going to stop looping because now the number is not lesser than 10 anymore again this may be a little bit confusing because we haven’t talked about loops yet so don’t worry too much about it if you don’t quite understand what I’m talking about here I just want you to know that we have something called plus plus and minus minus so if you want to add a number or subtract a number you can do it by writing plus plus or minus minus so with that said I hope you enjoyed this lesson here we will get to talk a bit about conditions in the next video which is something we have touched upon in this video here and in some of the previous ones with the if statement you go in you check for a condition and then you output something if that condition is true but there’s a little bit more when it comes to condition so we’ll get to talk about that in the next video so hope you enjoyed and I’ll see you in the next one [Music] today we’re going to learn about something called control structures inside PHP and a control structure is essentially a way for us to navigate the code in different directions so if we want something specific to happen depending on something else then we can leave the code elsewhere and do something else if that makes sense we have many different types of control structures we have conditions which we’re going to talk about today we have switches we have a new thing in PHP 8 called a match we do also have include so we can include other files into our code and then we do also have something called Loops inside our code to Output code multiple times inside our browsers so there’s many different kinds of control structures and we’re going to talk about a few of them today we’re not going to talk about all of them since there is a lot to talk about um but we will get to more of them as we continue this course here but for now we’re going to focus on something called a Edition a switch and we’re going to talk about the new match thing that we just got inside PHP 8 so now we have talked a bit about a if statement before because we have used it a couple of times up until now in the previous video so essentially what you do is inside your PHP code you go inside and create a if statement and inside this if statement we can write a condition inside the parentheses to only run the code inside the curly brackets here if that condition is true so it’s important to point out here that we’re not talking talking about if the result inside the condition returns as true but if the condition is true so if I were to go inside and say that we have a bullan let’s create a variable up here I’m just going to call it Bull and I’m going to set this one equal to true so we’re not actually checking what is assigned to this Boolean up here so if I were to go in and actually copy this and paste it in we’re not actually checking if it is returning as true I mean right now we are so this is actually going to run the code but we can also go in and check if it’s not true this is actually also a operator that we forgot to talk about in the previous video but essentially I’m going in and I’m checking if this statement is not true then I want to run the code inside the curly brackets so we’re not checking if this value up here is true we’re checking if the condition is true okay whatever we’re checking for has to be true I just want to make sure people are not confused about that so with that said uh what we can do is we can actually go in and we can create a variable so I’m going to create a variable called a I’m going to set this this one equal to one and then I’m going to create another variable and I’m going to set this one equal to four so what I can do inside my condition down here is I can go in and use one of the operators that we talked about in the previous episode where we actually compare some of these different data so I can go in and say you know what I want to check for variable a and see if it’s lesser than variable B so in this case I can go in say is variable a less than variable B if so then Echo out first condition is true so in this case if I were to go back inside my browser refresh it you can see we get first condition is true because it is in fact true one is less than four but let’s say I want to check for multiple conditions inside one check here let’s say there’s two things that needs to be true what I could do is I could go inside my if condition here and just copy paste another if condition and then we would say Okay first we check for this thing if that is true then we go inside the statement and then we check for this thing and then we output something else that is one way to do it but we do something what is called nesting which is not really looked upon that fondly when it comes to programming uh since this creates a very weird spaghetti um messy code and that’s not really what we want to do when we’re doing programming we want everything to be very neat and tidy so instead what we can do is we can go outside and we can use one of the operators that we talked about in the previous episode so I can go inside my if condition here and say you know what I also want to check for something else so if a is lesser than b and our Boolean is true then run the code inside the condition here so in this case it is going to run because our Boolean is set true up here and just remember just like before I can also check if my Boolean is false by going in and adding the exclamation mark to say I want to check for the opposite it is also possible to do something else which is to go in here and say is our Boolean equal to false or as it is right now if I want to check if this Boolean is true then we can also just say is it true and then this would also work but it’s just kind of a habit for programmers to you know look a little bit more professional and actually check for a Boolean if it’s true or if it’s equal to false so using the exclamation mark here is something you should get used to I think because it is just a shorter way to write things and it makes you a look a bit more professional now in this case it’s not actually going to run this condition because our Boolean is true and I’m checking if it’s false so let’s say I want to check for another thing if this one fails I want to jump down to another condition and check for a second thing what I can do is I can go down below and I can create something called a else if statement and an else if statement basically is just a chain that we chain behind our if statement and says okay so if the first if condition is not met then jump down and check for the next one in the chain list so what I can do down here I can actually go and say you know what let’s go and check for the same thing but this time I want to check if our Boolean is equal to true so in this case here we would actually output something else now don’t get too confused about my code jumping back up behind each other because you can write it like this or you can write it like this it doesn’t really matter but because of my plugins inside my my little text editor here uh it automatically jumps back when I save so don’t get too confused about that it’s a way for the text editor to tell us that this belongs together this is a chain so therefore it jump spec behind it which I think is a bit weird but that’s just kind of how my plugin works so what I’ll do is I’ll go inside side and I’ll copy paste my echo and I’ll say the second condition is true because this one would actually be true then so we were to save this go inside my browser you can see that now we get our second condition is true and when it comes to a else if statement I just want to point out that you can write it like this in two words or you can combine it into one word and this would do the exact same thing it is kind of a habit for PHP programmers to have it in one word but in pretty much every other language out there we we split it into two words so the way I prefer to do it is using two words as well so now when it comes to adding these extra conditions behind the first if statement whenever we want to add more we just simply go in and add another else if statement so we can just continue just pasting and pasting as many as we want to create this huge chain where we check for a new thing and the important thing to note here is that whenever you hit a certain condition and it returns as true so let’s say this second condition up here is actually true then all the other conditions below are not going to run so it’s going to stop right there and it’s just going to Output whatever is inside this condition and it’s going to stop everything else from being checked so in this case here where every single one of the conditions are pasted below are actually true it is only going to Output one thing inside the browser because like I said it’s just going to stop the rest from running but now let’s say we want to have a fail save what if all of these fails to get run inside the browser because all the conditions are actually false what we can do is we can add a default Behavior so if a to go below here I can add a else statement without parenthesis and then I can write some code inside of here so we can copy paste paste the echo in and say none of the conditions were true so we can actually do this last effort here in order to say that something has to be output even if none of these are actually returning as true so let’s go inside all of the elive statements and just add a exclamation mark just to kind of say that you know what all of these are going to you know essentially be false so we’re going to save this go inside the browser refresh it and then you can see none of the conditions were true right now it says None of the condition were true which is not right it’s not plural there we go but you kind of get the idea here so what I’ll do is I’ll actually go ahead and decrease these cuz these are a lot of else if statements I’m just going to go and do this let’s just go and change this one so it doesn’t you know fail so we have the second one is actually succeeding so again if I were to save this go inside the browser we now get the second condition is true so with this we now talked about these if else if else statements however we do also have something called a switch inside PHP now a switch is a little bit different I do tend to see a lot of people are confused about when you use a switch compared to using IF else if else statements because they kind of do a little bit of the same thing on the Surfers uh but let’s go and create a switch and then we’ll talk about uh how they’re different and when you should use one or the other so in this case here I’ll create a switch which is using the switch keyword parenthesis and curly brackets now inside the parentheses we want to include whatever data we want to check for so in this case here let’s just go ahead and check for variable a so I’ll paste it inside the condition here and inside the actual switch curly brackets we’re going to write a bunch of cases which is kind of the same thing as taking for all these if else if else statements down here so I’m going to go and write a case and then I’m going to say what should the value be of variable a and if that is the value then we’ll run this block of code here so I’m going to write the case keyword and then right after we have to tell it what we’re checking for so if variable a is equal to something specific then run the code inside this case here so in this case I’ll check if a is equal to one it’s important to note we’re not writing case one so like this is the first case and then the second one has to be case number two and and so on we’re checking for the actual value inside this case here so if this were to be a string let’s say we had Daniel in here then I could ALS be checking for a string called Daniel in this case here so what I’ll do is I’ll just go back so we had the number here and inside the case number one let’s go ahead and create a colon and then say whatever code is in here we’re going to run if a is equal to 1 so I could for example Echo out um the first case is correct and you can write as much code as you want in here so we can also write more code down here below if you want to do that and just keep writing code um um but the important thing is that once you’re done writing the code that you need to actually get run if that case is equal to one is that you can go down below and add a break to tell it that now we’re done this is the break point of the first case so all the code in between the break and the case up there so everything in between here is going to get run if this is equal to one and we can of course add more of these so we can just go below here and say you know we have a second case and now I want to check if the number is three for example then we can go inside and say this second case is correct and just like with else if statements down here we just keep pasting more cases behind it and check for different values right after the case keyword here until we get something that is correct but let’s say we run into a scenario where none of these are correct just like we did below here let’s say we you know we don’t have this lse statement uh but none of these conditions are true but we want to run some default code if none of them are actually correct what I can also do inside the switch statement is I can go down and I can write default and then I can include some code below here so we can actually Echo out something else so we can actually say none of the conditions were true we just copy paste it up here and this will be what gets echoed out if none of the cases above are actually going to return as true and now some of you may be asking okay so when do we use a switch compared to using a you know bunch of if statements because they’re pretty much doing the same thing right the difference here is that inside a switch statement we’re checking for the value of a certain you know piece of data so in this case here variable a whereas inside a if condition we can actually check for multiple things so we’re checking is a lesser than b and is Boolean equal to fult so we can change it and then even in the next else if statement we can check for something completely different whereas inside a switch statement we’re checking for one thing in all the different cases down here so if you want to check for one specific value and then depending on that value you want to run a different set of code then you can use a switch statement but if you want to run different types of conditions that checks with different things then you can use a if else if else statement and just to show you what exactly is going on here because right now let’s say I want to go in here and I want to check for the number two and then I want to also write another case here and I want to check for the number three what we can do let’s say third just to have everything being correct what I can do is I can actually recreate this condition down here to show you exactly what is going on with the switch up here so if you were to go down here you could say is variable a equal to one that is essentially the exact same thing as this first case up here so if I were to go down to the elsf statement I can now check is variable a equal to 2 then I can add another one behind it so we can actually check for the next one which is is variable a equal to three so just to kind of show this is what the switch is doing it it’s comparing the same data to different sets of results let’s go ahead and comment out the switch and also the if conditions down here and let’s go above the switch and create create a match now A match is a little bit different from a switch because inside a switch here we just basically have a block of code that deviates into different directions depending on a certain results so if variable a is equal to something specific then we run a different piece of code however when it comes to a match we actually have a variable so we can call this one results and then we set it equal to our match keyword parentheses and curly brackets now because this one is a little bit different than a switch state or a if else if else condition we do want to add a semicolon at the end here because this is the exact same thing as creating a variable to we call this one result and then we set it equal to some piece of data and then in this case here we would actually add a semicolon behind it so this should have a semicolon behind it too because it’s the exact same thing as going in here and then creating curly brackets because we still need to have that semicolon so with that semicolon what we can do is we can go in and say you know we’re going to check for a certain thing so if variable a is equal to something specific then we want to return a value into our variable result depending on variable a so I can go in here and I can say you know what if variable a is equal to one then we can go ahead and assign a value which is going to be variable a is equal to 1 and in this case here we’re not actually going to add a semicolon we’re actually going to add a comma because we’re creating a small list of items here uh so what I can do is I can copy paste this below and then I can say if the data is equal to two then I can assign the data called variable a is equal to 2 so in this sort of way we’re just adding a different piece of data to a variable depending on what the result is now it is important to note here as well that the last condition you’re checking for in here should have a comma behind it this is how it’s supposed to be done so you do want to make sure that is that comma behind every single condition so don’t go down here and add a third condition and then delete the comma because this is the last statement uh just go ahead and make sure you have a comma behind all of them I do also want to mention here that you can check for multiple pieces of data inside the same condition here so you can actually go in and say okay so if variable a is equal to 1 or it is equal to three or it is equal to 5 then I want to insert variable a is equal to 1 inside variable result so using a comma when we want to tell it what we’re checking for here then we can separate different conditions and then output the same data inside variable results so just to Output this inside the browser let’s go and go below here and Echo out variable result because in order to actually get something inside the browser we do need to Echo it so doing this and going back inside the browser you can now see that we get variable a is equal to one another thing that’s important to note here is that we’re doing a more strict comparison type when we do any sort of comparisons inside this match statement here what I mean by that is we’re actually taking for types as well so if I were to to check for variable a being 1 3 or five but variable a is equal to a string that is equal to one then this is not going to return the actual data in here so if we were to save this and go inside the browser you can see we get a error message that says uncut unhandled match error which is the default error message you’re going to get if none of the actual checks in there is returned as any sort of data and just to mention it here for the people who do need to see it it’s the same thing as going inside a condition and then checking for variable a being equal to one but we use two equal signs so this is a very loose comparison so if variable a is equal to one or a string called one then it doesn’t matter but if we use three equal signs then it’s going to be a strict comparison type which means we also need this to be the same data type but now you can also do a default output inside a met statement so if you want to do the same thing as inside the switch down here where we have a default or with the else statement inside the if conditions down here then we can do the same thing when it comes to a met statement by simply going in and writing default and then point to some kind of value so we can go ah and say want to point to a string and say none were a match so now we have something default in case none of these are actually true so right now because variable a is equal to a string which is call one then none of these are actually going to be true but we’re still going to get an output inside the browser because we have a default return and again now the big question is when do we use a match versus a switch versus a if condition it really depends on what exactly the purpose is of your code so if right here you want to have a piece of data assigned to a variable but you want to have a different result based on something else inside your code then you can do that very easily using a match statement so instead of having to do a switch statement down here where we assign a piece of data to a variable we created up here which is going to be a lot more code than simply doing this then you can use a match instead but if you just want your code to Branch out depending on One Piece data then you can do that using a switch statement just based on the value of one variable inside your code but if you want to do different kinds of checks where you want to switch it up every single condition you’re doing inside this chain then you can use a if else if else statement down here in order to do different kinds of checks inside your code so it’s just kind of nice to have different types of tools inside PHP to do different things that is somewhat the same thing you want to do but slightly different and of course just like with all the other episodes this is quite a lot of information so we will get to do more practical examples with this in the future and with that said I do also want to mention here that in the next video we’re going to learn how to build a calculator together using PHP so we’re going to have an actual calculator inside our website you know using HTML and CSS we can type numbers into it then you can submit it and then you can get some sort of calculation out of it so we’re actually going to build something using what we learned up until now which is going to be quite exciting cuz now we can see how we can use PHP to actually do things inside a website up until until now youve just kind of been Gathering puzzle pieces but you haven’t actually learned how to put them all together to build something so that is going to be quite exciting uh so with that said I hope you enjoyed this video and I’ll see you in the next [Music] [Music] one so now we finally came to the point where we have to start learning how to create something using PHP since we’ve learned a lot of things about until now but we haven’t really learned how to put all those things together and actually create something using PHP the exercise we’re going to be doing today is to build a calculator inside the browser so we can actually go in and type into numbers and then we can perform some kind of operation on those numbers so we can multiply plus minus divide those kind of things uh so we can actually do something so as you can see in front of me here I have a basic index to PHP file that doesn’t really do that much it’s just kind of like a basic setup so we have something inside the browser I do have have two different style sheets inside my project here I do have a reset. CSS and I do also have a main. CSS file Now using these two different stylesheets is not something that should be new to anyone in here because a reset stylesheet is something you should know about already and using a regular style sheet for styling HTML things inside the browser is also something you should know by now if you don’t know how to do CSS there is of course a HTML and CSS tutorial on my channel but you shouldn’t need it at this point but it’s there if you do need it I do want to point something out about the CSS though because I have been told by my subscribers over and over again not to include CSS inside my videos because they’re just taking up space so if you want access to my personal files for these lessons here for example for these CSS files then I do have them available to all the different YouTube members and patrons so you can just go ahead and click the link in the description if you want to become part of that with that said I should also say something else which I shouldn’t really have to say but I I still got to say it because I keep keep getting questions about it CSS has no effects on your PSP code you can make the calculator in however way you want using CSS and it’s going to work the exact same way as my calculator with my CSS in here if you get any sort of errors in this video it is not because of the CSS okay just so it’s said so with that out of the way let’s go ahe and talk a bit about how to actually create a calculator so right now we have this basic front page and what we want to do in here at least what I want to do with this exercise is I want to build a calculator and have it run inside the same page because typically the way we do things is that whenever we want to have any sort of input from a user we use a HTML form so we can actually create that now to begin with so if I go inside my body tag here I’m going to create a form just a basic form it doesn’t have to be fancy and inside this form you need to have a action attribute and we do also need to have a method since we do need to submit this data and tell it how we want to submit this data should it be a get method or a post method now a get method will actually show the data inside the URL when we send this data because when we send data using forms we use the URL in order to do so but using a post method would actually hide the data so we can’t see it inside the URL and for this exercise here we’re going to go and use a get method just to begin with here because I do want to demonstrate something once we get a little bit further so if I were to go in and actually say I want to use a get method which means we can see the data inside the URL and then go inside the action here now when I submit this form I want to stay on the same page because typically when we submit the data we send the data to another PHP file and then we have that file handle the data and do things to it and then we go back to the front page with some kind of results however in this video I want to just stay on the same page I want to calculate things inside this same page and just show the data inside the same page here so the way we’re going to do that is we can either leave this action empty or we can go in and include something called a server super Global that points to the same page that we’re on right now one of the benefits to doing it this way is if I were to go in and say I want to open up my phsp tags because we do need to add phsp in order to add a server super Global is I can go in here and I can say I want to reference to Dollar signore server and then inside the brackets I want to reference to PHP self and of course a semicolon so when when we do this it is going to send the data to the same page that we’re on right now so we can do something with the data inside this page here now it is important to note that whenever you want to have anything shown inside the browser using PHP you want to make sure you escape it using HTML special characters otherwise you can have users that inject code inside your browser which is not very good always think security when it comes to PSP so inside of here we’re going to go to Echo and we’re going to Echo out HTML special characters or just CS with an S behind it parenthesis and then I want to grab the server super Global and paste it inside the parentheses and I don’t want to paste in the semicolon it has to be outside the the parentheses so we have it like this right here uh so doing this is going to escape our server super Global so users can’t accidentally accidentally people will UNP purpose try to hurt your website using this particular action here if you don’t sanitize the output of your code there’s a couple of different ways you can sanitize data and it really depends on what purpose it has are you trying to Output HTML into the website so we actually show something inside the website or are you trying to sanitize data submitted by the user then we use something else so there is a couple of different ways we sanitize data using PHP and in this case here because we’re writing HTML that is being output inside the browser we have to use HTML special characters now let’s go ahead and make sure that we have everything just jumping down on a new line because because I want to make sure you can see everything so I don’t have to scroll sideways like this constantly so I’m just going to make sure to wrap everything and I’m going to go and grab the form closing tag and I’m going to move it down and inside the form closing tag we’re going to go and include a input because I want to make sure that the user can actually type in a number that they want to calculate inside this calculator here so this is going to be a number type I’m going to include a name attribute and this one is going to be set to num one and then I do also want to include a placeholder just so the user knows exactly what to type in so we’re going to say we have a placeholder and this one could be number one or just something something that you think makes sense so they know what to type in inside this input the next thing I want to include is not the second number but I want to include the operator so in this case here I could add a select which is a way for us to create a drop down inside a form so I can call this one operator and then I can go inside and delete this ID now just to mention it since this might be something people are not aware of but the name attribute inside all these different input so inside the select we have down here and inside the input we have up here are going to be the name that we have to reference in order to grab this data from the URL after we submit this data here so just so you know exactly why we have the name input In Here Also I did not include a label for all these different inputs technically if you want this to be readable and you know allow screen readers to perfectly understand what this form is you know in order to make usability as good as it can you should add labels in here I talk about that inside my HTML form episode inside my HTML course but in this episode we’re just going to do some basic PHP calculator we’re not going to worry too much about HTML conventions and stuff like that we’re just going to build something using PHP so inside of here inside the select I’m going to add a option and inside this option I’m going to go and give it a value which is going to be add so we can just say we want to add something here so inside the option for the symol we’re going to see inside the browser I’m going to add a plus just so we know that this is plus adding so to speak so what I can do is I can copy paste this down and say I want to add a minus and we can call this one subtract we could also have called the above one addition because that is probably how you should say it then I’ll copy paste it below and I’ll go in and say I want to multiply and we can also say multiply inside our value multiply then I’m going to paste it down and I want to say I want to divide in this case here so divide and we’re going to add a division symbol and then for the last one down here we do also need to make sure the user can type in a second number so we’re just going to copy paste our input from up here so I’m just going to paste it in and I want to rename everything so we have name set to number two and also I want to set the placeholder to number two so now we have everything in terms of input so we just need to add a button in order to be able to submit this inside the browser so I’m going to add a button and just simply going to call this one calculate so now we have everything that we need in order to have a form that can actually submit data so if we were to go inside the browser just so we can see exactly what we have you can now see that I can type in a number so I can type two and then I can say what kind of operation do I want to perform so in this case I could say do I want to plus minus multiply divide so I could say minus and then we can say number one so this would actually end up being one once we calculate but in this case here it’s not going to do anything because we don’t actually have any PHP code that does anything inside this thing so that’s going to be the next thing we’re going to worry about like I said in this video here we’re just going to focus on doing everything inside the same page here so below my form I’m going to go and open up my phsp tags because I want to just add in the PHP here and in between these PHP tags the first thing we need to do is we need to actually check did the user actually submit the form data correctly because we don’t want to run any phsp code if the user did not submit the form data correctly so what I’ll do is I’ll include a if condition go in here and say inside the parentheses I want to check for something very specific so in this case I want to check for a super Global called dollar signore server and I want to check for a certain request method so I can say I want to check for a request uncore method which is going to be set equal to a certain method so in this case I want to check for a get method now we will run into a small issue here but just for now let’s just leave this as it is because as a default whenever you load up a page inside the browser it will be as a default set to a get method so this will run the code no matter what which is not what we want we only want to run the code if we actually submitted the form so technically we do need to go in and actually set this to a post method and then up here we do also need to make sure when we submit the data we submit it as a post method so go ahead and change these but don’t refresh the browser because I had a point in including a get method and that is simply that if we were to go inside the URL inside the browser you can actually see because I did actually try to click calculate one time before we changed all of this so using a get method you can see we get all this data inside the URL so we get number one is equal to two and operator is equal to subtract and number two is equal to one so we do get a bunch of data inside the URL and this is my point about how we submit data pass it into the URL so we can grab it again and then do something with it however when we use a post method we actually don’t see the data inside the URL even though we do submit it so if I were to go back in here and actually resubmit everything so we want to make sure we save everything inside the index file go back inside and refresh the browser now if we were to go in and type one and let’s just say 1+ one calculate you can now see that we don’t have any sort of data inside the URL we only have index.php but there’s nothing behind it so the data is still there we just don’t see it so the next thing we need to do inside the PHP code after checking for a post submit is that we need to go in and actually grab the data so we can use it for something inside our code so the way we do that is by going in and say you want to create a variable I’m just going to call this one number one going to set it equal to Dollar signore poost brackets and then I want to grab the name of the input that we included inside the HTML form so in this case here the first number was called num one because if it were to go up here you can actually see that’s what we included inside the name attribute so going back down we can include the num one so we actually grab it however even though this is bare minimum for grabbing data from inside a post or a get method so if it had to be a get method we would actually do this instead however this is not seen as being secure let’s pretend that right now inside your website a user goes inside this form and decide to start typing JavaScript code or SQL for injecting into a database or something then all of a sudden we have a hacker under loose that can destroy our website and database and all that stuff inject malicious code into your site and we don’t want that to happen you should always sanitize data whenever you have any sort of data submitted by the user and this is very important to do you should never trust the users whenever you have anything the user can type something into because they will try to break a website we do have a couple of different ways we can sanitize data either using a filter uncore VAR or a filter uncore input and in this case we’re just going to go and use input since that is specifically meant for either post get or cookies uh whenever it comes to sanitizing data from those particular sources so instead of grabbing the data like this instead I’m going to use filter underscore input parenthesis and then inside the parentheses we need to include some data so in this case I need to tell it what kind of data are we trying to sanitize here in this case here we’re trying to sanitize a post method so I’m going to say we have a input uncore post then I need to feed it the actual name of the post method that I’m trying to sanitize so in this case here it is called num one we do need to make sure this is inside a string by the way and then we need to tell it how we want to sanitize it like what kind of method do we want to sanitize it with in this case here I want to make sure we sanitize a float because when you go inside this calculator here you can go in and type a float number so you can write a decimal point uh so what I’ll do is I’ll go in here and tell it that we have a filter underscore sanitize you can actually see we get a bunch of options popping up here the one I’m looking for is sanitize _ float so that’s the one I’m going to paste in here so just to show it here if I were to zoom out it is going to look like this on one line okay it might be a little bit small for you to see but this is how it’s going to look like so the next thing I’m going to do is I’m going to grab the second number so I’m going to copy everything here and paste it below and the first thing I’m going to do is change the variable name so now we’re grabbing the second number and then I want to go and grab the number that had a num two set to the name attribute inside the form now when it comes to the next one here which is the operator we do actually need to do things slightly different because if I were to go in here and actually say I want to grab the operator so we can say we have a operator name that we want to grab if I were to go in and actually say I want to sanitize a string because this is actually a string data type that we’re submitting with the plus minus multiply divide icons here uh it is actually giving us a small error message it is saying that filter sanitized string is depreciated which means that it is no longer recommended that you use it inside your code and this is actually something new that came with PHP 8 because if you were to go inside the documentation inside php’s website you can actually see that they don’t recommend that you use this anymore because there’s a little bit confusion about exactly what you’re trying to do with this method here so instead they do actually recommend that you used HTML special characters instead of using this particular filter input here so if I were to go in I can actually go and just delete everything and say I have this HTML special characters and then I want to go in and actually just grab the post super Global and reference to the operator name and simply do this of course we do also need to change the variable name so we want to make sure we say Operator just to make sure this is also uh changed I know this looks quite confusing in like multiple lines like this but if I were to zoom out you can see this is like how it would look like when when it’s not looking messy and confusing so now that we grabb the data and sanitized it the next thing we need to do is we need to run something called error handlers because error handlers is a way for us to go in and actually try to prevent the user from doing things they’re not supposed to let’s say for example I go inside the browser here and leave one of these inputs empty so I go down and I leave the first one empty and I try to submit this then you can see oh it got submitted but we don’t want that to happen because then that means that things are going to go wrong there’s nothing to calculate in here so what we need to do here is make sure that the user has to type something in into both of these inputs here and I can already feel people typing comments now because some people will tell me that Daniel you can just go inside the form inputs and add the required attribute then people cannot submit the form so let’s go and do that let’s go inside the first input here and let’s add a required attribute at the end here and let’s go and do that for the second one as well so we’re going to go down to number two and we’ll also going to paste it in down there so now technically we cannot go inside this form and submit it without typing something right so if we were to go inside the browser refresh it just go ahead and say yes to continue the submission and if I were to try and submit this without typing anything oh we get this little popup it says please fill out this field and clearly no matter how many times I click it it is not going to submit so this is security right we are now preventing people from submitting I clearly have a point here in case you couldn’t tell um so if I were to go inside the browser and you just know a little bit about browsers what you can do is you can right click inside the input inspect go inside this little developer tool go in and actually delete the required attributes so I can actually go and delete this one and I can also go in and delete the second one so I’m just going to click enter close it down and now I can actually submit it so this is not going to be a valid way of trying to not submit the form without filling in inputs always use PHP for security don’t do any sort of security with front-end languages like HTML CSS or JavaScript in the case of JavaScript you can do it if you’re using it as a server side language but don’t do it if it’s a front-end language okay always do security using a server language so what I’m going to do is I’m going to go back down to my code and I want to start including some error handlers we can actually write a comment here just so we know exactly what we’re doing so I’m going to go and type error handlers so I know exactly what this code does we can also copy this comment here go above and say grab data so we know exactly what this does here so let’s go and add from inputs just to be precise now when it comes to error handlers we can pretty much come up with as many things as we want so for example I could say I want to check for empty inputs because that should not be allowed I could also check for a maximum number of decimal points or if they didn’t type in a number but instead typed in a letter on the keyboard so we can check for many different things the first thing we’re going to do inside this ER Handler here create a Boolean because I want to actually have a Boolean that tells me is there any errors happening inside my error handlers here so what I can do is I can say we have a Boolean called errors and I’m going to set this one equal to false because right now there’s no errors happening inside this code here so for now it is just going to stay as false but if we were to go down and say you know what let’s go and check if the user left any inputs empty what I can do is I can run a if condition and in inside this condition here I can say I’m going to use a function built into PHP called empty and basically what this one does is that allow for me to paste in a variable so for example number one and it is going to tell me whether or not this variable has no data inside of it so right now if the user did actually submit something inside number one so they type something inside the first input here then it will actually have data inside of it but if they left it empty then it’s not going to have any sort of data so if this one is empty or because we learned about this operator in the previous episode if number two is also empty or because we have a third thing from the user which is our operator so I also want to check if the operator is empty then run some error code inside the curly brackets the first thing I want to do is I want to Output a message inside the browser so I want to actually paste in this little piece of text that I have here so just a basic Echo where we Echo out a string which is going to be a piece of text called fill in all fields and then I simply wrapped some paragraph tags around it the paragraph tags are only there because I wanted to style my error message inside the browser so it actually turned red so people could actually see it but you can style this in however way you want to inser your CSS file after doing this I want to go down to next line and I want to make sure that we now set our errors equal to true because now we do actually have an error so this should be true and this is basically all we have to do right here so what I can do now is I can check for a second error message the second one we’re going to check for here is going to be whether or not the number submitted is actually a number or is it a letter because if someone were to go in here right now you can oh I actually managed to again this kind of proves that even though you go inside your form up here and you say that oh it has to be a number sometimes it doesn’t quite work because I can’t type letters in here but clearly I just did so it didn’t quite catch it when I clicked on my keyboard also you can right click inspect go in autofill it with a you know a value or something again don’t use HTML for security okay it’s not going to be enough I have absolutely no idea why actually type something in here but it proves my point so I’m kind of happy it happened so what I’ll do is I’ll go down and I want to create another if condition so I want to say I have a if condition and inside this condition I want to check for something called is numeric so I can actually go and run a build-in function called is numeric and then I’m just going to go and paste in our number one then I want to include a or and then I also want to check for number two remember we’re only checking numbers right now so we don’t need to have the operator included in here but something else we do also need to pay attention to here is that right now I’m checking are these numbers and if so then run a error message and that’s not really what we’re trying to check for here we want to check if the these are not numbers right so either I can go in and say is this equal to false then do something or we can do it the professional way and go in and just write a exclamation mark in front of is numeric because this is checking is this false and the same thing of course we need to do to the second one over here so right now if these are not numbers then run a error message inside this condition here so I’ll just go and copy paste what we have up here and I’ll change the message so instead of fill in all Fields I’ll instead say only write numbers and paste that in instead at this point here you can include as many error handles as you want to have inside your code I’m just going to go and leave this for now otherwise this is going to be a very long episode so let’s just go and include these two error handlers here and say that’s that’s okay for now so after checking for errors I want to go down and I’m going to create another comment and I want to say calculate the numbers if no errors then what I want to do is I want to run a if condition and I want to go in and say if there were no errors then run this calculation inside the curly brackets so the way we do that is Again by checking if errors up here is equal to false because if it’s equal to false then it means we had no errors because we didn’t change it further down so now we actually want to run the calculation so if errors is equal to false by adding the exclamation mark in front of it after doing this we want to go inside the curly brackets and we want to actually check what kind of operation we need to do here did the user want to plus or minus or multiply or divide we don’t really know so we need to run a switch statement in order to determine what exactly they submitted so going in here we can create a switch say we want to add a pair of parentheses curly brackets and inside the switch condition I’m going to go and say we want to include the operator because the operator is going to decide what exactly we’re doing with these numbers here so I’m going to paste it in because that is the one I’m looking for and inside we’re going to go and include a couple of different cases so I want to say case number one is going to be if we have a string that is equal to add then we add a colon and then we add a break just for now then in between these two we want to actually add in what is supposed to happen so in this case we want to actually add the two numbers together so what I’ll do is I’ll say that we have a variable called value that we’re creating right now and I want to set this one equal to variable number one plus variable number two semicolon and this right here is going to be the first calculation that we do inside this switch statement so now we just copy paste it because we have a couple more we have three more we need to paste in so we’ll paste in like so and then we’re just going to go and change the cases so right now we have subtract and then we also have multiply and we have divide and just to mention it here these strings here are what we typed in inside the options inside the form so if we were to go up inside the form you can see that these are the ones that we included in here so that’s the one that we actually refer to inside these cases down here now we do also need to make sure we change the operation so this is going to be minus this is going to be multiply and the last one is going to be divide and we do also want to add in a default because if something happens and something goes wrong and we don’t actually have any sort of data inside the operator or something something it could happen something might happen Okay so you have to think about everything here what could go wrong at some point so let’s go and include a default which is going to be an echo and this Echo is simply going to Echo out a error message so I’m just going to copy paste what we have up here paste it in and then I’m just going to say something went wrong something went horribly wrong just to be a little bit dramatic here so now the last thing we need to do in order for this to technically work is to go after the switch statement and actually output the calculation that we just calculated here so what I’ll do is I’ll go below here and say we want to Echo and I want to Echo out a string which is going to be a paragraph because I want to actually have this styled inside my browser so I’m going to close off the paragraph as well then I also want to go in and add a class because I do actually want to style my text inside the browser so I’m going to say I have a class and now something is going to happen and you may have noticed this on the previous Echoes up here because if I were to go in because typically when we have a class that equal to something we need to have double Cotes right how however if I were to do that we’re actually canceling out the surrounding string double quote so we can’t really do that if we were to try and write something in here you can see oh that is not working out it’s actually giving me an error message so something we need to talk about here is the use of single quotes because you can either use a single or a double code for for example creating a string so I can actually go and do this instead so we just use a single quote or we can use a double quote and the same thing goes for HTML you can either use double quotes or you can use single quotes and by using single quotes and mixing it together with double quotes we don’t cancel out the string so to speak so I can actually go inside my class and I can say I have a class name set to celc dash results and in this simple sense we now have something that works okay so we’re not canceling out anything here so inside the I want to Output result is equal to space then I do actually want to add in my value which is right now up here so we have a value variable so what I’m going to do is I’m going to concatenate things so we could actually just so it’s a little bit easier for you to understand go in here and delete the last ending paragraph tag and after the double quote I’m going to concatenate my variable and then again I want to concatenate a string because we need to close off the paragraph so I’ll go ahead and say we have a closing paragraph graph and do something like this so now at this point here this is technically going to work however there is going to be something slightly off about this code here let’s say this switch statement here gets run and the default case down here is the one that is actually being used because something goes wrong and we don’t actually run any of these cases up here what is going to happen is we’re going to get an error message because variable value is never created we don’t actually create it inside the default value down here so we don’t actually have it when we reference to it inside the echo down here so it’s going to Output a error message so what I’m going to do is I’m going to go right before the switch statement and I’m going to declare the variable so we have it no matter what so we don’t get an error message inside the browser and now typically we would be able to just go and declare the variable like I just did here so we just have a variable but we don’t actually assign any sort of data to it however in some cases that is actually going to throw a error message for some people it is not actually going to work it’s going to have a reference error or something so what we want to make sure we do here is we want to actually assign something to it as a default which is going to be zero the reason I’m adding zero is because this is going to be a number or a float that has to be assigned to this value here so this is going to be a float data type that is assigned to Value once we actually start doing those calculations down there we did talk about this in the previous episode where we talked about data types so we create variables that don’t actually have any sort of data assigned to it and the fact that this is not something we should do inside PHP because in some cases it is actually going to throw an error message so we do need to make sure we assign a default value to a variable inside PHP again we can keep adding to this project here but for now this is going to be okay so we just want to declare the variable before the switch and everything should be okay so having saved this let’s actually go and test this out inside the browser so if I were to go inside my browser and type in number one actually we need to refresh everything first so that is important don’t worry about those error messages those are only there because I went into the developer tool previously and deleted the required attribute so don’t worry about those right now all the changes we made to the code will take effect now as we click the next time on the calculate button okay so don’t worry about those error messages right now so going inside I can go in and say 2 + 2 is going to be equal to 4 so it’s working yay but now if I were to go inside the form and try to submit it without having any sort of data typed into let’s say the first one up here then we’re going to get a well first of all please fill out this field but if we were to go in and actually remove the required attributes you can see we’re going to get our error messages so in this kind of way we can create a cool calculator inside our website using all sorts of PHP code that we’ve learned up until now so I can actually go in let’s go and test out multipli so we can say 10 * 2 is going to be 20 so we can do a bunch of different calculations and just kind of like experiment with it and and try out what we just created together here so with that this is how we can build a calculator using PHP I hope you enjoyed this lesson here because this is a stepping stone to learning PHP this is the moment where people are going to go and say oh that’s pretty awesome now we have hope that we can actually learn PHP and do something inside websites with it hey so this is a pretty big moment I think when it comes to learning PHP so with that said I hope you enjoyed and I’ll see you guys in the next video [Music] so back in our data types episode we talked a bit about arrays but we haven’t actually talk specifically about how we can create arrays and change them and what we use them for and how to create different arrays with different types of keys inside of them so there’s a little bit we need to talk about when it comes to array since an array is used very often inside PHP the previous episode where we talked about how to create a calculator where we did a small example together uh could have been done a little bit easier if we did use an array in order to Output error messages inside the browser so arrays is something we have to talk about now an array is a type of data structure that allow for us to store multiple values inside one variable so we can have one variable that is equal to many different types of data so we can easier manage many pieces of data at the same time so let’s be a little bit boring here and create a list of fruits because that is going to be a very good way to kind of show you the example of what I mean when I talk about storing many pieces of dat inside one variable because if I were to go down here and actually create a fruit variable and call it fruit one I can set it equal to a apple now the problem here is that if I want to have another piece of fruit and store that equal to another variable then I would have to go down and copy this down and say we have something called fruit two and set it equal to a pair and doing this is not really a good idea because all of a sudden we have all these different variables that could just have been combined into into one variable and then stor it in there so we could just access that one variable to grab all the different fruits inside my code so let’s say instead of doing all of this I’m going to go and delete back and I say I want to have a fruits variable now I’m going to turn this one into an array and there’s two different ways we can do that either I can go in and say we have an array data type parenthesis and then inside the parentheses I can go in and say I want to add a apple a banana yes that’s how I say banana I think you say banana like that might sound a little bit more correct so I’m going to go and add in a third piece of fruit which is going to be a cherry and now we have all three pieces of data inside one variable here inside an array now there is another way to write this though which is a little bit shorter and in my opinion just a little bit easier to work with so if I were to go down here and copy it I can actually go in and instead of writing array I can wrap this around a pair of square brackets so I can go in here and add these square brackets and just like this we now also have an array and just to make things a little bit easier for you what you can also do if you wanted to is you can actually add this down to multiple lines just to make it a little bit easier for yourself it’s really a personal preference if you want to go inside your code and have everything separated on a separate line or if you want to have one big line with everything inside of it I do also want to mention one more thing here when it comes to this particular way of writing things because you can also add a comma at the end here or inside the other one up here we can add a comma which is called a trailing comma this is something that we weren’t allowed to do before PHP 8 but now the PHP 8 is out we can actually do this if you at some point expect to add more pieces of data behind it so this is not really something where you have to like make sure there’s no come at the end because oh no then it’s going to break things but we can actually leave in a comma if you want to personally I don’t like to add a comma at the end because that’s how I’ve always done it because that’s how we were supposed to do it but just to tell you that you don’t break anything if you have that last comma so now let’s go and delete the top array up here and just worry about having one array inside our code and talk a bit about how we can access this data here when we create an array we have something called a key which is a way for us to access a certain data inside an array as a default the array indexes are actually going to be a integer which means that we can go in and just use a number in order to access a certain piece of data inside the array so what I can do is I can go below here and say I want to Echo out my array called fruits square brackets semicolon and then inside the square brackets I just simply refer to the index that I want to access what I mean by index is that we go inside the array and the first piece of data is going to have an index as zero so we can actually write that over here just so it makes sense for you the second piece of data is going to have an index as one and the third one is going to have an index S2 I do often experience that people have a hard time wrapping their head around starting at zero when they have to to count something when it comes to programming we always start at zero so the first piece of data is not going to be one but it’s going to be zero so let’s say I want to access banana then I would actually go inside the brackets down here and say I want to Echo out fruits with the index of one so where to do that go inside my browser and as you can see I tried to dim it down a little bit so it wasn’t completely white and burned your eyes out um but if we were to refresh the browser you can see we get banana so in this kind of way we can Echo our data from inside an array using a index number now let’s say I also want to go down and actually add another piece of data to this array here what I can do is I can refer to my array so I can go ahead and grab the name of it and anytime we refer to an array we always need to make sure we add the brackets behind it because this means that this variable is an array and I want to assign something to it so we can set it equal to let’s say orange because that is another type of fruit if I were to do this it is going to take the orange and move it behind the array so now we have apple banana cherry and orange behind it and that of course would have an index as three so if we were to go below here and say instead of echoing out down here we’re going to go below and Echo out a index of three and if we were to do that go inside the browser you can now see we get orange and in the same sense we can also go in and say we want to change a certain part of the array so let’s say instead of banana banana banana we can go in and say that okay so we don’t just want to assign the array to something new but I want to go in and replace the index number one with orange so now we’re actually replacing banana with orange so if we were to go down here and say I want to Echo out the index one save this go inside the browser you can now see we’re going to get orange so now we no longer have banana inside the array at least when it comes to below this line of code here in between here by the way we still have banana as being index number one but as soon as we add in this line here anything below is not going to have banana inside the array but now we do also have a way to delete data from inside the array so if I want to remove a piece of data I can go in and use a buil-in function inside PHP which is something we will talk about in a upcoming lesson because build-in functions is something we use all the time we did also use a bunch of build-in functions in the previous video where we talked about how to create a calculator uh but we haven’t talked about buildin functions yet but we will get to it so what I’ll do is I’ll use a build-in function called unset and I’m going to say I want to grab my fruits array and then I want to say I want to remove the index number one so in this case here we still haven’t replaced banana because we took out that line of code so now we no longer have banana inside the array so if I were to actually try to Echo this out inside the browser using the echo down here you can see that we’re going to get a error message because oh undefined array key one because we have no data inside of it but now you could argue that using unset here is not really going to be deleting an index from inside the array because technically we might want to have the Cherry being moved back on index because right now we have an index as zero and as two and index number one has nothing inside of it so if I just want to completely take out banana instead of just deleting it or unsetting it we can actually go in and use another build-in function called array uncore splice which is another function we have that we can use where we go in and give it a couple of parameters so in this case here I’m going to tell it which array are we talking about and in this case we’re talking about fruits then the second parameter is going to be where do we want to start deleting from so again we count using indexes so if I were to go in and say okay so we start at index number zero so I have to refer to index number zero and then from zero and then one forward I want to delete inside this array so we’re going to delete one length ahead which means we’re going to take out banana and doing this and then going inside the browser refreshing you can now see that index number two is going to be Cherry it is important to point out here that we do also use array splice to insert other arrays or other pieces of data in between certain array elements but I’ll talk about that a little bit later at the end of this video here so now that we know a little bit about arrays let’s go and talk about keys because right now we’ve used numbers which might not make a lot of sense if you want to have a specific label for each index inside the array so what I can do is I can go and delete what we have here and instead let’s go and create a array called tasks as in like house chores or something so what I’ll do is I’ll set this one equal to an array and let’s go and move this down to separate lines cuz that is going to look a little bit easier for the eyes here so in this case here let’s go and say I want to add a name so I want to say that Daniel has a certain house chore inside this house here what I can also do is I can add in a second person so we could also say we have freedom I can also add in a third person Bess and I can also go in and add a fourth person so in this case here let’s say Bella so in this particular array here I have a bunch of house chores and each person has a name inside this array because they have to do a certain house chore but how can I assign a certain key not as a number but as a string to each person so I know which person is doing what inside this house so what I can do is I can go inside and create what is called a associative array which is when you have an array that has a bunch of strings as Keys instead of numbers this means that I can go in here and say that I have a chore which is called laundry and I can assign Daniel to this particular key so by creating a string and then pointing to a value we can do it in this sort of way in order to create a different types of key so we can actually go ahead and just copy this down and I’m going to go and change the name for each one of these so the first one is going to be laundry the second one is going to be trash and we do also have a chore called vacuum so we can say vacuum and the last one is going to be dishes so what I can do now is I can actually go down below and Echo out a piece of data from inside this array but instead of using numbers I can go in and say we have an array called tasks and I want to reference to a certain key and let’s say in this case I want to figure out who’s doing laundry inside this house here so I can go ahead and say I want to refer to the laundry which means it’s going to Echo out who’s doing the laundry inside this array so I can go back inside the browser refresh it and you can see we get Daniel so this order of way we can create a associative array and actually have a label for each of the data inside the array so now we talked about how to Output one piece of data from inside all of these arrays but let’s say I just for developer purpose want to know exactly what is inside the entire array just to see if something went wrong inside the website you know just to kind of like double check what exactly is inside a specific array what I can do instead of echo is I can actually go and use something called printor R parentheses simp colon that I can paste in the name of the array that I want to actually print out inside the browser so in this sort of way I can go and save this go inside my browser and then you can see we get a complete list of all the data inside this array and right now because this is a associative array you can actually see we get the key then we set it equal to a value then we get the next key and then we set it equal to another value but had this been a index array using numbers then of course this would have been zero pointing to Daniel and then one one pointing to feta and so on and let’s talk about a few other built-in array functions that we can use now there is a lot of them we can use but I just want to show you some of the more basic ones now we do also have something called count which means that we can actually figure out how many pieces of data is inside an array so we’re going to use count parenthesis and then we’re going to go and paste in the array so I can go in and paste it in and then you can see when I go inside the browser that it’s going to tell me you have four pieces of data inside this array here one users of this particular function could be if we were to grab data from inside a database because when we grab data from a database it gets returned as an array so we can actually use this function here to count if we actually had any sort of data return from the database so that’s one particular usage of using count inside PHP but we do also have other pieces of functions we could use for example if I wanted to sort an array I can do so in a ascending order which means that if I were to take this task array up here and put it inside the parentheses I am now sorting it ascendingly which means that we’re going to take letters like a first and then it’s going to be b c d e and so on which means that it’s going to go in and sort these alphabetically if any of these values had been numbers then of course one would come first or actually zero would come first and then 1 2 3 and so on so we were to do this and go down and say print R to get this array you can see that we’re going to get the array but it’s going to be in a different order now so if we were to save this go inside the browser refresh it you can now see that b is going to come first and then Bella Daniel and then feta and it’s actually going to give it to me as a indexed array not as a associative array then we do also have one called array push and for that one we do actually need to use a nonassociative array so if would have commented this one out and paste in the previous one we did called fruits I can go in and say I want to take my fruits and I want to use a array push and say I want to grab this fruits array put it inside the array push function which means that we’re now pushing a piece of data at the end of the array which means that I can go in add the array that I want to add some data to and then tell it what kind of data I want to add so in this case here I can say mango and of course a semicolon at the end here and then I can actually go and print it out so we can take the fruits array go inside the print R and go inside the browser and then refresh it and then you can see we have mango pushed in at the end here of course this is very similar to just going in and just like we talked about at the very beginning just going in and grabbing the array so we’re going to say fruits we have an array and then I said equal to a new piece of data so this would actually do the same thing in this case here and the reason that’s relevant is because if I were to do the same thing to a associative array so if I were to comment out my fruits array here and instead let’s say we’re talking about the task array up here which is a associative array which means that we have these different indexes which are actually strings if I want to add another piece of data at the end here I can’t use array push because that only works for indexed arrays so would actually have have to go in and use my last method down here so I’m going to go and say I have my array tasks and then inside the brackets I’m going to go and add in a new string which is going to be the key so I can say we have something like dusting which is going to be assigned to a person called Tera so this is how you would push in a new piece of data at the end of a associative array so if I were to actually go down and print out this array here so we can actually just delete what we have up here and say we want to print out tasks inside the browser you can now see that we’re going to get Terra at the end here for the dusting assignments and the last build-in function I want to mention here is one that we have talked about already so if we were to go in and delete everything except for my fruits array because that’s the one we’re going to use in this example here and let’s go ahead and write down the array undor splice that we already used previously so we’re going to say splice and parentheses and semicolon so like we talked about if I wanted to delete a certain piece of data inside this array and I wanted all the other indexes to move back one slot what I could do is I go in and say okay which array are we talking about we’re talking about the fruits array right so I put that in here and then I say from where do you want to delete from so I could say for example I want to delete from index number one and then I want to delete one ahead of it so right now we would actually take out the cherry and then replace it with something else but let’s say I don’t want to delete something but I just want to insert some data in between this array somewhere what I can do is I can say I don’t want to delete anything by writing zero and and then I’m going to go and add the name of another piece of data at the end here so I can say I want to add in a string and I’m just going to go and add in mango just to have it here so if I were to actually print all this inside the browser you can notice that we now have mango in between banana and Cherry so I paste it in actually I’m mistaken here because I’m not actually going to insert it in between banana and Cherry we’re actually inserting it after Apple so in between apple and banana and the reason for that is that we did actually say to start at index number one which is here so all this data is going to get pushed over to leave space for the new data so that’s what we’re doing here uh so if I want to put it in between banana and Cherry we have to write two because we’re now going in saying 0 1 2 and this is where we want to insert the data which means all this data here has to move over in order to make room for it so if we were to save this go inside the browser and refresh it you can see that we now have apple banana mango and Cherry but this is not just when it comes to one piece of data so what I could do do is I could insert an entire array inside another array so I can actually go ahead and say you know what we have another array up here I’m going to go and call this one test or something just rename it something so I’m going to set it equal to a array and I’m going to go and insert some more pieces of data in here so could actually say we have mango and I do also have strawberry and then instead of saying I want to insert mango inside these when I splice them I can actually refer to this array up here and just say I want want to grab this array I want to go into slot number two I don’t want to delete anything from inside the array but I do want to merge test into that array so if we were to save this go inside the browser you can now see that we have many pieces of indexes inside this array here so in this kind of way we can create arrays and manipulate them and change data and replace data and just do all sorts of things when it comes to arrays because arrays is something you will be using quite a lot inside PHP code for all sorts of purposes so learning how to do arrays is something that is very important to do now there is one last thing we could talk about here which is a little bit more complicated than just talking about arrays which is something called multi-dimensional arrays and essentially this means that we have an array that has arrays inside of it so now we’re going Inception here there’s an array inside an array so let’s say I have an array called fruits and I’m just going to go and move everything down to the next line just so we have it a little bit easier to see and let’s say instead of calling this one fruits I’m going to call this one food and then I want to have different food types inside this array here and instead of Apple we can actually go inside and say we have another another array by using the array keyword and then go in and say we might have something like so I can say we have a apple and we also have a mango and in this sort of way we now replace one of the indexes inside the food array with another array which means that if I want to refer to for example apple or mango I need to go down below and I want want to Echo out the food array and say I want to grab a certain index and in this case here I want to grab the index number zero because that is the first slot inside this array so we’re going to say zero but then I need to tell what the index is of the array inside index number zero so I need to go after add in a second pair of brackets and go in and say I want to grab the first index which is index number zero and Echo that one out which is going to be apple I hope that makes sense okay so we’re we’re going to go inside the browser and as you can see we’re going to get apple because we’re grabbing the uh first array inside this array which has Apple a mango inside of it so if I wanted to grab mango I could also go in and say I want to grab the uh first index which is going to be the second piece of data inside this array here so we to do that we now get mango and if we wanted to grab banana then we just going to say we want to grab the first index and don’t add in the second pair of brackets so we can go in and then get banana but now what about associative arrays cuz we can also do that if we wanted to so let’s go and go back to our Apple examples now it’s just a very basic array uh let’s say I want to add in a food group and I want to say this one is going to be fruits and I want to point to a array which has a bunch of data inside of it so I could say fruits is going to be apple I do also want to add in banana and then I want to add in a cherry and then instead of having more fruit down here below we can also go in and just just copy this paste it in below and say we might want to have meat and then we can have something like chicken we can also have fish and then maybe something like sheep just so we have a little bit of data inside of here or just have two pieces of data you can also do that if you want to you don’t have to have three every single time and let’s go and add in a third group of food so in this case if we could for example say vegetables vbl I think that’s how you say it in English you write it out veg but you say it vexes okay I do know the difference uh so what I can do is I can go in here and I can for example say cucumber and let’s go and add in a carrot so in this sort of way we now have a bunch of arrays inside an array so we have a top category called food and then inside of here I can now refer to a type of food so if I want to grab something within the vegetables I can go and add that in then afterwards add another pair of brackets and say I want to Output index number zero which is going to be cucumber so going inside the browser we can now refresh and then you can see we get cucumber and of course you can also go inside this array here and add this as an associative array so if you don’t want cucumber but you want to have something pointing to cucumber you can also do that so you have a associative array within an associative array um but just to tell you that this is how you would normally go around doing this if you want to have an array inside an array and this is something we call a multi-dimensional array so with that said we now talked about arrays in pretty detail I think for now so with that said I hope you enjoyed this episode and I’ll see you guys in the next [Music] [Music] video so up until now in these many lessons we’ve had we’ve talked a bit about build-in functions inside PSP which are functions that exist inside the PSP language that we can use in order to do many different operations inside our code and there are so many functions out there that we can’t do one episode and talk about all of them since it’s going to be a very long episode if we had to do that and honestly I don’t know all the functions because there’s so many of them but what we can do is we can talk about some of the more popular ones that you might want to use at some point inside your code for various things so in this episode we’re going to talk about some of the functions that are built into phsp that we can use for different things so inside my document here I’m going to scroll down so we have our little PHP section and the first functions I want to talk about are some that are related when it comes to using strings inside your PHP code so let’s go and create a string here so we can actually do something with it so I’m going to create a variable I’m just going to call it string so we have some kind of name for it and then I’m going to say hello world it is important to mention here that whenever we create a function or reference to a function inside our code we do so by referring to the name of the function followed by a pair of parentheses because the parentheses are going to be used to call upon that function so we can do something with it so what I can do here is I can say we want to Echo something out and I can call upon a function called string length which is written by saying St Len and that stands for string length and what we can use this for is to call upon a function in order to tell us how long a certain string is so if we were to actually save this by pasting in the string inside the parenthesis refresh the browse so you can see we get 12 and the reason we get 12 is of course because we have 12 different letters or empty spaces inside our string so if we also count the empty space in there we do have 12 different characters we do also have a function that can go in and actually tell us the position of a certain string inside this string here so what I can do is I can say something like string position and string position is going to require two different things first we want to have the actual string that we want to get the position from so in this case here our variable string then I want to say comma which is a separator to add a second parameter inside this function here and then I can tell it what I want to see the position of inside the string so in this case I could say okay so what is the position of O inside this function here so in this case I’m can go down and say I want to get o save it go inside refresh and then we can see we get four and the reason we get four is because we always start at zero when we count inside programming so 0 1 2 3 4 which is going to be the O so now we got the position of O inside this string and it’s not just when it comes to a single letter we can actually check for more than just one letter so I can go in here and say I want to check for wo so in this case that would be this location right here so I can refresh and then we can see we get six now we do also have a function to replace a string inside another string so what I can do is I can say something like Str strore replace and by doing so I can also go in and say what do I want to replace inside this string here so I’m just going go to delete everything we have except for string so the first parameter is going to be what do we want to replace so in this case it is going to be world and I want to replace it with something else and in this case we can just say Daniel so we say hello Daniel inside this sentence so if we were to save this go back inside the browser you can see we get hello Daniel because I replace world with Daniel then we can also go in and use another function in order to to convert all the different letters to lower case so if I were to go in and say I want to string to lower then I can save it go inside refresh and then we can see everything is lowercase no longer have these uppercase letters inside this sentence everything has been converted to lowercase and the same thing we can do it the other way so we can say string to Upper which would of course do the opposite so were to go in you can see everything is uppercase and if I want to be a little bit more complex here what we can also do is we can do something called substring which is something something that I do occasionally use so if were to go in here so I can say we have a sub string by saying subst and what I can do in here is I can go in and say that I want to grab a certain part of the string here so the first parameter is going to be the actual string so in this case that this is going to be hello world then I’m going to say comma and then I want to say where do I want the offset to be so where do we want to start from and in this case here I could say we want to start from the index of two so if were to go inside my string and count this is going to be zero one two which means to be started here and then I want to have a length set to two so from here and then two forward which means that if I were to save this you can see that we get LL and we can actually do something quite smart here because if you want to do something in a very long string and you want to start from a couple of letters into the string but also end it a couple of letters at the end of the string instead of having this long string and then saying okay so you know 22 characters later I want you to like stop grabing the string instead what I can do is I can say minus 2 which means that it’s not going to start counting the index from the start but from the beginning so in this case here it is 01 2 which means we start at L and then minus 2 is going to be 012 which is the other L over here so as you can see we get low worldl cuz right now that is what we’re grabbing and with this we do also have a another one called explode which sounds very dramatic but essentially what this one does since we now have already talked about arrays in the last episode this is one we can actually talk about uh it takes a string and it says okay so where do you want to take apart this string and then all the different parts you take apart are going to be placed inside an array because we might have multiple pieces of Parts when we explode this string what I want to do is first of all remove the parameters inside of here except for the string and I want to go in and say that the first parameter because this has to be the first one is going to be what do I want to be the divider whenever I explode the string so let’s say I want to take any sort of spaces inside a string and divide the entire string depending on the spaces what I can do is I can say we have a string and that is just going to be a space which means that now it is going to take all the spaces inside the string and cut it like a scissor which means that now we have hello and world two separate strings and it’s going to place these inside an array now in this case here of course we can’t Echo it because that would actually create a error we can actually check this out because this is actually going to be a array so instead what we can do is use another build-in method called print R which is going to be printing out um I believe it stands for print readable if I remember correctly so essentially it’s going to print out data in a readable format so we can actually read it which in this case because of an array uh we might want to read what is inside the array so what I can do is I can just include it inside my print R and refresh it and then we can see we to get hello world so if I were to go in here and just say that we have more than one space so I can just separate the word a couple of times you can see that we get a even longer array because we have more divisions or explosions inside this array here so now having talked a bit about string functions we do also have some related to math inside our PHP code because in a lot of cases we might want to do math at some point uh so having some math functions is something that is really useful uh so let’s go and delete our function down here and also change our string because right now we don’t need to have a string uh but we do need to have some numbers so we can actually perform math inside this little example here so what I’ll do is I’ll create a variable and call it number and then I’ll go in and instead of a string I want to say something like minus 5.5 just so we have an example to use the first one I want to show you is a function called apps which stands for uh absolute I believe you can actually go in here and check it out because there is a really smart function inside our editor where we go in and hover our cursor on top of a function and then it gives us a little description here and as you can see it says absolute value uh so we can get the absolute value of a certain number so if we were to go in here and paste it in so in this case when we have minus 5.5 it is going to get the absolute value which basically means that it’s going to get uh the value no matter if it’s minus or positive it’s just going to get the actual value so if we were to save this go inside you can see you get 5.5 especially inside my gamep courses on the channel we use apps a lot to get you know the absolute value instead of having to deal with negatives and positives and stuff like that so it’s just a really neat function to have we can also round this up so we can use a function called round and this is basically going to do what you think it’s going to do it is going to round this up to the nearest uh whole number so when I refresh it you can see we get minus 6 then we also have something called p w which is going to be the power of or exponential expression so in this case here we can’t really use number because that is not really how this works but what I can do is I can feed it to number so I can say two comma 3 so again this would be exponential Expressions which means that we have to say 2 * 2 which is 4 and then 4 * 2 which is 8 in this case here so if we were to save this refresh it you can see we get eight then we can also do the square root of something so we can say sqr t which means that we’re going to get the square root of one certain number so let’s say two in this case and then you can see we get 1.4 it might have been a little bit easier if we did something like 16 just to like show this in a little bit more normal way so 16 the square root of that is going to be four but now another one that I have as a favorite is one called random so we can actually go and say R A and D which is going to give us a random number between two numbers so I can go in here and say I want a random number between one and 100 and in this case here we’re going to go in when I refresh it oh okay so in this case it’s going to be 51 if I refresh again oh it’s going to be 49 now it’s going to be three now it’s going to be 6 now it’s going to be 10 so it’s just going to keep feeding us a random number each time I refresh the browser I’ve seen people use this one especially when it comes to reloading images inside the website as they’re developing a website because your browser do have something called a cache that is going to store certain data so it’s easier and faster to load your website the next time you refresh it so when you’re sitting there develop and constantly maybe swapping out a certain image and it’s not really changing when you refresh the browser because oh it stored the cash of your last image so it’s not showing the new version then you can use this one and put behind the image name in order to get a new image but again that’s more of a developer trick you can use but it’s not really something you should use for releasing a website since there’s a a reason why a browser stores a cash of your images that’s because it’s easier to load next time right so now this was a couple different math functions we could use but what about arrays cuz we learned about arrays in the previous episode uh we do have quite a few different array uh functions I did cover some of them in the last episode but we do also have many others I could show you so let’s just go and create a array called array and inside of here we can fill it in with fruits just like we did in the last episode so we can say apple we can also say we have something like banana and we do also have orange and then we can just manipulate this array using many different functions the first one is going to be one called count which is actually one that we use quite often when we pull data from a database I do think I showed that one in the previous episode but let’s just go and talk about it here so if I were to say Echo and say I want to Echo out a count function that has the array inside of it we can actually see how many pieces of data are inside this array here so we do that you can see we get three because we have three pieces of data so let’s say we have an example where I pull data from a database and I need to check did we actually get anything from the database because if I didn’t then there’s no need to run a bunch of PHP code because we didn’t get anything from the database so this is going to be a very useful one that you will get to do a little bit of when we actually start talking about databases inside my episodes here uh so this one is worth remembering but now we do also have one here where we can go in and say is something an actual array so we can say is array so isore array and this one is going to give us a true or false statement so in this case it’s going to be false so it’s going to be true and like we talked about when it came to our data type episode a zero means false and a one means true so in this case it did actually return as true because this is in fact an array and we did also talk about a few other ones in the last episode that we can just briefly uh just mention in this one so if I were to go in here and say we have something called array undor push we can now push in data inside our array at the end of the array so I can go in and say we have this array here and I want to add a piece of data which is going to be a a kywi just to add something else to it so if I were to actually print R this one because in this case it would do actually need to print R in order to see all the data and of course I want to have this after we array push so I’m just going to move it down to the next line here save it go inside and then you can see we get kyv inside our array at the end there but now one we didn’t talk about in the last episode is how to remove data from inside the array so what I can also do is I can go below here and say that I want to do something called array pop so array po o and inside this one we just need to have one parameter since we’re only removing the last array index if we were to save this one and actually Echo it out or print R it out inside the browser then you can see we get the same array but now kyv has actually been removed at the end here so we no longer have it again and we can also go in and use another function where we actually reverse the entire array so if we were to go in here and say we have this array here but this time I want to array uncore reverse the array so parenthesis and then I’m going to insert the array inside the parentheses here then you can see we get everything but it’s reversed so we get orange first banana and then Apple and now in the last episode we did talk about something called array undor splice which means that we’re splicing two arrays together and merging them into each other uh but we also do have something called array uncore merge but merge is a little bit different because it’s going to take the data and put it at the end of the first array whereas splice is going to allow for you to put it anywhere in between any of the the existing data inside the first array so if we were to go in here we can also do array uncore merge so we’re going to say merge and then I want to have another array up here so I can just copy paste this down call this one array one this one array two and let’s go and change some of the data inside of the second array so again we could just use kyv and say we want to merge these two together so we were to do this I can say that I want to have the first array which is array one and the second array which is going to be array two too and when we do this I can go back in print it out inside the browser and then you can see we get kyv which has been placed at the end of the other array so all the data inside the second array here is just going to get added to the first array up there because we merg them together at the end of the first array so just a few more array functions you could know about after we talked about in the last episode but we do also have something else because inside phsp in some cases we do also deal with dates and time and when it comes to these we do need to know how to get the date and time because for example again if we talk about databases in a lot of cases you might want to know exactly what the time is when you upload certain data to a database so you might want to have a datetime format that you need to use in order to get the date time so let’s go and start by echoing out a certain date so what I can say is we have a date function and inside this date function I want to tell it the format that I want to Echo out the date and I will include a link in the description for all these different formats if you want to see them uh but essentially if you want to get the full year you can go inside and use a capitalized y then you can separate it with a dash and then we want to get the month the day and then we can also get the time which is going to be the hours colon then we want to get the minutes and also the seconds so in this case if we were to go inside the browser you can see we get the uh full date with the year month day and the current time inside our little uh function here but now we do also have something else we can use so if we were to go down here and say I want to Echo out the time so we’re going to say time parenthesis then you can see we’re going to get this weird long number inside the browser here so you can see we get this random string and you might be thinking hm so what does that do well let’s try and refresh the browser again and see what happens oh it updated okay so if I click this every second you can see it’s updating by one number every second that I click because this is the seconds since a certain date in history I can’t remember the exact date but what we can do is we can go and hover our Mouse CR on top of the function oh and it actually provides a link to the pspnet website so I’m going and open this one and then you can see we get this little link here what explains that it is since January 1st 1970 that we do get the amount of seconds since then and the reason this is something we can use is because you might want to get a certain time difference between now and now so we can actually subtract these two different numbers and get the amount of seconds and this by the way is called a Unix Tim stamp which we can also use for the next function where we actually go in and we want to know what is the Unix timestamp for a certain date at some point so what I can do is I can actually create a string so we can just go and call this one variable date and then I can set it equal to a random date at some point again using the same format that we talked about before for which was uh the date time format so I can go in paste in a random date from my notes here and then I can go in and say that I want to get the string to time Str str2 time and then I can paste in the date and see what is the Unix timestamp for this particular date here and in this case here it’s not going to update every single time I click it because we’re getting a fixed date or fixed time of seconds from 1970 the 1st of January until this particular date that I have pasted in here which is 2023 uh the 11th of April which is today and we have many other different types of date functions you could use inside your PHP code and the same thing goes for the strings and math and we also have something when it comes to like files inside your uh your PHP or files inside your website you can delete files or do something else to it using functions and I will leave a link to many different functions you could be using that you might want to check out and I will have that inside the description of this video here so if you want to check out something on your own then you’re more than welcome to do so but for now these are some of the different functions you can use in order to change things inside your phsp code so with that said I hope you enjoyed this little episode on built-in functions in next one we’re going to talk a bit about userdefined functions which is a lot more fun because now we actually get to create our own functions which means that we can start creating a function called something specific followed by a pair of parentheses and then we can decide that we want to add parameters to this function to change how the functions work and stuff like that and functions is something that we use a lot inside our code pretty much constantly anytime you create anything using phsp uh it’s going to have functions inside of it so functions it’s important and that’s what we’re going to learn the next episode so with that said I hope you enjoyed this one and I’ll see you guys next time [Music] today we’re going to learn about something called userdefined functions inside PHP and this is the moment where we start moving into a little bit more of an interesting point inside our PHP lessons because userdefined functions is where we can start creating our own functions inside PHP in case there is some kind of function we need that isn’t built into the PHP language user defined functions is something use constantly inside our code and I do mean constantly because we use functions in order to not have to rewrite code as well over and over again because if I need a certain piece of code to do something and then later inside my application I need to do the same thing instead of having to recreate the same code in two different places we can use this userdefined function just to reference to it so we run the same code but the code is just sitting in one place somewhere I do also want to point out here because I do remember back when I was learning PHP like 12 years ago when I took my bachelor’s degree in web development that the teacher would ask me inside the exam so what do we use a userdefined function for and I would say well we use it to do things inside our code but the answer my teacher was looking for was okay so we need to use a user defined function for one particular thing so if you want to create a bunch of code your function should not have a ton of code inside of it doing a lot of different things it should have one particular purpose in mind so don’t use a function to store like an entire script inside of it it’s just meant to do one particular thing we’ll get to do a little bit more examples so you can see what I mean so you know not creating a lot of code um so what I want to do here to begin with is let’s go ahead and just create a function just to see how do we create a function and how do we name it and how do we add parameters to it and and write code inside of it uh so what I’ll do inside my little PHP script here is I’ll go in and I’ll use the function keyword which means that now we’re creating a function and I want to go in and give it some kind of name and you can name this function function whatever you like we can come up with any kind of name that we think is appropriate for this function but there’s of course some naming conventions just like with variables and that kind of thing so the way we usually do it when we start a function is we start with a non- capitalized letter for the name so if let’s say I want to say say hello then you can do something like this where every word after the first word is going to start with a capitalized letter or if you want to do it you can also go in and say you want to use a underscore instead now my personal prefer is to do a capitalized letter because that’s how I see most people do it but it’s really up to you like there’s different naming conventions you can use here after creating the name we need to actually tell it that this is a function by adding the parentheses and these are the same parentheses you see when we create a builtin function so if we were to go up here and say something like string length then you can see that we can go in and actually get the length of a certain string so if it were to say Daniel and Echo this out inside the browser we would get the number of letters which would P six in this case here inside the browser and this is what we need to use the parentheses for because we can decide how many parameters we want to pass into our particular function down here because this is our function we can do whatever we want with this function here so I can decide how much do I want to pass into my function now you can also just decide not to pass anything inside your function so let’s go ahead and go inside the curly brackets here which is going to be where all the code is going to get run that you want to run inside your function so I’m going to go down here and say say I want to Echo a string and I just want to Echo out hello world so by creating this we now have a function inside our code that we can call upon so we’re not actually running this code yet we only run it once we call upon it so if we were to go inside my browser just to prove my point if I were to refresh you can see there’s nothing inside the browser but if I were to go down here and actually run my code by running the function I can go in and say we have a function called say hello hellow parenthesis semicolon and then I can simply run this function by Saving refreshing the browser and then you can see we get hello world and now we did use Echo inside the function here which is something you can do but it is a very typical thing inside a function to not Echo out a value but instead return a value uh so what I can do is I can go in and say return and when I refresh the browser you can see we don’t actually get anything inside the browser but instead I would have to go down and actually Echo our function so if we were to go in now you can see we get hello world and one of the reasons for this is I can actually go in and create a variable and I’m just going to call it test and I’m going to set it equal to my function and because I’m returning a value and not echoing a value I am now actually going in and assigning hello world to my variable test because this is the data that my function returns so now if I were to go below here and say I want to Echo out variable test then you can see inside my browser we get hello world but now we did talk about passing in parameters because we can do that and we can decide if we want to do it because it’s our function The World Is Ours we can do what we like uh so what I can do is I can go in and say okay let’s go ahead and pass in a piece of data now I’m just going to use a placeholder for this data so I’m going to create a variable and I’m just going to give it some kind of name so this could be name for example which now mean that when you call upon this function down here actually see we get a error message it now demand that you pass in one parameter in order for this function to actually work so if we were to go down here you can see that if I were to go in and say okay I’m just going to pass in a string and this is going to be Daniel we’re now passing in a piece of data that is going to be assigned to this variable placeholder up here so we can now use it inside our function so if I were to go down here and say that I want to concatenate so I’m just going to go ahead and say we want to concatenate our variable here just going to grab variable name which is the placeholder or the reference that we need to use inside this function save this one you can now see that if I were to go inside an echo the function down here you can see we get hello Daniel and you can pass in as many parameters as you want so you can go in here and say you want to add another name so this could be last name uh we can also pass in variable pet so we can you know get the pet that we might have inside our household or something uh so we can pass in many different parameters and you can also see they don’t actually light up they’re kind of like Gray out inside our editor which means we’re not actually using this parameter inside our function and just to mention it here because you don’t actually have to use these variables inside your uh little function down here but you do need to pass in the actual parameters inside when you call upon the function I do have two more things I want to show with this example here so let’s go and go back and just have variable name inside our function so what we can do is we can also assign a placeholder and by placeholder I do mean a default value so let say I go down here and I decide not to pass anything inside my my function down here and it’s now giving me a error message H is there a way for us to run this function without having to pass in a parameter and it just assigns a default value if you decide not to yes there are so what we can do is we can go in and inside the parameter inside our function up here I can go and assign my variable name to Daniel actually let’s go and call it something else so we get something else inside the browser here so let’s say Bess so now if I decide to call upon this function down here without actually passing in a parameter you can now see that it’s going to assign Bessa as a default value for this particular parameter here however if I go down inside my function and say you know what let’s let’s have it be Daniel and I save it refresh you can now see that oh okay so there is a value passed into this function here so we’re not going to use the default value that I assigned inside this function here the second thing that I want to show you is also in terms of something called type declaration which is also something we received in PHP 7 something I do believe type declaration is something we have in most other programming languages but for some reason because PHP is a very Loosely typed language we don’t have it and you don’t have to have it inside PHP but what you can do is you can go inside your parameter up here and say okay I do demand that whenever a user or whenever a programmer call upon this function here it has to be a string that is passed into this function here so what I can do is I can say I want to have this being a string data type so whenever we pass anything in here it has to be a string so right now if I were to save this it is not going to give me any sort of error messages because it is a string but if I were to go down here and say I’m passing in a number instead I’m now going to get a error message actually it’s not going to give us any sort of error message because right now we don’t actually have strict types enabled inside our code so that is something we need to do first uh so if you want to have these type declarations you do need to make sure that the very first thing inside your script here is going to be a strict type declaration so we’re going to go to the top of our file I’m going to open up my PHP tags and I’m just going to go ahead and close it again and the first thing inside my PHP code is going to be a declare strict types equal to one which means it’s going to be true so if we were to save this and then go down you can actually see oh now we do actually get a error message because o this is supposed to be a string but we found a int number and if we were to refresh inside the browser you can see oh okay so type error which means that we don’t insert the correct type inside our function here so type declaration is something that can help you make sure that the right data is being inserted inside the right functions so this is something I do recommend using because this is something that I’m used to from other programming languages but again if you want to you don’t have to do any sort of type declaration inside your Cod you can just delete this liner code here and delete the type decoration like you don’t have to have it it’s very very much possible to do without but I do recommend doing it because it is a habit I have from previous code that I have written in other programming languages out there and there is a reason for why we have it it is to make sure that we have one less error that we might accidentally do inside our code so it’s just kind of like a neat little thing we got added to PHP so with my strict type decoration I can now go in and pass in a string and then you can see oh now it works so and again we can use functions for many different types of things we can also go inside and say this is going to be named calculator because we did create a calculator in our exercise in the last exercise so what I can do is I can go in and say I want to pass in a integer and I want to call this One n one and then I can say I want to pass in a second integer and this is going to be number two and again I’m just going to declare these strict type declarations here because I do think it’s a good idea then I can go inside my code down here and say I want to run a calculation so variable result is going to be equal to variable num one plus variable num two again this is a very simple calculator here it it only knows how to add apparently but I’m just trying to prove a point here so what I can do is I can return a value so I’m going to return variable result so now when I go in I can actually call upon this function here and I do need to pass in the right data so I can go in and say that I want to pass in a number so this going to be two and five so we were to do this refresh then you can see we get seven I do also want to mention here that we do have something called scope inside programming in all programming languages out there and a scope is essentially where you can access certain variables so right now inside this function here this variable called variable result is a local scoped variable which means that we can only access this variable from within this function here one thing that I remember confused me when I started learning programming like many years ago is whenever I went up here outside the function and I would create a variable so let’s say I just create a variable called test and I’m going to set it equal to Daniel now if I were to go inside this function down here can I take variable test go down and just let’s say use it inside this function here so if I were to say I want to return variable test oh we get a error message okay so we can’t do this because it is a undefined variable because it doesn’t exist inside the scope of this function here but what I can do inside this function here is I can actually go and take my variable test and say that I want to grab a global variable within the global scope of my code so I can go in anywhere inside the code here and say I want to grab a global variable or at least declare that this is a global variable that I want to have access to and I can say I want to grab by variable test and because I reference to a global variable in this sort of way we can now use it inside our return down here so I can actually go in refresh and then we can see we get Daniel again I feel like I’m piling information on top of people here but it is just important to know that we have something called scope and we will have a episode I think we should do that in the next episode talk a bit about uh Scopes inside our PHP code because that will be a little bit more relevant to talking about global Scopes and local Scopes and that kind of thing so for now don’t worry too much about Scopes let’s just go ahead and worry about creating functions inside our code like so so you know how to create a function that has a particular piece of code that has a particular purpose in mind uh which you can then use inside your PHP application I do know this is a lot of information I piled on top of people in this video here but it is important to know what a function is because you will be using it constantly inside your code so with that said this is how you create a function if you’re still a bit confused about it I do recommend rewatching the video uh because you do need to know how to create a function okay so with that said in the next video we’re going to talk a bit about Scopes inside PHP and and with that said I about to say it again I hope you enjoyed the video and I will see you guys next [Music] [Music] time today we’re going to learn a little bit about Scopes inside PHP since we talked a bit about userdefined functions in the previous episode and talking about Scopes is going to help you understand how we can access different types of variables and functions and classes and so on so we’re going to talk a bit about Scopes today Scopes Scopes I’m pretty sure I’m saying it too fast Scopes so essentially what a scope is is how or when you can access a certain variable or function or something inside your script this means that right now if I were to have this page that has nothing inside of it and I were to create a variable so I can go in here and I can say I have a variable I’m going to call this one something like test then I need to know exactly when I can access this variable inside my code and we do have four different types of Scopes inside PHP we have something called a global scope which is where my variable right now actually is which means that we can access this variable from anywhere inside of our scripts we do also have something called a local scope which is when we’re talking about inside a function so whenever you define find a variable inside a function you can’t actually use that variable outside the function because it’s locally accessible from within that particular function we do also have something called a class scope and classes is something that we are not really getting into right now classes is kind of something you learn about after you learn the basics of phsp since objectoriented phsp programming is something that you should learn uh but here at the beginning it’s not really something you need to worry too much about but I will give a short example in this video here just to kind of give you an idea about what exactly a class scope is since we’re talking about Scopes so we might as well talk about all of them uh we do also have something called a static scope which is essentially when we have something that is statically declared inside our code uh we need to talk a bit about what exactly that is and how and when you can actually access a statically uh declared variable inside your your code uh so that’s something we’re going to talk about as well so now let’s start by talking about a global scope so as you can see right now we have this script um which we I have introduced The Script already uh but we do have this variable that I just created called test which is said equal to Daniel and if I want to gain access to this variable I can just simply go down and I can say Echo and then Echo out variable test and if I were to do that go inside my browser you can see that we’re actually going to get a spit out inside my browser because this is a global variable and I can just sort of access it from anywhere inside my script so as soon as we declare something outside a function outside a class it is inside the global scope of our script so we can can access it but now we do also have a local scope which we talked about in the previous video where we talked about userdefined function since whenever we create a function inside PHP we do have some code inside the function and we need to know exactly when can we use that code and and how can we use it inside our our script in here so now if I were to paste in a small example that I have here of a function you can see that this particular function here is called my function and we right now inside the function have a variable called local variable and it said equal to hello world now this particular variable I can gain access to within this particular function here so if I were to actually go in and and Echo it out or return it we can also do that because that is probably the better thing to do if we were to go inside and actually return this value go down below and call upon my function here you will see that we actually spit out our return inside our browser so if we were to do this refresh you can see we get hello world but now what if I want to G access to the variable inside the function so if I were to go in and say I want to copy this variable and I want to Echo it out down here because I mean I did declare a variable right but it’s inside the function so we were to do that refresh the browser you can see oh undefined variable which means that there is no variable existing that we can gain access to called local VAR so as soon as we declare a variable inside a function it is locally scoped within that function so we can only access it within my function and the same goes kind of the other way around because if I were to go above this function here and create a new variable so I’m going to say we have a variable I’m going to call this one test again and I’m just going to set it equal to a string So Daniel and if I were to try and access this variable within this function if I were to go in here and say we want to return variable test and actually spit out the function down here then you can see that we’re going to get another error meth because again undefined variable variable test because it is inside the global scope but not within the local scope of this particular function but Daniel didn’t you say that the global scope can be accessed from anywhere inside the script yes as long as it’s not inside a particular scope of for example a function or inside a class then we can gain access to it from within anywhere else inside our script so anywhere else below here if I were to go down here write some code that is not inside a function then I can of course gain access to variable test but as soon as I start creating a function like I did here it is going to only take into account the local scope of this particular function unless I pass in the data into the function and we talked about that in the last video too we can do that by simply copying our variable and say that I have a parameter inside my function here so I can pass in a parameter and then I can go down and for example spit out variable test down here because now I passed it into the function and also we do need to make sure we go down and actually pass it inside the function itself when we actually call upon the function because we have to pass in some data so we were to do this go inside refresh the browser you can now see that we’re passing in data and we can now see it inside the browser but now I did kind of lie to you just now because I did say that you could not gain access to a global variable inside a local function but it is actually possible for us to do so it’s just not really a habit that you should get into doing unless you have a very good reason to uh because the reason we passing data into to the parameter of a function just like we did here is because we want the function to work depending on outside data so if I go in and say well if we have this Global variable then all of a sudden the function becomes kind of like not as reusable in the wrong setting so let’s say we don’t have this Global variable and I say I want to grab it then all of a sudden we start getting some weird funkiness going on so what I can do if I wanted to is I could actually go in and just say we’re not going to pass in this variable which of course is going to give us an nrow message just like before because right now we cannot find variable test but what I can do is I can actually go inside a function and say I want to declare a global variable which right now is called variable test and now because I declared that I want to grab one of the global variables inside the global scope I can now use it inside my function so want to save this go inside you can now see that we get Daniel but we do also have a second way we could do this if you don’t want to declare a global variable first and just directly gain access to it so there’s another shortcut to do this which is also you can just go down and say we want to use one of the super globals we talked about in the previous episode so I can go in and say I want to grab a super Global called globals and I want to pass in variable tests inside my Global’s super Global so in this sort of way we’re grabbing a global scope variable called test using this super Global here called globals there was a lot of tongue twisters in a row so if we were to do something like this go inside the browser you can see we get the same result so it’s basically just another way of doing the same thing as declaring a global variable at the beginning of the function but like I said don’t do this unless you have a very specific reason to do so because passing in parameters is really the way you need to do it in 99% of cases whenever you do variables like this or or functions so now you know how to gain access to a global variable but just know to use it sparingly and for a good reason so now that we talked about a local scope of a function let’s talk about something called athetic scope and athetic scope is something you get whenever you create a static variable inside a function for example you do also have it inside classes but let’s go ahead and take a function as an example here so if we were to go ahead and paste in my little example code here you can see that inside my function we now have a variable that has been declared as a static variable and all I’m doing let’s actually go and just do this to begin with here all I’m doing is I’m going in and saying okay so static variable is equal to zero and then I want to add one to it and then I want to to Echo out the result or in this case here just return the result and then Echo it out down here inside my function so if I were to do this what you should get is one because when I run this function with taking zero and adding one to it and then returning it so we would to go inside my brows so you can see we get one but now what happens if I do this a second time if I were to go down here and say I want to Echo this out again but what is the second Echo going to be is it going to be one or is it going to be two because remember we’re adding one inside function so if we to go inside my browser refresh it you can see we get another one and the reason for this is that a function is meant to be a blocker code that has code inside of it that you can just gain access to over and over again inside your code so you can reuse the same code again and again and again and because of this they should not be influenced by each other so if I use my function in one place then it shouldn’t change the same function when I use it in another location otherwise it kind of defeats the purpose of my function so whenever I use the same function again and again we should get the same result every single time however let’s say I go inside my function here and I declare a static variable so if I use the static keyword instead this particular variable is going to be shared by all the functions inside my code or inside my script anytime I use this particular function here so if I were to go in here and say that my static variable is equal to zero and I add one to it it means that now for all all the other functions in the future this particular variable is not going to reset itself it is going to stay as one so when I use the function the next time the next time the number is going to get spit out it is going to become two and again if I were to use this function a third time it is going to be three because it keeps adding one to it and because this is a static variable it is going to be shared among all these different functions down here now the last scope that we need to talk about is something called a class scope and this may be a little bit premature because we haven’t actually talked about classes and properties and methods yet and objects and and all these things but it is something that exists when it comes to scope so I’m just going to mention it so you know a little bit about what I’m talking about here so inside PHP we have something called a class which is basically like saying we have a template that has a bunch of variables and functions inside of it I’m doing this because they’re not actually called variables and functions uh but so you know exactly what I’m talking about they kind of work the same way as variables and functions but within a class so as you can see here I have a class called my class and inside the class I have a variable and I also have a function which is actually called a property and a method and these variables and functions are only accessible from within this particular class here now I’m just going to stop myself here because I started talking about how to create Optics and different things off this class and this is not supposed to be a class episode It’s supposed to be about Scopes um so all you need to take from this is that when we have a class like this all the different properties and methods within this class let’s actually go and delete this static keyword here because that is actually useless right now um if I were to do this all these properties and methods can only be accessed directly inside this class here so if I were to go outside this class I can’t access these unless I make them static and the reason you will make them static is for like entire different reasons like there is actually a reason you might want to do that um but just for like regular usage you don’t usually do that so this is what we call a class scope so now we talked about global Scopes we talked about local Scopes and we talked about static Scopes and we talked about class Scopes uh don’t worry we will get to talk more about classes at some point in the future but for now let’s just go ahead and stick to procedural PHP and then once we have learned all the basics then we’ll get into like classes and off Tech oriented PHP and stuff like that so for for now that is basically what scope is when it comes to PHP so hope you enjoyed this lesson and I’ll see you guys next [Music] time today I’m going to teach you about something called a constant inside PHP and a constant is basically a way for us to create data that cannot be changed at any point inside our code which which is very useful for a lot of reasons for example if you have some data that is very important to a lot of your code and it has to stay the same then declaring it as a constant makes sure that if you were to accidentally change it at some point you get an error message instead of all your code that starts breaking and and showing the wrong thing because that one piece of data has now been changed and everything else is now wrong so creating constants is something that can help us create data that should always always stay the same if I were to create a variable for example here so if I were to go and say we have a variable called name and setad it equal to a string called Daniel you can now see that if I were to Echo this out and say I want to Echo out variable name this is going to give us Daniel because that’s what we wrote but what I can also do is I can take my variable name go down below and I can change it to something like Bassa and if I do something like this it is just simply going to change the variable in to B now which is okay because this is just a variable however if I were to do the same thing using a constant this is actually going to throw me an error message so if we were to go up here we can declare a constant by saying we want to Define parentheses semicolon go inside the parentheses and give it a name so to begin with here we can call it something like Pi because Pi should never change because it is always going to be 3.14 so let’s say I’m doing a bunch of calcul ations and I need to use Pi in order to do this and I wrote it as 3.14 if Pi were to change then all my calculations are going to go wrong so I want to make sure that we always get this particular value even if I were to accidentally change it at some point in the future which I should not be able to do but hey mistakes happen but we just want to do as much as we can to avoid those kind of mistakes so what I can do here is I can go down and say I want to Echo out not variable name but just Pi if would to saved this go inside the browser you can see we get 3.14 and you may have noticed something here because I did actually create a variable name using all caps so right now it is pi using capitalized letters this is not something you have to do I could also go in here and say Pi with a non- capitalized lettering so if we were to do that and actually spit it out inside the browser you can see we still get 3.14 however it is a convention inside any sort of programming language that when you create a constant that you use capitalized lettering because it shows other programmers that this is a constant so it’s just kind of a visual indicator for other programs to know that this is a constant so now if we were to spit this out inside the browser but I were to go down and say I want to change Pi into 4.14 so let’s say I want to do this but hey whoops I made an accident I accidentally changed something that I shouldn’t change if I were to do this you can now see that we get a error message because we’re not supposed to redefine a variable called Pi elsewhere inside our code and this is just a very useful way to make sure that if I were to accidentally change something that we get a error message instead of all the code starting you know to go wrong and of course this can be any sort of data type so it doesn’t just have to be a float number like it is right here I could also go in and say this is going to be name and then I can create a string and say this is Daniel and if we were to actually spit that out you can see we get Daniel inside the browser we can of course also create all the other types of data we can create a true or false statement so I could say isore admin you know is the person and administrator then I can go in and say this is a true and of course I can go in and actually spit it out so we can see it it is also important to note here that a constant is inside the global scope whenever you define it which means that if I were to create a function down here so if I say have a function just going to go and call it something like test just to give it some kind of name if I were to go inside the function I can actually Echo this particular Conant directly inside the browser because we can just gain access to it so even though we in the last episode talked about variables not being able to get passed into functions unless we actually declared that they were a global variable we should access or pass them in through the parameters or something like that uh we can actually do that using constants so if we we to actually go in here and say I want to Echo up Pi then I can actually do that so if we to go below here and actually say I want to run my function here called test and then you can see that we get 3.14 inside the browser of course we’re going to get 13 now because we also echoed out is atmin over here so we delete that you can now see we get 3.14 the last thing I want to mention here is whenever you define a constant is to make sure to always do it at the top of your script it’s just kind of a habit that we have that whenever we want to create a con they should be all listed at the top of the code so even though it’s not necessary I could take the constants and actually move them below all my code if I wanted to do that it is kind of a habit or a good practice for programmers to make sure that it’s all at the top of the code so we can easily find them and this is basically what a constant is so having talked about that we now start reaching a point where we need to start talking about how to actually do things with databases when it comes to PHP because PHP is is kind of like one side of the coin and the other side of the coin is handling data from within a database so we need to start talking about how to you know actually go inside a database and create data and how can we then grab the data using PHP and show it inside a website so having talked about constants I hope you enjoyed this lesson and I’ll see you guys in the next video [Music] today I’m going to teach you about something called a loop inside PHP which is actually going to be our last episode before we start talking about databases together with PHP so that is going to be very exciting cuz it’s kind of like the point where we can start building some very cool things inside phsp so with that said let’s talk about the different types of Loops that we have inside PSP now if you have learned something like JavaScript beforehand this is going to be very familiar to you because a loop is pretty much the same thing in most programming languages so there’s there’s like slight differences maybe but they are going to be pretty much the same thing so when it comes to a loop we use them inside our code to spin out a blocker code multiple times by just writing one block of code so we can spit it out maybe like 10 times or you know maybe we pull some data out from a database and we want to make sure that we spit all the data out inside our website rather than just one piece of data so we can keep spitting out data depending on how many iterations would tell it to actually run inside our code basically just something that repeats again and again and again and again until we tell it to stop that’s basically what a loop is so when it comes to a loop we have the first one which is called a for Loop and a for Loop is a very basic way for us to spit something out depending on numbers so what I can do is I can actually go inside my for Loop here and inside the parameters we need to include three different parameters the first one is going to be a starting point so I’m going to create a variable we can call this one whatever we want but it is kind of like a tradition to call it I for iteration because one iteration is one Loop and then we can do like three iterations which is three Loops so you know we have something called a iteration to begin with here we’re just going to go and set I equal to zero and then I’m going to end this off with a semicolon and add in the second parameter or the second state inside this uh parameter here and that is going to be when do we want this Loop to stop running so at some point this has to stop otherwise we create something very bad which is something called a infinite Loop which is a loop that is going to run endlessly inside your website and eventually crash your browser so we don’t want that to happen that is a very bad thing um so we want to make sure the loop has a stopping point so what I can do is I can goad and say that I want variable I to stop once it hits a certain point and this can be you know when variable I is equal to a certain number which is for example 10 we can also do less than an equal or greater than an equal let me just go ahead and rephrase that we’re running this loop as long as this statement is true that’s what we’re doing okay so we have to go in and say as long as uh variable I is lesser than or equal to 10 then we want this uh four Loop to keep looping that’s that’s what we’re saying here so what I can do is I can go inside and add a third parameter which is going to be how much do we want variable I to increase or decrease every single Loop when we Loop this out and what I can do here is I can go ahead and use a increment or a decrement which is something we talked about in our operations episode uh basically we can go in and say we have a variable for example variable I and I want to add one to it by writing plus plus so the first time we Loop this variable I is going to be equal to zero but once we get done with this blocker code it is going to change it to one and then the next time it’s going to be two and then it’s going to be three and four until we get to a point where this statement here is no longer true and then it’s just going to stop running so what we can do is we can go inside here and we can just go ahead and Echo out something so we can say Echo um this is iteration number and then we can go and add a concatination and say this is iteration uh variable I and let’s also go Ahad and add a break to this because because we do want to have multiple lines just so we can see it properly inside the browser here so what I’ll do is I’ll just add a HTML break and with this I can go inside my browser and as you can see we get this is iteration number zero and number one number two and so forth until we get to iteration number 10 now in this case here we are spitting out 11 numbers because we’re also spitting out the first one which is you know when the number is zero and there’s a couple of ways you can do this if you want this for example to Loop out 10 times then we could go ahead and say this should be uh maybe equal to you know 9 or we can also go ahead and say that we should start at one uh if I do this for example if I were to go inside the browser you can see that we start at one and then we count to 10 uh we can also go ahead and set this back to zero and say it’s just going to be lesser than 10 and this case it’s going to go and stop at nine so there’s many different ways you can split this out 10 times uh this is basically just to show you that you can go inside your parameters if I can find my mouse there we go you can go inside your parameter here and you can change these numbers however many ways you want to so this is a basic way to create a for Loop inside your code and again you can write whatever code you want to in between these uh curly brackets here so you can you know spit out any sort of code that you want and there’s many different uses for a for Loop for example if you have a string that has a certain number of characters inside of it and then you want to spit out uh a loop for each character so you can count how many characters inside a string and then you can do that based on that basically anything you can think of that has something to do with numbers is something you can use in this case here you could also go in and actually replace this you could say instead of being lesser than 10 uh if I were to have another variable up here I can just call this one test I can set this one equal to five and I can actually go ahead and replace variable test with my number 10 and in this case this would also work so in this case we’re spinning out five times so you can replace these in here with variables if you wanted to you know if that’s the thing that you want to do it’s just kind of to show you that there’s kind of like a a free Ro uh to do whatever you want with this kind of loop here but now we do also have a second type of loop which is called a while loop so what I can do is I can just comment this out just so I can demonstrate what a while loop is and the way this works is instead of using numbers I can actually go inside and create any sort of condition that you might want to use from for example Le a if statement so you know when we use a if statement you can also go and compare things you know do something specific uh we can also create a Boolean so if I create a variable here I just call it Boolean I’m going to set this one equal to true what I can do is I can go inside and say as long as this variable here is equal to true then I want to Loop something out and now of course in this example here we are creating what is called a infinite Loop just like we did previously so it is a very good idea that this should at some point make our variable Boolean into fals otherwise this is not going to be very good for our website cuz it’s going to crash everything uh so what you could do is you go in here and say let’s just go and make variable Boolean equal to false in this sort of sense here uh so this basically means that the first time it’s actually going to just Loop out one time and then it’s going to stop looping again because the first loop it’s going to change our variable into false uh which means that this is not going to Echo out anything else so in this case we’re just going to Echo out our Boolean just so we have something to actually spit out inside the website so we can test that this is working uh so if I were to do this go inside my website you can see we get true or one in this case which is the the number version of being true zero would have been false in this case here so we are spinning something out uh what we can also do is we can actually create something very similar to what we had up here so I can take my variable test and I can go down and say I want to say we have a variable called test and as long as variable test is lesser than 10 then I want to spit out this Loop here so what I can do is I can go inside and I can actually say that variable test is going to add one every single Loop and then I can simply Echo out something so we can actually see something going on inside the browser here which could for example be variable test just so we can follow what exactly it’s do doing and then I can go ahead and refresh the browser and as you can see we get numbers so it is looping through five times because we had our variable test starting at 5 and then we just add one each time until we get to lesser than 10 uh so it is doing something here so anything that you might want to think of that you could for example use inside an if statement when it comes to checking for these type of conditions is something you can use inside a while loop whereas for example our full loop up here is more about when it comes to like numbers so two different ways to Loop things out you can just kind of like use the one that you might find appropriate for a certain situation to spit out a bunch of data a certain number of times uh but what we can also do is I can also go ahead and do something called a do while loop because right now if I were to go ahead and say that for example variable test is equal to 10 which means that immediately the first time this is actually going to be false because this is not going to run a single time so so if we were to actually save this go inside and refresh it you can see we get nothing inside the browser hm and that is because we started out with a false statement so it’s not even going to Loop out one thing inside our code but what we can do if I can find my mouse here for some reason is really difficult in this background color here uh what I can do is I can go inside and create something called a do while loop and the way that works is I can actually replace the while statement and the parenthesis with a do keyword word and then afterwards down here I can actually include my while statement so I can go ahead and say semicolon and what this is going to do is that it’s going to Loop this code in the same sort of sense as before but it will always Loop this out at least one time no matter if this is going to be true or false the first time uh so no matter what happens this is always going to spit out something one time so in this example here even though variable test is going to actually be a false statement inside the while loop it is still going to Echo out variable test one time so if we to do this go back inside refresh you can see we get 10 now let’s take a second example here because we do have the last type of loop that we have inside PHP so right now we talked about full loop while loop and dual while loop but we do also have something called a for each Loop and in order to demonstrate this one I will create a array which right now has three pieces of data so we have apple banana and orange and what I want to do here is I want to Loop one time per data inside the array so let’s say I want to spit out all this data inside my browser what I could do if I wanted to and do it manually is I could go inside and say well you know what I’m going to go and Echo out my variable fruits and I want to grab the first index so I’m just going to go and grab index number zero and then I’m going to go and copy this down you know two more times because we have two other pieces of data so I can also grab number one and number two and if we were to do this and go inside my browser you can see we get all three but you may start to see the disadvantage here because now we actually first of all we need to know how many pieces of data is inside this array CU we need to know in order to manually type them out here um but also we have to literally manually type them out which is not really a good thing uh so what we can do instead is we can actually make our code automatically just know how many pieces of data inside this array and then spit them out and I just want to point out here that a lot of people will look at these Loops here and think that oh okay so the you know the while loop might be the one I have to use the most cuz that one is pretty cool but this for each Loop here that’s about arrays and we haven’t done much in Array so far so we’re not going to use this one that much right however when it comes to learning about databases and actually grabbing data from a database and outputting it inside our website you do need to know how to create a for each because that’s the one we use in order to do this um so a for each Loop is quite important so what I can do here is I can actually create one so we’re going to use it for each keyword parentheses and curly brackets and then inside the parentheses we need to first of all add in the array that I want to actually grab the data from and what I want to do is I want to use another keyword called as and then I want to give it a placeholder that I can refer to inside the actual brackets down there or inside the curly brackets uh that is going to to use in order to grab the data from inside the array so in this case here because I want to just grab one piece of fruit I could actually say that the placeholder is going to be fruit you know a singular fruit so what I can do here is I can save this and then I can go inside deep brackets down here the curly brackets I keep saying brackets for some reason um but I can go inside the curly brackets and I can Echo something out so I could say this is a which is not going to make a lot of sense in this case because apple is supposed to be an Apple I do know a little bit of English grammar but you know we’re just doing a small example here so it’s okay but what I can do is I can say this is a then add in the fruit variable because that is going to be the placeholder and then I want to just close it off here actually let’s go ahead and move everything down to the next line just so we have a little bit of you know neatness going on in here so we’re going to add a break and just like so it is going to go through each of these data and spit it out inside the browser so if we would to save this go back in you can now see we get this is a Apple this is a banana and this is a orange but now what about a associative array because this is a indexed array and we did talk about arrays in a previous episode basically we have something called a indexed array which is where we go in and if you want to spit something out when it comes to an array is you refer to the index of the array so in this case if we want to grab Apple then we refer to index number zero if you want to grab banana we refer to index number one uh but what about a associative array so what I have here is another example of a associative array where basically we go in and we say that the key is going to be apple and the value is going to be the color of the fruit so we can keep doing that banana is going to be yellow uh and orange is going to be orange because you know it’s the same name so what I could do here is I could actually just go inside my browser now refresh everything but if I were to do that it is actually going to be echoing out the values uh because when we use the S keyword inside of for each Loop down here it is actually going to refer to the values inside this array so right now the values are actually going to be the colors that we added in here so if I want to go inside my browser refresh you can see we get the colors in here but what if I want to also get the key because that is also something we can do in order to spit this out inside the website so the way we can do this I can just simply go ahe and copy paste this little arrow up here because we do it the exact same way and go after my fruit and say I want to point to another placeholder which in this case it could actually be the color so if we were to go back down inside my echo I can say this is a fruit that has a color of and then I can go ahead and add in another concatenation so just going to go and add in our color uh value here so I’m just going to paste it in and if I were to go back inside the browser you can now see that we get this is a Apple that has a color of red so we’re also getting the key in this case here and this is a small introduction to how to you know Loop something out inside the browser depending on how much data you might have inside a array or you want to Loop something based on how many numbers there are or based on a condition like for example with an if statement uh so we have four different types of Loops that we can use depending on the situation that we might want to find one of them useful so in this case here we have something to work with so with that in the next video we’re going to start talking about databases which is going to be very exciting I know it doesn’t sound exciting cuz database like it kind of sounds a bit dry um but when we start using databases with a website using phsp that is the moment where we really start to see something happening with PHP inside our website so that is going to be very fun to do uh so with that said I hope you enjoyed this lesson and I’ll see you guys next time [Music] So today we’re going to do something very exciting because we’re going to start talking about databases and how to handle data inside a website because when you start doing that that’s the moment where you really start to make a website more Dynamic rather than making a static website which is something that basically means that you have a website that doesn’t really change depending on which user is watching the website so when you have a dynamic website all of a sudden you can start changing content or if you were to hand off a website to a client they can start changing content themselves if you want them to be able to do that that is actually something that I don’t think a lot of people realize that when you start learning how to make websites and you want to become a web developer and you think to yourself okay so I’m going to start making websites for people but when you hand over a website and they have to make a change to let’s say a title or paragraph or maybe they want a image updated or something then all of a sudden they have to contact you because you can’t give them a website and then teach them eight to Mons so they can change things themselves um so that doesn’t really make a lot of sense right so you have to be able to make a website that is dynamic where can allow people to change content themselves without having to know HTML or css in order to do so for example if you want to create a blog inside a website and you want the client to be able to you know upload a new blog post by thems without having to contact you every single time that is going to be an example of something we can start doing when it comes to learning phsp together with a database so with that said let’s go and talk about how to set up a database and what exactly it is databases sound so dry when you say it out loud like that uh it’s not it’s quite fun once you get into it and when you really start seeing content change it’s gets a lot of fun okay so the first thing you want to do is you want to make sure that when you go inside your xamp that we installed in the second episode I do believe that you do have both the Apache and the MySQL server running because the first server here which is the Pache server is going to be the web server where we have PHP running the second one is going to be the actual database server so this one has to be running in order for us to access our database with the xamp that we installed uh because you do have a database installed as well other than just PHP and a server so this is something that you do have already uh we don’t have to do anything special in order to set up a database we just have to open it basically just a small quick tip for you because I don’t think I mentioned this in the first episode where we installed xamp uh you can actually go inside the config menu here and you can actually make it so that the software Auto starts these servers when you open up the program so you can just tick this off right here and then you can click save now if it gives you a error message it is because you need to run this uh software here as administrator so the basic way to do that would be to go inside your exam installation go down find your examp uh Dash control right click properties and then B basically just go in here inside the compatibility and set this one to run this program as administrator if you do that then it’s going to allow you to to set these up as auto start uh without giving an error message so with that done let’s go and talk a bit about something called a relational database management system rdbms for short you don’t have to memorize that it’s just so you know okay so we have many different types of database systems out there which is what we call a rdbms um and the one we’re using is the one called MySQL which is also the most popularly used one when it comes to databases with websites especially if you’re using PHP but there are many different types of database systems out there and that you know some people watching these tutorials may be using something else but if you installed exam you will be using MySQL for this tutorial here most of the time if you do actually have an online server from a hosting company you will also be using MySQL just to mention it so it is the most commonly used one which is also why we’re going to be using that one for these lessons here and just to debunk something here because I know I will get some comments asking about this because it is something I’ve seen on previous videos MySQL servers are not the same thing as MySQL PHP functions okay so before people start typing in comments that MySQL is outdated and it’s unsafe to use then it’s not the same thing as PHP my SQL functions okay it’s two completely separate things so we don’t need to worry about using a mySQL database okay that is something that is very commonly used and it’s not unsafe uh in any sort of way um so what I’ll do is I’ll go Ahad and open up my uh browser and inside my browser I can go up and type Local Host just like we do when we actually want to enter a website but instead of saying forward slash the name of the website in this case I’m going to write PHP my admin and if I type that and click enter you’ll see that we enter our database system so PHP my admin is going to be the dashboard that you’re going to use in order to manage your database and you can actually see that we have many different types of databases on the side here uh you’re not going to worry about these ones that you have over here you may not have PHP tutorial because I actually created that myself at some point but don’t worry about these databases that we have over here you just need to know that any database you create will be over here in the the side so what you can see is we do actually have quite a few TS up here uh you don’t need to start freaking out about oh no there’s so many things going on in here um because we’re not going to be using all these tabs up here do also keep in mind that you do actually see some information about your web server so you can actually see what PHP version you’re using so right now I’m actually using 8.2.0 um so this is actually some information about your server the first thing we’re going to be doing is we’re going to create a database for our tutorials here so what I’ll do is I’ll go up to databases in the top here and then you can see we can type in the name of a database so we can just come up with any sort of name of course a name that makes sense as you can see with these databases down here there is kind of like a naming convention so don’t use weird symbols or something like that uh so what we’ll do is we’ll just go ahead and say my first database just so we have something right then you can just go and click create and then you can see we have a database added to the side over here now as a default it is actually going to be selected once you create it the first time but you can also see we can swap between them and actually see some of the uh other databases that we have here so I can actually click back and forward uh but for now let’s just go and select the one we just created called my first database now inside of here you can see this is quite empty like there’s nothing going on in here cuz we just created a completely empty and fresh database and what you can do in here is a couple of things first of all you can import databas base data from somewhere else if you have a existing database that you want to import in here or we can just go ahead and create a database from scratch we will be doing the lad because we will be creating things ourselves and there is a couple of ways we can go around doing that uh I do want to point out to you that right now it says no tables found in database the first thing you need to know about a database is that we have data inside a database so for example let’s say I have a login system inside my website and in order to have that we need to have users signing up inside our website and with that logic we do also need to be able to save that user information somewhere for example the username the password they used maybe an email address maybe what date they signed up inside the website we can save all kinds of information about our user and that is what we use a database for because whenever the website has to remember something inside our website you use a database to save that information about whatever we want to save inside our website and in order to make that a little bit easier we create something called tables because instead of just taking all our data and putting them inside our database there has to be some sort of structure going on so we want to maybe create a table that is called users where we have all the user information we might also have a table called comments so we have all the different comments the user made inside our website inside that table so basically a table is a place where we gather similar information about something inside our website and we do have two ways we can create that either we can go down here and do this in the confusing way at least I think this is the confusing way this is also the way that I see most people do this when they start out making a database uh but you can go down here where it says create new table and you can actually type in a name so in this case I can just say uh users because we use that as an example and then I’m going and say how many columns do I want uh which basically means how many different pieces of information about this user do I want to save so in this case I could say five which is an ID username password the date they signed up an email address you know so we have some some information about them and if I were to click create here you can see we get this very confusing uh table that we can start filling out uh so basically these are going to be the names so like I said we can have an ID we can have a username we can also have a password you know we can start filling in the names for all these different columns what is what they’re called inside our database um but the problem here is that there’s a lot of information that you don’t really need right now to know about um so this is only going to confuse people even more uh so what we’ll do instead is I want to go back so we can go back inside where it says structure and then you can see oh you have unsaved changes are you sure you want to leave um yeah let’s let’s not worry about this right now what we’re going to do instead is we’re going to go and create all our data using SQL code so we’re going to to do everything manually which is also going to be very useful because once you start talking about how to uh change our database and and talk together with the database using phsp from our website directly uh you will need to know SQL code in order to do that so there’s no better place to practice SQL than directly inside a database so hey let’s do that instead so what I’m going to do is I’m going to go up here in the top where you can see we have something called SQL do make sure that your database is selected otherwise this is not going to be SQL code that you write for that particular database because I sometimes see people who have another database selected or no database selected so make sure that your new database is selected and then click SQL now SQL code is actually quite simple to write a lot of people find a little bit intimidating to start with but it’s it’s actually quite simple and and of all the SQL that you may look up and and try to learn uh there is typical SQL you know like very few lines of code that we use over and over and over and over again so it’s not like you have to learn a lot of code just like if you had to learn PHP for example it’s it’s quite simple and there’s not a lot of code you have to learn for now but this is the tab that we’re going to be using in the next video when we actually start learning how to create a table together so we’re going to take this video by video we’re just going to do one step at a time uh chronologically as we’re making this database uh really really what we have to do here is just create a table and that’s pretty much it for now but although we could take this table we create in the next video and use it directly inside our website I do want to use this particular SQL uh editor here to just kind of show you how to do various things using SQL uh because you’re going to be using the exact same SQL inside your phsp code so the best place to practice it is doing it inside this database here I do also want to point out that even though we are going to have a couple lessons here where we’re not really going to write any PHP code and this is a PHP course this is the other side of the coin when it comes to learning PHP so if you don’t know this stuff here then you’re missing out on half of what PHP can actually do in order to make a website really cool so learning about databases and learning PHP with it is something that is necessary when you’re learning PHP for the first time so this is going to be a couple of lessons of just SQL programming essentially uh but it’s going to be very worthwhile to to learn so with that said I hope you enjoyed this lesson and I’ll see you guys in the next [Music] video so now that we have a database inside PHP my admin we need to talk about how to set up a table inside our database or multiple tables since we can have many tables inside our database and in order to do that we’re going to program this into our database using SQL code which is something that stands for structured query language which means that we’re quarrying the database using this code here in order to manipulate the database and you know maybe create tables or insert data or select data or delete data or you know there’s many things we can do using SQL and SQL is something that is not really too difficult it takes a little bit of memorizing to do but a lot of the code that you write using SQL it’s going to be pretty much the same so it’s not really like learning phsp where you have to memorize a lot of different code it’s it’s more about learning the same queries so to speak in order to manipulate the database so the first thing we need to do here is make sure that our database that we created in the last episode is selected over here in the sign so you need to make sure you click it otherwise we’re going to be writing SQL code for something else outside you know on the side here we don’t want to do that cuz we want to make sure we select our database so with our database selected you can go up here in the SQL tap and in here we’re going to go ahead and start writing some SQL code so we can actually write some you know some instructions to our database for it to do something like for example creating a table so I hope this is big enough because it is quite tiny I mean I guess I can zoom in a little bit more so you can see a little bit extra here just just to make sure that you can actually see what is going on cuz it is quite a a tiny console that we can write into here so now when it comes to creating a table there’s a couple of different concepts that we need to talk about before we get started here because we do have uh data types that we can insert inside a database we do also have something called signed and unsigned we do also have some different commands like autoincrement which means to we automatically assign numbers to a certain column uh we do also have columns that we need to talk about you know we have columns and rows uh which is like columns is the uh the vertical and then rows is the horizontal you know we have some different concepts we need to talk about but what is important to know is that this video is kind of going to be a mega video it is going to be a little bit longer than other videos because there is like I said quite a few things we need to talk about but you need to see this video as something you can return to so if you need to know a little bit of information about for example what a row is or what a column is or what signed and unsigned means what does a primary key mean what is a foreign key you know then you can come back to this video and then it will be time stamps below so you can kind of like fast forward so you can you know find a specific part you need to refresh your mind with in order to know exactly what that was but just know that I don’t expect you to memorize everything on the first go in this video here we will get to do more code in the future when we actually get into PHP we’ll also write SQL code so you know memorizing these things is not something I expect of you on the first goal so the first thing I want to talk about here is data types because when it comes to inserting data just like with PHP we also have you know integers we have characters you know like actual writing like text and that kind of thing we have dates we have uh decimal points that kind of things so we need to talk a bit about the different types of data we can insert into different columns because when we create a table we need to define a row which is all the data we have for one entry and then we have the columns which is each individual piece of data there you might have a one database entry so essentially we would have for example a person so we would have you know first name last name age you know hair color that would be like the different columns and then will we grab one row from the database that is basically grabbing the entire person with all these different attributes that that person has so we can actually pull the row out and display the data inside a website for example so we have you know columns and then we have rows and each column inside a table needs to be defined with a data type in order to tell our database what kind of data do we expect to be put inside this column here so for example if we were to go in here and say that I want to Define a integer data type then we do have an INT data type which is basically when we have four bits of data we can insert as a number inside this column here which is not a decimal point so you know just like a regular number like this and one thing to note here when it comes to these different types of data that you can insert inside a database is that they all have certain amounts of bits you can store inside this specific column here so for example when it comes to a in we can actually store a number that goes from I actually just went ahead and wrote it out here because it’s going to take a little while but when it comes to a integer data type we can store up to four bits inside this specific column here which means that we can store up until minus this number here until positive this number here so this is going to be four bits I’m just going to go and leave this for now because we do also have something called called signed and unsigned we need to talk about but this is basically the integer range that you can store inside a integer column if you want to choose a integer data type so let’s say for example I want to have a much larger number inside my um my column here because this might not be enough for my specific number let’s say I want to store a uh money amount inside my database and maybe that money exceeds this amount which in that case you’re a very lucky person if you have that much money um but let’s go and say I want to store even more money inside this database column what I could do is I could also use something called a big int and it is important to note here that we do have something called tiny int int big int um so we have many different types of integer data types they can store up to you know different types of bits inside of it but for now we’re just going to talk about the more common data types that they might want to use inside a database cuz I it is going to be quite a long lesson if we’re going to list them all out so let’s just go ahead and stick to the the ones that you might want to be using at some point then you can by yourself look up some of the other types if you want to at some point in the future but for now we have something called Big end and this can store even greater numbers so in this case here I’m not going to write it out but this is going to be up until eight bits of data or eight bytes it’s called the previous one up here is also four bytes by the way not bits um so essentially what you can store here is a much larger number which again is also going to range from a negative number to a positive number so it could for example write something like this inside of it and it would actually be able to store it because as you can tell this number is much bigger than this number up here which is the maximum for a uh int data type so you know we can store a lot bigger number when it comes to uh the big int down here and you might be asking well Daniel so if you’re saying that this one can store a lot bigger number than this one why don’t we just use this one every single time and essentially it all counts down to Performance and that kind of thing because we want to make sure that we don’t uh take up more space than we need to if we don’t need to get close to this number here but this is plenty for storing you know a certain type of data inside our database then performance will be better if you just stick to the data type that makes sense for that particular purpose so don’t just go around using the the biggest data type that you can find so in that case you can always store the biggest number um so so choose the one that makes sense for the the circumstance you might want to use it in and now we do also need to talk about something else before we move on to characters and decimals and date times and that kind of thing uh we can also go ahead and put parentheses Behind These data types and actually Define a parameter for these data types here in this case here when it comes to integers it is a device with that we’re defining in here so if I were to write something like 11 um this does not mean that I’m allowed 11 characters like 11 numbers inside this integer this means that the device with allowed for this data typ type is 11 numbers and this is not something that is directly going to be affecting your website this is something that is going to affect certain types of applications that is used to for example show data for example our uh MySQL software here U has a console inside of it where we can actually show the data from inside these different columns so if I were to set this one to five and I were to store let’s say this number right here then I wouldn’t be showing this number right here inside my database I would actually be showing this number right here although this number is actually what is stored inside this column but it’s not shown inside this database because we defined a Max limit for how many uh how much the device width is going to be when it comes to showing this data inside this database here and like I said this is not something that really affects your website when you define a number in here because you can still show the full number inside a website uh so a typical thing that we do when it comes to just making websites is we just Define 11 in here as a default which by the way is from what I remember also the default when you just write this it is going to be the same thing as writing 11 inside the parentheses so this is not really that important if you’re just a web developer and you just want to store numbers that you want to show inside a website but just out of habit we’re going to go and write parenthesis 11 to make sure that it is defined because some database types may be some Legacy databases or applications that needs to show this data do need to have this defined so it is better to have it than not to have it okay so with that said let’s go and talk about a float number so we can also Define a float which is of course also going to be when you have a decimal point so you can for example say you have minus something you know this number right here dot something and you can of course have a Max and a minimum that you can store inside when it comes to bytes uh in this case it is also going to be four bytes which means that we can store I’m not going to type it out here cuz it is you know a long number like these ones up here but essentially you have a minimum and a maximum which is equal to four bytes that you can store inside this particular column here uh the same thing goes when we have something called a double so we have something called a double which can store much larger decimal points so just like we have up here a inch and we have a big int so we have one for storing you know a normal amount of numbers and one for storing a large amount of numbers the same thing goes for float and double this is a small amount of numbers and then this one down here can have a lot greater amount of numbers inside of it when it comes to like decimal points and that kind of thing so uh we do have different data types again just like with numbers we have the same thing when it comes to decimal points um and then we do also have something called vaa now Vara is when we have to do with characters uh so let’s say I go in here we can also create the parentheses which is actually something you should do cuz the default is going to be one uh which is this right here and that is not really useful for anything cuz that means we can store one character inside this column here um so it is you know you should create parentheses outside vaa in order to define something here so in this case here we could for example say 10 so what this would basically mean is that I can store 10 characters as a string inside this data type so if I were to write Daniel uh this would be able to be stored in there but if I were to write something like Danny cing which is going to be more than 10 characters is going to cut off the last parts of this string here because we only allow 10 characters inside this column here so depending on how many characters you want to allow inside this column here you need to change this number in order to allow for that amount of characters now when it comes to something like let’s say a username you could say something like 30 cuz you know 30 characters for a username might be plenty so you don’t want to be able to store more than that so we do have different numbers we can provide in here depending on the purpose of what we want to create inside our database if you have a password uh then we can also go down and say maybe something like um 255 because we want to be allowing many characters for a password but I have rarely seen anyone use more than 255 characters when it comes to using a password U so of course you know you can Define different things depending on the purpose that you want to allow the person to insert inside this particular column here and just like before we do also have a certain number of bytes you can store inside a v chart data type so in this case here it would be in the range of something like and again this really depends on the database because some databases only allow for 255 which is why I use that one as a maximum um but you can also in some database do up to 65,535 bytes so you know it really depends on the databased type you’re using in our case I do believe we can store many bytes inside this uh inside our database here but 255 is kind of like the typical number that you define inside a vacha data type because then you know that it can be stored in many different types of databases because this is the maximum for some databases uh so 255 is also plenty in my opinion for storing U you know characters because you know we have other data types of storing much greater number of characters for example we do also have a data type called text and just like before when we talked about int big int float and double if you want to store many characters inside a column you can just use something called text which is going to just be defined as text and then you can store for example a blog post or a big comment for post inside your website that has a lot of characters and text inside of it so uh using text for for example comments and blog post and that kind of thing is kind of what we need to use this data type for whereas vacha might be something used for usernames and P password you know something that’s not a huge paragraph that needs to be written inside your website so again choosing the proper data type for a certain type of data or usage inside your website that is appropriate to the amount of characters that you might be using is something you should be doing but now the last type of data type that I want to talk about here is something called date and date time so we have something called Date here which is basically when uh you want to create a date for a certain moment in time so for example today it is the year 2023 and it’s May month which means 05 and then it’s the 14th of this month year uh so we do have different types of uh formatting when it comes to our date and date time and that kind of thing so the formatting is something we need to be aware of when we upload a date to a database because if we don’t format it correctly it is not going to get stored inside a database so when you write PHP code you want to make sure you format it in the same way as the databas is so with we do also have something called date time so we have date time and that is basically the same thing so we can actually copy paste this but we do also have the time so if I were to go in here and say that right now it is 11:30 in the middle of the day so it is the 11th hour and then we have the 30th minute and then we have the let’s just say the zero second of the day uh so this would be 11:30 and then of course we go into not a.m. and p.m. but we’re going into for example uh 17 if it’s 5:00 in the afternoon so we go after this time format here so these are the different data types that I want to talk about but I do want to talk about something called signed and unsigned when it comes to using numbers up here because let’s say we have this integer example here let’s just go and delete everything else now we did talk about there being a certain number of bytes available inside these different data types that we have in here and when it comes to a integer data dat type we have four bytes available to us and that basically means that we can range from this negative number here to this positive number here however if I were to go in and say I want to Define my integer as signed this right here means that we can actually store a negative number inside our database column as well so this would be uh this range that we have right here but I can also go in and Define this one as unsigned which means that we don’t want to store negative number numbers inside this particular number column and that opens up a little bit of options for us because right now we only have four bytes available which means that this is the maximum positive number we can use but when we cut out the negative numbers we can store from zero until a much greater positive number because we have more bytes available and now we cut out all the negative numbers which means that we can store up till actually just went ahead and Googled it here CU that was a little bit easier but you can store the twice as much number when it comes to the positive number so inside a column you can define something called signed and unsigned when it comes to numbers that goes down into the negative range because we want to maybe not allow negative numbers to allow more spacing for positive numbers so that is something that is just important to mention here so now that we talked about all of this let’s actually go and talk about how to actually create a table because now we got a lot of dry knowledge about data types and signed and unsigned and you know defining parameters and you know bytes and that kind of thing so let’s talk about how to actually create a database table so if we were to go in here we can define a create table keywords it’s called which basically means that we’re going to create a table named something so in this case if we can name something called users if that’s how we want to create a table called and this of course would be information about a user inside your website so for example username and password email you know the date that you signed up inside the website that kind of thing there is something to note here which is if you were to write this you may notice that we get a popup which says that this right here is a existing keyword inside our MySQL keywords here so we don’t want to be using a existing keyword so this right here is a no no okay so we want to make sure that we write something that doesn’t pop up as an existing keyword otherwise you can end up in a little bit of you know errors and that kind of thing so make sure you don’t do that so one of the things that I do when it comes to naming a table is to say well inside a table we have many entries of data right so we have many users inside this table which means that it makes sense to call it users in plural because we have many uses inside this table here so I like to name mine users and it is allowed to use a underscore for something specific so if you want to write something you can use an underscore but in this case I think uses is good enough parentheses and semic one and then I’ll open up the parentheses and then we can start creating all the different columns inside this table here in between the parentheses so now we need to think about what kind of information do I want to remember about a user inside my website when it comes to a you know database and information kind of purpose the first thing I want to do here which is something you need to do in pretty much all the different tables you create is to make sure you have something called an ID so I’m just going to go and name this one ID and then I’m going to define a int data type and like we talked about we don’t really need to have something behind inter but for the sake of making sure the Legacy databases and that kind of thing can can use this data for something let’s go ahead and make sure we Define 11 in here just to to make sure we have it defined even though it won’t really matter to us in most cases as a web developer we we should still Define it in here uh so what I’ll do is I’ll go after and say that I want this data type to be not null which means that we don’t want it to be nothing uh that’s basically what null means it means nothing it is different than not having any sort of data it just basically means nothing which is a concept we have inside programming um but basically this means that we we need to have data inside this particular column here and what I’m also going to do here is I’m also going to define something called Auto unor increment and I know I’m not really explaining all of this right now so let me go ah and explain it right after this line of code here so basically whenever we have a table we want to make sure that we can find data inside this table very easily which means that having a ID for all the different rows we have inside the table is going to make it a lot easier for us to grab certain data so let’s say I have a user that has an ID as 65 for example if I were to look inside my database table for the user that has an ID at 65 which by the way he’s the only user who can have that number then it’s a lot easier for me to find that user inside the database than trying to search for his username or something so whenever we’re trying to search for something inside this table here having an ID for all the different rows inside the table is going to make a lot easier for us so basically what we’re doing here is we’re saying that we want to have an ID for all these different users that is going to be a unique identifier that is what id stands for and I want this to be a number data type and I want to make sure that there is a number for all the users in here cuz this cannot be empty and now in order to not manually having to write a ID for every user whenever we create a user inside our website I added something called autoincrement which means that our database is just going to handle this ID column by itself and automatically add a number to this user whenever we create a new user inside this table here so user number one is of course going to be user number zero and then the next user is going to have an ID is one and then number two and then three and then four and then it’s going to keep counting up every single time you add a new user to the database so this is automatically going to increment a number hence the autoincrement keyword and this by the way is unsigned which means that it’s going to use the positive numbers and not negative numbers so this is automatically also going to declare this as being a unsigned and this is something that you have to remember this particular line of SQL code because we use this pretty much in every single table we create inside our database because all our entries needs to have an ID so having this particular line of code as the first thing is going to be very very important now we do have something called a primary key that we need to Define inside this table here which is going to be this particular number but we’re going to wait with that until after we declared all the columns because I want to talk about it afterwards uh so for the people who do know a little bit of SQL here just we’ll get to it okay um so the next one here could for example be a username so let’s say we want to declare a username for this user so we can say username and I want this to be a v chart data type because this is of course course going to be a set of characters because we need to have like you know Crossing or something you know as a username uh so what I’m going to Define here is just 30 because I want to allow 30 characters inside this username more than that I think it’s going to be you know overdoing it a little bit so if a user tries to declare something bigger than this then it’s just going to get cut off at the end there because we don’t want to have more than 30 characters you could also say that maybe like 20 characters is plenty uh but let’s just go and go with 30 for now uh we do also want to declare this one as not null cuz I do want to make sure there is some data inside this column here and then I want to go down to next line and we can actually copy paste what we have here cuz the next one is going to be very similar and this one is going to be the password now there’s a reason why I don’t write password and you may see it there because there is a built-in keyword called password so instead I’m going to declare a PWD which is kind of a short hand for password and doing that I do want to allow more than 30 characters and when it comes to passwords we don’t want to really limit our user when it comes to a password we want to allow them to create as long as a password as they want for security reasons cu the longer it is the better it is but let’s not go overboard here let’s go ahead and say we want to allow 255 characters which we talked about is kind of like the maximum number for some databases so let’s go and make sure we Define uh 255 in here which is plenty for password I think so we don’t need to have more than that uh after this one we can go and go down to the bottom and maybe say something like email and let’s go and Define a vaa as well so we’re just going to copy paste here and I want to allow something like let’s say 100 characters cuz I think you know an email of more than 100 characters doesn’t really exist out there so let’s just go and Define 100 characters and for the last column here let’s go and Define a date time for when they us to sign up inside our website so we know when they signed up inside the website so what I could do is I could create a column called something like created underscore at just so we know you know we have some kind of name for this column here you can call whatever you want in my case I’m just going to call it created at and I’m going to call this one a date time format or data type so to speak and inside of here what we can do is first of all Define a not no which means that it should not be empty and we can also go and Define something called a default which means that if I decide not to write something and send it to my database table here to create a new user then if left empty it is going to by default assign something by itself to this particular column here so what I could say is I could use the keyword called default and actually assign a default value so in this case I could say you know just to give an example here that we have a year a month a day uh we do also have a hour we have a minute and a second and this would be a default date time uh that I could set for this particular database here but of course this doesn’t really make sense like this is you know the year zero at the zero hour so basically the creation of the universe or something so this doesn’t really make sense but what we do have is another keyword inside the database here called current and then you can see we get date and time so one here is just the the date format and the other one is the date time format so we can say current time which means that it’s going to automatically create the time based on the server time so this basically means that we don’t really have to define a date time using PHP if we don’t want to we can do it because this is just a default which means that if we don’t submit something then it’s just going to assign the current time based on the database server but you can also submit a date time using PHP if you want to so you have kind of like an option now but now we do also have something called a primary key and the way you could Define that is by for example going up inside the one column that has to be the primary key and just write primary key inside this this particular column here and now this is defined as a primary key so this would be correct but it is also just kind of a habit to go down here at the bottom and say that you want to have a primary key so we can see we have primary key and we want to define a column so we can say parentheses and that is going to be the ID column which is the one that we have up here and doing this here is also a way to do it so that is just a second way of doing it instead of writing it directly inside the actual column up here um and do note that I’m not writing a at the end cuz the last line of code inside this particular SQL statement here inside the parentheses has to be without a comma so all the other ones you need to include a comma but for the last one you leave it out otherwise you’re going to get an error message now a primary key is basically just a way for us to Define which column inside this table is going to be the one that we use that has to be unique so it can’t be duplicated elsewhere inside any other rows inside this database so for example we can’t have one user that has an idea 65 and then another user that also has an idea 65 because then we start getting error messages so primary key is just basically a way for us to create a unique ID for all the different users in here so we can very fast just grab a user and you know find them very fast inside our database so now with this created we actually do have a database table we can just run inside our database and actually create it uh let’s just go ahead and out of habit just copy everything because because in case something goes wrong and it’s always a good idea to have this you can also go and store this information inside a empty text file or something so you have you know all this data somewhere so in case something goes wrong and oops okay so this particular one up here could not have been named username so I have to call it user uncore name or something instead then instead of having to rewrite everything you have everything stored somewhere so that is a recommendation that I have so you have it saved essentially um so what I can do is I can scroll down and then I can say we want to go which means that we’re going to run this inside our database and then you can see we now have our first database table which is called users if I were to click the database you can see okay so we have our users table right here and we can click it or we can click it over here in the side and then you can see we have an ID username password email and created ad inside this column here or inside the table it’s called um so right now you can see we don’t actually have any sort of data otherwise we could see it below here you just listed out we’re going to talk about how to insert data and update and all that stuff in the next episode but for now let’s go and create another table uh because we do also need to talk about something called a foreign key so again we want to make sure the database is selected and because I made everything so tiny by zooming in it’s now a burger menu for some reason if I would to do this you know to zoom out you can see that I have it up here uh but basically we’re just going to go and click the SQL tab once more I’ll zoom in again so you can see it and we’re going to go and create a second table so in this case I’m going to create a table I’m going to call this one comments because we’re going to create comments that the user can make inside a website underneath something so a picture or a video or something like that so we’re just going to go and create a comment table parentheses and semicolon and what I’ll do is of course I need to Define an ID cuz that’s the first thing so we’re going to say we have an ID this is going to be a int data type and just like before we’re just going to set 11 as a default one and we’re going to say this one is not null we’re going to say this is auto increments so Auto uncore increment so it automatically assigns a new number comma next line and then I’m going and say okay so what do we need to know about this comment here we need to know U for example the username of the person who made this comment so we could say username and we can say this is a v chat data type we’re going to define a username length which in this case it could be 30 because that’s what we defined in the previous table so we’re just going to say 30 here as well not null and then I go down to next line and we do also need to have some text in here of course cuz you need to write a comment so there has to be text in here right so instead of using vaa for this one because we want to allow for the person to write many characters inside this comment here we could also use a text data type so let’s go and say we want to have the comment uh message or just comment text let’s go and do that cuz that’s a lot shorter so comment text and I can say this is a text data type I want to set this one to not no and I want to go down to next line let’s also go and create a timestamp for this particular um when this was created so we’re going to create a datetime data type and we’re going to call it something like creatore at cuz again we can just reuse the same name as the previous one um and then we’ll also go and Define a not null and we can also go and create a default and then we can again use the same thing so we can say current time stamp or current uh time it’s called so it will just automatically create a time stamp for this particular comment once it’s actually created and then at the end here we’re going to create our primary key so we’re going to say we have a primary key which is going to be our ID so we’re going to Define ID inside this particular one here now we want to also Define a foreign key in this example here cuz we can create something called a relationship between one database table and another database table so right now we have a user who made this comment so we’re trying to think logically here which means that we can actually tie a comment to a particular user and you might be thinking well Daniel we defined a username isn’t that what you’re saying so if we say that a user called cing from the users table uh now is also named Crossing inside this comment table here aren’t those connected then um to a human that might be connected but for a datab base that is not connected uh there’s no relationship going on between the two tables so what I can do is I can actually say that okay so this comment here let’s say we actually upload a comment to this table here has to be connected to a user that has a certain user ID again the primary key inside the users table has to be connected to that particular comment and there’s a couple of reasons why we can do this let’s for example say I go inside my website and I sign up as a user and now I have a a user account then I go inside a picture and I write a comment underneath the picture now what is going to happen when I delete my user account is it going to delete all the comments inside the website that I made with that account or is it just going to throw me an error message because hey you made comments inside the website so you’re not allowed to delete your account or should we just go ahead and say that okay so we can delete the user account but we now need to Define all the comments the user made as a deleted user because the user no longer exists inside the website so what needs to happen once we have this relationship and you decide to lead a user from inside the website so what I want to do here is I want to first of all Define a column that is going to reference another column inside my users table and when it comes to naming this column here we can give it any kind of name that we want to but in my my case I think it makes sense to say that this is from the users table underscore and it’s going to be the ID for the users table so just a little bit of logic here for me so I know exactly what this is and what I can do is I can define a data type and not null and all this kind of thing um but it’s very important that when it comes to the data type that we assigned the same data type that is inside my users table for this particular column that I want to reference to so in this this case here this is the ID for inside my users table which means that we have the same type of data as we have up here which is int 11 so we need to make sure that we Define the same data type for this particular column here then I can also go and say not null and what I can do now is I can go down below my primary key and I can define a foreign key so we can say foreign key the first thing we need to Define here is which of my columns inside this particular table is going to be my foreign keys in this case here I want to say this is my users ID this is the one that I want to reference to a key from another table so what I need to do is write references because we reference another table called users and we point to a column inside this users table called ID because that is the ID from inside the users table that I’m trying to reference to inside this column here and now with this we could just go ahead and submit it and that would be okay everything would work perfectly fine um however like I talked about previously if I were to go inside my website and create an account and write a comment underneath a video or a picture or something and I then delete my user account what is going to happen now now as a default you’re going to get an error message because as a default we have something called on delete and then we can write something like no action and what this basically means just to kind of explain this for you is if I were to go inside and delete a user from inside my users table that has a certain ID that is connected to a comment that is made inside this table here so right now there’s a relationship going on between a comment and a user from inside the users table if I were to delete the user so on delete then I want no action to be made so essentially it’s going to throw an error message and not delete the user because we don’t want to delete the user because there’s a relationship going on here so if we delete the user then it’s going to break our database table relationship and this is basically the same thing as doing this right here because this is actually the default state of what is going to happen if you try to delete a user that has made a comment so that is not really going to make a lot of sense in most websites like logically in the real world this is not going to make a lot of sense because you know I should be able to go inside a website and delete my user account even if I made a comment somewhere like that should be a valid thing to do uh so we do also have something called Cascade so on thead I want to Cascade which basically means that if there’s any comments inside this table here that has a relationship to a user from inside the users table that is now being deleted then also go ahead and delete all the comments made by that particular user so that is what Cascade is going to do but we do also have one called set null which is basically going to instead of you know deleting all the entries or throwing an error message this one is just going to go ahead and set this column in here as null whenever we delete a user that this one has a relationship to which basically means that there’s not going to be any sort of ID that we’re pointing to inside the users table it’s just going to delete it from inside this column here but now if I were to try and run this code inside my editor here so let’s go and make sure we save it just to make sure if we were to scroll down and actually run this you’ll notice that we get a error message message oh no there is a error which is called error number 10005 which is actually when it comes to the foreign key being written wrong inside this table here now if you know a lot about logic inside a table you may see what is wrong here because right now I’m telling it if I were to delete a user from inside the users table then go ahead and set the comment column which is called users ID to know right but what did we also Define inside this column here we said it cannot be null so right now we’re saying okay so if we delete a user set this column to null but hey oh we’re not allowed to do that so if I were to do this down here I do also need to make sure that we don’t have not null inside this column here otherwise we cannot do it so we need to make sure we do this in order to submit it so now that I have this again we can copy everything go down to the bottom make sure you have no comma at the end here by the way and go ahead and submit this then you can see everything works out just fine so now if you were to go inside my database you can see oh we have two tables now we have a comments and a users table and these actually have a relationship with each other we have a foreign key that points to another table so now we actually have something going on here and with this we now know a little bit about creating tables inside a database or you know a lot about creating tables inside the database of course you can go much deeper into it uh but for now I think as a beginner sort of lesson that is already quite long this is going to be plenty for teaching you how to create tables inside a database so for now this is what you need to know about creating tables and in next video we’ll talk about how to write some SQL code to just insert and select data it it’s much more simple than this episode by the way um this episode was quite long and complex compared to the next episode because we just need to write like one liner code in order to insert data into a database you know into one of these tables here so that is going going to be much simpler okay so with that said I hope you enjoyed this lesson and I’ll see you guys in the next [Music] video so now that we learned how to create a table in the last episode I thought it was a good idea to talk a bit about how to actually insert data inside our database table since right now we have these two tables that we created but we don’t really have any s of data inside of them we’re not going to talk about selecting data in this episode here since we also need to talk about something called joints in order to talk properly about selecting data and that would mean that this would actually be a little bit longer episode so for now let’s just go and talk about inserting deleting and updating data since it’s fairly simple to do so we don’t really need to have a long episode to explain that with that said as you can see right now I selected my database and inside our database we have comments and a users t table since we created that in the last episode now what we’re going to do is we’re going to talk a bit about how to insert data to begin with so I’m going to go inside my SQL tab up here make sure you do have your database selected over here on the side and from in here we’re going to go ahead and write some SQL that is going to insert some data inside our users table just so we have something to to work with you know to teach you how to insert data so what I’m going to do is I’m going to write something uh called a insert into statement which basically means that we’re telling it to insert some data inside one of our tables and in this case we want to insert into users which is our users table and then we want to tell it what exactly do we want to insert inside this table here so in this case here we do have a couple of table rows that we want to do something to and when it comes to inserting a row of data we do have different columns that we need to provide some uh some data for uh so if I were to actually right click on users and open that in a new tab so we can actually see our users table you can see that right now we have an ID a user name a password an email and created at so those are the five columns that we need to insert data for now in the last episode we did talk about ID being automatic so we didn’t have to touch that one it’s just going to automatically create an ID and we did also create a default value for our created ad so we don’t actually need to create data for this one either so right now the only one we actually have to do something for is username password and email so what I can do is I can go back inside my insert statement and inside the parentheses I want to tell it which columns do I want to insert data into so in this case that we want to say that we want to insert inside our uh username then we do also have a password and we had a email so right now we have these three different columns I want to insert data into and you have to remember the the order here because the order is going to matter and afterwards we want to say that we want to include some values to insert inside these columns so we’re going to say values which are going to be inside a parentheses as well semicolon and inside of here I want to provide some strings since in this case we do want to insert strings not numbers and if it had been a number I would just write a number in here but because we’re dealing with a string or characters I want to make sure we have these sing quotes you can also use double quotes but it is just kind of a habit inside when it comes to SQL statements that we use single quotes So for that I’m going to go and insert a username so in this case I could call myself cing just to do that I could also provide a password so in this case yeah I could say something like Danny 123 just to you know have something in here uh I do also want to point out when it comes to actually inserting a password you know in more real life examples we do need to Hash the password first so it’s more secure uh because if a hacker were to gain access to our database it shouldn’t be able to tell what the password is so you know doing a little bit of hashing for the password is something you need to do uh but just because we’re practicing here we’re just going to go ahead and insert a password that we can actually see inside the database because we want to see if this works so afterwards here I’m going to go and provide the last one which is going to be an email so I’m just going to say uh John do John do at so John do at gmail . just to you know give it something this is just a placeholder email and just again to make sure we have this saved I’m just going to copy everything here and I’m just going to go and open up my text editor and just paste it in so now we have it stored somewhere so I can actually go ahead and see it in here you know so we we can just copy paste it again if we need it for another time um so what I can do is I can go back in here scroll down and I’m just going to go and submit this one so I’m going to click go and when I do this you can see one row inserted inside our database table so if we want to click this users table or just go into the tab that we have open refresh it you can now see that we have a piece of data so right now we have aids1 we have clossing Danny 123 John Doe and then we have a date for the the time right now that I created this user here so everything is working perfectly so now let’s go ahead and go in and add a second user just for an example here so I’m going to go and go back make sure my database is selected now because I’m zoomed in it’s going to give me this burger menu up here so don’t worry too much about that just go in Click SQL again and I’m going to go and paste them what we had and I’m just going to change the values here so we can say this is going to be Bess and this is going to be just Bess 123 and I’m also going to go and change my email to Bess gmail.com and I’m just going to scroll down and click go so now for I want to go in you can now see that we have two different users us so now we have an idas one and an idas 2 and remember the ID is going to be a unique identifier so in this case here you know each user has a unique number for each of them that is going to be relevant for a little bit later in this video here um so for now let’s just go ahead and save this as it is and talk a bit about how to go in and update one of these tables here so if I were to go back in and make sure we have SQL clicked I can go in we can now create a update statement so if I were to say want to update one of these rows of data um just to go back in here just to show you uh so this is a row of data as you can see horizontally we have all this data here and then we have the columns which is the ID the username the password email and creat AD so you can see how we have rows and columns right just to point it out uh so going back in I want to change one of the rows from inside my table so what I can do is I can write update which is another command that we have here and I need to tell it which table do I want to update in this case here so right now I want to update the users table and I need to tell it okay so we have the user table selected but what do I want to change and from which specific row and this is where the ID comes in because what I can do is I can say I want to set a new value so in this case here I can say let’s say I want to change the username of Bess for example what I can do is I can go in and say I want to change the username and I want to set it to a new value so I’m going to set it equal to a new string but like I said it is more common to use single quote so let’s go Ahad and stick to what I’m saying um so what I can do is instead of saying Bessa 12 three is I can say Bessa uh 456 just to change it to something else now we have you know not one two three but we have 456 if you want to change the second piece of data you can also do that so you can also say comma and then add another piece of data from inside that particular row you want to change so in this case here I can say that I want to change maybe the I just realized this is actually the uh the password I just wrote in here so let’s go and copy this uh this information here and say I want to change the PWD into Bassa 456 because that makes more sense so let’s change the the username into something else let’s call this one Bassa is cool just to have something right because he is kind of cool he’s sitting right over there um so what we can do now is we picked two columns that I want to change and you could pick all of them if you wanted so you can just keep adding commas and add some other data um but in this case I’m just going to go and say I want to change these two different columns and I do also need to tell it where from inside this table I want to select a row because right now we don’t actually know exactly what we’re picking like right now we’re just saying oh set all the usernames and all the passwords to this value but we need to pick a specific user that we want to graph from the the mix of of users so what I can do is I can say where the ID is something specific so I can say where ID is going to be equal to two because if I were to go back inside our users table you can see the Bessa has an ID as to so in this case here I can just go ah and pick out you know the person with the ID of a specific ID is going to have this data changed about it um if you don’t know the ID of the user you can of course also go in and say that okay so right now it’s the person with the username that is equal to uh what was it Bessa um or if I want to say okay so we need to have the user be a user with a username of Bessa but also so and the password should be equal to something else so Bess one two 3 for example here inside strings of course so we’ll make sure we have single quotes there we go um so in this case here we only change the information if Bess has this username and this password here or we can also go in and literally I just made an unintended pun there uh we can also say or instead of and and say that if the username is equal to cing so in this example here I’m changing the username and the password of two different users inside my database so you can also use you know a username search two times in a row row and just say okay so if the user has a username A Bess or crossing then change them inside the database or ID you can also write ID and say ID is going to be equal to uh one so we can actually say this is a integer so we say one or the ID is equal to two so this would also be the first two users inside the the table so you know like we can mix a match things here and and mess around with it as much as you want um but let’s just go ahead and go back to just is saying where ID is equal to one in this case here so if we were to actually run this and go down say okay or go it’s called Uh then you can see if for where to go back inside my users table notice how bassim uh is going to have his username changed and his password is going to change once I update okay so I accidentally set the user ID as one okay so we changed the wrong one here so instead of changing you know the Bas one down here we actually updated my cing one uh because wrote we wanted to change it where the ID is one and not two uh small mistake on my end but hey it it kind of proves my point so now you can see the old version down here and the new version up here so you can see that it is actually changed um so what we can do now is talk a bit about how to delete data from inside the database and I want to give you kind of a small little example here because I get a question quite often when it comes to deleting data from a database and I want to kind of prove a point here so what I’ll do is I’ll go in here and I want to say we want to delete from our users database so delete from users and I want to tell it which row do I want to delete from inside this users table which is going to be done in the same sense as we just did with the update because we have to pick the specific row maybe based on an ID or username or something you know can mix and Max this with and and or just like we did before but let’s just go and say we want to delete the one that has an IDE D equal to 1 which is the one we also just updated so we had Bessa is cool and Bessa 4556 right so if we were to do this and go back down to the bottom and run this you can see that now we get a small popup so it actually says are you sure you want to really execute this quy and I’m just going to say yes here and then we say one row is affected so if we go back inside and refresh you’ll notice that now we only have our second user inside the database table and this is where I’m going to prove a point because what is going to happen when I insert another user inside my table here because if were to go back inside my little uh code that I saved in here conveniently and went back inside and ran a new insert statement so if we were to go inside my SQL tab here and run a insert statement and say we want to insert Crossing Denny 123 you know blah blah blah and run this what user ID is you’re going to get if you guessed one you are incorrect because if we go back in here and refresh you can see oh okay so Bessa has an IDE is two and then Crossing has an ID as three oh no but that messes with my brain cuz where is user with the ID as one inside this table here I do sometimes get comments underneath my video asking about so what do we do in this situation here cuz you know one is missing so so what are we going to do uh can you just go inside and maybe change this so we write one and then we write two down here uh so you actually do this and you actually update it because you can do it like this as well if you wanted to um so if I do it like this ah now everything is matching right if we can actually get this out of the way so now user number one is B and user number two is crossing so ah now it’s not going to be two and three anymore you know so it’s not like weird or something but it’s very important to point out here that doing what I just did changing the IDS manually by just going in and changing them is a big no no okay you cannot do that let’s say for example that one of my users made a comment inside the comments table which now means that one of those users are assigned to a comment and then I manually afterwards go in and change the IDS of all my users then all of a sudden all the comments and which user made those comments are going to get all messed up inside the database so don’t change the ID manually just go ahead and leave the numbers broken as it is because it’s supposed to be be broken if you start deleting users so if it says in this case here I can actually just show you another thing here uh if I were to try and go in and change the ID to two it is going to give me an error message because this is the primary key which means that there cannot be the same ID for all the different users so in this case because I tried to change this one to two but we also do have another user that has an ID is two uh it it doesn’t allow me to do this uh so going back here I would have to go in and Tin this one to three because now I can tin this one to two because now there’s no duplicates okay so this right here is the right thing okay don’t go in and change these numbers to one and two because oh it makes sense to your brain uh to do this so I get this question quite a lot so I just wanted to make sure that this was answered properly in a lesson I do know I kind of went on a rant here because I do get this question quite often but I just wanted to make sure that people didn’t start changing the IDs manually inside a database because like I said it starts Breaking All the relationships to other tables and that kind of thing so uh with that said we have now learned how to insert update and delete data from inside our database tables so in the next video we’re going to talk a bit about how to select data from inside a database table since that is very important to know as so you can actually select and show data inside your websites and we will talk about selecting data but also how to join data together together if you have data from two different tables uh let’s actually go and do one last thing in preparation for that so let’s go ahead and copy the insert code that we have here go back inside our database make sure it’s selected and go inside our SQL console what I want to do is I want to insert inside comments and I want to insert a comment from one of the users inside my table here because that is going to be relevant when it comes to talking about joints and that kind of thing in the next episode so so what I will do is I’ll open up my comments inside a new tab so we can actually see what is going on and inside the comments table we do want to remember that we have a username a common text and also a users’s ID because these other ones the ID and the created app is going to be automatically created for us so we don’t need to worry about this one uh so we have these three columns here so username I’m just going to copy it go back in here and say I want to you know paste it in it was already in there so we didn’t need to paste anything I do also want to grab the common text paste that in as the second one and then I want to paste in the users’s ID now it is important to keep in mind that because the users uncore ID is a foreign key it has to match one of the users from inside my users table otherwise we’re going to get an error message because there’s no user connected to this comment here and we did set it up in the previous videos to make sure that we do need to have a user connected to it okay so it is important that we have a user that is existing inside the database so with the values here I’m just going to go and say we have a username so the username for this user could for example be cing and in this case here if we were to go back inside my database inside the users table uh cing right now has an ideas three so I’m just going to copy that then we’re going to go back in and make sure that the users ID which is the last one down here does have the same ID as that user inside the users table and I do also want to go in and write a message which is going to be my commment so I can say this is a comment on a website just so we have something in here and with this if I were to just copy this to make sure that we have it saved if I go down and click go you can now see that we’re going to have a comment inside my comments table so if we want to go in here you can see we have an ID we have a you know cing this is a comment on a website created that and then we do also have our users ID from the user inside our users table so now everything is working like intended so with this comment here we’re now ready for the next video where we’re going to select data from inside our database so with that said I hope you enjoyed and I’ll see you guys in the next [Music] video so in the last video I showed you how to insert update and delete data from inside a table and in this video we’re going to talk about how to select data since we we need to know how to do that in order to select data and show it inside a website so with that said let’s just go ahead and dive straight into it here uh in the last video we did create a couple of data inside our tables here so inside my comments table you can see that I have uh one comment from one user and inside my users table I do have two different users that I could do something with inside my database so we have Bessa and crossing and what I want to do here is I want to go inside my database and go back inside my SQL tab now again it looks a bit weird on my screen here cuz I’m zoomed in but if it were to zoom out you can see it’s right there um and what I want to do here is I want to create a select statement so we can actually select some data from inside one of the tables and actually show and we can do that directly inside our console here so if were to go in I can write a select statement so I could say I want to select and then I want to say what do I want to select you know what kind of columns do I want to select here so I could for example say username I could also write a comma and say I want to show the email and then I need to tell from which table inside our database they want to do this from so from inside our users table and then I want to write where so we can actually select these specific row that I want to select data from since otherwise it would just select all the users from inside the database um so right now what I want to do here is just kind of tell it which row they want to select from so I could for example say where the ID is equal to three in this case here so if I were to do this we can actually output data um so if you want to run this you can go down click go and then you can see we get some data in here so one total we got from this Cory here so if we want to scroll down you can see okay so we got a person called cing with an email called John Doe because he is the one that has a ID set to three inside my users table so we selected some data from inside this table here using the select statement and we got the information that we asked for which was the username and the email in this case here and we can do the same thing when it comes to a comment so what I can also do is I can go back up here make sure that we go inside our database I want to select the SQL console and that I can just paste in our select statements and say that I want to select the username the commentor text from not the users table but the comment table and we do want to make sure we change this last ID over here because if I were to go inside my comments table if you followed the last video uh you’ll know that we right now have an ID column but we do also have a users uncore ID and the ID column is the ID for this specific comment but the users uncore ID is the ID for the user who made this comment here so it’s very important that we we pick the right one here uh so users uncore ID is what we need to select over here so users uncore ID and I’m just going to go ahead and copy everything to make sure it’s saved go back down and then I’ll go and quy this inside my database base and then you can see we get another user or at least a comment from a user here called cing and we get this is a comment on a website now we do also have something else we can do which is something that you usually see people do when it comes to selecting data from a database if we were to go back inside my SQL console I can do the same thing but instead of writing which specific columns I want to pick something from I can go ahead and write a star symbol or a multiplication symbol um and that will actually go select everything from inside this row here so not just specific columns but everything okay so what I can do is I can just go and save this go back down run this query and then you can see we get everything so we get the ID the username the comment text the Creator ad and the users uncore ID of this particular comment here so it’s not really that difficult to select data from inside one of these tables you just need to run a select statement and just fill in the blanks essentially but now let’s talk about something something called a join which is when you select data from two different tables at the same time or actually you can do as many tables as you want but let’s just go and focus on two here uh so let’s say I want to select my user called clossing but I also want to select his comment from inside the comment table so now we’re actually grabbing two different uh rows of data from two different tables what we can do is I can go and make sure I select my database and open up the SQL console and I’m just going to go and paste in what we had here from the previous example so select everything from comments where users uncore ID is equal to three so now when it comes to creating a join we have a couple of different types that we can use we have something called a inner join we have something called a left join a right join and in some databases we do also have something called a full join but in my SQL databases like the one we’re using right here I do believe we do not have a full join so instead what you could do is create something called a left join and a right join Union where you basically combine those other two types of join to get the same effect as a full join um again I’m just kind of like rambling here and you probably don’t understand what I’m saying so let’s go and do a example here uh so what I want to do here is I want to go and create a inner join and in order to do that I’m going to say I want to select everything from users and I’m not going to go and add where ID is equal to three because that will actually be created a little bit later on inside this join uh so instead I want to go ah and say I want to select everything from users and do a inner join together with the other table that we have called comments and I want to make sure we do it on a certain column so right now we have two different columns from inside each table and those columns are going to have the same data inside of them to kind of connect them together so right now we have inside our users table we have an ID so our user has an ID is three and inside our comment table we have a comment where the users uncore ID is equal to three so what I want to do here is I want to combine these two tables where we have this same column data right cuz we made a foreign key so we can do that using the foreign key cuz that is perfect for that kind of thing so what I’ll do is I’ll go back inside my quy and say I want to select from my users table so users Dot and then you can see we get some options here so I’m going to select the ID where it’s equal to our comments Dot and then you can see we get users uncore ID and then basically spit out the data based on these two tables here so again before we quy this just to explain it again CU I know joints can be a little bit confusing to people uh we’re basically combining two tables together and we want to select everything from both of these tables and we start by selecting one table so in this case here the users table and then I want to injoin it with my comments table and I want to combine a data from these two tables using one column from each table that has the same data inside of it so if I were to C this just to make sure if we get any sort of Errors we still have it here if we were to scroll down and run this you can actually see that we’re going to get one result and that is going to be my user so in this case here with an ids3 uh cusing password email created at and then we also get the commment over here so everything is combined in one row of data and just to show another example here because you can also go back in here if I were to select my database and run another query and P paste everything back in you don’t have to select everything from both of these tables here you could also just go in and say that you want to select from the users table so users do uh username and you might also want to select something from the comments table so we can say comment dot comment text in this example here and maybe also another piece of data from the comments table so we can say comments. uh created at so if you want to select specific data you can also do that so we would actually run this scroll down you can see we get the same kind of thing but now we just get the The Columns that we asked for from both of these tables here and I do want to point out you that if I were to have another comment inside my comment table made by the other user named Bessa in that case it would actually get two rows of data down here so right now we we have this row of data here but we would actually get a second row below it with Bessa instead because all we’re asking is to grab data from two tables that has matching ID and user ID and spit it out and any other sort of data that does not have any matches is not going to get shown when we actually Cory this which is why we only get one uh piece of data down here but let’s go and talk about left and right join because that is going to change things a little bit so if we would going select my database go back inside my quy and just paste everything in and instead I’m going to do a left join which means that basically this users table is the primary table we have in focus and I want to join it together with any sort of comments that are made by my users so even if a user does not have a comment we’re still going to show all the users from inside our users table but they’re just not going to have the comments shown next to it so by doing a left join you can kind of see here that we have the users on the left here and we have comments on the right side and that is basically what we’re talking about here when we’re doing a left join so you know this is the left side this is the right side uh we can also do a right join which means that we’re talking about the comments on the right side and not the users on the left side so this is the the primary one that we’re focusing on over here but just to kind of demonstrate this if I were to do a left join I am now selecting all the users no matter if they have a comment assigned to them so in this case here if we were to go ahead and do this and run it inside below here you can see if I were to click go we would now get two pieces of data because I’m grabbing all the users but you’ll notice that the user that does not have a comment does not have any sort of data it just has null instead because we have no data so in this case you can kind of see that we still grab everything from our users table but not everything from our comments table only the comments that have a matching user is going to get grabbed and we can also do the same thing the other way so if were to go back inside my database and do a right join instead I can just paste everything in here and say I want to do a right join then I’m going to show all the comments but only the users that actually made a comment where these actually match when it comes to the column so in this case we just going to get one row of data which is going to be the exact same thing as when we did our inner join that is just coincidence by the way so would actually run this you can see we get one row of data and that is going to be our cing because he actually has a commment so we’re showing all the comments here but not all the users which in this case it would just be one row of data so if I were to have more than one comment inside my comments table uh we would have all those comments listed below here but the user information would just say null instead uh so the opposite of doing a left joint essentially in our case here with this example I have uh to show you and that is basically how to select data from inside our database and I just want to point out here that I know we talked about joints in this episode here in a lot of cases when it comes to just grabbing data from a database you’re just going to be doing what we did at the beginning of this video here you’re not going to be using joint for something specific that is more for other specific purposes inside your website we actually do want to combine data from different tables but in most cases you just going to be selecting data using what we did at the beginning so uh don’t worry too much about these joints here they are good to know uh but we’re not going to be using them you know when we start selecting data from inside our website in the upcoming examples when we actually uh start talking about how to use PHP to select data from inside a website database so with that said this is how you select data I hope you enjoyed and I’ll see you guys in the next video [Music] so in the last couple episodes we talked about how to go inside a database and create a table as well as creating data inside those tables and updating them and deleting them you know just kind of like manipulating data inside a database but we haven’t actually talked about how to do that from inside a website so that’s what’re going to do today as you can see I have a very basic website in front of me there’s not really anything special here just basically have a index of PHP which doesn’t really have anything there’s nothing inside the body tag um so what I want to do in here is I want to go ahead and actually create a connection to my database so I can actually go in and run PHP code that can actually query this database so in order to do that we need to have a connection going first so what I’m going to do is I’m going to go inside my project file and I’m going to create a new folder and I’m going to call this one includes now includes B basically means that this is going to contain files that are not going to be seen inside the actual website so for example a pure phsp file that just needs to run a script in order to do something but it’s not a actual file that we visibly see as a page you know in the same senses we see this uh index. PSP file because that’s the front page so the include files are just basically extra files that just run code the first thing I’m going to do inside this folder here is create a new file so I’m going to say I want to create a new file I’m going to call this one on dbh do in.php which stands for database handler. includes. PHP now it’s very important to point out here that it is possible to go in and name it as db. in which is also a kind of file that we can use and create phsp code inside of um but this kind of file can create issues and some people when they hear that I I call it in.php think that we are creating a in file that’s not what we’re doing here the in is just a naming convention so to speak so it doesn’t really do anything uh this is going to be a PHP file so in this case if we could call it db. in or you could call it db- Inc or just dbh Inc if you wanted to it’s really the same thing cuz it’s just a name uh so don’t get confused about the naming convention that I’m using here it’s just a way for us as the developer to know exactly what kind of file this is so what I’m going to do is I’m going to name this file and create it and inside this file I’m going to open up my PHP tag so we can actually create some PHP code and it’s important to point out here cuz we talked about this in my syntax video at the very beginning of this course that when we have a pure phsp file we don’t create a closing tag so for example you would create this at the end of a you know a pair of PHP tags we’re not going to do that when it’s a pure PHP file and the reason for that is if we were to accidentally go below here and create some HTML or something just by mistake then we can create more damage than you know not doing that again you can always go back and watch that episode at the beginning of the course if you want to know more about this but we’re just not going to put it in here okay um so going in here what we can do is we can start off by saying that we want to include some information about our database uh we did of course create a database in the past couple episodes so if I were to go in here you can see that I created a database called my first database and inside this database we also created a couple of tables that could actually have some sort of information inside of it so we have a comments table and we have a users table where we actually do have some users uh just because we learned how to insert and you know update and delete data and that kind of thing so we have some stuff in here is what I’m trying to say all we have to know for now is that we have a database called my first database because we do have this uh PHP my admin hooked up to our server so when we do actually need to connect to our database we do need to tell it which one of all these databases we’re trying to connect to because it is possible to use more than just one database inside a website you can use multiple if you want to and there there is Arguments for doing that you know for different reasons but for most websites you’re just going to have one database for everything um so remember the name my first database so going back inside our file here and I’m going to create a DSN which stands for data source name which is US telling our server uh what kind of database drial we’re trying to use and you know what is the dat database name uh what is the host that we’re trying to connect to here in this case it’s going to be Local Host so we need to give it a little bit of information about this database we’re trying to connect to uh so in our case we’re using a mySQL database so we’re going to create a variable I’m going to call this one DSN and I’m going to set it equal to a string and inside of this string here I’m going to say that I want to connect to a mySQL database driver then I want to tell it what kind of host I’m trying to connect to here in this case it’s going to be Loc host so we’re going to say equal to Local Host semicolon and then I want to tell it the database name which in this case here we did already just go in and check in my case it’s called my first database and again if you called it something else in the past couple episodes you do need to change this so it matches whatever you call your database um so you basically just go in and change the information here depending on what database you’re trying to connect to um so underneath here I need to give it two more pieces of information I want to give it a database username so we’re going to say DB username and this one is going to be equal to root and I do want to explain this in just a second but let’s go ahead and create the next one as well so I’m going to create a database password and this one is going to be empty in my case here password there we go um so basically when we have a database we do also have a username and a password in order to connect to our database which makes sense uh so in my case because I’m using my examp software and I have not gone in and actually changed this the default username and password is going to be root and then no password I do want to point something out here though because if you’re using a Mac computer you may need to go inside your password and write root um because I did experience 12 years ago when I was studying my web development bachelor’s degree that people who were using Mac computers and using xamp did actually need to include root in both places because XM is a little bit different on Mac than it is on Windows when it comes to at least this information here uh so if you’re sitting on Mac and doing this right here doesn’t work for you try writing root both places and see if that works for you or just Google how to change your password and username for your database again there’s a couple of different options here uh we’re just going to stick with this information for now and then I actually want to go down and run a TR catch block so we can actually see we get some a popup here and it looks like this so basically we have a TR cats block which means that we are basically running a blocker code and if an error occurs then I can do something else by catching the error and then doing something with the error mthod that’s basically what a TR catch is and you’ll see this very often inside PHP because a TR catch blog is very useful so what I’m going to do inside my try is I’m going to say that I want to run a PDO connection and we didn’t actually talk about this yet because when it comes to connecting to databases we have three different ways we can do it we have what is called a MySQL connection which is very bad and you should never use that because it’s obsolete and they actually came up with a new way to connect to a database which is called mysqli which stands for improved um this basically goes in and does extra SQL injection prevention um so don’t use my SQL because there is some security things that is just not very good but now let’s not talk more about was you cannot connect to a database cuz we have talked about that now but what you can do is you can connect to a database using mysqli I or we can also use the third method which is called PDO now PDO stands for PHP data objects which is basically another way for us to connect to a database that is a little bit more flexible when it comes to different types of databases out there mysqli is very good when it comes to mySQL databases but if you plan to connect to other types databases for example SQL light or something then you can use something like PDO it has also been a thing in the past lessons of mine that people do request that I use PDO so we are just going to stick to using PDO since that is going to be the one that people lean more towards because it is more flexible um but for people are curious about what exactly the difference is when it comes to the actual programming when it comes to mysqli and PDO um it’s basically just the methods that that you know change a little bit when you when you start programming it if you are curious about mysqli you’re more than welcome to look it up but we’re going to be using PDO in these lessons here so having ranted a little bit about different ways to connect to a database we are now going to create a PDO connection so PHP data objects is a way for us to create a database object when we want to connect to a database so basically we turn the connection into a object that we can use inside our phsp code and just refer to that object whenever we want to connect to a database so what we’re to do is we are going to have a variable called PDO I’m going to go inside of it and create a new PDO object so we’re going to say new PDO and what this basically does is that it instantiates a PDO object off of a existing class inside our PHP language that is going to create this connection based on a couple of parameters so for example what is the you know the database driver going to be what is the uh host going to be what is the database name we’re connecting to what is the username what is the password and then it’s going to create a database connection object that we can use so going inside this PD I’m going to give it a couple of parameters the first one is going to be the DSN which we just created up here uh so we have all of this information then I’m going to give it the username so we’re going to say DB username and then I’m going to give it the database password so doing this here we now have a database object and just to mention it here we could Technic technically just take this one lineer code and do this right here and that would actually be enough to connect to our database if all the information is correct every single time um but we do want to have some sort of error handlers you know if an error happens then we want to be able to grab that error message and show it inside our website um so you know even though this is like the pure bare bone you know enough to connect to a database uh it is a good idea to run this TR cats block here to you know get any sort of potential errors so what I want to do is I want to set a attributes inside this object that we created here uh we can do that by going in and say we want to grab this PDO variable that we just or object that we just created here because now it’s no longer a variable it is actually a object and I want to point to a existing method inside this object called set attributes which is going to allow for us to change a couple of attributes about this particular object that we just created for example how do we want to handle error messages that we may run into when we try to connect to our database so inside the parameters here I can say I want to grab a specific uh attribute so in this case it’s going to be PDO colon colon aore error mode so e r r m o d e you can actually see it pops up over here uh so we’re going to grab the arror mode and then we’re going to say we want to set it to a PDO colon colon e r r m o d eore exception so right now we are saying that if we get a error then we want to throw a exception which means that we can go down inside our cats block down here and actually grab that exception which is you know information about this error here so what I can do is I can say I want to catch my PDO exception and I want to name this one variable e so we’re basically just saying that this is a PD exception type which is going to be named as variable e which is a placeholder that we can refer to inside the curly brackets here so if an error message happens then I want to go in and Echo out a message connection failed colon space and then I want to concatenate a error message so right now we are grabing the Exception by referring to variable e so I want to go after here and paste that in and say I want to run a method called get message parenthesis and semicolon so right now we’re getting the exception which is the error that maybe thrown and then we want to grab the actual error message and Echo that out inside the browser so if we don’t connect correctly to a database then just go ahead and throw an exception here but like I said this one liner code here is actually the one line that we use in order to actually connect to our database so all this other stuff down here is error handling and throwing you know error messages inside the screen if the connection fails that kind of thing so for now just know that this line here is the important one so now that we have this we can actually go in and actually do stuff inside our code so if I wanted to you know select data from a database or if I want to insert data inside my database I can do that by simply running uh this one connection here and actually querry something into my database using PHP code and we haven’t talked about how to do that yet but that is something we’re going to talk about in the next upcoming lessons uh so for now we learn how to connect to our database and in the next upcoming lessons we’re going to learn how to insert data we’re going to learn how to update and delete data so we can actually use the connection for something so I hope you enjoyed this lesson and I’ll see you guys next [Music] time now I just got done watching the last video that I uploaded to my channel and I thought why not just show you how to go in and change your username and password when it comes to connecting to a database because if some of you are sitting there with with you know a Mac computer or something where things are a little bit different when it comes to the password then you may want to know how to change your username and password in order to you know decide yourself what you want it to be and as I did that I did also run into a very well-known bug when it comes to PHP my admin that actually prevents you from going in and clicking on user accounts in order to change your username and password now the error you might be getting is called exam error number 1034 index for table DB is corrupt or something like that so you know having something corrupt inside a table uh there is a very easy way to solve it so I will show you how to do that after I’ll show you how to go and change your username and password and then you know at the end of the video I’ll show you how to solve a corrupt table so the way you change your username and password is by going inside PHP my admin by clicking it up here to make sure you’re inside the main page of PHP my admin uh because if you click a database you can see all the menus change so that is not what you want to do so going inside PHP my admin we’re going to go under user accounts and then you can see we have all these different users that are here as a default now the one that you’re looking for is the one that has a host name of Local Host and a username as root how do we know that well we used Root in the last episode where we actually connected to our database so you know you need to have one where the username is root and also where we connect to a host called Local Host so this is going to be the one down here at the bottom so what you can do is click on edit privileges so you can go in here and then you can see we get a new menu where we can change this user here uh we do have one up here called login information so if you click that one you can see that we can change the username from root to something that we may want it to be um so if I want this to be Denny or something else then we can change it in here just change it go down and actually you know click go at the bottom here in order to make the changes happen uh do not go in here and do the password in here cuz there is apparently a bug that can happen where you go in and change the password directly in here uh I’m not saying it is going to happen to you but it is better to go back up inside the top here where it says change password click it and then change it in here instead so you go in here uh you choose to have a password then you enter you know something so in this case it could be anything that you might want to think of and then you retype it and then you click go and then you basically change the user information and the password for the user that we use in order to connect to a database um but now let’s talk about the bug that you may encounter which is the one called eror code 1034 uh so basically when you click this user accounts up here instead of going inside right here it may throw a error which gives you a popup with the error message that I just told you about and basically can’t access this page here the way you’re going to fix it is by first of all figure out where exactly the corruption is because that is what you need to find out in order to solve it uh so the way you can do that is by going back inside PHP my admin and then clicking on whatever database that it’s actually telling you there is something corrupt inside of so when you give the error message it’s going to give you a quy string where it is going to say there is a corruption or an error happening from a certain database uh so it’s going to have a qu that says something something from a certain database which in my case was from the mySQL database which is the most common one to get this corruption in so if you were to go down click the mySQL database over here in the side you’re going to see all the tables from in here uh in my case it did actually tell me me inside the error message that it was from inside the database table but if you’re a little bit doubt about where the croping is you can scroll down to the bottom here and go down to where you can check all and then with selected you’re going to say you want to check table and when you do that it is going to check and give you you know some status thing now in my case just checking the tables here automatically fixed the error for me which I actually thought I was going to show you how to actually fix the error when I started this video here because I did not go in and repaired it yet uh but just checking the table gave me a couple of error messages it said that my MySQL DB here there was some sort of Errors inside of it it was corrupt uh it gave me red warning messages and I basically just went back again to PHP my admin from here and that fixed the errors for me uh but if that doesn’t work for you then you want to go down and just take note that it was the MySQL do DB table go back inside the mySQL database and then you want to make sure you select the DB table that is over here then you’re going to scroll down to the bottom and with selected you’re going to say repair table and when you do that it is going to try and repair it and when you do that it should also fix the error message for you so after you repaired the table that is broken uh you can go back inside PHP my admin and then you can click on user accounts and then everything should be fixed so you can go in here and and actually um you know change your username and password so that is how I can solve it in my case it solved it just by me checking the table I didn’t even have to repair it in order to to fix fix this issue here but if checking it doesn’t work then choose repair and basically that should work for you so with that said I hope you enjoyed this lesson lesson fix I guess this is kind of well I did show you how to change the username password so this could be considered a lesson so um thank you for watching and I’ll see you guys next time [Music] so in the last episode we learned how to connect to a database directly from inside a website and in this episode we’re going to learn how to insert data directly from inside our website so we don’t have to go inside the database and start typing SQL code in order to do that uh so we’re going to do everything from inside our website here yes I did cut my hair uh it is quite a bit shorter for health reasons so it is a little bit different it wasn’t my choice but it is what it is I do want to start out by pointing out a little bit about what exactly we’re going to be doing when we connect to our database and insert data into our database since there is a couple of ways you can do it uh we did talk about us using PDO in the last episode which is what we’re going to stick to in this video here so we’re not going to use mysqli or MySQL which is outdated uh we will be continuing to use PDO to do this and we’re also going to be using something called prepared statements and that is something that is very important for you to do uh you can insert data into a database without using prepared statements but that is not secure so I don’t think it’s a good idea to teach you how to do it without using prepared statements since there’s never a reason for you to do so uh so we will be using prepared statements in order to securely insert data into a database and just to talk a bit about what exactly prepared statements are and what exactly they’re supposed to do uh let’s say we have a website like this where we have a signup form where you can go ahead and type in your username your password your email and if you use a were to go inside your website here and go inside one of these puts it is actually possible to type code directly inside these inputs here so just like we talked about cross site scripting in a previous episode like you had to sanitize your data and validate it to make sure that people couldn’t inject JavaScript code into your website it is also possible to go in and write SQL code so if you were to write SQL code directly inside this input and the user submits it then they can actually destroy your database because maybe they decide to write a SQL query that can go in just delete the database or something so to prevent the user from being able to write SQL code directly inside an input like we have here uh we need to use prepared statements now the way a prepared statement work is basically we send in the query that we write so the SQL code and we send that to the database first and then afterwards we bind data submitted by the user and then send that to the database afterwards so because we separate the query from the data that the user submits to us we can do them separate ly and not have SQL code have an impact on the query that we write inside our PHP code because they’re separated so using prepared statements is a very good idea so having talked a bit about that let’s actually get started on creating an actual PHP script that can actually insert data into our website so going back inside our editor here you’ll notice that I do have one thing that you do not have from the previous episode uh so in the last episode we did create this database Handler together uh where we can just go in and grab this PDO variable in order to connect to our database but inside my index page I do actually have a form that I created which is the one you just saw inside the browser uh this is just basic HTML form you should know HTML by now so this shouldn’t be anything new to you uh this is just a basic form where I go in and say I want to submit this data to a PHP file which is going to be inside by includes folder called form handler. in.php we did talk about the naming convention that I use here with Inc so if you watched the last episode I did explain that in that episode and I am using a post method since we need to submit data and when we submit data it is more secure to use a post method and that is the method you’re going to be using most of the time when it comes to submitting user data when you want to grab data from a database you use a get method most of the time and then you can see I have a couple of inputs down here I have one for the username I have one for the password and I do also have one for the email address now I do want to point something something out here which is that we do have an attribute inside each of these form inputs which is called name uh we did talk about this in a previous episode I we talked about submitting data using a form uh this name attribute is the name that we’re going to be grabbing inside this file up here when we send the data to the other page so it is very important that you have a name attribute and you remember what they are or you can just go back and and look at your form um so you know exactly what you need to grab in order to grab the data so having talked about this uh let’s go ahead and start creating this form handler. in.php file since that is what we need in order to actually you know run this data submitted by the user so we can actually insert it inside our database I do also want to point out to you before we continue that this is the data that is fitting into the table that we created together in the uh table episode so as you can remember we did actually go inside our database here and we created two tables we created a comment and a user table and inside the users table we do have an ID username password email and created ad now we did set it up so that ID and created ad is automatically created for us so we don’t need to submit any sort of data for that uh but we do need to submit data for username password and email which just so happens to be the three inputs that I included inside my form so now that we know this let’s actually go and create our form handler. in. phsp file so I’m going to go inside my includes folder over here right click say I want to create a new file I’m going to call it for form handler. in.php and having created this one we can now start creating a script that actually goes in and submits this data to our database so the first thing we’re going to be doing is we’re going to start up our PHP tags we’re not going to close them though which we talked about in the previous episode since this is a pure phsp file that is just going to run a script and then that’s it we don’t need to have a closing tag because it can actually cause issues which we don’t want to happen the first thing we’re going to do is to actually run a check to see if the User submitted the data and entered this page the correct way because it is actually possible to go inside our website here and go inside the URL and then directly say I want to go inside my includes folder forward slash and then form Handler uh. in.php and then you can see I actually enter this script that we just created and entering this page here in the way that we just did just by typing into the URL is not a good thing uh so we do need to make should we check if the user actually submitted this form in order to access that page because otherwise we don’t want them to access it so going inside our code I’m going to go in and create a if statement I’m just basically going to check for a super Global so in this case we’re checking for a dollar signore server and then I want to set brackets and go inside and say I’m looking for a request method requestor method and check if it’s equal to a post method so if the user actually submitted a form using a post method which we did actually do cuz we just did it right here and enter this page using that method there if not then I want to create an lse statement and basically say that I want to send the user back to the front page because you know they’re not supposed to be here and we can do that using something called a header function so basically create a header function and say we want to add a location colon and then you add in the link that you want to send them to so in this case here we’re inside a includes folder so in order to get to our index page we have to go back One Directory so we say do do forward slash and then we say index. PHP so basically now if the user tries to access this page without actually submitting the form so if we were to go inside the URL here and say I want to go inside my includes folder and access this page you can see oh okay now I got sent back to the front page so everything is working perfectly so now what we want to do is we want to go inside the actual if condition and say okay so if we did actually access this page legitimately then I want to actually grab the user data so I’m going to create a variable called username and I’m going to set this one equal to a dollar signore post since we sent this data using a post method and inside of here I’m going to reference to the name attribute that we actually submitted inside uh the form so in this case here we call the username or at least I did I don’t know what you called it but if you followed my tutorial you did call a username and then I’m going to cover this down two more times and the second one is going to be PWD for password and the third one is going to be email and just like so we now grab the data and you may point something out here because hey Daniel you forgot something you didn’t use the HTML special characters function in order to sanitize the data why didn’t you do that uh this is actually something we have to do when we want to actually output data inside the browser so when you’re not outputting data into the browser it is not dangerous at least as it is right now to not sanitize the data so anytime you have to Output data into the browser and actually spit it out so if we to go down here and actually uh do something like this here so if I go down a couple of lines and say I want to Echo out the username then I would need to sanitize this because I’m now outputting data into the browser so I would need to go in and actually wrap this in HTML special characters otherwise this is not going to work and it’s going to be unsecure but because right now we’re just submitting data into a database and not outputting it inside the browser uh we’re not going to be sanitizing anything just quite yet you can of course do it if you want to and sanitize the data like we did in the last couple of episodes and just you know submit the data into the database being sanitized uh but it is best practice not to do so unless you actually try to Output data into the browser and the reason for that is that we are converting this to HTML special characters so in some cases you know we want to use data from inside a database uh we don’t necessarily want to have it in HTML special characters and use it inside our code for example if we’re not planning to actually output it inside the browser so do be aware that there are some cases where you don’t want to have HTML special characters translated data inside your database so in some cases you don’t want to have it the next thing I’m going to do here is I’m going to run a TR cats block which we talked about in the last episode basically we’re just trying to run a blocker code and if it fails then we want to catch an exception so we’re just going to go down here and say if there is some sort of error happening then I do want to go in and say I want to grab a PDO exception and I’m going to create a variable e as a placeholder that I can refer to and then inside of here if something happens that goes wrong when I actually try to insert this data into the website then I do want to you know output a error method so I’m going to die which is a function we have inside PHP that is just basically going to terminate this entire script and stop it from running and it’s going to Output a error message so going in here we can actually say we want to write a custom error message in this case here I could say something like Cory failed so I’m going to say Cory failed colon space and then I can concatenate the error message so I’m going to point to the exception and then get method on up method message get message it is a method but it is called get message so it is the same thing um the next thing I’m going to do is I’m going to go inside this try block that we have up here and I’m actually going to grab my connection to our database because we have that inside our db. in.php file to do that I’m going to use something called require require uncore once and this is basically going to say that we want to link to a file that we have somewhere so I’m going to grab a PHP file for example and just say we want to link it inside the script here so when I go in and say I want to link to a db. in.php file I’m just basically linking to this file that we have up here do keep in mind that because I’m inside the includes folder right now and typing this script here uh we don’t need to go inside another directory or something if this dbh the link the PHP was inside another directory you would of course need to go back out of the directory and go inside the correct directory and doing this here is basically the same thing and just going in and saying oh okay I’m just going to include all this code and just paste it in here like this is the exact same thing so we’re just basically linking to another file which means that we have access to all the code inside that file uh after this point here and I do also want to point out because I don’t think we talked about this yet we do have require uncore once we do also have require if I can spell that correctly there we go we do also have something called include so we can say include and we can also say include underscore ones all of these basically do the same thing but with slight variations so include for example we’ll go in and say oh okay so we’re going to include this file just like we did up here but if we can’t find the file then it’s going to give you a small warning saying oh I can’t find the file include underscore once it’s going to do the same thing but it’s also going to check if the file has already been included earlier inside the script and if it has then it’s going to throw you a warning and when it comes to require and require underscore once they do the same thing as include and include underscore ones except instead of just throwing a warning it is going to actually run a error so going to have a fatal error saying oh okay we can’t find this file so stop everything from running or it’s going to say oh you already included this file once so stop everything from running uh so these two slight variations of each other with you know different exceptions in this case here we’re just going to go and use require uncore once because we don’t want to run the connection if we already have the connection included somewhere else so what I’m going to do now is I’m going to write a variable called query because I now want to actually create a query that I can send inside the database to insert data so I’m going to set this one equal to a string which is going to be our SQL quy string that we’re going to submit and I’m going to run a insert statement and you may recognize this one because we did learn how to do this inside our database episode this is the exact same thing so the SQL code is basically insert into and then we’re going to choose a table so in this case it’s users and I also want to make sure that we include our column names so in this case if we have username we do also have some something called a PWD and then we have email then I want to include the values so I’m going to say values and then parentheses and I’m just going to go and wrap my code here to make sure that it doesn’t disappear off screen so it goes down to next line instead and then I’m going to go inside and give it the actual values now we could do this here and just say we want to copy the variable and just paste it in and say comma space and then password paste it in and then the email and paste it in and this would actually be okay uh do keep in mind to close off with the semicolon at the end here because this is a SQL statement which means that you do need to end off the SQL statement with a semicolon just like we did inside the database episode so it may look a little bit weird that we have a semicolon here and also one here but do keep in mind this is the SQL and this is the PHP but like I said earlier we’re not supposed to insert user data directly inside our query otherwise they can do something called SQL injection and destroy our data base so doing it like this is not really seen as a good practice now there is two ways we can use a prepared statement either you can use something called name parameters or you can not use name parameters I will show you how to do both ways and we’re just going to do one of them at a time so using not name parameters what you basically just do is you replace these different user data with question marks so you say question mark question mark and question mark and these are going to act as placeholders so we later on can actually go in and insert this data or bind the user data to this query after we submitted the query so going down to next line I’m going to create an actual statement which is a prepared statement that I can actually prepare to query this query inside the database so what I’ll do here is create a variable called stmt for statement then I’m going to set it equal to our database connection which is variable PDO which we have access to now because we actually required this file up here and then I’ll point to a method called prepare parenthesis semicolon and then inside this prepare statement I’m going to submit my query so basically now I’m submitting the quy to the database so it gets run into the database and then afterwards I can actually go and say okay but now I’m going to give you the data that the User submitted so I’m going to reference to the statement we just created so statement and I’ll go ahead and point to another method called execute so parenthesis and semicolon and inside this method here I’m just basically going to submit the user data and I’m going to do that using a array so I’m going to add a pair of brackets and then I’m going to go in and just submit these data one by one so we’re going to say username then we’re going to say password and then we’re going to say email so doing this here is going to actually submit the data from the user and actually sign them up inside the website uh but before we test this out let’s actually go ahead and just finish off the script here uh cuz there’s a couple more things that we need to have in in order for this to actually be kind of proper properly done the first thing we’re going to do is manually close the statement and also the connection to our database it’s not something you have to do because this is actually going to happen automatically uh but it is considered best practice to do so manually to free up resources as early on as you can uh so going down here what I’ll do is I’ll refer to my uh database connection so that is variable PDO and I’m going to set it equal to null then I’m going to go ahead and go in and say I want to grab my statement and I’m going to set it equal to null and I just want to point out here there’s a couple of ways you can do this there’s also methods for closing off a connection or a statement um but I’m just going to refer them to null which is the same thing as just saying okay so just you know not set them equal to anything and free up those resources and the last thing I’m going to do is I’m going to write a die method just like we did below here when you know some sort of error message happens then we want everything to stop running I do also want to point out here that you can use dive or you can use something called exit and people do argue a lot about you know whether or not it doesn’t matter which one you’re using the general rule of thumb is that if you’re just closing off a script that doesn’t have any sort of connection running then just use exit but if you’re running something that has a connection inside of it then use die and of course we do also need to make sure we send the user back to the front page after they signed up inside our website so I do want to go down here and copy this header function and then paste it in right above the die statement so we send the user back to the front page and then kill off this script here so this is everything that we need in order to get this working so I could actually go inside my website here and go in and say I want to sign up John uh do you know just to give him some sort of you know username uh password is going to be one 12 three and then I can call his email John gmail.com just to give him something if I were to sign him up inside the website you can see we get back to our front page if I go inside the database and refresh it you can now see that we have another person signed up inside our website so as you can see our script is working perfectly I do want to point something out here though which is something that I know some people might point out uh why is my user id 10 on this person here it’s just basically because I inserted some users before this tutorial here so the the ID is going to change a little bit compared to yours so having done this we now did this using non-name parameters but what about name parameters inside our code uh so if we were to go back into inside the form Handler I do recommend using name parameters because it actually allow for us to know inside this query here which data is supposed to be inside where when it comes to using non-name parameters like we did here I do also want to point out that the order in which you insert the data down here inside the execute has to be the same order as inside the columns up here so these have to match up with each other but when we use name parameters this is not the case because I can actually go in and say instead of question mark I’m going to write a colon and then then I can give it some kind of name so I can say something like username uh I can also say the second one is going to be colon PWD then I can say the third one is going to be colon and then email and in this sort of way instead of question marks I’m now giving them actual names so after preparing my query here I can go below and I can actually go ahead and bind my user data to these different name parameters up here and I can do that by referring to my statement so I’m going to say statement and then I’m going to point to a method called bind param which stands for parameters then I can go in here and say that I want to have two pieces of information I want to first of all have the actual name parameter so the first one is going to be the username going to insert that one and then the second one is going to be the actual user data so in this case our username variable up here so if we were to paste that in we now have a name parameter bound to a actual data submitted by the user so I’m going to copy this down two more times and I’m just simply going to change these so password then I’m going to change to email and then I want to make sure I delete the array that we have inside the execute down here because now we don’t need it anymore because we actually B them up here instead so doing it like this we now use name parameters instead of notame parameters so what I can do is I can go inside our website here and test this out one more time so I can say Jane do in this case here so we can say pass 1 2 3 4 then I can say Jan gmail.com and then I can sign up go inside the database refresh it and then you can see we have Jane do instead and this is basically how we can go in and actually submit data using our PHP code from a website instead of going directly inside a database and manually coring the database in there so this is how we can insert data uh I hope you enjoyed this episode and the next one we’re going to talk about how to actually update and delete data and then after that one we’re going to talk about how to select data and show it inside our website so hope you enjoyed and I’ll see you guys in the next video [Music] so in the last episode we learned how to insert data into our database directly from inside our website and this episode we’re going to talk about how to update and delete data from inside our database directly from inside our website now as you can see I did change things a little bit from the last episode inside my index page I did actually include a second form and I did also change a couple of things inside the original form up here uh so just to quickly go over what exactly I changed I did go in and change the title so now it says change account I did also include a title for the second form down here so it says the leete account and I went in and changed the action of the first one so went inside the update form and said I wanted to send all the user data to a user update page that we haven’t created yet but we’re going to in just a second and inside the delete form down here I just went in and said I wanted to send the data to a user delete. in the PHP file and I did also delete the email input from inside this form and that is basically all I did here and just to point it out here I do also have the form handler. in the PHP found in the last episode since we basically just need to copy paste everything so just to show it I still have it in here so we have the code here uh for people who have not followed the last episode you can just kind of copy paste what I have in here um and just use this code when it comes to that next part so what I’m going to do is I’m going to go inside my include folder and create these files here so I’m going to create a user update. in phsp so I’m going to right click on includes and say I want to include a new file and just basically paste in the name of that file then I’m also going to be creating one for the delete user or user delete. in.php so I’m going to copy the name here go inside includes right click and create a new file so the first thing we’re going to do is of course talk about how to update a user inside our website so what I’ll do is I’ll go inside my user update and paste in the code from my form Handler so going inside my form Handler I’m just going to copy everything go inside user update and just paste everything in and all you need to do here is essentially just go in and say you want to change the query down there just slightly so it actually matches up with a update statement instead of a insert statement so it’s quite simple to just go in and run a update statement instead of a instant statement uh from the last episode so I’m just going to text wrap everything here so we can see everything on screen and we’re just basically going to change the insert statement into a update statement so we’re going to say we want to to go in here and update and I want to update my users table and I want to set some certain values I can just basically delete everything that we have here I want to set the username equal to something new which in this case is going to be a placeholder uh because we did talk about prepared statements in the last episode so we are going to create a placeholder called username and then afterwards here we’re going to say what else needs to be changed so in this case I do also have a password column that needs to be set equal to the password submitted by the user so again we’re going to say single quotes and inside of here we’re going to refer to a placeholder called PWD and then we’re going to add in the last one which is going to be the email so we have a email column that is going to be set equal to again single quotes and then we insert a placeholder called email after doing this we need to tell it where inside the table we want to change this because if I were to just submit this then all the users inside my table are going to be uh updated to what the User submitted just now so I want to go in and say where and in this case here we’re just going to go and say we want to grab a user that has a certain ID as something specific so I’m just going to say ID is equal go inside my database here and just pick a random user that I have so I can say Bess is going to have his username changed uh so we’re going to say his ID is two I’m going to go inside and again if you have another user with a different ID just go ahead and choose some sort of user from your database in my case I’m going to choose B that has an ID as2 um of course this is very unorthodox because typically inside a real website you would have a user that is locked into the website currently who’s trying to change his user information and because of that you would actually have his user ID grabbed and stored inside a session variable so we could actually just grab the user ID and say oh okay so that’s the user we need to change this information of uh so right now we’re just manually going inside the database and grabbing a random user and typing it in here cuz you know we’re not we don’t really have a real login system right now so this is just for practice okay so we’re just grabbing a random user here uh so doing this now basically what you would just do is you would go down you would bind the parameters in the same sense you know you would actually prepare the statement find the parameters execute the statement and that is actually pretty much it I just realized that we don’t actually need to have these single quotes up here so let’s actually go and delete those so we’re not going to have single quotes around the user data uh in inside this quy up here so I’m just going to go and delete them like so and with that Sav we’re going to go back inside the website and actually test this out so I’m going to actually have something written in so in my case here I’m going to change bass’s username to Bassa is cool and I’m going to have 1 2 3 4 as the password and then I’m going to change the email to bis cool at gmail.com and if I were to click update here you can now see that we get sent back to the front page if I go inside the database refresh it and now everything is has been updated so Bessa now has a username as B is cool 1234 and B iscool gmail.com so everything gets updated in here and looks correct but now what if I want to delete a user from inside my website how can we do that because that is also very simple to do uh so if I were to go inside my user delete and copy paste everything from inside my form Handler so we’re just going to copy everything again insert that inside user delete now we basically do the same thing we just go inside the Corey up here and say okay so we’re not running a insert statement we are actually running a delete statement and this one is going to be even easier because we have less data to handle so we can just go inside and say okay so in this case here the user did actually not submit a email so I’m just going to go and delete that one for now then I’m going to go down and change my insert into statement into a delete statement so I’m going to say I’m going to delete from users and I’m going to say where a certain username and password is equal to what the user submitted I could also use an ID just like we did with update cuz that would be the typical thing when you have an actual login system where the user is logged in so you have their ID and you can do that uh but for now let’s just go Ahad and use the username and password since we did submit it here so why not just use it so I’m going to say where the username column is going to be equal to a placeholder which is username and then I’m going to say and where the password column is going to be equal to the password that the User submitted and do also make sure you close off with a semicolon here and then what I’m going to do is I’m going to go down delete the last bind parameter because we don’t need that since we don’t have a email and this is basically all we have to do then we can actually go inside and delete the user so if I were to save this go inside my website here and refresh everything and say I now want to go in and delete the user that has a certain username and password so in this case I could say let’s go and delete Danny that has a password as 123 so we would to go inside my website here go down inside delete account I can say Danny that has a password as 1 2 3 delete his account then we’ll back again so if we were to go inside and refresh you can now see that Danny has been deleted and this is basically how you can go in and update and delete data from inside a database directly from inside a website so it’s quite simple to do uh in the next video we’re going to talk about how to actually select data and show it inside our website so that is going to be very fun to do so I hope you enjoyed this lesson and I’ll see you guys in the next video [Music] so now that we learn how to insert update and delete things from inside our database directly from inside the website now we have to talk about how to actually select things from inside a database and show it inside our website so to begin with let’s go and take a look at what exactly I have inside my text editor so you can actually you know copy what I have here since we need a little bit of HTML in order to get this working inside my index page here I do have a very basic form at the bottom I’m just going to go and text wrap so you can actually see what’s going on here I just have a very basic form that I styled a little bit inside my website so it actually looks somewhat nice to look at uh which is why I have this class up here you can style this in however way that you want to The Styling has nothing to do with the phsp so it’s still going to work even if it doesn’t look very good inside your website I just did it to sort of like have something nice for this tutorial here but as you’ll notice inside the form here I actually included a action that does take us inside a include file now we’re actually just going directly to a regular page inside the website here called search.php and we’re still using a post method since we’re trying to submit data in this case here inside the form you can see I have a very basic label just to have a label for this input down here that goes in and just simply takes a input from the user where we can search for something inside the database now in this case here because I wanted to create something just a a very simple little thing um I wanted to go inside database and search for any sort of comments made by a certain user where we type in the username of that user so if that user made a comment then I want all the comments to show inside that page that I’m linking to called search. PHP so technically we’re creating a small search system here for a website so if you want to have a search system inside a website you can build a very basic one in this sort of sense here uh so you actually learn how to build something that you could potentially use inside a small project if you wanted to so so essentially it’s just a basic form where we go in and we type in a search word and then we just search for something so uh the only important thing here to really note is where exactly we’re taking this data to so in this case the action the method as well as the input down here where we actually assigned a name called user search so with this basic form here let’s actually go and start creating a search. PHP file so going inside our project folder I’m just going to go and create a new file not inside the includes folder but just inside where I have my index page uh so I’m just going to create a search. PHP and then I’m just going to go ahead and create it now inside this file here I’m just going to copy paste everything from inside my index page since this is just a regular page inside our website so I’m just going to copy everything and paste it in and what I’m going to do here is I’m just going to go and remove my form since I don’t think we need to have it inside this page here and what we have to do now is just basically go in and write some PHP code that queries our database and searches for certain uh data in inside the database using the search term that we wanted to search for and show it inside this page here so what we’re going to do is we’re going to go to the very top of this file and I’m going to go above my doc type and I’m just going to start off my PHP tags now in this case here we do actually have HTML like this is an actual page inside our website so we do need to include a closing tag around the PHP code here so we can’t just not have it like we did in the previous episodes um so what we’re going to do is we’re actually going to go in inside our previous file just any of the previous files we created in one of the last episodes um so we did create a form Handler we created a user delete and a user update it doesn’t really matter which one you want to to go into I’m just going to use the form handler. ink the PHP file here and as you can see we have a bunch of PHP code that we did create in the last couple of episodes I’m just going to text wrap everything here so we can actually see everything if you want to copy what I have here you can just kind of see what I have and I can just very slowly here scroll past it and you can pause the video uh but this is something that we did create in the past couple of episodes um so what I’ll do is I’ll copy everything except for the beginning PHP tags since we don’t need that cuz I did open and close phsp tags inside the top of my search. phsp file here so I’m going to paste everything inside at the top of the site here and inside of this PHP code we now just need to make the alterations that we need in order to match it up with the form from inside the index page so if I were to go inside my index page again you can see that we did have this form that I talked about extensively a minute ago um and we just basically have one field which is called user search so I’m going to copy that name go back inside my search. phsp and say I want to grab a user search and I’m just going to delete the other two uh post methods so I’m just going to change the name here as well to user search so we do actually have a variable that makes sense with the naming and with this we can now just go down and change the Quarry since we need to make sure this is actually a select statement we have learned how to do that in a previous database episode uh so what I’m going to do is I’m just going to go and delete everything again we’re just going to make sure we text wrap here so I can select everything and I’m just going to delete the entire query that we have in here what I’ll do is I’ll create a select statement so I’ll say select uh everything so select all from a comments which is our comment table inside the database where a username is equal to a certain value in this case here it is going to be our user search so I’m just going to write a placeholder called user search and this is basically all we need inside this quy here we’re just selecting all the data from inside that row including you know the the actual comment the user made when the comment was made which user made that particular comment uh what user ID do they have what just selecting everything from inside that row inside our comment table just to show exactly what comments table I’m talking talking about here if I were to go back inside my database so inside my database here we do still have the same tables that we did create together some episodes ago I’m going to go and Link those episodes in the description if there’s someone following this tutorial here thinking oh well I don’t have this so I’ll go ahe and Link that in the description so you can actually keep up with what we’re doing here but basically we just created two tables we created one called users and one called comments and inside my comments table I actually went in and included a couple extra comments uh which we did learn how to do so you can go back again watch that episode and create some more comments in there I just basically went in and manually typed those in inside the SQL tab up here I created a couple of comments for cing a couple for bess’s cool and Jane do because those are some of the users that I have inside my website so if I were to go inside my users table you can see that I have some of these users in here so I do have quite a few comments now uh that I can go inside my website and I can actually pull these out depending on the search term that we put inside our query so going back in you can see we’re selecting everything from comments where a username is equal to what we submitted inside the website so going down below here uh first of all we need to actually send in the query so we’re doing that with this prepare statement here again it is important to mention here that we are going back to grab our database file which is inside a includes folder with the connection to our database again this is something we learned in a previous episode which I’ll also link below if you need to have that one but we do need to go in and actually change the path because like I said we’re not inside the includes folder anymore so inside the require above here where we actually grab this database connection we do need to go inside the path and say we want to go inside and includes folder and then grab the dbh that in the PHP file otherwise it’s going to say oh we can’t find this file cuz it’s not linked correctly right so with this done I’m going to go back down and the place where we actually bind the data that we submitted from the actual form uh we do need to change these as well since we don’t have three pieces of data data submitted we just have one and we do also need to change the names of these down here so I’m going to copy my user Search and say that is what I have as a placeholder and I’m also going to grab the data called user search and put that in as my variable and then I’m simply going to execute the statement here and at this point here things are going to be a little bit different than the previous couple of episodes so we just simply went and made changes to the database or submitted data to it uh because when it comes to actually grabbing data we need to actually grab the data and set equal to an array inside our code so we can actually do something with this data so we need to have the data put inside our PHP code so to speak so what I’m going to do is I’m going to go below my execute and I’m just going to go and create a variable called results and I want to say that I’m going to take my statement that we sent in and execute it and I want to point to a method called Fetch all because in this case I want to fetch all the results from the database there is also something just called Fetch for just one piece of data but in this case here we are potentially grabbing many comment from the database so this is going to be uh many results in our case so fetch all is the one that we’re going to be using parenthesis and semicolon and inside the parentheses we need to tell it how do we want to fetch this data now we did talk about arrays in the past because we did have a array episode in one of the previous ones and inside that episode we talked about indexed arrays and we also talked about associative arrays and when it comes to grabbing data from inside a database it is is much easier to handle the data as an associative array because essentially each array data is going to have a name associated to it so we can refer to the name in order to get the data and in this case when we grab database data the column names inside the database are going to be the name for each data so doing this as an associative array is a very easy and fun way for us to grab data from inside a database in order to know exactly what we’re referring to so what I’ll do is I’ll go inside and say I am using a PDO connection and I want to fetch this as an associative array so we’re going to say fetch ESO which is for associative so doing this here we can actually go down and actually delete this header statement because we’re not trying to get back to an index page or anything here uh we’re just basically going to say that we don’t you know we we have the data so now everything is done we don’t need to do anything else here I do think it’s also important to point out here that we do still have this header function down here since that if the user tries to access this search page without actually having searched I don’t see a reason for them to access this search the PHP page um so if they were to try and access this file without having actually searched for something there’s really no need for them to be in here so again just to summarize all the data that we just grabbed using the query from the database are now stored inside variable results as an array and each data can be referred to using a associative name so in this case if I want to grab um let’s go back inside our database here if I want to grab this particular comment down here from a certain user so let’s say I search for crossing and now I’m grabbing all the comments from Crossing if I want to grab this is a comment on a website then I just need to refer to commentor text because that is the column name and this is going to be what is assigned to our associative array as the name for this piece of data I think I may be confusing you more just by explaining this over and over again so let’s actually just go Ahad and do it CU that’s a lot easier for you to see um so what I’ll do is I’ll go down inside my body page and actually do something with this data because we grab the data at the top of our file so we can just go further down to file and just refer to variable results because it’s available inside this file here cuz we just created it uh so you can just go aead and go further down to file go in and say that maybe we want to create an H3 where we can say this is our search results go down below here open up the PHP tags so we’re going to open up and we’re also going to go and close it here and then we’re just simply going to do a simple if statement where we go in and check if we actually have some sort of data pulled down from the database because in some cases if I try to write in a username that doesn’t exist inside the database of course we’re not going to have any sort of comment from any sort of users because the user doesn’t exist uh the same thing goes if a user just didn’t make a comment then they’re not going to have any comments so we do need to have something default to show the user if there’s no comments to actually grab from inside the database the way we can do that is just by creating a simple if statement where I go in and say if right now we don’t have anything in inside this array that we just created so variable results so if Mt which is a built-in function inside PHP I can check for if variable results is currently empty so if there’s no data inside this array then we don’t have any sort of data and if that is the case then I just simply want to go in and I want to Echo out a piece of HTML which in this case here I did actually di a little bit inside my style sheet so I’m just going to go and create a div here I’m going to open it up I’m just going to copy this Echo two more times and I’m going to go and close the div down here and then in between here we’re not going to have a div we’re going to have a paragraph and we’re also going to go and close off this paragraph here to make sure that we close it and in between the paragraph I’m just going to say there were no results or something you know you can come up with any sort of message you want here there’s a little bit of freedom in these tutorials so you can just sort of say whatever you think makes sense in this case here so there were no res results um so if we don’t have any sort of results from our database quy then we just Echo this out uh if not and we did actually get a result I’m just going to go and copy this go down below write a else statement then I’m going to actually Echo out uh the user or at least all the comments from the user inside this page here now the way that is going to work is currently we don’t know if we have one comment from this user or we have many comments from the user you know we do have an array here um but we don’t know how many results that might be inside this array either way we do need to make sure that all the comments that we grabbed inside our associative array do get looped out inside the page because we need to Loop out the result so to speak I can actually do something just to show exactly what is going on here so you have a a small idea about what is going on if I were to do a Vore dump and actually go in and refer to my variable results uh before we do that though there is one more thing we need to do inside our little PHP code at the top here cuz I actually forgot about that this D method here we do want to delete otherwise we are basically terminating our entire script and stopping everything from running even if we do grab something from inside the database so do make sure you don’t have that die method up there otherwise it’s not going to work for you uh so we’re going to go back down and then we’re just going to make sure we save everything and going inside our website I can now go in and actually search for a user so let’s go and search for crossing or whatever you might have inside your database there if we were to do that you can see oh okay so we get a search result because we didn’t get our uh small message that we just created we did actually get a v dump here and basically you go in and see that we have a bunch of data we have a lot of data in here and this is actually what we call a multi-dimensional array because we have an array that has a bunch of arrays inside of them so each row is going to be a separate array inside this array that we just created and you can actually see at the very top up here does actually say that currently we have a array that has three other arrays inside of them so that is basically what this says up here uh which means that we have three different rows of data with commments from this particular user again this might confuse you even more than actually help you with anything but let’s go and go back inside our website here and instead of doing a v dump let’s actually go ahead and run a for each Loop because what we can do using a for each Loop which I do think we talked about before is how to Loop out an array so using this can actually Loop out all the multi-dimensional arrays inside this for each loop from inside variable results so what I can do is I can go in and say okay so we do have variable results here so that is the array that I want to grab and I want to have a placeholder that I can refer to inside this Loop here so we’re going to say as variable row so I’m going to grab my variable row and just copy it go inside the loop and then I’m going to say for each Loop when we Loop out one row of data from inside this array with all our data inside of it I want to make sure to Echo out a variable row and then I’m going to refer to a associative name so in this case I’m going to say I want to grab and we can actually go back inside our database here uh I want to grab the username and also the common text and the created ad so I can actually go back inside my code and say I want to grab the username then I’m going to copy this down to the next line and say I want to grab the commentor text and then I want to copy it down and say also want to grab the created uncore at and at this point here we can actually go ahead and test this out inside the browser but we do have two other things that we need to do before we can actually do so the first thing is we need to make sure it actually looks pretty so we need to style it in some sort of way uh the second thing we need to do is to make sure we don’t have any cross-side scripting going on because two episodes ago when we talked about inserting data from your website into the database we talked about the fact that you have to sanitize the data when you actually output data inside the browser to make sure there’s no cross-site scripting happening uh so we do need to make sure that since we’re outputting data right now we’re actually echoing it out inside the browser then we go in here and actually run a HTML special character function to make sure that we don’t have any sort of cross-side scripting happening uh so if a user were to Output some sort of JavaScript inside our database and now we’re echoing it out inside our code here we could actually have a potential issue here we actually allowed the user to Output JavaScript inside our website which is not a good thing uh so we need to make sure we use this HTML special characters whenever you want to Output data from a database inside a website or just any point when you want to have any sort of user data uh spit out inside your website so making sure to wrap everything in HTML special characters is very important or any of the other uh filter uncore input method or something like that that we have inside PHP in order to properly sanitize data now in this case here we’re just outputting string so HDML special characters is the proper one to use here so at this point here I would like to actually test this out inside the browser even though it doesn’t look that pretty yet when we actually output it so if I were to go inside my browser and type in a username that we don’t have inside the database you know because I want to test out the error message then you can see we get there were no results which is good cuz that is what we’re supposed to have but if I were to type in a us that I know we have inside the database for example cing and actually run a search then you can see we get get his entire all the comments that he made inside the database so you can see we get uh one comment up here then we get a second comment over here then we have the third comment over here but as you can see we have three different comments from this particular user here so we do have his comments uh showing inside the website that just not styled yet so that’s the next step we have to do so going back inside the code I will continue styling things here so I do need to make sure because I did actually do that inside my notes here that I wrap everything inside a section tag because my notes say I did that and I did style it you know depending on this so I have to do it otherwise my styling is not going to work so I’m just going to make sure I paste this in and then I’m going to go inside my for each Loop down here and I’m going to Echo out a div because I want to wrap this inside a div just like we did up here I’m also going to close the div right after and then I want to wrap my data inside an 84 and two paragraph tags so we actually have something you know style when it comes to the text as well uh so I’m going to say I want to Echo and I want to Echo out a84 and I’m also going to go ahead and concatenate here to make sure we concatenate everything then I want to go after and say I want to close off my H4 so I’m going to close off the H4 here I’m just going to scroll to the side here so you can see everything and then I’m going to copy paste and do a paragraph for the other two down here so I’m just going to change this to a paragraph paragraph and the same thing when it comes to closing off at the end here but changing it to a paragraph of course like so and I just want to point out here that there is another way to do this when it comes to HTML inside PHP which is not to have it echoed out inside a string uh but actually close off the PHP TX up here for example then you open it up down here if you want to do that and then you can actually just write HTML in between here and then Echo out the data in between the HTML by opening and closing the PHP tags so that is another way to do so but in this cases since we don’t have that much h going on I think it’s just easier to Echo it out so doing this here and going back inside the website just to test how everything looks like I’m going to go back here refresh and again if I were to search for someone that does not exist inside the database for example this random person here then you can see that we have there were no results and it’s been styled because I wrapped everything appropriately and if we were to go back and search for crossing now you can see that we get three different search results and because I styled it and made sure that everything was below each other and wrapped it inside a dip container to have a a white background color everything now looks a lot cleaner and we can also go back and search for another user so if I were to search for besser is cool which is another user that I have inside my database then you can see we get his comments inside his comment table and just like that you created a very basic search system using PHP so that is something you could actually use inside a website if you wanted to um so learning how to do this is a very good and important step to learning how to Output things using PHP when it comes to data uh in the next episode we’re going to talk about something called a session because a session is a way for us to store data inside our uh well inside our session inside our browser uh so we can actually store data from page to page without having to send it using a post or a get method so using sessions is something we use constantly when it comes to PHP in order for the website to remember things as you’re using the web page so this is something that is very cool to learn about so we’re going to talk about that in the next episode but for now this is how you select data and output it so I hope you enjoyed and I’ll see you guys in the next [Music] one today you’re going to learn about something called a session inside your website and a session is very important to know about since it is the way that your website remembers information across all the pages inside your website now we have talked about a post and the get method where we can send data from one page to another page but this is more for when it comes to submitting data from the user or uh submitting a lot of data inside the website that isn’t really permanent but it’s more temporary information that just needs to be sent from one page to another but when it comes to a session this is information that we want to store permanently inside the website or at least for a longer period of time inside the website uh when a user is currently using your website let’s say for example we want to create something like a login system in order to create a login system the website has to remember okay is this person logged in or is he not logged into the website and when you go inside your login form and you type in a username and a password and then you click login then if you typed everything in correctly and you were to log into the website then the website has to remember across all the pages that oh this user is logged in so everything needs to change inside the website so we use sessions in order to store information that has to be remembered per permanently inside our website in order for for example a loin system to work there’s one thing I want to show you before we get started on any sort of code inside our documents here which is to go inside my browser and open up this website that I just created which is completely empty there’s nothing going on in here uh you can actually see that I have nothing in here literally there’s no you know code inside the body tags I do have a second page by the way which is called example. PHP but that one is completely identical there’s nothing inside of it and this is just to kind of demonstrate that it remembers information across pages so I just created a second page called example. PHP uh so you can go and create that one as well if you want to but I do want to show you that if I were to go inside the browser here go inside my developer tool which is F12 on the keyboard or if you were to go inside the website and right click and then click inspect then you also open up that way uh if you were to go in here you can see we have this very typical developer tool that we’ve seen so many times before we have the HTML you have the CSS you can also see the JavaScript uh but if you were to go up here where it says storage and this tab may be in a different place if you’re using a different browser I’m using Firefox in this case here if I were to go in here you can see that we have something called cookies and inside of here you can see we do actually have a cookie that is related to Local Host because I right now have a PHP my admin turned on inside my browser so it it does have a cookie for PHP my admin now a cookie is information that is stored directly inside your browser locally inside your browser not inside the server and whenever you start a session inside a website you actually generate something called a session ID cookie which is going to pop up in here as soon as we start a session because now we’re telling the server that okay so there’s this user here who is trying to remember things about the website and the information is going to be stored inside our server so in order for the server to figure out which person you are CU there might be many different users accessing the same website uh the server has to place a session ID cookie on your browser to figure out which user you are and which session variables you need to have assigned to you so if I were to go back inside my editor I’m going to go to the top of my index page and I’m just going to go and open up and close my PHP tag so we can actually type some PHP in here and I’m just simply going to start a session by typing session underscore start parenthesis and semicolon and with this simple method here we now started up a session inside this page inside our website so right now we don’t have a session going on inside ex example so we could actually go in and copy paste this information paste it over here just to make sure we have a session started on both pages and then with this we’re now going to go back inside the website refresh it and when I refresh it and open up my editor you’ll notice that inside my cookies we now have a second session ID cookie which is called PHP session ID and this is actually the session that we just started inside our web page using the session uncore start so now the server knows okay so there’s a session going on inside this web page which means we need to put a session ID cookie inside the browser so we know which session data belongs to that particular user because like I said many users might be using this particular website here so for the server to pinpoint which user is which we need to have the session ID cookie if I were to go inside and delete this cuz you can actually do that and say delete uh PHP session ID Local Host then the server no longer knows who who you are and all the session data is probably going to get lost so uh this is not something you have to do because the browser actually purchased this so if we to close down the browser it’s going to delete all these session cookies so you don’t need to worry about you know them sticking in here because we do actually have some session security when it comes to sessions as well where people can go inside and hijack your session or something and that is something we need to talk about at some point uh for now we’re just going to talk about the basics of sessions and starting them up and how to delete them again and so on so with this here just know that as soon as you close down the browser this particular session that you have right here or this session ID cookie will get deleted and there is a reason for that that is because the timeout for this particular cookie here is set to a negative so therefore the next time you close down the browser uh you can always you know extend this session ID if you wanted to manually but let’s go back inside our editor and talk a bit about session data or session variables that we can create using the session super Global because we did actually talk about this one many episodes ago but we didn’t really talk about it extensively uh but we do actually have something called a session super Global so if I were to say dollar signore session brackets and then I can go inside the brackets say double quotes and give this some kind of name so I could for example call this one username so if I were to type username and set it equal to something I can for example say Crossing then currently I have a session data or session variable able that is equal to a string called Crossing which means that this information is going to get remembered on your server on any page that has this session uncore start started at the top of the page so what I’m going to do here is I’m going to say that I want to start this session and I want to go down inside my buddy tag and I want to start my PHP tags because I want to demonstrate something for you so we’re going to say we want to start the PHP tags and close it again and I just simply want to Echo out my session variable that I just created up here and pasted in down here so you can actually see that we can actually see this session variable now inside our page but I do also want to take this Echo go inside my example page and show you that we can actually see it inside this page as well so even though inside the second page we didn’t actually set the session variable at the top here we should still remember it so if we were to go inside my browser and say I want to refresh my index page you can see oh we get causing up here if I were to zoom in you can actually see it uh if I were to go to to my other page called example.php then you can see we still get Crossing because we echoed it out on the second page as well without even declaring it at the top because our session remembers oh okay so inside the index page he set this session variable so now we can Echo it out so in this sort of way we can store information inside our session that gets remembered across all the pages inside our website as long as we have this session start declared at the top of the page now I do want to demonstrate something else here here as well which is that if you have a bunch of data inside your session variables how can you unset them and delete the data again because that is also something you need to know about so if I were to type a method called onset and actually take my session variable so if we were to go down here and say we have a session variable called username then I want to paste it in here and unset it so if we were to do this go inside my website you can now see that oh okay so undefined array key username used cuz we don’t know what this variable is because now it’s been onset let’s actually go and go back to the front page because I actually think that makes a little bit more sense since we did set it here uh so if we were to go back inside the front page and set the session variable and then unset it again right afterwards go inside the website go back to the index page you can see it still gives us the same error message because oh okay so we we onset this session variable but let’s go back inside the code and say that what if I have more than just one session variable that I want to delete what if I want to purge all of them uh what I can actually do is I can run a method called session underscore unset parenthesis semicolon and if we were to do this one then it’s going to purge all the session data inside our session so we can’t see it inside our website so would to refresh the browser you can still see that we get this you know we can’t find the session variable so everything has been deleted still so this one here is for deleting all the session data and this one is for for deleting one session data and now we do also need to know how to stop a session from running inside our page so let’s say I have a session started here I can also go down to next line and say I want to run a session underscore destroy and if I were to run this one then we’re actually stopping the session from running again so let’s actually go ahead and go up here and delete this onset so right now we start a session we set a session variable and then I destroy the session inside the same page but now there’s a small thing that I want to show you here because if I were to save this and actually let’s go ahead and go back inside our example page here and just make sure that we only have our session uncore start at the top and also to make sure that we have the echo down here inside the body tag so with that in mind if we were to go inside the browser here this causing variable when I refresh the browser should not be available right CU it just said to purchase all the data so if I were to refresh the page oh okay so cosing is still in here so the reason we can see it in here is because because even though the session destroyed does actually Purge all the session data it doesn’t get purched inside the same page so it doesn’t happen or the the effect is not going to happen until I actually go to another page so if I were to go back inside my uh example page here then you can actually see that when I access this page that oh okay so this username session variable is not available because we did purchase on the previous page using session unor destroy so again if I were to go back inside my my my code editor here session unor destroy is going to purge all the data but you can’t see the effect until you access another page often you’ll also see people use the session uncore unset in combination so whenever you want to completely destroy a session and unset all the session variables this is how you would do it so now that we talked about our session uncore start and how to create a session variable and also how to unset data so I can actually write it in here again there we go so we talked about how to unset data inside our session very Ables and we also talked about how to destroy a session and again just to point it out here sessions are used in order to you know remember information across Pages for example login system or if you have a shopping cart inside your website and the user goes in and puts things in the cart then the website has to remember across all the pages what you put inside the shopping cart so there’s many different things you could use a session for to remember things and of course we do also have some security when it comes to sessions which I think we’ll talk about maybe in the next episode or maybe a little bit further ahead in this course here so having talked about this I hope you enjoyed and I’ll see you guys in the next [Music] video so in the last video we talked a bit about sessions and how we could create a session inside our website and in this video we’re going to talk a bit about session security which is going to be quite a it’s going to be one of the more complex episodes we having discour up until now but I will try to take it and explain it as simple as I can and just show you exactly what we need to do when it comes to basic security using sessions so the first thing we have to talk about is what exactly are we trying to defend ourselves from because we have talked about prepared statements and sanitation you know to defend against SQL injection and cross-site scripting um but what are we defending ourselves against in this video here what exactly I would try to prevent using session security uh something that is very important when it comes to having anything to do with the session is to make sure that other users on other computers are not able to steal our session data so whenever we create a session inside the website like we did in the last episode and we start creating these session variables that are going to store data inside the server then we want to make sure that the ID stored inside the server is only going to point to us who is using our computer so the session ID cookie inside our browser should only match up with the ID inside the server for for us so if another user out there were to hijack our session ID then they can actually go in and steal our session data which is not a good thing so we need to make sure we have some session ID security uh whenever it comes to handling sessions inside the website just to mention a couple of ways that people could potentially hijack your session could for example be using something called session ID sniffing where a user can go in and intercept unsecure trafficking going on inside your website and they basically hijack your session ID and then impersonate you as the user inside their computer and this is why it’s important that whenever you have a session running inside a website that you don’t have a HTTP connection but a https connection another method people use is also something called session ID prediction where basically they try to guess what kind of ID you have inside your computer so if you haven’t generated a strong session ID they can try to predict and guess whatever session ID you might have so it is important that we also go inside our code and generate a much stronger session ID to prevent this sort of thing from happening and then we also have another very popular one which is something called session fixation which is a type of attack where the user basically tries to make you use the cookie that they have on their computer so for example by sending you a malicious link to a website that they actually included the session ID for their computer in so in a situation where you might click on a link that they sent you through for example an email then you can actually go into a website using the session ID that they created so basically you’re impersonating them inside the website but you don’t know it and then of course we do also have cross-site scripting attacks where people try to inject JavaScript into your website to for example steal your cookies so there’s many different ways that people can hijack a session inside a website and we have to make sure we try to prevent as much as possible and just to mention some additional security things that you just kind of need to know whenever you have anything to do with sessions inside the website uh whenever you have anything to do with sessions it’s very important that you always validate and sanitize user data because that is always important to do so whenever the user submit some sort of data make sure you don’t have it be unsecure as you use it inside your website another thing you want to do is also make sure you don’t store any sort of sensitive information inside a session variable for example a user’s address or phone number or email or something like that uh because if a hack were to gain access to all the session data then all of a sudden they have access to very personal information which is not a good thing you do also want to make sure that whenever you have any sort of session data that you don’t need to use anymore that you go inside and you actually delete it because if you have old session data stored in there that isn’t usable anymore then there’s no need for a potential hacker to gain access to information that could have been prevented because you don’t need it anymore inside your website and with that said it is also kind of a thing whenever we have session security going on that the more security you have inside your website the more you’re going to inconvenience the user that is using your website because that kind of goes hand inand and you have to find a balance between how much do you want to inconvenience the user versus how secure should your website be if you want to have the maximum amount of security inside your website you should force the user to log in every single time they use your website but that would also mean that the user has to log in every time they use your website so all of a sudden we have this again security or convenience because you also don’t want to have users being scared away of your website so that’s just a very important thing for me to to just sort of point out there I do also want to mention here that some of the stuff that we’re going to be doing in this video will also be changeable inside the php.ini file inside your server so something that we haven’t talked about yet is that if I were to go inside my exam installation then I do actually have a PHP folder and inside that folder we have something called a php.ini file and this file has a bunch of settings inside of it that you can change in order to do some of the things that we can do in this video here but I do want to do everything using code in this video here just to make sure that everyone who is following can just sort of follow and just write the code down and you know that you don’t get scared cuz oh no we have to go inside a weird file inside our phsp installation how will I do this inside a live server and that kind of thing so I’m just going to go and show you how to do everything using code in this video here now the first thing we’re going to talk about is one of the settings that you do have inside the inii file that you can change using Code which is something called session use only cookies and this is something that goes in and make sure that any session ID can only passed using session cookies and not for example through the URL inside your website because that is one of the ways that people they do session fixation where they go in and try to make you click on a malicious link and they take you to a website and then they might have a session ID stor inside the URL of that link so this is one of the ways we can prevent that from happening so the way we can do that is go inside our website and what I’ll actually do here is I will not start creating code at the top of my index file I’ll actually create a new file inside this this uh root folder here so I’ll create a new file and I’m going to call this one config.php and this is going to be a file that I’m going to link at the top of my index page here so I’m going to say require uncore once and then I want to link to my config do PHP and any other page inside the website where we want to include this code we can just go ahead and require the file just like we did here so what I can do is I can go inside the config file and the first thing I’m going to do is open up my PHP Tags I’m not going to close it again though because this is going to be a pure PHP file and what I’m going to do is I’m going to set something called ini iore set parentheses and inside this one we can set a parameter which is going to be our session uh do use underscore only underscore cookies and if I were to set this one I can also set a value which is going to be one and this is going to mean that we’re setting this one equal to true because one is true and zero is false so in this sorder of way we can go inside that inii file and actually change some of the parameters using Code inside our phsp code uh so what I’m going to do here is I’m going to duplicate this because we do actually have a second one that we also want to make sure we set in here this one is going to be called use strict mode so we’re going to say session. use strict uncore mode and what this setting is going to do is a couple of things or quite a few things actually one of them being that we make sure that the website only uses a session ID that has actually been created by our server inside the website it is also going to go in and make our session ID a little bit more complex when they actually get created uh so in that sort of sense it makes it a little bit more difficult for people to go in and try to guess your session ID inside your cookie so there’s a couple of really good things that this particular one does and this is actually a mandatory thing to have whenever you have anything to do with sessions inside your website so you want to make sure that this line of code is inside your website anytime you have anything to do with sessions the next thing we’re going to do is we’re going to create some cookie parameters inside our code so whenever we start a session inside our website and the cookie is created want to make sure that we do have some parameters set for that particular cookie to make it more secure so what I can do is I can create a function here called session unor setor cookie underscore params and if we want to create this one we can go inside of here we can actually create a bunch of different parameters so I could potentially create a array here and inside this array we can define a bunch of parameters and the first one we’re going to set is something called lifetime now a lifetime is basically going to go inside your cookie and say that okay so after a certain amount of time has passed inside the website we want to make sure this cookie is going to get destroyed and the reason this is important is because we don’t want to have the same cookie running inside the website for too long because if that were to happen it is going to increase the chances of someone catching that cookie and stealing it and if they have that cookie we do also want to make sure that after a certain amount of time they can’t use that cookie anymore so what we want to do in here is we want to set a parameter called Lifetime and I want to point to a new value which is going to be1 1800 which is going to be 30 minutes in seconds so in this sort of way we now created a new lifetime for our cookies so they actually get destroyed after a certain amount of time uh the next thing we’re going to do is we’re going to set something called a domain so whenever we want to go inside and create a cookie it will only work inside a particular domain so in this case here we’re going to point to Local Host because right now we have exam running which is a local host server so this is going to be the domain that we have to point to of course if you had to put this online and you had another website you would call it something like example uh.com for example if it has to work for that particular website like I said in our case here we’re using Local Host the next thing we’re going to create is going to be something called a path and this is going to to point to a sort of path inside your domain here so in our case here we could actually say that it just has to work inside any path inside our website so what I can do is I can say that we want to set it equal to forward slash which is going to be any sort of subdirectory or sub Pages inside our website that is currently running uh inside this particular domain up here our next parameter is going to be something called secure which is going to make sure that we only run this cookie inside acq website so only using a http s connection and not a HTTP connection so I’m going to set this one equal to true then I’m going to say I want to add another one which is going to be H TTP only so we’re going to say h TTP only and we want to set this one equal to true as well and this basically just goes inside our website and restricts any sort of script access from our client which means us inside the browser so now that we have these we can actually go below here and actually start our session so we’re going to say session start just like we learned in the previous episode so all this information up here has to be set before you start the session that is very important to do uh because these has to be set before we actually have a session created but now there’s a couple more things we have to do whenever we create a session and I did actually mentioned one of them which was we need to make sure that the standard session ID created by this particular function here is going to get even better because right now when we create a session ID using session unor start it is going to be a very basic not really a secure session ID so we want to regenerate it into a stronger version which we do actually have a PHP function that can do uh so we have a function which is called session uncore regenerate ID and this particular one if you were to set this one to True is going to just generate a new ID for this particular current session ID that we have so it’s not going to create a new one it is actually going to regenerate the current session ID we have and make make it into a better version however even though we did use this function in here underneath the session story in order to regenerate the ID it is also a very good idea to do this automatically after a certain amount of time has passed inside the website so if a attacker were to gain access to a session ID then after a certain amount of time that session ID no longer works for them so we want to make sure we regenerate this periodically inside our website and I do actually have a blocker code to do that so I’m just going to go and copy paste it in and then I’ll go ah and explain what exactly it does so underneath my session undor start I went ahead and created this blocker code here I’m just going to talk a bit about what exactly it does uh so inside this block of code I have a if and an else statement and inside the if statement I’m basically just checking if we right now have a session variable created using the iset function here inside my session called lastore regeneration if I do not have it created it means that this is the first time I’m running this page inside the website and it’s the first time I’m actually starting up my session and if that’s the case I do actually want to make my session ID Stronger by regenerating it and I do also want to make sure actually create this session variable that we’re checking for up here so the first time we’re running this if statement it will actually go in and create this session variable so anytime other than this in the future it is going to run this El statement instead I did also give this one a value which is going to be equal to the current time that we have inside the server here and this is going to be important for us to actually check if a certain amount of of time has actually passed since we last time actually regenerated our session ID so the current time for us actually regenerating the session ID is going to be equal to our session called last regeneration and inside this L statement I created a variable called interval which is going to be set equal to the time that I want to pass until we have to regenerate our session ID again uh so we want to have this in seconds which means that in 1 minute we have 60 seconds and then I’m basically just multiplying it with the number of minutes that I want to pass until we actually regenerate this session ID so in this case 30 minutes so if you want this to be 10 minutes then you can write 10 if you want this to be 30 then we’re going to write 30 and then afterwards I went ahead and created a if condition which takes the current time and minuses that with the time inside our session variable which is going to give us a number of seconds and then I check those seconds if they’re greater than or equal to our interval and if it’s more than 30 minutes then I’m going to regenerate our session ID and I’m also going to go and reset my last regeneration session variable to be the current time that I now regenerated the session ID inside my website so we’re basically just regenerating the ID inside our session every 30 minutes that is what this code does and with this said you now know some of the basics when it comes to session security inside your website um I do want to point out here that there is more we could talk about when it comes to session security for example creating a new session ID so not generating a new session ID but actually creating one using for example a function called session unor create ID and then you could take this ID and combine it with your user ID from inside the database whenever you create a login system in order to create a unique ID for a login session so um there’s many different things we could talk about for now I think this is good when it comes to beginning and just sort of starting up with session security and just to mention this again for people did miss it at the beginning we can just take this file here that we just created together and just go inside one of the pages inside our website and when we want to create a session inside one of these Pages we just sort of link to this file and then we have all of this you know session security going on inside those pages I do also want to mention at the end here that if you are a channel member then you do of course also have access to all my personal notes here so if you want to have all my personal notes for for example this Paton here with all the comments inside of them then you do have access to these files if you are a channel member and you can find the link for that in the description so with that said I hope you enjoyed this lesson and I’ll see you guys in the next one [Music] so now we reached the point where we have to talk a bit about security when it comes to inserting data into a database because we have talked about creating data inside a database and selecting data and sessions and that kind of thing but we haven’t talked about hashing yet which is something that is very important whenever you want to insert data that is sensitive in inside a database so right now just to demonstrate something if I were to go inside my database that we have created in the past couple of episodes where we created a users table and a comments table if I were to go inside my users table here you’ll see that right now inside our password column we actually don’t have any sort of security going on in terms of Hing uh so right now if I were to you know break into a database like this one right here I could actually see everything in terms of what exactly these passwords are so we can see this user here has a password of 1 2 3 4 this one has a Denny one 2 3 and 1 2 3 1 2 3 4 um but the thing about inserting sensitive data inside a databas is that we’re not supposed to be able to tell what exactly is in there so in order to create another layer of security we do something called hashing which is going to turn our password into a hashed string which is going to be this very long and confusing letters so we can’t really tell what exactly it’s supposed to be it’s just going to be jerish basically so going back inside my text editor here you can see that I have a bunch of files just going and ignore those for now because these are for a example a little bit later on but for now all I have that you need to worry about is a file called hash password. in.php this is a file that I put inside my includes folder inside my root folder just because this is going to be a file that has pure PHP inside of it and we have talked about why I name my files in this sort of way many times in past episode so you’re more than welcome to go back and and just take a look at that if you want to but the important thing about this episode here is just talking a bit about what exactly hashing is so going inside this file here which is completely empty I’m going to open up my phsp tags and I’m not going to close it off again because this is going to be a pure PHP file and we’re going to start by talking a bit about how we can hash and what exactly hashing is now hashing is whenever we perform a oneway hashing algorithm on a plain piece of text for example a password and then we basically convert it into a fixed length string that you can’t really look at and tell what exactly is this supposed to be so it is going to be something that even if a hacker would gain access to your database data then they still can’t see what the data is supposed to be so depending on what kind of data we’re feeding the hashing algorithm it is going to convert it into a different thing so it is something that is going to be different depending on what exactly you’re going to feed to it and it is also important to mention here that a hasing algorithm is designed to be irreversible and expensive to do um so you can go in and make a hassing algorithm more complex if you want to we do also have something called a salt which is a vocabulary word that you may hear from time to time whenever we talk about hashing essentially a salt is a random string of text that is going to be included inside the data that you provide the hashing algorithm so it’s going to mix the salt together with the text that you provided it and then it’s going to Hash it afterward to create a more unique and even harder to crack hashing algorithm to make it even stronger it is important want to point out that we do have many different hashing algorithms out there and some of them are considered to be outdated whenever it comes to for example password hashing uh you wouldn’t use a shot 256 or md5 Hing algorithm in order to do those uh whenever you insert those into a database so there are you know different ways of hashing things depending on what you’re trying to do when it comes to specifically just general purpose hashing when we’re not talking about a password to be inserted inside a database uh we can for example go inside our code like we have have here and let’s say I have a variable which is going to be whatever the user gave us so let’s say there’s a form and the User submitted something to us uh then I could go inside and say I want to create a value called sensitive data just to have something here and I could set that equal to some kind of value so I could say for example Crossing as my username the next thing we would need to do is create something called a salt and a pepper which sounds really funny but just to kind of show what exactly those are um I can actually go and create a variable here I’m going to call this one salt and then I’m going to set it equal to a random string that we’re going to generate based off some functions that we have inside PHP so what I could do here is I could say we have something called bin to hex parenthesis and then inside this one I’m going to generate a random underscore bytes and then we just basically feed this one how many bytes you want to randomly generate inside this function here so we could for example say 16 and by doing this we’re basically just going in and saying want to generate 16 bytes of data data and then we want to convert it to hexad decimals in order to actually have something that we can actually actively use inside our code so heximal representation as it says inside the notes here um so basically just generating a random string so if we were to write some notes Here we could say Generate random salt next we’re going to go and create something called a pepper so I’m going to create a variable and call this one pepper and I’m going to set this one equal to a random string of characters that I decide what is going to be so so this is not going to be random characters this is going to be a keyword that I’m going to use to fuse together with this hash in here uh so I could for example say a secret pepper string so now we have something called a salt and we have something called a pepper and we can fuse these together in order to make our Hash a bit more secure so what I’m then going to do is I’m going to go below here and I’m going to create a variable called Data to hash and essentially we’re just going in and we’ll combine in these three pieces of data up here so we have the sensitive data that the user gave us inside whatever input we have inside the website uh we do also have a piece of data called a salt and then we also do have our pepper and then basically we just go below here and actually run a hashing function that we have inside PHP called hash so what I can do is I can say we have a variable called hash and I’m going to set this one equal to a hash function and inside this one we’re just going to feed it what kind of hashing algorithm we want to use and then the next piece piece of data is going to be what exactly we’re trying to Hash in here so in this case I could say want to use a shout 256 hashing algorithm and then I want to feed it data to hash and if we were to go inside my website here and actually try and Echo this out we can actually Echo this out after each other just to kind of see the effect of what exactly we’re doing here so if I were to Echo out a break just so we have everything on a new line and actually Echo out the hash that we have here then I’m going to copy this line of code and go right behind where we actually combine all this data here and I’m just going to go ahead and Echo out my salt as well so we can see exactly what is going on in here so if I were to do this and go inside my website go inside my includes folder and say I want to access my hash password. in.php file then you can see we get these two here so the first one up here is going to be the random ass salt that we generated at the beginning of the code and the second one down here is going to be the overall hash from combining our salt with the data from the user and our pepper string and as you can see this doesn’t make any sort of sense so even even though everything is combined inside this hash in here even the readable data that we included such as Crossing and a secret pepper string we can’t see anything about what this is supposed to be and at this point he would actually take the salt and the hash and store that inside either a database or inside a file storage system or someplace that is actually secure where people can’t gain access to it and you would actually go and take this salt and has and use that together with new data the user might submit in order to check if it matches up with the old data they subm it up here so let’s say somewhere else inside the website I want to go in and actually first of all grab the data from inside our database so we have the salt and the has stored in this case here we don’t actually have the salt and has stored inside a database and we would technically have to run a query in order to go inside the database and grab those data uh but for now let’s just go ahead and grab the ones inside the code here since this is more or less a example so let’s say I would grab the all up here and the hash that we have down here I would also need to go ahead and recreate the pepper string inside my code here because that is a unique string that I have created inside my code and then we would of course also need to have the data that the User submitted again so let’s say a User submitted this piece of data once more we’re going to go ahead and put it up here so with all this we would now have to combine everything again just like we did before inside our previous script up here so if we were to grab this lineer code where we combined everything and then I would need to take the salt that we just grab from inside our database and replace it with the salt that we have down here and with all these combined we can now run the has algorithm again just to sort of check if it is the same as the previous one so I’m going to copy this line of code up here and I’m going to paste it in we could also go ahead and rename this variable here to something like verification hash just so we know exactly what kind of hash this is so right now we’re trying to verify that the data submitted up here is the same as the previous data so we’re hashing the new data in order to compare it with the old data that we have inside our database so if I go below here and run a if condition in order to compare the these two pieces of hash data that we have uh so the first one is going to be the stored hash from inside the database so I’m going to copy this one put it inside the if condition and check if it is the same as our verification has down here and if it is then we can actually go inside and say we want to Echo something out so we could say something like the data are the same and then I can create a else statement just to Echo something out in case these are not the same so we could say something like the data are not the same so we just Echo that out inside our L statements just to get an idea about what exactly we’re getting in here so with this saved we can actually go back inside the website and refresh it and what we should get is either the data are the same or the data are not the same in this case here since we have cing here and we also have cing up here then the data should be the same as so going inside the website here if I were to refresh it you can see we get the data are the same because they are the same if we want to go back inside my code here and go up and change the value of the new data that was submitted so let’s say a user is typing something in let’s say cosing two and I were to Hash that and you know do everything in terms of the salting and the pepper we hash it and then we want to check if this data is the same as the previous one up here if we were to go inside the website you can see we get the data are not the same because they are not the same because you know the data submitted by the user is something different and it is important to point out here that we’re not deashing anything inside the code we are actually taking two different hashes and checking if these two strings are the same so if we to go inside and change my sensitive data back to Crossing just to give you a example here let’s go ahead and Echo out not the data are the same but let’s actually go ahead and Echo out our actual values here so I’m just going to go and create a break and then Echo out our stored hash and then I’m going to go below here and add another break just so we can see exactly what is going on and then I’m going to Echo out our verification hash then you can see inside our browser if I were to go inside and refresh it that these two strings are the exact same strings because we has the same data in the same way and then we are comparing the two so basically we are getting a true or false statement when we go inside and actually check for these two data being the same data and this is how you can do General hashing inside your website and it is important to point out here that this is for General hashing when it comes to password hasing for a database whenever a user wants to submit a password when they sign up inside a website then we do actually have a different method for doing so and this is something that is much more simple than what we just did here just to point it out this is much more complex but it is important to mention that a hassin method that looks something like this is good for when you for example want to hide certain sensitive data that isn’t specifically password specific this could for example be a name or a email address or you know financial data or something like that this is what you would for example do if you want to just has something that isn’t a password so now let’s go and talk about about how to generate a h password using phsp so if I were to go inside my code here and just delete everything I’ve just created uh for you it might be a good idea to take notes of these and maybe put that in a document on the side of something so you have these saved uh but what we’re going to do here is we’re going to actually do a hash function that is built directly inside PHP in order to Hash a password now when it comes to hashing a password we have a function called password unor has which is going to go in and actually run a in algorithm and a salt that is going to automatically do all of this for us in order to hash everything uh together to a unreadable format so we don’t have to add a salt manually or do a Pepper or something like that this is going to go in and do much of this automatically so in this case here we might say we have a user that submits some sort of password so we have a variable up here called PWD for password which in general is going to be equal to a post method you know from a form where a user submits something to you but now case here since we’re just doing an example I’m just going to go ahe and write cing because I just want to you know just set it equal to some sort of string in here so what I can do is I can take this password and put it inside my password unor has down here and then I can tell it what kind of hashing method do I want to use in order to Hash this password now in general we have two common hashing methods or hashing algorithms in order to Hash our passwords we have something called password uncore default which looks like this so so if we were to say password uncore default which is going to get automatically updated in the future whenever something new comes out inside PHP so this is something that the developers of PHP will actually come out and update as things change in the future so this is not something you have to worry about when it comes to any sort of changes uh but we do also have something called password bcrypt now password uncore bcrypt is right now actually being used inside password default so this is the one that will be used so does really matter if you’re using this one if you’re using password uncore default uh but just know that in the future if something were to change then the password uncore default can go in and change something uh because something has changed but in general right now whenever it comes to password hashing it is recommended to use BCP so this is the one we’re going to be using here and what you can add in here as another parameter is something called a cost factor which is in general how difficult it’s going to be to uh do this hashing uh algorithm here so if you have a hacker that is trying to Brute Force the way inside website by submitting different passwords again and again inside your input field then this is going to slow that process down and make it much more difficult and take much longer in order to actually try to break your hashing algorithm so this is something that is recommended to do and this is also a point where we have to talk a bit about convenience when it comes to users because the higher this number is going to be the more inconvenient it’s going to be for the user because it’s going to take longer whenever they have to log inside the website the general recommendation here is to use a number between 10 and 12 uh but this has to be submitted as an array otherwise we are going to get a error message so if I were to type 12 in here you can see oh it is expecting a array so if we’re to go above here I can go in and create an array I’m going to call this one options and I’m going to set this one equal to an array and inside of here we’re going to add a parameter called cost and I’m going to point to a value so this could be for example 12 or 10 depending on how you want to strengthen the hashing that you have running here uh so I’m going to write 12 and then I’m going to include my options inside as the3d parameter and then you can see we have this uh function here I do also want to take this hash password and set equal to a variable so we can say hashed password and this would actually be the password that we put inside the database when the user is trying to sign up inside the website so let’s actually go and change that up inside the naming up here so we can say this is the password on sign up and we’re going to change that inside our hash down here as well so this would actually be what we have in inside our database so now the next question is what do we do when want to log into a website because now the user is going back inside the website and they type in the username and the password inside the input fields for the login system and we would actually have to take that password and hash it again and compare it together with the password inside our database so what I would have to do down here is create another variable for the new password the user submit in when they try to log into the website and what I’ll do is I’ll go below here and run a password on _ verify which is going to go in and compare the new password that we submitted when we Tred to log into the website together with the old password that is hased inside the database so if were to take my password here put it inside as parameter number one and then take the password up here which is the hash version not the one that the User submitted on sign up because we don’t actually have that stored inside the database we have the hash version inside the database so I’m going to compare with that one and this would actually go ahead and return as a true or false statement and basically just tell are these two the same so if they are the same it’s going to return as true and if it’s not the same then it’s going to return as false so what I can do is I can run a if condition down here where we basically just go in and say we want to check for this particular function here so I’m just going to delete this line of code and move it inside our condition so if right now they are the same I’m going to Echo out they are the same but if they’re not the same then I’m going to Echo out they are not the same so in this sort of way we can very easily just go in and hash a password and then recover it from inside the database and compare that with the new password submitted when the user tries to lock into your website so if I were to go inside my website here and refresh the browser you can see we get they are the same if I were to go back inside my code and change up the password I used when I tried to log into the website so now it’s the wrong password I can go back inside the website here refresh and then you can see we get they are not the same and you can actually see there is a difference when I click refresh there’s actually this short half a second going on before we actually get the update inside the browser if I were to go inside here and change the cost into something like 30 and go back inside my website here and refresh you can see oh still processing still trying you can see it’s it’s moving up here so you can see it’s it’s thinking right now um so as you can see we are strengthening uh the hassing process so imagine you had a hacker that were trying to Brute Force the way in by typing one password after the other inside the website that you have uh then it’s going to take forever whenever they try to do this if you have a cost Factor inside your hessing algorithm now this is taken quite a long time so I’m just going to go and stop it here uh and just change this back to 12 so now your question might be so taking the signup system that we created in that episode number 22 inside this course here how can we take this and implement this inside our signup system because what I have here is a bunch of other files that I did tell you to ignore at the beginning of this l here these are actually the files that I had for my lesson 22 so we have the form Handler that actually takes the data from our index page when the user tries to sign up then we do also have our database Connection in here and then we have our front page that just basically has a sign up form again if you don’t have all of this you can go back to episode number 22 and just recreate all of this with me but what we can basically do is we can actually go inside our form Handler and just include this hashing in between what we’re doing inside this form Handler here so when I go down to where we actually insert some data I want to make sure that I’m not actually inserting the actual password submitted by the user so as you can see we grabb the password after a post method is being used and we’re just taking that password and directly inserting it inside our database which is not a good thing so what I want to make sure I do right down here before we actually bind the data is to make sure we run a hashing algorithm so going back inside my hash password. in.php I can just simply grab my options and my has password copy that go back inside my form Handler and paste that in so now what I’m going to do is I’m going to take the password from up here which was submitted by the user on sign up and replace that with my password sign up down here and then lastly we just take the has password and use that as our binding parameter down here when we actually want to insert the data inside our database so I’m going to replace my password with my H password down here and that is all we have to do so now if I were to go inside my website here and go back inside my index page refresh everything to make sure everything is good go inside my username say I want to sign up as Danny Crossing and I want to create a password in this case I could just say one two three then I’m going to include a email which is just going to be Crossing at gmail.com which is not a real email but just to have something in here if you were to click sign up and go back inside my database you’ll now notice that I have a new user but something is going to be a little bit different instead of having this very obvious password that I can just see with with my eyes inside the database we now have this hash that is going to be in here instead and that is what you want to do whenever you have any sort of sensitive data that you want to store inside for example a database because now if a hacker were to actually gain access to my database data then they don’t know what this data is so with all this here we now talked about just general hashing we talked about how to Hash a password for database and this is basically all I want to talk about in this video here it was quite extensive it is quite complex compared to previous episodes inside this course here but I hope this is something that makes sense to anyone watching this video here so with that said I hope you enjoyed this video and I’ll see you guys next [Music] time today we’re going to do something a little bit different we are going to implement everything we’ve learned up until now in these past many episodes to build a login system so we will actually have a PHP application that can do something inside a website and I do want to point out this is a very long video and I will have chapters in the description so you can actually skip ahead if you want to but just to point out this is going to be a long video but it’s also going to be very worthwhile so if you do actually go through this video you will learn many things so this is going to be a very very good lesson for you to just sort of write notes for and you know just have next to you as kind of like a cheat sheet for something you want to build in the future it is okay to be confused just rewatch certain parts of the video and make sure to write those notes that I was talking about so you will get to a point watching this video where now you know a lot when it comes to PHP I do also want to point out here that there is a tendency for long videos like this for people to get errors as they are following the video and I just want to point out that 99% of the time when people write hey Daniel I copied your code exactly and I’m getting an error message this code is not working 99% of the time it is because of a typo it is because you don’t have the same databases I do so you know some of the columns inside your code has to be changed when it comes to the names and that kind of thing you misplace the parentheses you know any kind of syntax error is 99% of the time going to be the cause even though you copied my code exactly so I just want to point out here look at the error message inside your website and then pinpoint where that is inside your code because it will tell you the line that the error is on and if you’re just completely in doubt and you don’t know anything about where to find that error inside your code you’re more than welcome to share it inside the comments so people can help you out I do also want to point out that we will learn a lot of new things in this episode here so we will for example learn how to combine our user ID from the database with our session ID to make it better for certain things uh we’re also going to talk about error handling which is when you go inside your code and you actually check for errors before you actually run the code because a lot of times you need to run error handlist in order to figure out if something is wrong this could for example be if the user didn’t fill in all the fields inside the form and then they submitted it so you have to check for that and then say hey you forgot something and then you go back to the form to tell them to fill in everything uh speaking about that we’re also going to learn how to write error messages inside our form so if someone doesn’t fill in all the inputs then we’re going to write an error message saying hey you forgot to fill in all the input or if the User submitted a username when they tried to sign up inside the website that already exists inside the database because you can’t have the same usernames then we also want to create an error message so we have to learn how to create error messages and to check for these things using error handlers inside our code to make this into a you know somewhat decent application I do also want to point out that we’re going to do something a little bit weird in this episode here because we’re actually going to organize our code in a MVC pattern which is something that usually don’t talk about until you start talking about object-oriented phsp which is when you start talking about classes and objects and that kind of thing uh but just to kind of get you into the mindset of a MVC pattern early on before we actually get into classes and objects it is a very good idea I think to just kind of touch upon it and teach you the concepts behind it so you’re not completely confused once we actually have to start talking about classes and that kind of thing so learning about the NBC pattern is just a really good idea and I think this is a good opportunity to just sort of get you into the mindset of how to think in an MVC pattern the reason that the MVC pattern is a really good thing for you to learn about is because it is going to allow you to organize your code in a much more scalable way so that once you build much bigger PHP applications then it is something that is going to be much more organized and better to look at because it’s not going to get all you know jumped together and because right now we’re creating what is called procedural PHP which means that when we have someplace inside our website where we need something specific to happen using PHP then we create the PHP code in that place which means that if I have another page inside my website somewhere where I need the same PHP code then I have to duplicate the code put it inside that page too and then you know all of a sudden we have this duplicates of code that is unorganized and you know there’s no need for it to be duplicated so an MVC pattern is a very good thing to learn about okay um so talking about that let’s actually go ahead and get started on this login system we will talk about all the different security things that we have talked about throughout these lessons here of course there is some security that we haven’t talked about but since we haven’t talked about it it’s not going to get implemented in this video here it’s a way for me to say that this is a good start for a login system then you can always work on it later on when you start learning new things so right now inside my website you can see that I have a index page I do have a main.css and a reset. CSS these are just my Styles sheets so if I want my website to look a certain way then I can can Implement a style sheet to do that because this is basic HTML and CSS and this is something you should also know by now uh so we shouldn’t talk about sty teet because it’s not PHP so with that I do want to show how my website actually looks like right now so if we were to go inside my page here you can actually see that we have a login system and we also have a signup system so we do have two forms that basically can go in you can type your username and password to log in or you can type in your username password email to sign up inside the website so just something very basic in here and of course the way I created that is simply by going inside my index page and I went down inside my body tag created our login form and I created a signup form and these are just to point it out very similar to each other so one of them has an input that is called username and it has a placeholder as username so the person knows what to type in here and we do also have a password input and the same thing goes for the the signup form down here we do also have a username we have a password but we also have a email so we actually use an email to sign up inside the website uh for the database I do have a file in here that you don’t need to have called db. SQL this is basically just my SQL code in order to create a table inside my database called users so right now we have an ID username password email and a Tim stamp for when the user signed up inside the website again if you followed my previous lessons you should right now have a database with this exact users table so this is not something you should need need to put inside your database but just to show you if I were to go inside my database here I do actually have my first database in here it is the name of my database and I do have a users table go ahead and ignore the comments table since that has nothing to do with this episode here uh but inside my users table you can see that I have a couple of different users already uh these are from previous lessons inside this course so there’s no need for me to have them in here uh so let’s just go and delete these users we can delete them one at a time by clicking delete or you can take them off here and say delete and now we don’t have any users left inside my users table the first thing we’re going to create inside our login system is going to be a connection to our database since we need to connect to our database in order to actually do something with the database because when it comes to a login system uh we need to be able to store the users information somewhere so the username the password the email that has to be stored inside a database so we need to connect to it so I’m going to go inside my root folder I’m going to create a new folder I’m going to call this one includes and I’m just simply going to put every single pure PHP file inside my includes folder so any sort of PHP that isn’t a direct page inside my website but just has some PHP code that needs to run a script inside of it that is going to go inside this folder here uh so our database file is one of those files so we’re going to go ahead and right click on includes we’re going to go in here and say want to create a new file and I’m going to call this one db. in.php for database Handler inside this file we’re going to open up our PHP code and I want to make sure that we go in and first of all create all our parameters we’re going to create four variables and each of these variables are going to be equal to a string of characters in our case here we’re going to have a host name which is going to be a local host if you’re using XA which I am right now you’re also going to have the database name which is the name of your database which might be different from mine but in my case I call mine my first database and then you need to have a database username and a database password now if you don’t know what your database username password are then you can of course just go inside your database and change these I do have a tutorial on that inside this course here which is a bit further back but we do need to have these parameters here in order to actually quy our database so the next thing we need to have is a TR catch Block in order to actually try to connect to our database so we’re going to run a TR catch block which means that we right now try a bunch of code and if it fails then we want to throw an exception down here now inside the catch I’m going to say that I want to throw a PDO exception so we’re going to say PDO exception you make sure you spell that correctly and then inside of here we’re going to create a placeholder called variable e for exception now we’re just going to go and create the error Miss straight away so we’re going to create a die function which basically just terminates this script if something goes wrong in here and we can actually generate a error message inside this die function so we can for example say connection failed connection space failed colon space and then we can add a message so we can say we want to add our variable e and we want to point to a method called get message and in this simple way here we now have a way for our error message to get displayed if we get some sort of connection error so what I can do now is I can go inside this try block here and I can actually try and connect to my database or at least create a variable that is going to contain a object which is going to be a connection object to our database so what we can do is we can create a variable call this on PDO I’m going to set it equal to a new PDO object and again we haven’t talked about object oriented PHP yet which is okay since that is a little bit further ahead in this course here uh but this is going to be a new PDO object based off a a connection class that is going to allow for us to connect to the database so going inside this PDO object here we can actually give it some parameters so the first one is going to be uh what kind of database are we trying to connect to so in this case it is going to be a MySQL and again just to point it out here some people do keep pointing out even though I keep mentioning it that MySQL databases are not outdated but PHP MySQL functions are outdated okay there’s a big difference between the two uh so MySQL databases are not outdated okay so moving on we’re going to go and tell it what kind of host we’re trying to connect to here and we do actually have our host up here so I can just go and copy my host and paste it down here now something we haven’t talked about that many times in this course here is the fact that when we do this we usually concatenate so you know we do something like this like we just it down here uh but it is actually possible to take a variable and just copy it directly inside the string and because PHP have you know nowadays know how to just look at this and say oh that’s a variable then we can actually do that so afterwards I’m going to add a semicolon and then we’re going to go and add our database name which is also going to be equal to our variable up here which is called database name and then after here we can actually go ahead and say we want to add a comma since now we have to add the last parameter which is going to be the username and also the password so we can say username comma and password so can actually paste that in down here now things are disappearing a bit off screen here so I’m just going to go and wrap everything so you can see everything inside my code I’m going to add one last thing below here which is going to be a couple of attributes for our p connection so we’re going to say we have this PDO connection I’m going to point to a method which is called set attributes and then I’m going to go ahead and add some parameters inside this method here now the first parameters is going to be to set our PDO error mode to exception so it actually works properly inside our catch block down here so inside the parameter I’m going to say PD colon colon a tore e r r m o d e for error mode and then I’m going to set a second parameter which is going to be that we want to set it to an exception so we can say PDO e r r m o d eore score exception and this is basically all we need in order to have a connection going so with this file we can now move on to the next file which is going to be our config session. in the PHP this is a file that is going to allow for us to configure our session so we have different things that can help us make it more secure to run a session inside the website so a hacker for example if they were to gain access to a session ID then we update the ID every 30 minutes to make sure that you know people have less time to do any sort of damage it with our session ID so there’s many different things we can do in here to make our session a little bit more secure uh the first thing I want to do here is of course make a new file in St my includes folder which is going to be a config undor session. in.php so inside this file we’re going to set a couple of things and I’m just going to go and copy paste for my notes here since that is a little bit easier at least for me since I’m teaching this and I have a lot that we need to go through um what I’m going to do is I’m going to open up my PHP Tex first and then I’m going to include two lines of code which is going to go inside our inii file inside our PHP folder inside our server and change a couple of inii settings so right now we are setting our use only cookies and I use strict mode to true in order to make this a lot more secure when it comes to handling sessions this is something that is mandatory so anytime you do anything with sessions make sure that you either change these inside the PHP speed. ini file or you change these using Code like we just did here now the second thing we’re going to do is change our cookie parameters in order to make this even more secure inside our website so I’m just going to paste in a blocker code here essentially this is a function called session unor setor cookie uncore parameters or params which is going to accept an array inside of the parameters that allow for me to change things like the lifetime of the cookie we can change the domain this cookie should work on any sort of subpaths inside this domain here that it should work on in this case I’m saying it should work on any sort of path inside this domain here uh we can also set secure to True which is going to allow for us to only use this cookie inside a secure connection so an https connection and we’re also setting HTTP only to true to avoid the user being able to change anything about this cookie using a script for example JavaScript inside our website so there’s a couple of things we need to set using this function here in order to make things a lot more secure when it comes to a session again we did talk about this a few episodes ago so if you missed that one you’re wouldn’t welcome to go back a couple of episodes to our session security video um we do need to add in one more thing which is going to be a uh if condition that is going to run a update every 30 minutes which will go in and take our cookie and regenerate the ID for that cookie and this is something that helps us prevent attackers from Gaining access to the cookie and then using that cookie for more than at least you know maximum 30 minutes so what I’m going to do here is I’m going to create a if condition which is going to go in and check if a certain session variable exists inside the website because if it does not exist then we need to create it in order to check when we last updated our session cookie so what we can do here is I can go inside this if condition and let’s go and wait with the um condition parameter for now because that just confuses people uh so inside the actual brackets here what I’ll do is I’ll add in a couple lines of code the first one is going to be where we actually go go in and grabb our session and run a function called session uncore regenerate ID which goes in and regenerates our session ID to make it even better and more secure because the default one that you get from doing the session _ start is not very good uh so doing this here is going to allow for us to regenerate it and right now it may be asking what session because we didn’t actually start any session yet uh so let’s go and do that right now let’s go and put in a session unor start right Above This condition here so right now we started a session after we set all these parameters of course and then we went in and said we wanted to regenerate our session ID to make it better underneath here I’m going to say I want to create a session variable so I’m going to say we have a dollar signore session going to call the session variable something like last regeneration so lastore regeneration and I’m going to set this one equal to something called time now time is a function we have inside PHP that just simply gets the current time inside the server uh so by setting last regeneration equal to the current time I can now check when is the last time we actually uh went in and updated our session ID because that is going to be the time stamp inside this last regeneration session so what I can do now is I can go inside my if condition and say I want to run a is set function that goes in and checks if this particular session exists inside my website because if it does not exist it means that we have not yet went in and improved our session ID so that is something we have to do uh but right now we’re checking if it does exist and we have to check for the opposite so in order to do that we write a exclamation mark in front of the is set function in order to do the opposite so basically we’re checking if it does not exist inside the website so now what we’re going to do is we’re going to go and create a else condition which is going to go in and update our session ID after 30 minutes so what we need to do here here is we need to go in and say we have a variable called interval and this interval is going to be equal to the time in seconds that I want to pass until we have to update our session ID again so this case here there is 30 seconds to a minute so we need to say 30 times the number of minutes that we want to actually pass so in this case it’s going to be 30 minutes uh so what I’m going to do below is I’m going to run another if condition because now we want to actually check if the current time minus the time inside our last regeneration is greater than or equal to 30 minutes because if it is then we need to regenerate the ID again as so go inside this condition here we can say if our time which is that function we did before as well minus our session called last regeneration is greater than or equal to our interval that we set up here and if it is then we want to regenerate the ID and we also want to reset our L generation equal to the current time that we now again updated our session ID so I’m just going to copy these two lines of code here and paste them below but now there’s an easier way to do things cuz now we start getting into functions because we are duplicating code so these two lines to code here are also down here so you know instead of having to duplicate the code every single time uh we could go below here and create a function and I’m going to call this function something like regenerate session ID so now we have a regenerate session ID function and I can take these two lines of code paste them inside the function and simply run the function inside where we need to have these two lines of code so we can just paste that in there semicolon copy this line of code and paste it inside up here instead as well so now we are running the same code but we’re not duplicating code in multiple places so going back inside my index page we’re now going to talk about these forms down here because now we have to start creating the signup form and the login form and you will notice that inside my sign up form and inside my login form I do have a action that points to a file that we do not have created yet so we need to create these two files inside our includes folder so what I’m going to do is I’m going to right click on my includes folder create a new file and I’m going to call it login. in.php and I’m also going to create a file called sign up. in.php so now we have the file that is going to actually run the code for signing us up and logging us in once we actually do get to those parts inside the website here for now let’s go and close down to login. in.php file since we don’t want to talk about the login system until we actually created the signup system because the signup system comes first right we need to sign up first and then log in the user uh so let’s go and start with that inside this page the first thing we’re going to do is we’re going to open up our PHP tag so we can actually run some PHP code in here and then we’re going to run a if condition to check if the user actually accessed this page legitimately so did they actually submit the form in order to get to this page or did they go inside the URL and try to access this page in a weird way by you know trying to access it directly inside the URL uh because that is something we can do so what I want to do is I want to go inside this condition here and I want to say I want to run a dollar signore server super Global and I want to check for a request method which is going to be a post method so we’re going to say requestor method and I want to check if it’s equal to a post method if the request method is equal to a post method it means that the user did get here correctly if not then they did not get here correctly and we have to send them back to the front page so that is something we have to do now so if they did not get in here correctly then we run a else condition and then we just basically run a header function in order to send them back to the front page so a header function looks something like this uh we just basically go in and tell it where to send a user so that would be a location which is going to be back One Directory because right now we’re inside a includes folder with this file here so we go back one directory and then access the index.php file in order to send them back to the front page I’m also going to go and add a die function underneath here to make sure that this script stops from running so if there’s any other code in here that might accidentally get run uh then we do actually stop the script from running so that is a good thing to include in here so the next thing we have to do inside our if condition here is to actually grab the data from the users so inside my uh sign up form I did actually have a post method that is called username because that is one of the inputs that was submitted and I’m going to set this one equal to a variable which is called username so again just in case people are confused if I were to go back inside my signup form you can see that down here I do have an input and this one is called username so that is why I’m referencing to a username post method because that is the method we chose for this form here so going back inside the sign up page I’m going to duplicate this down two more times since I have two more inputs one is called PWD for password and the other one is going to be called email we’re not going to do any sort of Sanitation here by the way because I do know that some people may be pointing out that we have HTML special characters or you know some of the other filter underscore inputs that we can use in order to check for certain things but it is best practices to not do this until you actually output something inside the website or you try to store information inside your website uh so we’re not going to do HTML special characters until actually output something underneath here I’m going to go and run a TR catch block just like we did inside our connection file and we’re basically going to do the same thing here so we can actually go inside our database connection and say we want to you know actually run a exception and a error message of something would have failed so we can go back in here and say we want to replace that uh so basically we want to run a PDO exception and we want to have a variable e which is the exception and then we can run a error message to say something like query fail instead of saying connection failed so the first thing we’re going to do in here is I want to require underscore once my database file because we do actually need to have the database Connection in order to actually connect to the database I’m going to link to my db. in.php file we do not need to say it’s inside a includes folder because we’re already inside the includes folder so there’s no need for that um and one thing I want to point out here is we will need to require some more files because I did talk about something called the NBC model which is something that we should talk about just a little bit this early on because I want to get you into the habit of thinking in a MVC pattern which is going to be very beneficial for you a little bit later on in this course here and in any other courses you might be taking inside YouTube uh because the MC pattern is something you just need to know about so before we continue here let’s actually go and create our files for the MBC pattern so I talked about the Mec model being a way for us to structure our codes which is going to allow for us to make is a lot more scalable uh a lot more organized inside our code and in order to do that we’re going to create a lot of functions that are going to have different purposes so for example we’re going to have one file that is going to have functions inside of them that are used to connect to a database and actually cor the database then we’re going to create another file which is going to be used in order to actually show data inside our website so whenever we have any sort of PHP code that is going to show something inside the website that is going to go inside the second file and the third file is going to be for actually handling any sort of input or information that needs to get run inside the website and this is what we call a MVC model we have model U controller and whenever it comes to any sort of application like we’re doing right now so right now we have a signup system and we have a login system so we’re going to go in and create a MVC file for our signup system and for our login system so going inside our directory here I’m going to go inside my includes folder I’m going to create a new file I’m going to call call this one sign upore model. in.php I’m going to create a second file which is going to be called sign upore view. in the PHP and I’m also going to create a third file which is going to be called sign upore controller. in.php controller is spelled c n t by the way so now with these let’s go and wait with the login system because like I said that it’s going to wait until a bit later uh so for now what we can do is we you can actually take a look at these different files so right now if I want to go inside my model here you can see there’s nothing inside this file uh basically these three files are going to have a bunch of functions inside of them and depending on the file we’re going to have these functions do a specific thing so they have a certain task they need to do uh so inside the model here that is going to take care of only cing the database and getting data or submitting data or updating data or deleting data it’s only going to interact with our database and it’s very important to point out here that these are very sensitive functions because these are interacting with our database and that is a sensitive thing uh so the only thing that is allowed to interact with these functions in here are going to be our controller file because our controller takes care of handling input from the user and then uses these functions in here to actually send that information to these functions so they can actually do something with the database so we separating different tasks here and I know that may sound confusing but that is something that is going to be something you have to learn to do so what I’ll do to start with inside this model here so I’m going to open up my PHP tags and I want to say I want to activate something called strict types and this is something you don’t have to do this is something that I like to do because it just sort of prevents more errors from happening inside our code if it were to write a typo or something or submit the wrong type of data so by declaring that we want to set our strict types equal to true it means that we are allowing our code to have something called type declarations I will talk more about type declarations once we actually get to it for now just know that this is something we’re going to have inside our code here and what I’m going to do is I’m just going to go and copy this code make sure I save it and paste it inside my controller save it and paste it inside my view because we’re going to have this inside every single file so going back inside our sign up that ink the PHP file we’re going to include two more files underneath our database connection the first file is going to be the model that we just created so we’re going to say we have a sign upore model that ink the PHP and then we do also have a signup uncore controller that ink the PHP the order here is very important because that is going to be relevant for later when we do talk about object or PSP and then instantiating different objects based off classes uh and that has to be done in this order here so this order here is just a good habit for you to get into it uh so the model is always going to come first after the connection and then we’re going to have the controller after the model here in a situation where you did also need to connect to the view that would actually go in between these two so you would have these sign of view in between the model and the controller just to point it out but for now we don’t need to have the view we’re just going to go and delete it here and again if this is confusing to you about model view controls just go and wait because it will make sense in a second I promise okay I know it doesn’t make sense when you get started on it and I’m sitting here talking about it uh but since we haven’t actually done any sort of code based on it yet it is going to sound confusing so you’re not alone if this is confusing you it will make sense in a second okay so going below here the first thing we’re going to do inside our Tri block here after actually grabing these files is going to be running error handlers now error handlers is a way for us to go in and actually do any sort of prevention to make sure that things are running appropriately so to speak so things are running correctly inside our code uh so if the user were to go inside your website and not type something inside one of the inputs when they’re trying to sign up then we want to take them back to the front page and say hey you forgot to sign something up in there so that’s the thing we have to to do in order to make sure that we have some sort of error prevention happening inside our code uh and some of you may say well Daniel can’t you just go inside your index. PHP and go inside one of these inputs here and include a required attribute and with this attribute we can no longer submit this form right uh wrong because this is front-end development this is client side languages so HTML CSS JavaScript cannot be used when it comes to security at least we cannot rely on them when it comes to to security that should always be done using a server side language because if I were to put this inside my website I can just go inside my website here I can click F12 to go inside my developer tool go inside my form down here and I can just go ahead and remove my required attribute and there we go I can now hack this website and bypass it so it’s very easy to do so do not rely on HTML or css or JavaScript for any sort of security only for extra things so to speak so having said that let’s go and go back inside our sign up and actually create a error Handler for checking if every input are actually filled out before the user actually submits the form so what I’m going to do is I’m not just going to write the code directly in here because that is not organized that is not the appropriate way to do things because all of a sudden we have a lot of code inside this file here uh so let’s go ahead and split up the task to our different files so now you have to ask yourself okay so what are we trying to do here are we trying to quy the database are we trying to show something inside the website are you trying to take some user data and do something with it yes we are so we’re going to go inside our controller file which is up here so our sign upor controller. in.php is what we have to use so inside my controller I’m going to go and create a function which is going to have a name that name is going to be is input empty so isore input put underscore mty and this is just you know one of many ways you could name functions just to point it out some people prefer to use camel case other people like to use underscores so this is just a little bit easier for people to tell what this function is at least from my eyes when it comes to naming these functions here uh but inside this function what I can do is I can pass in some parameters so inside my parameters here I want to pass in a username so going to say we have a variable called username I do also want to pass in a password and a email because I have to check if any of these were not submitted when they us to submitted this signup form and remember we use these parameters here to pass in data from outside the function so this is important to have uh so inside the function itself I’m going to run a if condition and inside this if condition we have a built-in function called empty which is basically checking if one of these variables are empty or if they have data inside of them so I’m going to grab my username put it in here and check is this one empty or is another one of these empty so I can actually copy paste here and just simply check for the password I can also copy paste again and then we can check for the email and these two pipe symbols here means or inside our condition so if this one is empty or this one is empty or this one is empty then we want to run a certain blocker code so in this case here this would actually mean there is a error inside our form because they did not fill in one of the inputs if this one is actually true uh so what I’m going to do is I’m going to go in here and say I want to return a true Boolean and then I’m going to run a else condition and say I want to return a false Boolean and in this sort of way we can now go in and actually check is there a error when the person tried to submit their username password and email because they did not fill in the inputs so now saving this I can actually go and copy the name I can go back inside my sign up. the PHP file and inside my error handlers here I’m going to create a if condition that is simply going to check if this one returns as true or if it returns as false because if it returns as true then we do actually have a error inside the website so in this case here if this returns as true by just pasting in the function and at this point here I’m actually going to wait with putting in the code for the actual error message inside this condition here because we do have a couple of different ways we could do it and I do have a way that we are going to do it in this video here uh but it’s not going to make sense until a little bit later on so let’s go and wait with this uh what I’m going to do is I’m going to create a second function that is going to check for something else in this case we can actually check if it was a valid email that the user actually submitted so what I can do is I can go back inside my controller I can copy this function here just copy paste it below and I can call it something different so in this case if you could say something like is email invalid isore _ inval valids and now at this point here we’re only checking for a email so we don’t actually need to have the password or the username so we just go and delete those two from the parameters here and inside the condition here I’m just going to go and delete these empty functions because we’re not going to check if they’re empty we’re actually going to run a filter so we’re going to say filter uncore V which is a build-in function inside phsp and inside this one we can tell it what do we want to filter for so in this case here I want to filter my email so I’m going to paste in my email as the first parameter and then I want to tell it what exactly do I want to filter here and in this case I want to filter to validate if this is a proper email so filter uncore validate uncore email and this is actually a built-in uh validation inside PHP so you can actually check if this is a valid email uh if that is the case then right now we’re returning this as true and if that is not the case then we return it as false but this is the opposite of what we want to do we do actually want to say if this is a invalid email then return as true so we’re going to go in here and write exclamation mark which means the opposite so in this sort of way we now have a function that can check if the email is actually valid and if it is not a valid email then we return this as true so again we can go and copy this go back inside our sign up the dink to PHP so I’m just going to go and paste in my function below here and copy the if condition paste it down below and simply take this email invalid function and put that inside instead inside this condition here here uh so the next thing we can do here is we can actually go ahead and check if this uh username that the user tried to submit has been already taken because inside the database you may have many different usernames and you don’t want to have two users with the same username uh so what we can do is we can run another function inside our controller in order to check for a certain username and if it exists inside the database then the users should not be allowed to use that username so again we’re going to go inside the controller and copy this function and just paste it down and we’re going to rename it into is username taken and we’re just going to go and delete the parameter inside our if condition here and at this point I do actually want to point something out which is that right now we want to run a function that has to go inside our database and check for a username which means that we have to query our database but now I did talk about this earlier I said that we have three different files we have one called a model that takes care of cing the database then we have the view that shows information inside the website and our controller takes care of any sort of information so in this case here what do we do do we go inside this controller here and then we quy the database because that’s a no no only one file is allowed to actually quy the database and interact with the database inside our code which is our model file uh but before we do that we do actually need to do some type declaration here because we didn’t actually do that uh so right now our username up here is actually supposed to be pass in as a string data type or at least that’s what I decide this is going to be because the username is a string of characters so that is going to be a string data type I’m going to do the same thing for our password and our email since that is also going to be a string then I’m going to go below here inside my email invalid function and do the same thing because this is also going to be a string going to go below here and say I want to pass in a username that is also going to be a string so this sort of type decoration here is not something you have to do but it just adds another layer of error prevention inside your code because if I were to pass in a Boolean inside my uh function here then it would tell me inside the website hey that is a incorrect data type so it’s just an extra layer of error protection you could also go after here and say what the return type should be so if this has to return as a Boolean meaning a true or false statement then I can say bull right after here and say that is going to be the return type uh but let’s not go into that right now let’s just go and talk about telling it what kind of data we expect inside our parameters here so having talked about that let’s actually go back inside our model page and continue what we’re doing right here so right now we’re trying to query the database in order to check if a username is already taken uh so going inside my model page we’re going to go below here create a function give it some kind of name in this case here I could call it getor username and I can go ahead and say I want to pass in a username because we need to use the username in order to actually C the database to tell if the username exist in there uh so we have to pass in a username again remember we’re using strict types here so we can actually say we want to declare this as a string called username so now at this point here we do actually need to run a PDO Connection in order to do this and right now our PDO connection is inside our db. in.php file so there’s a couple of ways we could do this we could go in here and actually go ahead and require our file here so require uncore one and link to our db. into phsp but that is not actually necessary because we do actually have that linked inside our signup page so at the top here we link to these files up here we do have the database connection linked up here first before we actually access these files down here uh so going inside the model here I can actually go and pass that in inside as a parameter here so this is going to be a object data type so not a string or bully and this is actually a object data type uh because this is a PDO object that is going to to connect to our database again we haven’t talked about object or ENT PHP so just for now just trust me this is a object data type uh so this is going to be our variable called PDO which is of course the same variable we have inside our dph that in the PHP which is right here so now all we need to do is actually query the database because now we do have our connection passed into this function here so going down I can say that we have a variable I’m going to call this one query I’m going to set it equal to a string which is going to be the query for our database so in this this case it’s going to be a select statement I’m going to select my username from inside this table here because that’s the only thing we need to check for so there’s no need to grab all the data in this case we can just say username from our users table and then I want to say where a username is equal to a placeholder that we’re going to call username and in this sort of sense here remember the semicolon at the End by the way uh we now have a query statement that we can actually quy into the database using our connection but we do need to do this in a secure way using prepared statements so below here I’m going to create a variable and call this one stmt for statement and we’re going to set this one equal to our PDO connection and then we want to point to a method called prepare which means that now we’re creating a prepared statement and I’m going to pass in my query and send this one in separately because by sending in our query separately from the actual data from the user we now separate the data from the actual query which makes this something that is going to prevent SQL injection which is a good thing so having done this what I can now do is I can actually bind the data to this quy and send that separately so first of all we have to bind the data so we’re going to say we have our statement point to a method called bind param parenthesis and inside of here we have to tell it what is the name of the placeholder in our case it is going to be username so I’m going to paste that in as a string and then I want to to tell it what is the data I want to put in where this placeholder is in this case it is going to be our username and then we simply run a execute statement so we want to take our statement here point to a execute method and this will actually go in and actually Cory our database using this SQL statement up here uh so now that we did that we need to actually check if we did actually grab a row data when we search for a username called whatever the user typed inside the input uh so in order to do do that we are going to write a variable called result and we’re going to set it equal to our statement and refer to a method called Fetch now fetch is only going to grab one piece of data from inside the database so it’s not called Fetch all it’s just called Fetch so in this case we’re just grabbing the first result now the fetch type is going to be a PDO type and I want to refer to fetch uncore asak which means that I want to fetch this as a associative array this basically means that we can refer to the data inside the database using the name of the column inside the database which is a much better thing than using index arrays uh so in this sort of way here we can now take this data and return it so we’re just going to go and return our variable result which means that when we run this function here we grab the data or if the username does not exist inside the database then we get a false statement so now we copy the name of this function we go back inside our controller and we paste that function inside our if condition condition now we do need to remove these type declarations in here so we’re just going to say we don’t want to have those because we don’t need them when we actually call upon the function we do also need to make sure we pass in our connection inside this function here otherwise this is not going to work so we do need to say we want to pass it in and we want to make sure this is a object type so doing this here is basically going to go inside the if condition and then check is the username inside the database if it is then we return this as true if it is not then we return this as false meaning that this is going to be a error if the username is already taken or not an error if the username is not taken so again we can go back inside our sign up the D the phsp go down and copy one of these if conditions paste it below and change the name to what we called it inside our controller so we just copy the name of this uh function here go back inside and paste that inside our if condition of course again remove the type declarations because we don’t actually need those from be used to functions and in this sort of way here we now have something that goes in and actually checks for a username so now I’m going to do one last thing inside my error handlers here and it’s very important to point out that you can do many different types of error handlers you can also check for the length of the username or the password or the email or whatever um I’m just going to go and do a couple of different ones here and then you kind of get the idea that we can just do this and you can come up with any sort of error Handler WR a function for it and then refer to it inside a if condition inside our sign up that in the PHP file uh so it’s the the same process every single time basically uh so what I want to do here is I want to copy paste my if statement because I do want to include one last eror Handler I’m just going to go and delete the function from in here because we don’t have it yet and I’m going to go inside my sign upore controller and I’m going to create the last function so in this case I’m just going to copy paste one of these function here I’m going to change the name so it’s not is username taken but is email registered in this case here we do also need to Cory the database because we have to check for a email so I do also want to make sure I include my database connection inside this function here I do also want to make sure I pass in my email so not the username in this case so the email and inside the if condition here we’re just going to go and delete our function because we want to run a different function now so again because we have to quy the database to see if there is an email inside the database we have to do the exact same thing as we did with the username just using a email instead uh so we do actually need to go back inside our model and create a SE function that is only going to check for a email so in this case if we can say get email and all we have to do is change a couple of different variables in here so right now we’re passing in a email I want to go inside and take my email column I do also want to change the parameter here or the placeholder to email I do also want to change the name that I’m binding inside my bind parameter method down here so it’s going to be the email variable and also the email placeholder and with this this is all we needed to do in here here so we can go and copy this go back inside our controller and paste that inside our if condition and of course do also make sure you remove these different type decorations because we don’t need those inside the function when we call upon the function and with all this we basically now just check for an email being inside the database because it was pretty much the same thing as before uh so it’s very easy to do so going inside our signup we can go ahead and copy the name of this function here and paste that inside our condition and of course remove the type Creations like so and at this point we need to talk about how we can actually create these error messages because now we have a bunch of functions that check for different things and if one of them return as true it means that there is a error so what I can do is I go above my different conditions here and I can create an array which is going to be empty I’m going to call this one errors so we’re going to say we create a errors array which is going to be equal to no data and what we basically do is if there is a error inside one of these conditions down here then we assign that error inside this array up here so we’re going to stack a bunch of data inside this array depending on how many errors we get inside our code and then at the end if we have any sort of Errors inside the array then it means we get a error because there is an error in there and then we’re going to prevent actually signing off the user because if there’s an error then we shouldn’t sign up the user uh so what we can do here is I can actually go ahead and go inside the first condition and say I want to actually assign a piece of data to my array so I can say we have a variable which is called errors and I want to go ah and say brackets is equal to some piece of data which in this case is just going to be a string so right now I have to tell it what is going to be the associative name for this particular piece of data so this is the key this is the value so if I want to grab this particular error message here then I need to refer to this particular key in here that is basically what is happening again if you’re a little bit confused about when it comes to arrays I do have a array episode where I talk about arrays extensively um so this should be something you know by now for now let’s just go and go inside our array and create a key for this particular piece of data I’m going to call this one empty input so _ input and I’m going to create a error message so in this case we can say something like fill in all Fields exclamation mark then I’m going to do the same thing for all these other ones down here so I can go down and paste in my code and I can change this one not to empty input but instead we can say invalid email invalid unor email make sure we actually spell that correctly invalid change the error message to invalid email used then we’re going to go inside the next arrow down here which is if the username is taken and I can go ahead and save we can call this key something else so this is going to be username uncore taken and I’m I’m going to call the error message something else username already taken exclamation mark then we can go inside the last one down here and say this is going to be email uncore used and then we can change the error message to email already registered and at this point here if there was no errors meaning that none of these actually returned as true and insert this data inside our array it means that our array is going to be empty because if there’s no error then we didn’t put any data inside our array so now all we have to do is run a condition and check if this array is empty if it is then it means we had no error messages but if it is not then we need to send the user back to our index page you know what the sign up form is with error messages so I’m going to check if we did have errors this is going to return as true by the way if there is actually data inside this array if there’s no data then it returns as false and this is going to return as true if there is data inside this array and it’s going to return as false if there’s no data inside this array so what I can do is I can go inside this condition here and I’m actually going to go and create a session variable so I’m going to say we have a dollar signore session and I’m going to set this one equal to error signup or at least call this one error signup and I’m just going to go and assign some data to it which is going to be all the error messages that we have stored inside our errors array so I’m going to assign that to it but now at this point if we don’t don’t actually have a session started so we can actually run these error messages because we need to actually have a session started before we can actually store session data inside a session so what I can do right above where we actually assign these errors to our session variable is I can actually link to our config file because that has a session started uh inside that file so I’m going to go up here and just copy paste my require go down below paste it in then I’m going to change this to config uncore session in PHP because like I said inside this file here we do actually have a connection started so we could just run this liner code so I could just take this go back inside my sign up and just replace that with this line of code instead but because we do have a much safer way of doing things when it comes to sessions inside that file so instead we can just link to that file in order to start a much safer session so with this in here we can now actually assign this session variable to a value and have that stored inside our session so now what I can do is I can actually go below here and I can link back to our index page where we have our sign up form because we need to go back to that page and run some error messages so I’m going to run a header function and I’m just going to go ahead and copy paste what we have down here since that is going to be the same thing so we’re going to go back to the index page and because we have all the errors stored inside our session we can actually go ahead and print those out inside our page so let’s actually go and go back inside our index page and do that right now because why not we are at the error messages so why not just show them already so right underneath my sign up form I’m going to run a PHP function that we haven’t created yet so I’m going to say we have our PHP Tags I’m going to close it again and I’m going to refer to a function called check uncore sign upore errors parentheses semicolon and now because we’re actually outputting something now using PHP from the signup system we’re now going to jump inside our view. in the phsp file so our sign upore View uh is going to have a function inside of it which is going to be what we just created inside our index page so we’re going to say we have a function we’re going to call this one check uncore sign upore errors then we want to open up the actual function here and inside this function I first of all want to run a if condition because I want to actually check if we have these errors stored inside the session because if there’s no error stored inside the session it means there’s no error messages so inside the parameters we can run a is set function and actually check one of these session variables so in this case here I’m going to check if we have our erasor signup which is going to be the session variable we have inside our sign of the in the PHP that we did actually create down here and if we have that I want to go inside this condition and I want to create a variable called errors and I want to set it equal to our dollar signore session actually we just go and copy paste from up here which means that now we have a variable inside our PHP code which is equal to this array that has all our errors inside of it uh so this is actually a array now now the reason we’re doing this is because we do actually want to unset our session variables because like we talked about in previous session security episodes as soon as you have data inside your session variables that you don’t need to have anymore you need to make sure you actually delete them uh so at the bottom here I’m going to run a unset function that is going to unset my session variable because once I’m done running this script here I don’t actually need this data inside our session anymore so we’re just going to go ahead and remove it again right afterwards uh so in between here we’re going to go ahead and actually run the error code so first of all I’m going to run a small break just because I want to get some distance from the actual form uh this could also be done using HTML if you wanted to but inside my code here I’m just going to go and create a break and then below here I’m going to run a for each Loop because that is a loop type that is used in order to Loop out a array so I’m going to grab my arrow array and say I want to refer to that one and then I want to say as variable error which means that this is the placeholder for one of these data inside uh this array here and inside for each Loop I’m just going to go and Echo out a paragraph again I’m just going to copy paste from my notes here so I have a paragraph that has a class to it because I have some CSS inside my my website here and in between these paragraphs here I’m just going to go and concatenate my code so I’m going to say I want to concatenate and I want to go ahead and refer to my error and in this order way we now Loop out every error message below each other inside this page here so at this point here we do actually have a error system working now we could also say sign up success once we’re actually done uh but let’s go and wait with that until the end because we do actually have a little bit more code inside our signup in.php file and once we’ve done that then we can return to this in order to actually run our successful message so now in order to test this out we’re going to go back inside our index page and actually link to our file because right now we don’t actually have our sign upore view. interface P linked inside our index page uh so in order to actually access the functions we need to go at the top here create a pair of PHP opening and closing tags and then we’re going to say we want to require underscore once and I want to link to my includes folder and inside the includes folder I have a sign upore view. in.php we do also need to make sure we have a session started otherwise this is not actually going to run this code because we need to have a session available to us to grab the error messages so I’m also going to link to my config file so I’m going to go inside my includes folder link to my config session. in the PHP and doing this we can now go back inside our website and actually test this out we’re going to go and refresh the browser just to reset everything and now if we were to go inside my sign up form and try to sign up without typing something inside my inputs you can see we get fill in all fields and invalid email use because right now uh we didn’t type in a proper email and we did not fill in everything inside the form uh so if we were to type something in so for a username a password a invalid email you can see that oh we get a invalid email use because that was actually wrong if I were to type in a non-existing username from inside my database a password and a correct email so I could just say example at gmail.com and then click sign up then you can see we get something you know it actually puts us to the next page because now we type something valid into our signup form but of course we haven’t yet created something to actually sign us up inside the website so right now it’s not going to do anything now we’re just stuck inside our sign up the thing the phsp page um but just know that now we have something that actually writes out error messages once we do actually create some sort of error inside our code so back inside our sign up the link the PHP file we can actually continue in order to actually sign up the user inside our website uh so what I’ll do is I’ll go below here and I’m going to run a function called create uncore user parenthesis semicolon because at this point here we don’t actually have any errors CAU by the error handlist that we created inside our code uh so we can actually go ahead and run this function here so in order to do that we need to go inside our controller I’m going to copy paste one of the functions and I’m going to call this one create uncore user which is the one that we just created inside the signup page and I’m going to paste in our connection because that is important and then we do also need to paste in all the different data that the user actually submitted so I’m just going to go and copy pasted here so we need to paste in the password the username and the email and then going inside our actual function we can go and delete what we have here and we’re just basically going to run a function from inside our model page so we’re going to say we want to run a function called setor user parenthesis and then we’re just going to go and paste all the same data as we pasted inside this function here so we’re just going to go and paste that in make sure we remove the type declarations just like before we’re going to save this and then go inside our model page and then we’re actually going to to create a new function and we’re going to call this one the same thing as we did inside the last function so setor user and of course paste in all the data including our type declarations uh inside the parameters here curly brackets and then we can actually go inside one of these other functions and just copy paste the query and execute uh so this blocker code right here paste it inside our function and then we’re just going to go and change the statement from a select statement to a insert statement so we can say insert into users we’re going to include the column name so we have a username we also have a password and we have a email then we’re going to say values which is going to be what is inside these parentheses so again we’re going to use placeholders so this is going to be username and we’re going to include a password and we’re also going to include a email and then we just need to bind the parameters down here so we can actually copy paste in the username we can copy this down two more times and paste in the password we can paste into email and this is all we have to do but now we did also talk about hashing in the previous episode because we need to make sure that when we paste in this password that it can’t be read from inside the database so right before we bind the parameters I’m going to create a variable I’m going to call this one options because I want to include a couple of options inside an array and this is going to contain a cost factor which is going to be called cost and we’re going to set this one equal to 12 and this essentially is just going to make it cost quite a bit more in order to actually run this hash and this is going to prevent the Hackers from actually brute forcing the way into your website so this is important uh then we’re going to go below here and actually run a hash so we’re going to say we have something called hashed password and I’m going to set this one equal to a function called password uncore hash parenthesis semicolon and then we need to tell what exactly we’re trying to Hash here so in this case you want to Hash the password that was submitted by user and I’m going to run a hessing algorithm called password undor bpts and I’m also going to go and pass in my options which is the variable we created up there and this is basically going to Hash our password using the bcrypt algorithm and also go and add a cost factor to it so it’s going to slow down the The Brute forcing process if someone were to try and hack their way into your website um so what we can do here is we can actually take our H password and replace that with our password then where we actually B our parameters because now we’re storing the H password and not the real password inside the database we do also need to make sure inside this array here that we don’t set it equal but we actually assign 12 to our cost just so we don’t get that error message there uh so with this we now actually have this function working so we can go back inside our uh sign up the PSP file here and we need to make sure we actually paste in these parameters so we could just go back inside our controller copy all these different parameters here go back inside our sign up the PHP and paste those in of course without all the different uh type declarations that we have here so after running this function we just signed up the user inside our website so what we can do is we can go down a couple of lines and then we just run a header function and a die function in order to actually stop the rest of the script from running just in case and we’re going to send the user back to the front page where we’re actually going to include a sign up success message so we can actually go and say we have a question mark sign up equal to success and before we end off the script here so before the die function I do actually want to close off my connection and my statements so I’m going to say we have our variable PDO I’m going to set it equal to null then I’m going to copy paste this down and I’m going to say I want to set my statement equal to null and in this sort of way we now have a basic signup system working inside our website so now what we could do is we could actually go inside our website to test this out but I do want to have our signup success message if we do actually do so uh so we’re going to go and use this little um URL parameter here in order to do that so right now we have a signup equal to success displayed inside our URL if this is actually successful uh so what I can do is I can go back inside our view function because this is the one that actually has the error messages and I can write a else if condition and then check if we have that inside the URL with the sign up equal to success uh before we do that let’s go and paste in what we actually want to display inside the website so in my case I do want to again just run a break but I’m also going to go below here and Echo out a paragraph that is going to say sign up success inside the condition I’m going to run a iset function that is going to check if we have a certain get method inside the URL so in our case here we are checking for a dollar signore get because that is something we can do whenever we have any sort of data displayed inside the URL for example sign up equal to success so I’m going to check for something called sign up which is going to be the key inside the URL so we have sign up equal to success so key equal to Value okay just like inside arrays and I’m also going to go and check if it is equal to a certain message so I can go right after our is set function here do make sure you do it after the parentheses so in between these two parentheses at the end here and I’m going to say and is my get signup equal to a certain string so in this case success and having done this we need to do one more thing that I actually forgot to do inside our sign up the link to PHP file which is to go down and inside our errors if condition I do need to make sure we exit this script if we do have any sort of Errors inside our code otherwise it is still going to continue running all this code down here even if we do get a error message so we do need to copy this die function here and paste it right below our header because then we do actually exit the scripts and with this we now have a complete signup system or at least a signup system with a error message system so you can actually see any sort of Errors you might have inside your signup form so if were to go back inside our web page I can actually refresh everything just to make sure everything is reset and going inside and typing in a sort of error so if I were to type something wrong uh let’s say I did not fill in my password and I wrote a invalid email if it would to sign up then you can see we get two error messages down below we get fill in all fields and invalid email used so as you can see we have error messages showing and telling us what we did wrong inside the signup form uh what we can also do here is we can actually sign up inside the web page because that is something we have set up as well so if we were to go in here and say I want to sign up as Danny Crossing and I want to type in one 12 three as my password and say I want to type in a email so I can say Crossing at gmail.com which is not a real email that I have but just to come with some kind of example here uh if want to click sign up now you can see sign up success and then if I were to go inside our database we now have a user inside our users table so at this point here the signup system is working but there’s one more thing we need to include inside in order for this to be a complete signup system at least I think this is a feature that is something you should have inside a signup system which is to make sure that if you create any sort of error messages inside the signup form let’s say I went inside my signup form and I wrote in a valid username and I did not type in a password and I did type in a valid email so let’s say we say example at gmail.com um at this point here if I were to get a error message when I try to sign up because I did not fill in my password it should send back the data that I already typed in inside this form so don’t have to retype everything if I get sent back with an error message because that is just really annoying so this is more of a usability feature for people to not have to retype everything inside this form here so in order to create this I’m going to go back inside my code and the first thing we have to do is make sure we actually send the data that the User submitted back to our signup page so we can actually show it inside the inputs and the second thing we have to do is actually show it inside the input so we have to do two things in order to get this working here so the first thing we’re going to do is I’m going to go back inside my errors if statement here and I’m actually going to create an array that is going to contain all the data submitted by the user so we can send it back to our index page so if we have some sort of Errors then I want to go in here before the header function by the way and create a array and in this case I’m going to call this one sign up data and we’re going to set this one equal to an array so we’re going to say brackets and semicolon and then opening this up we can now add some data inside our array here and we’re going to do that as a associative array so we want to have a key and we want to have a value for that key so the first key I’m going to have in here is going to be the user name because I want to send back the username and again this is a name we can come up with ourselves so you can call this whatever you want uh in my case here I do think username makes sense because this is the username then I’m going to assign a piece of data which is going to be the username the user actually submitted when it tried to sign up inside our form which is going to be variable username and the reason I know that is because if I were to scroll up here I can actually show you that we want to grab all these different data and send that back inside the signup form or at least all the data except for the password because I do think the password is something you have to retype every single time in case you get something wrong inside your input and that is just kind of something you see inside websites typically so we’re not going to send back the password but any other kind of data we are going to send back inside the index page so going back down I’m going to assign the second piece of data which is going to be our email or at least the users’s email they tried to sign up with so this is going to be called email and we’re going to copy that and paste it over inside our variable here so now we have the actual data inside an array and now we have to actually send it back by assigning it inside a session variable just like we did up here so I can actually copy this session variable that we have paste it down below and we’re just going to go and change the names in here so we can actually go and say sign upore data and then we can go ahead and say this is going to be equal to our signup data so with this here we can now send the data back to our sign up form so what I can do is I can go inside my index page and what we need to do now is just basically take all these inputs from inside our signup form and we’re going to replace it with a piece of PHP code that is going to check if we did actually have some data sent back to this form here because then I want to show a different version of these inputs here so the way I’m going to do this is I’m going to copy all my inputs here just so I have them and I’m going to delete them and then I’m going to go inside my sign upore view. in.php file since we now have to show something inside our page and like we talked about we have the model view on controller and the view is going to take care of showing something inside the web page so what I’ll do is I’ll create another function so I’m going to go below my declare here and create a function and I’m going to call this one sign upore inputs just to give it some kind of name then I’m going to go inside and I’m just going to paste in my HTML for now so now what we have to do is create a couple of conditions that are going to check if we have this data being sent back to aign up form because of an error message and if that’s the case then I want to include that data inside my inputs here instead of having just the regular inputs with no data so what I need to do is go below here and create a if condition and inside this if condition I want to check if we have a certain session variable existing inside our web page which is going to be the one that has all the data in inside of it so going inside of here what I can do is I can write a is set function which checks if a certain session variable is currently set inside the page so I can check for a session variable so dollar signore session and I’m going to check if we have something called sign upore data but now I do want to check for a specific piece of data inside this sign upore data array uh so what I can do is I can create my brackets afterwards here and refer to a certain P inside this array here so right now I want to check if we have something called a username so if we have this it means that we did not leave any input empty for this particular input so now we’re actually also checking if there was any empty input so we don’t actually have to check for that particular error message but we do need to check for another error message because what if I picked the username that already exists inside the website because if I did that it means that I need to retype the username because it is already taken so in that case I don’t want to type the username that used to submit it because it is wrong and it needs to be changed right so we also want to check for certain error messages in here the way we can do that is going afterwards make sure it’s after the first parenthesis over here and we’re going to write a and condition and we want to check for another is set so what I can do is I can copy paste this session that we have here paste it inside my is set statement and in this case we’re not checking for sign upore data but we’re checking for errors uncore signup and then inside our errors uncore sign up we have a specific error message that we want to check for so in this case here it is going to be username unor tagen taken taken username uncore taken but we do also need to keep in mind here that I want to show the data inside the input if this error message does not exist inside our website so I do need to write a exclamation mark in front of my iset function here so right now we’re checking if we do actually have the data available because the User submitted some data and if we do not have this error message inside the web page then I want to actually show the actual data the User submitted inside an input so we can actually copy paste what we have up here with the username and I can go down and say I want to Echo then I’m going to say single quotes in order to not mess up any HTML here because we are using double quotes inside the HTML and then I’m going to close it off here and now the way we actually show data inside an HTML input and again this is HTML this is not PHP knowledge is by actually going in and adding a value attribute and then I’m simply going to close off the HTML by using single quotes and then I’m going to concatenate some PHP code and I’m going to paste in my data from inside our session so I can actually go and copy that from up here inside our condition and paste that in inside our value then I want to run a else condition because if this is not the case and we did not have any sort of data sent back and we did maybe have an error message then I do actually want to go in and show the Reg input without any sort of value inside of it so I do need to Echo that out as well so I’m going to Echo out single quotes paste it in and semicolon and this is basically all we need to do for these different inputs here so now the second one is going to be our password and in this case here with the password we did already talk about that I did not send the password back because I do want the user to retype it no matter what happens uh so in this case we do actually just need to Echo out our input for the password so we can just go and copy paste a password input here single quotes and paste it in and semicolon but when it comes to the email input we do actually want to copy paste this if else condition up here paste it below and then I want to use my email instead so instead of checking for sign upore data username I want to check for a email I do also want to make sure we’re not checking for a error message that is called username unor taken but instead I want to check for a email used because that is the error message we had inside our sign up. in.php if we were to scroll up here you can see we have email used but now we do also have a second error Mage when it comes to our email which is actually called invalid email so we do need to check for that as well because if you have more than one error message for one particular input then that is important to check for as well so going back inside our view I’m going to copy paste from where we actually check for the ANS and all the way over to the first parentheses copy that and then paste it in right afterwards here because now we can actually check for a second error message do make sure you have all the parentheses correct and all the single quotes and double quotes because that will mess up something inside your web page if you do not have everything said correctly so with that in mind let’s go and change the second error message from email used to invalid email because that is the error message for that particular one so now all we have to do is make sure we replace the actual Echoes down here so I’m going to copy paste my email I’m going to go down below and paste it in instead of these Echoes that we have in here in both places by the way so both inside the if condition and inside the else condition and then we just need to make sure we also add in the value inside the first one up here so I’m just going to go up going to copy the value make sure you copy it exactly like I am here so after the double quote at the end there but also before the angle bracket so copy that go back down and paste it in right after the placeholder so space and paste in and then just go ahead and change the actual data inside of here from username to email go back up to the top here delete these HTML things that we just pasted in just for reference and now what we need to do is just copy paste our sign upore inputs function go inside our index page and actually spit this out inside our form so if we were to go inside the form here where we had the inputs before I can say I want to open up my PHP tag and close it again and just simply write out my function and in this sort of way we should now have our actual data being shown back inside the forms if I to type some sort of error message so if I were to go back inside and refresh everything inside my page here so if I go back inside my form and type a random username so just something jerus write something random inside the password and let’s go and create a invalid email so in this case here when I click the sign up button we should not have any sort of data inside the email field but we should have something inside our username field so we want to click sign up here you can see oh okay invalid email used we still have the data inside our username but it did actually remove the data from inside the email which is what is supposed to happen uh so if I want to go in here and say I want to type in a username that already exists inside the database so Denny Crossing type in a random password and then let’s go and create a valid email so let’s say example at gmail.com so if I would to actually submit this it should send me back without the username and without the password because the username is already taken right so if I were to click submit here you can see that we get sent back without the username without the password so as we can see this is working like intended so with all of that we can now go ahead and sign people up inside our web page and just to double check nothing is being inserted inside the database cuz that’s always a good idea you can see that nothing is getting inserted and with that we now have a signup system with both error messages and we have the data still being inside the forms if the user would submit something wrong you know so they don’t have to retype things the signup is actually working inside the signup system uh what I’m going to do here is I’m actually going to split up this video into two part since this is already pretty long and I don’t want you guys to sit here for like 3 hours or something I don’t know maybe this video is going to be 3 hours long who knows so we’re going to split this up into a signup part and then we’re going to have a login part in the next video so I hope you enjoyed this video and I’ll see you guys in the next [Music] one so in the last video we how to create a signup system inside our website just as an exercise to learn how to use all the different things we learned up until until now inside this course and we still need to create a login system since we you know now we have people signing up inside the website but we also need them to be able to log into the website uh so what we’re going to do to begin with is we’re going to start up inside our login. in.php file because this is the file that we need to start in in order to you know when the user goes inside our login form and submits the user name and password they send that information to this page so we can actually lock them inside our website from within this page here so in the same sense as we did inside our sign up the in to phsp file we’re just going to go ahead and check for a server request method just like last time we’re going to go in and make sure we do that to begin with so we’re going to open up our PHP tags and we’re simply going to check for a request method that is going to be a post method so if the user got to this page legitimately by actually submitting the form post just like with our signup system then we do want to run some code inside this file here so the first thing we’re going to do is actually grab the data so in the same sense as we did in the last one you can see there’s a lot of copy pasting because we did the same things already uh we’re going to go and grab the username and password from within our login form and just to show you if I were to go back inside my index page I do have a login form and I do have a signup form and inside my login form I do have two inputs one for the username and one for the password so not anything for I think a email which we had in the signup system because we don’t need to log in using a email so going back inside our login. in.php file I do also want to make sure that if the user actually got to this page illegitimately so if they did not submit a request method called post then I do want to go down and write a else statement again just like inside our sign up form so we were to go in here scroll down to the bottom you can see that we have a else statement that simply sends them back to the front page and kills off this script here so if we were to go back inside our log in you can see that we just simply paste that in and that is all we need for now at least and then we have a basic structure of you know sending the user back if they did not get here properly so what I want to do now is I want to go below our username and password that we grabbed using the post methods and I want to go in and do a dry catch block just like again in the last episode so if we were to go in here you can see that we do have a try catch block where we go in and we try some code and if it fails then we do want to catch an exception and actually you know write whatever error that might has happened inside the website so we know that an error has happened so again we’re just going to go and copy the catch block at the end here and we’re going to go back in and we’re going to replace the catch block that I autogenerated using the tap functionality we have inside editors typically so I’m just going to go and replace that and now we do have the ability to catch a PDO exception if something were to go wrong so now all we have to do inside this Tri block up here is actually run the code that is going to allow for us to check for error handlers and check you know if the user should be logged into the website if there were no error messages then of course you know we do want to lock them in so what we’re going to do to begin with is first of all I do want to make sure that I create a login controller a lockin model and a lockin view just like we did in the last episode when it came to the sign up because we do need to go in and create these different functions that has something to do with different tasks again we’re going to try and implement this MBC model system uh so you can get a little bit familiar with it when you get into object Orient PHP which I did just upload a crash course on object oriented PHP and I will include that inside this playlist here as the next episode because I do think it’s a very good idea for you to know about object oriented phsp so we’re going to get into objectoriented PHP after this video here and I just want to say don’t don’t freak out because a lot of people do think objectoriented PHP is very difficult but it’s really not you just need to have someone explain it to you in a beginner friendly sort of way so it’s really not difficult to learn object oriented phsp it’s just you need to have it explained properly and that way you can get eased into it and then you’ll you’ll realize that oh okay so this is actually pretty easy um so we’re going to do that in the next episode so please watch that one even though it’s not labeled number 30 or something inside this course here because it is relevant to what we’re going to do in the future inside this course here but for now let’s go ahead and create these different controller model and Views inside our files here so what I’m going to do is I’m going to go inside my includes folder and I’m going to create a new file I’m going to call this one loginor controller or c n. inc. PHP we just going to copy everything here and I’m going to create another file and I’m going to name this one the same thing except for controller we’re going to say model then I’m going to do the same thing but this time we’re going to call it view so linore view. in.php and we’re going to go and link to these files we just created because we do need to use some of the functions inside these files so we do need to have them available to us inside what we have here so what I’m going to do is I’m going to say I want to require underscore ones and I want to require these files one at a time time so the first one is going to be login actually just copy paste here cuz I did actually copy it I’m going to copy this down two more times because we do actually need to get the database connection first that is the first one we need to grab so we’re going to say dbh in.php which is the database connection that we created over here which is just a very basic file that connects to the database and then creates a PDO object which I do explain in that Next Episode by the way because we do go over objects in the next episode and then we can use this PD connection object in order to connect to our database again this is something we learned in the last episode but since I recorded that a while back I thought why not just mention it again so going inside our login. in phsp file we do need to make sure we have this connection and then we’re going to go down and say we want to grab the model and then we want to grab the controller and the order here does matter so you do need to have the connection first then the model and then the controller so now taking a look at what we did in the last episode you can actually see the we immediately started doing error handlers inside this script here and we’re going to do the same thing when it comes to login system so instead of doing things a little bit out of order like we did in the last episode because that might be easier for you to understand now you do know exactly what these error handlers do while we create this empty errors array why we do these if conditions down here why we do need to want to have this config underscore session why we do need to check for if we had any sort of Errors inside the array because then we need to send the user back with an error message so we do do have some things in here that we’re going to repeat inside the other file so we’re going to go and copy everything from when we actually check if the array that is called errors have any sort of Errors inside of it all the way up till the comment where I wrote error handlers then we’re going to go back inside the login file go down and simply paste that in so right now we are creating an empty array called Aros which is going to contain any sort of Errors you might be getting inside the website and in this case because we’re doing a login system and not a signup system of course this are going to change a little bit because you might not want to check for as many things for example why do we check for an email when it’s a login system we don’t have any emails passed from the user so we don’t actually need to have that uh so we don’t need to have all of this inside our code for now we’re just going to go Ahad and delete all of them except for the first one which is going to check for any sort of empty inputs and then we do actually need to go after this one and we do need to actually query the database because we need to actually grab the user from the database that they typed in using the username and we need to check if the passwords match because if this password the user just submitted matches with the user’s password from within the database then we do need to check for that as well and of course there’s many different error handlers you could be doing when it comes to a login system I think for now just because this is a basic example it is just enough just to check for empty inputs and check if the username exists inside the database so does the user actually exist inside our database and if the user exists does the password actually match inside the database as well so we have a couple of things we need to check for here so what I’ll do is I’ll go inside my loginor model file and I’m actually going to quy the database using the username provided by the user to see if the user exists inside the database and if they do then I do want to grab the password and check that up against the password the User submitted just now so what we’re going to do is we’re going to open up our PHP tags just like any other time we go inside a new file and inside of this one I’m going to create a function that simply goes in and gets the user so we can say getor user and I’m also going to go and declare strict types because we did actually talk about that in the last episode so we’re going to declare that we want to use strict types so we’re going to say parentheses strict underscore types and I’m going to set this one equal to one this means that once we do actually get inside this function down here we can also tell it that we want to require a certain data type and not just the variable but the variable has to be a certain data type so inside the parenthesis I want to get the connection so we want to grab the variable PDO which is the one we have inside our database connection here so we can actually connect to the database in order to query it the second thing we’re going to pass in is going to be the username because the username was given to us by the user so if I were to go back inside my login. in.php file you can see that we did actually get it up here so just simply going to quy the database using this username now now we did talk about strict types so what I can do is I can actually say this is a object type and then the second one over here is going to be a string type again we talked about the PDO variable being a object that we created inside our connection so whenever you use PDO in order to connect to the database in this sort of way we do do that by creating a connection object using PDO and we do that using this new keyword so we instantiate a new object that is from the PDO class again we’re going to talk about this in the next episode uh but this one is going to be our connection so we do want to make sure we grab that and refer that to as an object because that is what it is and then we just have the username being a string because that is what the user gave us so now inside this get user we simply going to go in and Cory the database and we can actually go and copy paste because inside our sign upore model we do actually have very similar function so we can actually go in and just copy everything from inside just this first one up here called get username just to grab one of them and we’re going to go back inside the model and simply paste that in now everything is going to be the same except for our select statement up here because right now we want to not just select the username but we do want to select everything from inside this table here so we’re going to grab everything from the users table where a certain username is equal to username so in the same way as we did before then we create a prepared statement we go in and bind the parameters to the placeholder so right now we have this name parameter up here so we just bind the username the user gave us and then we execute it and then we grab all the results from inside our database or at least we’re grabbing one result from inside the database because we’re not fetching all of the data but just fetch which is just one piece of data or one row from inside the database so with this basic function here we can now just go in and cor the database using a particular username which means that we can actually go in and grab our loginor controller and do a couple of other functions in order to check if the username exists inside the database and we can also do want to check if the passwords match inside the database because you know the username has to use the right password so I’m going to go inside my model again and just copy everything go back inside my controller paste it in and just delete everything inside the function and change the function name to something else because in this case here we might call this one is underscore username wrong so underscore wrong and inside the parameters here we’re just simply going to check for variable results which was the one that we returned inside our model here if we do actually have a result but there is a small catch here because if I qu the database and we do actually have a user inside the database with that username then I’m going to get this one as an array however if we do not have a user inside the database with that username then this is going to return as a Boolean so no longer as an array but as a Boolean because it’s going to be f because there’s no user inside the database so how do we do that when it comes to strict types because if we would to go back here and say okay well I want to require variable result to be of a certain data type because if I write array then if I don’t have the user inside the database then we’re going to get an error message because now the strict type is wrong so if we were to type bull instead which is a Boolean then now it’s going to be wrong if we actually do get a result from inside the database so the solution here here is that we can go in and write this pipe symbol and say we also want to accept an array so now we’re saying that if this is either a Boolean or an array then we do want to accept the results so this is how you can combine different data types and say that you want to accept one just one type of data so not just a string but also a string and a Boolean if you wanted to uh so just to show you that this is how we can do that inside the function itself we’re going to write a if condition I’m just going to copy paste for my code here because it is very simple so going in we’re just going to create a if condition and we’re going to check if result is equal to false then return true because if it returns as false it means that we did not find the user inside the database because we don’t have any data inside this array here otherwise return this as false which means that we did not have any sort of error messages I know that the true false May logically seem like it switched around but it’s not really because the function is called isue username wrong and if this one is true it means that it is wrong and this is how we can simply check if the username exists inside the database and I know we haven’t actually use the function inside our login theing the PHP file yet but it will make sense in just a second so what I’ll do is I’ll copy paste this function below here and I’m going to check is password wrong because we do also need to check if the passwords do actually match because we do have a password from the user that just tried to log in and we do have a password inside the database which by the way has been hashed so we need to actually check these two against each other um and then we need to return this as true if they do not match each other or false if they did match each other the simple way to do this is just to go inside our parameters and say we want to get a string which is going to be the password submitted by the user and then we also do want to get another string which is going to be the has password from inside our database so PWD so grabbing these two different passwords we can go inside the if condition and simply run a password underscore verify and then we’re just simply going to check these two different pieces of data up against each other so we can check if password and H password do actually match each other but we do need to keep an eye out here because we are actually right now checking if the passwords do actually match each other which if they do then we’re actually returning a error message and that is the opposite opposite of what we want to do so we do need to make sure we go inside the if condition and do a exclamation mark in front of our password verify because now we’re checking if this is equal to false but now we do also have one last one we need to create because going back inside our login. in. PSP file we do have one more error Handler that we haven’t actually addressed yet which is right now is input empty because right now this is actually the one that matches up with the signup form and not the lockin form because as you can see we have an Emil in here so we can’t just reuse it and it is also just better to separate functionality so you know all the code for the login system in one place and then all the code for the signup system in another place because that kind of goes into the NVC model pattern that we’re going to talk about in a future episode okay so we do need to create a function for checking is input empty inside our linore controller so that is important so going inside the loginor controller I’m just going to copy paste the function here so you can just copy paste it as well uh it’s very basic we just go in and create a function and we call it is input empty and then we just submit a username and a password not an email this time around and we just go inside our function and just do a if condition to check if username and password are empty so with these functions here we now have a very basic example of checking for different types of errors that might occur inside our login form again if you want to add more you can do that uh for this tutorial here we’re just going to do these three for now so going back inside the login form we can actually make some adjustments so right now we do actually have this is input empty but I do want to make sure we delete the email and again this function here is something that we can actually grab because it’s inside our login controller which we did require right above it so we do have access to this function and then below here we do actually want to run our model function because we do want to actually grab any sort of data that might be inside the database where the username is equal to this particular username so what I can actually do here here is I can create a variable and I’m going to call this one result and I’m going to set it equal to getor user which is the function we have inside our model so inside our model file here where we actually go in and we qu the database and grab a user if it does exist so we’re going to grab a user and we do also want to make sure we submit our database connection as well as our username so we can actually go and say we have the username up here which was the second parameter by the way so we do need to go in front and also grab our PDO connection again the PDO connection is inside our database file which is linked up here so we can actually grab this one directly and just like that we now have a variable that has the results from the database query where we go in and actually try to grab the user so now we can use this in order to complete our next two error handlers which we did create inside our controller here so we do want to check if the username is wrong and we do also want to check if our password is wrong so after grabbing the data we can run a simple if condition just like up here when it came to the empty inputs and we can check if our username is wrong by simply running this function that we just created inside our controller and then we pass in our results that we just created in order to check if we did have any results from the database if we did not then we want to return a error called loginor Incorrect and incorrect login info and all this does is that it creates a error message that we can grab once we do actually get back to the login form if there was any sort of error messages and then we can display those errors inside the login form so the next one I’m going to check for here is if the passwords actually do match and again we did create a function for checking that so what I can do here is I can go below and I can run another if condition but this time I do want to go in and check if the username is not wrong so if it is actually a user that exists inside the database but also if the password is incorrect and you’re going to notice inside our is password wrong we just pass in our password which was submitted by the user right up here and we also pass in the password from inside our database query so the one we grabbed inside variable result which has a column name as password so with these error handlers here we basically just go in and check if the username exists and if you do actually have the passwords matching inside our database so with that we can now go back down inside our if condition that checks for any sort of Errors inside the errors array and I’m actually going to go and delete our session variable called sign upore data and also the actual array called sign up data and the reason for that is I do think that when a person types something incorrect inside a login form I don’t think that we should retype what they submitted into the login form I think they have to start completely over with the username and a password so it’s a little bit different than the signup form where if they wrote One Thing incorrect but the email was correct and everything else then we just you know we don’t want them to retype everything again cuz a sign up phone can be lengthy but in this case here I do think that that they should just type everything again and again just to go over what exactly this code does because you may not remember it from the last episode The require once where you grab the config unor session basically just goes in and grabs our session config file which goes in and updates the session ID once in a while inside the cookie inside your browser session security thing so to speak so inside our config session you can see that we you know we set out some parameters and you know we update the cookie every once in a while every 30 minutes so um so so now what we need to do here is a security thing which is that whenever you have any sort of changes happening when you lck in a user inside a website or something else that you know maybe some uh roles have changed inside the the website what you want to do is you want to make sure you always update the session ID cookie again when you make these changes so when you log a user into the website then update the session ID cookie because that is just a good habit to have so you don’t have to wait every 30 minutes you know from inside the config file just do it whenever something changes inside the website but now we’re going to do this in a slightly different way because if I were to go back inside my config file you can see that the way we did it before is by running a session regenerate ID which is how we can take the current session ID that is inside our website and we then regenerate it because if someone were to grab the session ID and stole it from us then we can regenerate it to change it so now it’s no longer usable but something we can actually when it comes to a login system is we can actually grab our users ID and combine that with our session ID from inside our session and this is not something you have to do this is something we’re going to do together in this episode here just so I can show you how to do it uh but essentially there comes a couple of benefits to having the users ID inside the session ID for example because you can associate some data together with the actual user that is using a particular session ID um so there is some benefits to it and again I’m just going to show you how to do it and then you can determine whether or not you want to use it or not again it’s just an exercise to show you some different things so what we’re going to do is we’re going to go back inside our login. in phsp file and right below where we check for these error messages the next thing I want to do is I do want to create a new variable I’m going to call this one new session ID make sure we spell that correctly and I’m going to set it equal to a function that I do think I’ve mentioned before in the previous episode which is called called session uncore creatore ID so this is not a session uncore regenerate ID this is a session _ create ID which is a little bit different so now this will actually create a entirely new ID instead of just regenerating the existing ID we have current inside the website and what we can do then is we can actually append our users ID together with this newly created ID that we just created so if I were to go below here I can go ahead and say I want to create a variable called session ID and I’m going to set it equal to our new session ID that we just created up here and then I’m just simply going to append a ID that we got from our variable results a little bit further up inside our code because we did actually grab the users’s data from inside the database so if we were to grab the variable results go down I can actually append the ID of the user together with our session ID so again we’re creating a new session ID which is just for security just like we regenerate a new session ID we now just create a new one and then we just add our users ID together with our session ID using a underscore just so we can separate those uh the ID from the users ID and now all we have to do is just go below here and say we want to run a session ID function which goes in and actually sets our session ID equal to a ID that we give it inside the parentheses here so this case we can go in and tell it to set our session ID equal to what we just created up here with the users ID so again a small trick here just to you know create a new session ID inside our website using also the users’s ID from the user we tried to log in inside our database here and there is something we have to do here as well in regards to this because right now we do have our users ID together with our session ID but what happens in 30 minutes when I go inside the config session code and it automatically updates the session ID in 30 minutes well when it does that we no longer have the users ID part of our session ID because it is just regenerating the the session ID without appending the users’s ID in 30 minutes so that is something we have to change inside our config file so what we need to do here is we do actually need to check if the user is currently logged in or if they’re not logged into the website because if they are logged into the website side then I do want to make sure that when we regenerate the session ID that we do so using the user’s current ID so inside our if condition at the bottom here where we go in and update this every 30 minutes I do want to create another if condition so again now we’re going to start to have some nesting going on but I think it’s okay for now and I’m simply going to go inside my parentheses and check if we currently have a user locked into the website by checking if we have a current session variable that is equal to user on the _ ID or at least that is named user uncore ID so by going in here we can say we have a variable underscore session which is a super Global we have talked about this one plenty of times by now so we go in and we check if we have a user ID which we haven’t created yet by the way this is something we will create once we actually log the user in instead of login.in phsp file just know for now that we will have a session variable called user ID when the user is logged in okay then I’m going to create a else condition so we’re going to say else and inside the else condition we want to run the code that is going to get run when the user is not logged into the website so that would actually be the code that we have here already so it would to copy paste that inside my else condition this is now getting run if the user is not logged into the website but what if the user is logged into the website because now we need to change things a little bit here all we have to do is we need to go inside the if condition paste in the same code again but instead of running I’ll regenerate on _ session ID which is a function that we created down here we’re going to create a new function that is going to go in and append the users’s ID once you do actually regenerate the ID inside once we’re logged into the website so all we need to do here is create a new function called regenerate unor session idore loged in and the same thing down here for regenerate uncore session ID logged in then we scroll down inside our function here and just copy paste it because we do need to have another function for when we’re logged in so I’m going to change the name of one of these to logged in and we’re going to keep the same code as we have in here because we do still need to use this code uh we do need to make sure we write true inside these parentheses here though inside both functions because we forgot to do that in the last episode so after regenerating the ID we’re going to do the exact same thing as we did inside our login that in the PHP file so I’m just going to go in I’m going to go down here where we actually generated the ID using our ID from the user so I’m going to copy that go back in paste it in but we do need to change one thing here which is that right now we don’t have a result called ID because that is specific to that particular file in there uh but we do have a session variable that does exist called user ID if the user is logged in so we can actually take that one go down here create a new variable we can call this one user ID and set it equal to our session variable called user ID and then we can use that ID instead of our result from the database because like I said it’s inside that other file so we can’t access this variable specifically uh but we can access a user ID from our session variable if we’re logged into the website so again just to recap here we’re going in regenerating the ID which we technically don’t have to we could delete this if we wanted to we’re grabbing the user ID from our session variable if we’re logged in then we’re going down and creating a new session ID by using this session create ID then we’re going in and saying that we want to set a session ID equal to the new session ID we just created and the user ID from the user and then we’re just simply going in and saying that we want to set the session ID equal to this session ID up here and then we update the time for when we last regenerated the session ID because now it needs to wait 30 minutes until it will automatically go in and again regenerate this using the users ID if we’re logged in this may be the most confusing part of this video by the way again just know that we’re going inside the website and updating the session ID by adding the users ID with it as well to create some faint new things we can do potentially if we wanted to do that in the future uh we’re not going to do anything with it in this video here it’s just to show you that you can do it so inside our login. in.php file at this point here we do actually have a user that tried to sign up with a username that exists inside the database and also a password that matches with the password inside the database so what we can do is we can actually sign up the user inside our website the way we’re going to do that is first of all by setting the appropriate session variables so we’re going to say we have a session variable and we’re going to call this one user uncore ID which by the way inside the config uncore session we are checking for if the user locked in into the website and we’re going to set this one equal to the ID from inside our database so we can actually go ahead ahead and set this one equal to our result from our database quy and the ID column from inside the database which is the ID of this particular user here so I can copy paste this down and then we might also include maybe the username so the user undor username just so we have it available to us so we don’t have to quote the database every single time if I just want to graph the username of the user uh so with this we can set it equal to username because that is the name of our database column but now I do want to do something else here because we might actually take this username and print it out in our website somewhere we might try to Echo it out because I want to show the user who they’re logged in as right now inside the website uh so we do need to make sure we do some security so we’re going to use HTML special characters and make sure we run a sanitation of variable result just to make sure everything has been sanitized to avoid any sort of potential crossy scripting that might be happening inside the website here and with that I do want to do one more thing which is to go in and actually reset the timer for when we have to update our session ID because we just did so so why not go in and just reset the timer for that so I’m going to go inside my config unor session and I’m just simply going to go down and grab our session variable called last regeneration which is equal to time copy that entire lineer code go back in and right below here where we actually to create these session variables I’m just going to go and create that one as well by setting it equal to the current time so now we reset the time so that in 30 minutes it’s going to update itself again and just like that we now have a login system so we can actually go below here create a header function to send the user back to the front page with a login equal to success message uh we can also go ahead and close off these statements and our connection because the prepared statement and the connection it does get automatically closed but it is just a good habit best practice so to speak to actually close it manually inside your code uh so we’re going to go and do that as well well so right below the header function I’m just going to say we want to close off the PDO and the prepared statement and the last thing we’re going to do is to create a die function essentially just terminating the script at this point here so now we have a login system that should be working inside our website but let’s actually go back inside our index page and make sure if we have any sort of error messages related to the login form for example submitting the wrong password or a username that doesn’t exist inside the database then we want to Output that error message inside our form or at least below the form inside our front page so going below the login form I’m going to go down and open up my PHP tags and inside here we’re going to refer to a function called check linore errors and this is a function we haven’t created yet because this is going to actually output something inside the website which means that it needs to go inside our view so going inside our loginor view you can see that right now we have nothing so what I’m going to do to begin with here is open up the PHP tags and open up the strict mode and all that U so I’m going to go inside one of the other ones that I have here and just kind of open up what we have here you know so we have the beginning of the PHP tag we have the declare strict types and then we’re going to create the function that we just had inside our index page I’m just going to go and drag this over so we can actually see it and I’m going to copy the function name inside the index page go back inside my loginor view and say I want to create a function that has a name set to check unor linore for errors so inside this function we’re going to run a if condition and I want to check if we have a certain session variable set currently inside the website so if we have a is set parenthesis and we have a session variable that is called error uncore login so errors uncore login and this is something we actually do need to change inside our login. in PSP file so if we would to copy the name here go inside the login the PHP and scroll up to our error messages you can see that right now we’re creating a session variable called errors unor signup because we copy pasted this from our signup form so we do need to make sure we’re go and change that to errors unor login and then if we have any sort of error messages then I want to go inside this if condition and simply create a variable called erros and set it equal to the session variable that has all the errow messages inside of it so we’re just going to set equal to variable uncore session errors uncore lugin because by doing that we can now go below here and we can actually unset the session variable because remember if there’s any sort of information inside our session variables that is no longer needed then we need to make sure we unset it you know to clean it out so in between here I’m just going to go and Echo out a break just to get some distance between our form and the error message that we’re going to print out and then I’m going to run a for each Loop because we do actually want to go in and make sure that we take all the error messages inside our variable errors and print print them out below each other inside our login form or below the login form just like we did when it came to the signup form so inside my for each Loop I’m simply going to Echo out a paragraph that has a class set inside of it which I did style inside my stylesheet and I’m just simply going to print out a error so I’m going to go inside our parameters up here for the for each Loop and I’m going to say that I have a errors array and I want to refer to error whenever I refer to one of these errors inside the array and then because I refer to to error in between the paragraph down here we just simply spit out the error that we might be getting inside our form so with that we now just need to create a success message if we did actually not have any sort of Errors so going below here I can create a else if and I’m just simply going to check if we had any sort of success message inside the URL when we did send the user back with a you know lockin success message so we’re going to use a get method in order to grab a login and we’re going to check if it is equal to success and and again just to show you where this happens if we were to go back inside our login. in. PSP file at the bottom here when we do access send the user back you can see that inside the URL we have lugin equal to success and that is what we’re checking for here and now we need to do one more thing before we can actually test this out because right now inside the index page we are referring to a check unor linore errors which is inside our view file uh but we did not actually link to our view file at the top here so we need to go up here and say we have a lock inore view. in the PHP file so now we do actually have access to this function in here so if we were to go inside our website and let’s go ahead and sign up as a new user because I don’t actually remember the password from the user we created in last episode so let’s just go ahead and go in here and say we have John do and we’re going to say we have a password that is one 12 three which is most likely what I used in the last episode as well so John at gmail.com I’m just going to go and sign up this new user and then you can see oh sign up success and now we can actually go inside our login form and we can test this out so if we were to say John do with capitalized d and capitalized J and then one two three log in then you can see we get login success if I were to try and go in and actually log in with something that does not exist inside the database let’s actually go and leave this one empty you can see oh fill in all Fields incorrect login info uh if we were to pick something in both Fields then you can see we get incorrect login info because saf does not exist inside our database as a user if I were to use John Doe John do but use a incorrect password then you can see we get incorrect login info because this was not the correct password so everything is working exactly like intended but now a question that people may have is okay so we have this login system but how do we change content inside the website once we’re logged in cuz that is important to do too before we do that let’s actually go and create a log out button because I do want to be able to lock out the user as well because right now we’re just logging in as one user and then trying to lock in as another user but we’re not actually locking out at any point so going inside the index page here I’m going to create a new form I’m just going to call this one log out so I’m going to copy paste this one and let’s go ahead and put this one at the bottom so we’re going to say log out like so and we’re going to refer to a log out. in the PHP file and we’re not going to have any sort of inputs in here we’re just going to have a logout button then I’m going to go in and actually create a new file inside my includes folder so I’m going to say new file call it log out. in.php and inside this file here we’re just going to open up our PHP tags go down and say we want to create a session uncore start because we do want to start a session in order to actually destroy it and then below we’re going to go and say session uncore unset and then we’re going to say session uncore destroy and then we can actually send the user back to the front page so we can actually copy paste that from let’s say I’ll login. in.php file so we want to go down to the bottom here we have a header that sends the user back and we have a die uh function so we can copy those and paste those in so if I were to go inside my website refresh everything you can see we have a log out button so if we were to actually log in using John do one two 3 log in then you can see we are logged in as John do well you can’t actually see it cuz you can’t see if we’re logged in or not uh but we do get a login success message and then if I want to I can loog out down here and then I will be locked out again so now the question is how do we change content inside the website when we’re locked in when we’re not logged in you know because we need to change content because that’s the whole point right we create a login system so we can log a user in and then change content inside the website so they might have a profile page or something um so the way we can do that is if I were to go back inside our view for the login system is I’m actually going to go and create a function to print out the username when we’re logged in so we can actually see the username inside the website and it says you are logged in as and then the name of the username so I’m going to create a basic function I’m just going to copy paste it here which is called output username and then inside we have a if condition that simply goes in and checks or we currently logged in by checking if we have a user ID because if that exists that means we’re logged into to the website and if we’re logged in we’re just simply going to go in and output you are logged in as and then we’re going to grab the username from inside our session variable again that’s why we wanted to set that as a session variable when we did actually log in previously and if we’re not logged in we’re just simply going to say you are not logged in and then we can use this function we can copy it go inside our index page and just simply output it somewhere maybe above our login form so we can say we have a let’s create a H3 and we’re going to go and say we want to have a PHP tag opening and closing in here and then we’re just simply going to run this function here so anytime you want to change anything inside the website if you’re logged into the website again all you have to do is run a if condition that checks if currently we have a session variable that is called user ID and that is all you need to check for if that exist then change the content Again by echoing something out or creating some HTML or something um so if I were to go back inside the website you can now see that when I refresh it says you are not logged in cuzz we’re not logged in but if if we were to go down here and log in as John Doe 1 2 3 log in then you can see we get you are logged in as John Doe and again if I were to go down to the bottom here log out then you can see oh you are not logged in cuz we destroyed all the session data with the session variable and now we’re no longer logged into the website and we can do the same thing when it comes to the forms so if we were to go in here and say you know what let’s go inside our view and just copy this if condition go inside our index page and let’s say we only want to see the login form if we are currently not logged into the website because there’s no need to have a login form if we’re already logged in right so if we were to go in here we can go ahe and open up the PHP tags and close it off again we’re going to paste in the if condition here and then we can just go in and actually include the form inside the if condition for when we’re not logged in so what we can do here is we can say okay so if we are not currently logged in and instead of echoing out you are logged in as and then the username we can just go in and we can copy paste the form and paste it inside our condition here so I’m going to copy the form delete it go inside and I’m just going to go and close off my uh PHP tags here just because it makes a little bit easier so again opening and closing the PHP tags wrapped around the closing bracket and also opening and closing it wrapped around the first if condition line of code here because that allow for us to go in and paste in HTML and still have it be part of the PHP again this is PHP syntax good practices 101 so instead of you know putting this in as a string by echoing all of this out can just write HTML code directly Inside by simply opening and closing the closing bracket and the same thing for the opening bracket so if I were to go in here and do this then you can see that if I were to go inside the website refresh it right now we’re not logged into the website so we can see the form but if we were to go in and log in as John do 1 2 3 then you can see that oh okay the login form disappeared cuz we no longer need to see it and that is how you can simply go inside a website and change content based on if you’re logged in or if you’re not logged in and you can do the same thing for the sign up form that could also disappear by the way and the same thing for the log out form maybe that should not be there when you’re not logged into the website because it doesn’t make any sort of sense so with that I hope you enjoyed this little episode on how to create a login system and I’ll see you guys in the next video [Music]

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Linux Terminal Mastery: Commands, Shells, and File Systems

    Linux Terminal Mastery: Commands, Shells, and File Systems

    This text is a transcript of a Linux crash course aimed at beginners. The course, offered by Amigo’s Code, covers the fundamentals of the Linux operating system, including its history, features, and various distributions. It guides users through setting up a Linux environment on Windows and macOS using tools like UTM and VirtualBox. The curriculum further explores essential Linux concepts like file systems, user management, and commands, including the use of the terminal. The course then introduces Bash scripting, covering variables, conditionals, loops, functions, and the creation of automated scripts. The goal of the course is to equip learners with the skills necessary to effectively use Linux for software development, DevOps, or system administration roles.

    Linux Crash Course Study Guide

    Quiz

    1. What is Linux and who developed it?

    Linux is a powerful and flexible operating system developed by Linus Torvalds in 1991. Unlike operating systems such as Windows and macOS, Linux is open source and allows developers around the world to contribute and customize.

    2. What are the key features of Linux that make it a preferred choice for servers?

    The key features are stability, security, the ability to be customized to specific needs, and performance. Due to these factors, servers worldwide often prefer Linux.

    3. What is a Linux distribution? Name three popular distributions.

    A Linux distribution is a specific version or flavor of the Linux operating system tailored for different purposes. Three popular distributions are Ubuntu, Fedora, and Debian.

    4. Explain what UTM is and why it’s used in the context of the course.

    UTM is an application that allows users to securely run operating systems, including Linux distributions like Ubuntu, on macOS. It’s used in the course to demonstrate how to set up and run Linux on a Mac.

    5. What is VirtualBox and how is it used for Windows users in the course?

    VirtualBox is a virtualization software that allows Windows users to install and run other operating systems, including Linux distributions like Ubuntu, within a virtual environment.

    6. What is the difference between a terminal and a shell?

    A terminal is a text-based interface where users type commands and view output. A shell is a program that interprets and executes those commands, acting as an intermediary between the user and the operating system.

    7. What is Zsh, and why is it used in this course?

    Zsh (Z shell) is an extended version of the Bourne shell, known for its advanced features like auto-completion, spelling correction, and plugin support. It is used in the course to provide a more customizable and efficient command-line experience.

    8. What is Oh My Zsh, and what does it offer?

    Oh My Zsh is an open-source framework for managing Zsh configuration. It includes numerous helpful functions, helpers, plugins, and themes to enhance the Zsh experience.

    9. Explain the command sudo apt update. What does it do?

    sudo apt update updates the package index files on the system. These files contain information about available packages and their versions. The sudo ensures the command is executed with administrative privileges.

    10. What is a Linux command and what are its three main parts?

    A Linux command is a text instruction that tells the operating system what action to perform. The three main parts are the command itself, options (or flags) which modify the command’s behavior, and arguments, which specify the target or input for the command.

    Quiz Answer Key

    1. What is Linux and who developed it?

    Linux is a powerful and flexible operating system developed by Linus Torvalds in 1991. It’s open-source and allows for worldwide contributions.

    2. What are the key features of Linux that make it a preferred choice for servers?

    Key features include stability, security, customizability, and performance, making it ideal for servers.

    3. What is a Linux distribution? Name three popular distributions.

    A Linux distribution is a specific version of Linux. Ubuntu, Fedora, and Debian are examples.

    4. Explain what UTM is and why it’s used in the context of the course.

    UTM lets macOS users run other operating systems, including Ubuntu. The course uses it to set up Linux on a Mac.

    5. What is VirtualBox and how is it used for Windows users in the course?

    VirtualBox is a virtualization software. It allows Windows users to run Linux within a virtual environment.

    6. What is the difference between a terminal and a shell?

    A terminal is the interface for typing commands. The shell interprets and executes these commands.

    7. What is Zsh, and why is it used in this course?

    Zsh is an improved shell with features like auto-completion. The course uses it for a better command-line experience.

    8. What is Oh My Zsh, and what does it offer?

    Oh My Zsh is a framework for managing Zsh configuration. It provides themes and plugins to customize the shell.

    9. Explain the command sudo apt update. What does it do?

    sudo apt update updates package lists, requiring administrative privileges through sudo.

    10. What is a Linux command and what are its three main parts?

    A Linux command is a text instruction to the OS. It consists of the command, options, and arguments.

    Essay Questions

    1. Discuss the advantages of using Linux as a server operating system compared to Windows Server. Consider factors such as cost, security, and customization.
    2. Explain the significance of open-source development in the context of Linux. How does the collaborative nature of its development benefit the Linux community and users?
    3. Compare and contrast the roles of the terminal and the shell in a Linux environment. How do they interact to enable users to control the operating system?
    4. Describe the process of installing Ubuntu on both macOS (using UTM) and Windows (using VirtualBox). What are the key differences and considerations for each platform?
    5. Discuss the importance of Linux file permissions and user management in maintaining a secure and stable system. Provide examples of how incorrect permissions can lead to security vulnerabilities.

    Glossary of Key Terms

    • Linux: A powerful and flexible open-source operating system kernel.
    • Distribution (Distro): A specific version of Linux that includes the kernel and other software.
    • Open Source: Software with source code that is publicly available and can be modified and distributed.
    • Terminal: A text-based interface used to interact with the operating system.
    • Shell: A command-line interpreter that executes commands entered in the terminal.
    • Zsh (Z Shell): An extended version of the Bourne shell with advanced features and plugin support.
    • Oh My Zsh: An open-source framework for managing Zsh configuration.
    • Command: An instruction given to the operating system to perform a specific task.
    • Option (Flag): A modifier that changes the behavior of a command.
    • Argument: Input provided to a command that specifies the target or data to be processed.
    • Sudo: A command that allows users to run programs with the security privileges of another user, typically the superuser (root).
    • UTM: An application that allows you to run operating systems on macOS devices.
    • VirtualBox: Virtualization software that allows you to run different operating systems on your computer.
    • Operating System: The software that manages computer hardware and software resources.
    • Server: A computer or system that provides resources, data, services, or programs to other computers, known as clients, over a network.
    • Root Directory: The top-level directory in a file system, from which all other directories branch.
    • File System: A method of organizing and storing files on a storage device.
    • Directory (Folder): A container in a file system that stores files and other directories.
    • GUI: Graphical User Interface. A user interface that allows users to interact with electronic devices through graphical icons and visual indicators such as secondary notation, as opposed to text-based interfaces, typed command labels or text navigation.

    Linux Crash Course: A Beginner’s Guide

    Okay, here’s a detailed briefing document summarizing the main themes and ideas from the provided text:

    Briefing Document: Linux Crash Course Review

    Overall Theme: This document is a transcript of a video presentation promoting a “Linux Crash Course.” The course aims to take complete beginners to a point of understanding and mastering Linux, particularly in the context of software engineering, DevOps, and related fields. The presenter emphasizes that Linux is a fundamental skill in these areas.

    Key Ideas and Facts:

    • Linux Overview:Linux is described as a “powerful and flexible operating system” developed by Linus Torvalds in 1991.
    • A key feature of Linux is that it’s “open source,” with developers worldwide contributing to its improvement and customization.
    • Linux boasts “stability, security, the ability of changing it to your needs, and performance.” This makes it preferred for servers globally.
    • Linux is used by “internet giants, scientific research companies, financial institutions, government agencies, educations,” and pretty much every single company out there.
    • Amigo’s code is actually deployed on a Linux server
    • Linux is versatile and used on “smartphones to service and also Raspberry Pi.”
    • Linux Distributions:Linux has different “flavors” called distributions.
    • Ubuntu is highlighted as the “most popular flavor of Linux.” It comes in server and desktop versions (with a graphical user interface).
    • Other distributions mentioned include Fedora, Debian, and Linux Mint.
    • Companies often customize Linux distributions to meet their specific needs.
    • Course Promotion:The presenter encourages viewers to subscribe to the channel and like the video.
    • The full 10-hour course is available on their website, with a coupon offered.
    • The course aims to “make sure that you become the best engineer that you can be.”
    • The course has a “Windows users as well as Mac users”
    • Setting up Linux (Ubuntu) on Different Operating Systems:Mac: The presentation details how to install Ubuntu on a Mac using an application called UTM (a virtualization software).
    • Windows: Installation of Ubuntu through VirtualBox.
    • Understanding the Terminal:The terminal allows users to interact with the operating system by entering commands.
    • Understanding the shellshell is a program for interacting with the operating system.
    • Z Shell (zsh)zsh also called the zshell is an extended version of Bor shell with plenty of new features and support for plugins and themes
    • Linux CommandsThey are case sensitive
    • Linux File SystemThe Linux file system which is the hierarchical structure used to organize and manage files and directories in a Linux operating system
    • Files and PermissionsLinux is a multi-user environment where allows us to keep users files separate from other users
    • Shell scriptingIt is essentially a command line interpreter

    Quotes:

    • “If you don’t know Linux and also if you are afraid of the terminal or the black screen then you are in big trouble so this course will make sure that you master Linux”
    • “Linux is a must and don’t you worry because we’ve got you covered”
    • “Linux it’s a powerful and flexible operating system”
    • “Linux is open source developers around the world contribute to improve and customize the operating system”
    • “servers around the world prefer Linux due due to its performance”
    • “Linux is open source but it’s also used on a wide range of devices from smartphones to service and also Raspberry Pi”
    • “Ubuntu is the most popular flavor out there”
    • “At Amigo’s code we want to make sure that you become the best engineer that you can be”
    • “So many original features were added so let’s together in install zsh and as you saw the default shell for Mac OS now is zsh or zshell”
    • “We’ve got Bash as well as chh Dash KS sh T C CH and then zsh”

    Potential Audience:

    • Beginners with little to no Linux experience.
    • Software engineers, DevOps engineers, backend/frontend developers.
    • Individuals seeking to enhance their skills and career prospects in the tech industry.

    In summary: The document outlines a Linux crash course that aims to provide individuals with the necessary skills to confidently navigate and utilize the Linux operating system in various professional tech roles. It covers core concepts, practical setup, and promotes the course as a means to become a proficient engineer.

    Linux and Shell Scripting: A Quick FAQ

    FAQ on Linux

    Here is an 8-question FAQ about Linux and shell scripting, based on the provided source material.

    1. What is Linux and why is it important for aspiring engineers?

    Linux is a powerful and flexible operating system developed by Linus Torvalds in 1991. Its open-source nature allows developers worldwide to contribute to its improvement and customization. Its stability, security, and performance make it a preferred choice for servers and various devices, ranging from smartphones to Raspberry Pi. For aspiring software, DevOps, or backend engineers, understanding Linux is crucial because most companies deploy their software on Linux servers, making it an essential skill.

    2. What are Linux distributions and how do they differ?

    Linux distributions (distros) are different “flavors” of the Linux operating system, each customized to suit specific needs. Popular distributions include Ubuntu, Fedora, Debian, and Linux Mint. Ubuntu, particularly its server and desktop versions, is a popular choice for many, while other distributions cater to specific requirements in different companies. The source material mentions Ubuntu will be used in the course.

    3. How can I install Linux (Ubuntu) on my Mac?

    On a Mac, Ubuntu can be installed using virtualization software like UTM. First, download and install UTM from the Mac App Store. Then, download the Ubuntu server ISO image from the Ubuntu website. Within UTM, create a new virtual machine, selecting the downloaded ISO image as the boot source. Configure memory and disk space as needed, and start the virtual machine to begin the Ubuntu installation process. The source material also highlights the Ubuntu gallery in UTM.

    4. How can I install Linux (Ubuntu) on my Windows machine?

    On Windows, you can use VirtualBox. The steps include downloading and installing VirtualBox. Then download the Ubuntu desktop ISO image from the Ubuntu website. Create a new virtual machine in VirtualBox, selecting the downloaded ISO image. Configure memory and disk space. Install ubuntu to the VM.

    5. What is the difference between the Terminal and the Shell?

    The terminal is a text-based interface that allows you to interact with the operating system by entering commands. It provides the prompt where commands are entered and outputs the results. The shell, on the other hand, is the program that interprets the commands entered in the terminal and executes them against the operating system. Shells include Bash, Zsh, Fish, and others.

    6. What is Zsh and how do I switch from Bash to Zsh?

    Zsh (Z shell) is an extended version of the Bourne shell, known for its advanced features like auto-completion, spelling correction, and a powerful plugin system. To switch from Bash to Zsh, first install Zsh using the command sudo apt install zsh. Then, change the default shell using the command chsh -s /usr/bin/zsh. After rebooting the system, Zsh will be the default shell. Oh My Zsh can be used to configure Zsh.

    7. What are Linux commands, options, and arguments?

    Linux commands are text instructions that tell the operating system what to do. They are case-sensitive. A command can include options and arguments that modify its behavior. For example, in the command ls -a ., ls is the command, -a is an option (for showing hidden files), and . is the argument (specifying the current directory).

    8. What are user types and how do permissions work?

    Linux is a multi-user environment with two main types of users: normal users and the superuser (root). Normal users can modify their own files but cannot make system-wide changes. The superuser (root) can modify any file on the system. Permissions control access to files and directories. The ls -l command displays file permissions, divided into three sets: user, group, and others. Each set includes read (r), write (w), and execute (x) permissions, dictating what actions each user type can perform on the file.

    Understanding Linux: Features, Usage, and Commands

    Linux is a powerful and flexible open-source operating system that was developed by Linus Torvalds in 1991 and has since become a robust platform used worldwide. Here’s an overview of some key aspects of Linux:

    • Open Source Linux is open source, meaning developers can contribute to improving and customizing it.
    • Key Features Stability, security, customizability, and performance are key features. Its flexibility and security make it a preferred choice for companies.
    • Usage Linux is used by internet giants, scientific research companies, financial institutions, government agencies, and educational institutions. Many companies deploy their software on Linux.
    • Distributions Linux has different versions called distributions, with Ubuntu being the most popular. Other distributions include Fedora, Debian, and Linux Mint.
    • Terminal In Linux, the terminal (also known as the command line interface or CLI) is a text-based interface that allows interaction with the computer’s operating system by entering commands. It provides a way to execute commands, navigate the file system, and manage applications without a graphical user interface.
    • Shell A shell is a program that interacts with the operating system. The terminal allows users to input commands to the shell and receive text-based output from the shell operations. The shell is responsible for taking the commands and executing them against the operating system.
    • File System The Linux file system is a hierarchical structure that organizes and manages files and directories. It follows a tree structure with the root directory at the top, and all other directories are organized below it.
    • Commands Linux commands are case-sensitive text instructions that tell the operating system what to do.
    • Shell Scripting Shell scripting automates tasks and performs complex operations by creating a sequence of commands. A shell script is saved with the extension .sh.

    Shell Scripting Fundamentals in Linux

    Shell scripting is a way to automate tasks and perform complex operations in Linux by creating a sequence of commands. It involves writing scripts, typically saved with a .sh extension, that contain a series of commands to be executed.

    Key aspects of shell scripting include:

    • Bash Bash (Born Again Shell) is a command line interpreter used to communicate with a computer using text-based commands.
    • Editor A text editor is needed to write scripts, which could be a simple editor like Vim or a more feature-rich option like Visual Studio Code.
    • Shebang The first line of a shell script typically starts with a “shebang” (#!) followed by the path to the interpreter (e.g., #!/bin/bash). This line tells the operating system which interpreter to use to execute the script.
    • Variables These are containers for storing and manipulating data within a script. In Bash, variables can hold various data types like strings, numbers, or arrays.
    • Conditionals These allow scripts to make decisions based on specific conditions, executing different blocks of code depending on whether a condition is true or false.
    • Loops Loops enable the repetition of instructions. for and while loops can iterate over lists, directories, or continue tasks until a condition is met.
    • Functions Functions group a set of commands into a reusable block, promoting code modularity and organization.
    • Comments Adding comments to scripts is considered a best practice as it helps in understanding the script’s purpose, functionality, and logic. Comments are lines in a script that are not executed as code but serve as informative text.
    • Passing Parameters Bash scripts can receive input values, known as parameters or arguments, from the command line, allowing customization of script behavior. These parameters can be accessed within the script using special variables like $1, $2, $3, etc. The special variable $@ can be used to access all parameters passed to the script.
    • Executable Permissions Scripts are executables that require giving executable permissions using chmod.

    To run a shell script:

    1. Save the script with a .sh extension.
    2. Give the script executable permissions using the chmod +x scriptname.sh command.
    3. Execute the script by using its path. If the script is placed in a directory included in the PATH environment variable, it can be run by simply typing its name.

    Linux File Management: A Command-Line Guide

    File management in Linux involves organizing, creating, modifying, and deleting files and directories. This is primarily done through the command-line interface (CLI) using various commands.

    Key aspects of file management include:

    • Linux File System: The file system is a hierarchical structure with a root directory (/) at the top, under which all other directories are organized.
    • Essential Directories:
    • /bin: Contains essential user commands.
    • /etc: Stores system configuration files.
    • /home: The home directory for users, storing personal files and settings.
    • /tmp: A location for storing temporary data.
    • /usr: Contains read-only application support data and binaries.
    • /var: Stores variable data like logs and caches.
    • Basic Commands
    • ls: Lists files and directories. Options include -a to show hidden files and -l for a long listing format that includes permissions, size, and modification date.
    • cd: Changes the current directory. Using cd .. moves up one directory level. Using cd – flips between the previous and current directory.
    • mkdir: Creates a new directory. The -p option creates nested directories.
    • touch: Creates a new file.
    • rm: Removes files.
    • rmdir: Removes empty directories.
    • cp: Copies files.
    • File Permissions: Linux uses a permission system to control access to files and directories. Permissions are divided into three categories: user, group, and others. Each category has read (r), write (w), and execute (x) permissions. The ls -l command displays file permissions in a long listing format.
    • Working with Files:
    • To create an empty file, use the touch command.
    • To create a file with content, use the echo command to redirect a string into a file.
    • To view the contents of a file, you can use a text editor or command-line tools like cat.
    • Working with Directories:
    • To create directories, use the mkdir command.
    • To remove empty directories, use the rmdir command.
    • To remove directories and their contents, use the rm -rf command.
    • Navigating the File System To navigate, utilize the cd command followed by the directory path.

    It is important to note that commands are case-sensitive.

    Linux User and File Permissions Management

    User permissions in Linux control access to files and directories in a multi-user environment. Here’s an overview:

    • Types of Users There are normal users and superusers (root).
    • Normal users can modify their own files but cannot make system-wide changes or alter other users’ files.
    • Superusers (root) can modify any file on the system and make system-wide changes.
    • Commands for User Managementsudo: Executes a command with elevated privileges.
    • useradd -m username: Adds a new user and creates a home directory.
    • passwd username: Sets the password for a user.
    • su username: Substitutes or switches to another user.
    • userdel username: Deletes a user.
    • File Permissions Permissions determine who can read, write, or execute a file.
    • The ls -l command displays file permissions in a long listing format. The output includes the file type, permissions, number of hard links, owner, group, size, and modification date.
    • The file type is the first character. A d indicates a directory, and a – indicates a regular file.
    • Permissions are divided into three sets of three characters each, representing the permissions for the user (owner), group, and others.
    • r means read, w means write, and x means execute. A – indicates that the permission is not granted.
    • The first three characters belong to the user, the second three to the group, and the last three to everyone else.

    Essential Linux Terminal Commands

    Linux terminal commands are case-sensitive text instructions that tell the operating system what to do. These commands are entered in the terminal (also known as the command line interface or CLI), allowing you to interact with the operating system. The terminal provides a way to execute commands, navigate the file system, and manage applications without a graphical user interface.

    Here are some basic and essential commands:

    • ls: Lists files and directories.
    • ls -a: Includes hidden files.
    • ls -l: Uses a long listing format, displaying permissions, size, and modification date.
    • cd: Changes the current directory.
    • cd ..: Moves up one directory level.
    • cd -: Flips between the previous and current directory.
    • mkdir: Creates a new directory. The -p option creates nested directories.
    • touch: Creates a new file.
    • rm: Removes files.
    • rmdir: Removes empty directories.
    • cp: Copies files.
    • sudo: Executes a command with elevated privileges.

    Each command may have options and arguments to modify its behavior. To understand how to use a command effectively, you can refer to its manual for instructions.

    Linux For Beginners – Full Course [NEW]

    The Original Text

    what’s going guys assalamualaikum welcome to this  Linux crash course where I’m going to take you   from complete beginner to understanding Linux this  is a course that abs and I put together and it’s   currently 10 hours which a bunch of exercises  if you don’t know Linux and also if you are   afraid of the terminal or the black screen then  you are in big trouble so this course will make   sure that you master Linux and whether you want to  become a software engineer devops engineer backend   front end it doesn’t really matter Linux is a  must and don’t you worry because we’ve got you   covered if you’re new to this channel literally  just take 2 seconds and subscribe and also smash   the like button so we can keep on providing you  content like this without further Ado let’s off   this video okie dokie let’s go ahead and kick off  this course with this presentation which I want   to go through so that you have a bit of background  about Linux so Linux it’s a powerful and flexible   operating system that was developed by lonus tals  in 1991 so the name Linux comes from the Creator   Linus and since 1991 Linux has grown into a robust  and reliable platform used by millions worldwide   as you’ll see in a second the cool thing about  Linux unlike operating systems such as Windows Mac   OS is that Linux is open source developers around  the world contribute to improve and customize the   operating system and it has a Vibrant Community  of contributors and I’ll talk to you in a second   about distributions as well because it plays a big  part since Linux is open source the key features   of Linux are stability security the ability of  changing it to your needs and performance so   servers around the world prefer Linux due due to  its performance so who uses Linux well interned   Giants scientific research companies financial  institutions government agencies educations and   the platform that you are using right now so  Amigo’s code is actually deployed on a Linux   server so you look at Google meta AWS NASA  and obviously Amigo’s code and pretty much   like every single company out there majority of  them I can guarantee you that their software is   being deployed on Linux it might be a different  flavor of Linux but it will be Linux and the   reason really is because of the flexibility  and it’s secure so this is why companies opt   to choose Linux and the cool thing about Linux  is that it’s open source as I’ve mentioned but   it’s also used on a wide range of devices from  smartphones to service and also Raspberry Pi so   if you’ve ever used a Raspberry Pi the operating  system on this tiny computer is Linux Linux has   something called distributions and these are  different flavors the most popular flavor of   Linux is Ubuntu and you have the iunu server or  the desktop which comes with a graphical user   interface and this distribution is what we’re  going to use and is the most popular out there   but obviously depending on the company that  you work for the software will be deployed on   a different flavor of Linux to customize their  needs but there are also other distributions   such as Fedora Debian Linux Mint and plenty  of others and this is a quick overview about Linux cool before before we actually proceed  I just want to let you know that the actual   10 hour of course is available on our brand  new website and I’m going to leave a coupon   and a link as well where you can basically go  and check for yourself because many of your   students already have engaged with the course  they’ve been learning a lot and to be honest   the positive has been really really great so far  so we are coming up with something really huge   and we decided that Linux had to be part of this  something and here Amigo’s codee we want to make   sure that you become the best engineer that you  can be details will be under the destion of this video okie dokie for the next two sections  we’re going to focus on Windows users as   well as Mac users and just pick the operating  system that you are using and go straight to   that section because the setup will be the  exact same thing so I’m going to show you   how to get Linux and you bu to up and running  on your operating system if you want to watch   both sections feel free to do so uh but in this  course I just want to make sure that there’s no   issues when it comes to Windows or Mac because  there’s a huge debate which uh is better and   also um after those two sections you’ll see  how to rent a server of the cloud okay so   if you don’t to use nor um yunto or Linux on  your local machine but you prefer to rent it   from the cloud I’m also going to show you how  to do so cool this is pretty much it let’s get started in order for us to install Ubuntu on  a Mac operating system we’re going to use this   application called UTM which allows you to  securely run operating systems on your Mac   whether it’s window Window XP which I really  doubt that you’re going to do windows I think   this is Windows 10 maybe you can also run your  buntu which is the one that we’re going to run   and also like old operating systems in here also  Mac as well so you can virtualize Mac and um I’ll   basically walk you through how to use it and  install yuntu right here which is what we need   in order to get up and running with Linux cool  so in here what we’re going to do is click on   download and you can download from the Mac Store  then pretty much save this anywhere so in my case   I’m going to save it on my desktop and just give  a second to download cool then on my desktop I’m   going to open up this UTM DMG there we go and all  I’m going to do is drag this to applications and   job done now let me close this and also I’m  going to eject UTM and also I’m going to get   rid of this UTM file in here and now I’m going to  press command and then space and we can search for   UTM and then I’m going to open and I’m going to  continue and there we go we successfully installed UTM the next thing that we need is to install  Ubuntu navigate to ubuntu.com and in this page   in here we can download yuntu by clicking on  download and then what I want you to do is   let’s together download the Ubuntu server and  I’ll show you how to get the desktop from the   Ubuntu Server so here you can choose Mac and  windows so I’ve got the arm architecture so   I’m just going to choose arm in here if you  are on regular Mac and windows you can just   basically download your Windows server for  the corresponding architecture and operating   system so here I’m going to click on arm and  you can read more about it in here so this is   the I think this is the long-term support 2204 and  then two and right here you can see that you can   download the long-term support or I think this  is the latest version in here so in my case it   doesn’t really matter which version I download so  I’m just going to download the long-term support   in here so this my bugs who knows so here let’s  just download and I’m going to store this onto my desktop now just give it a minute or so so  my internet is quite slow and you can see the   download still uh in progress but once this  finishes I will um come back to you awesome   so this is done also what I want to show you  is within UTM you can click on on browse UTM   gallery or you can get to it via so in here  if I switch to the UTM official website in   here click on gallery and basically this gives  you a gallery of I think the operating systems   which are currently supported so you can see Arch  Linux Debian Fedora Kali Linux which is quite nice   actually and then you have Mac OS you have Ubuntu  I think this is the older version actually you’ve   got the 20.01 which is the long-term support  Windows 10 11 7 and XP so if you want to go   back to olden days feel free to do so but  we just downloaded yuntu from the official   website which is good and also have a look the  architecture in here so arm 64 x64 right so make   sure to pick the one which is corresponding to  you so if you want to have for example Windows   as well feel free to download an experiment or  a different version of Linux so K Linux which   is quite nice actually feel free to do it but  in my case I’m going to stick with traditional   buntu and next what we’re going to do is to  create a virtual machine and have Linux up and running right we have UTM as well as the iso  image in here for Ubuntu let’s create a brand new   virtual machine and in here we want to virtualize  never emulate so here this is slower but can run   other CPU architectures so in our case we want to  virtualize and the operating system is going to be   Linux leave these and check and in here boot ISO  image open up the iso that we’ve just downloaded   right so here browse and I’ve just opened up  the Ubuntu 22.0 4.2 the next step is going to   be continue and here for memory usually you should  give half of your available memory so in my case   I’m just going to leave four gigs I’ve seen that  it works quite well and I do actually have 32 but   I’m not giving 16 so I’m just going to leave four  in here and CPU course I’m G to leave the default   and here if you want to enable Hardware open  Gil acceleration you can but there are known   issues at the moment so I’m not going to choose  it continue 64 gig so this is the size of the dis   continue and here there’s no shared directory path  continue and for the name in here what I’m going   to do is say YouTu and then the version so 20.0  four dot and then two awesome so you can double   check all of these settings and I think they’re  looking good click on Save and there we go so at   this point you can see that we have the VM in here  so we’re going to start it in a second we can see   the status is stopped the architecture arm the  machine memory 4 gig the size this will increase   in a second and there’s no shared directory but  the cd/ DVD is yuntu which is this one in here so   one more thing that I want to do is so before  we play I want to go to settings so in here   click on settings and you can change the name  if you want to in here and uh all I want really   is within this play I’m going to choose retina  mode and this will give me the best performance   cool so save and I’m good to go next let’s go  ahead and install Ubuntu within our virtual machine oky dokie now the next step for us is to  click on play in here or in here and this should   open this window so in here you can see that  currently so I’m just gonna leave the the screen   like this so currently you can see that it says  press option and um I think it’s enter for us to   release the cursor So currently my cursor is not  visible right and the way that I can interact with   this UI is by using my keyboard so the down arror  in here and the app Arrow right so if you want   your cursor back you just press control and then  option I think control option there we go you can   see that now I have the mouse in here cool let me  just close this in here for a second and I’m going   to Center this like so and now what we’re going  to do is try or install Ubuntu Server so I’m going   to press enter on my keyboard so display output  is not active just where a second and we should   have a second screen there we go you can see that  now we have this other the screen and basically   now we can basically configure the installation  process so in my case I’m going to use English UK   and here so for you whatever country you are just  use the correct country basically so here English   UK for me press enter Then the layout and the  variant so for the keyboard I want to leave as   default and at the bottom you can see that I can  flick between done and back so I’m just going to   say done and I’m going to leave the default  so I want the default installation for you Bo   to server not the minimized so just press enter  and here there’s no need to configure the network   connections continue no need to configure proxy  and also the mirror address just leave as default   enter and in here configure a guided storage so  here I’m going to use the entire disk and leave   as default so just with my errors go all the way  to done enter and here now we have the summary   and you can see the configuration basically 60 gig  and I think the available free space is 30 gig and   you can see there and at this point I you sure  you want to continue I’m going to say continue   now for the name I’m going to say Amigos code the  server name I’m going to say Amigos code the usern   name Amigos code the password I’m going to have  something very short and Easy in here and then   go to done continue and I’m not going to enable  yuntu Pro continue continue there’s no need to   install open SSH server because we don’t need to  remote access this server that we are installing   so here done and also we have a list of available  software that we can install so for example micro   Kates nexcloud Docker you can see AWS CLI in here  so a CLI Google Cloud SDK we don’t need none of   these also postgress which is right here so if  you want to install these by all means feel free   to take but for me I’m going to leave everything  as default done and at this point you can see that   what he doing is installing the system so just  wait for a second and I’m going to fast forward   this step oky doie so you can see that the  installation is now complete and at this point   what it’s doing is downloading and installing  security updates so it’s really up to you whether   you want to wait for this or not but in my case  I think it’s you know the best practice for you   to have everything patched and um updated so I’m  just going to wait and then I’ll tell you what are   the next steps so this might take a while so just  sit back and relax all right so this is now done   and you can see that installation is complete and  we can even say reboot now but don’t don’t click   reboot now what we need to do is so basically we  have to close this so again close this window will   kill the virtual machine which is fine okay now  open UTM once more and you can see that we have   the Ubuntu virtual machine in here and if I open  this up once more so all I want to show you is   that this will take us to the exact same screen  to install yuntu server now we don’t want this so   close this and what we have to do is in here  so CD DVD clear so we have to remove the iso   image and at this point feel free to delete this  so here I’m going to delete this and that’s it   cool so this is pretty much the installation for  Ubuntu next let’s get our Ubuntu Server up been running cool so make sure that this CD for/ DVD  is empty before you press continue or before   you press play so let’s just play this there  we go and I can close this and I’m going to   Center things there we go and at this point we  should see something different there we go now   have a look yuntu the version that we installed  and then it says Amigos code login cool so here   what we need to do is I think we have to add  the username which is Amigos code then press   enter followed by by the password so my password  was I’m not going to tell you basically but it’s   a very simple one so here you don’t see the  password that you type so just make sure that   you have the username and the password press  enter and check this out so now we are inside   and we’ve managed to log in cool so at this point  this is actually yuntu server right so there’s no   graphical user interface and um that’s it right  so later you’ll see that when you SSH into the   servers this is what you get right so this black  screen and that’s it now obviously for us I want   to basically install a graphical user interface  so that basically you see the Ubuntu UI and um   the applications I I’ll show you the terminal  and whatnot but in a shell this is yuntu server   so at this point you can type commands so here  for example if you type LS for example just L   and then s press enter nothing happens if you type  PWD so these are commands you learn about these uh   later but if I press enter you can see that I’m  within home/ Amigos code if I type CD space dot   dot so two dots enter you can see that now if I  type PWD I’m within home okay so this is pretty   much the yuntu server and this is a Linux box  that we can interact with but as I said we want   to install a graphical user interface to simplify  things for now and that’s what we’re going to do next within the official page for UTM navigate  to support in here and I’ll give you this link   so you can follow along but basically they give  you the installation Pro process and things that   you should be aware when working with UTM now  one of the things is if we click on guides or   expand you can see that you have the different  operating systems so Debian 11 Fedora Cali yuntu   Windows 10 and 11 so we installed 2204 so let’s  open that and it doesn’t really matter just click   on your BTU and whatever version here um that  you have installed this will be the exact same   thing okay so just select yuntu anything that says  going to in here cool so if I scroll down in here   so they have a section so we’ve done all of this  creating a new virtual machine and basically here   installing you B to desktop if you install you B  to server then at the end of the installation you   will not have the graphical user interface to  install we need to run these commands in here   so sudu apt and then update and then install and  then reboot awesome let’s go ahead and run these   commands cool so in here within in Yun to server  let me see if I can increase the font size for   this so control and then plus and it doesn’t look  like I can but I’ll show you how to increase the   font size for this in a second but here let’s  type together PSE sudo and then a and then   update press enter and then it’s asking me for  the password for Amigos code so make sure you   add the password for your username press enter  and you can see that it’s basically performing   the update now now the update basically is used  to update the package index files on the system   which contains information about the available  packages and their versions cool so you can see   that 43 packages can be upgraded now if you  want to upgrade the packages we can run PSE   sudo and then AP so let me just remove the mouse  from there ABT space and then up and then grade   and here I’m going to press enter and we could  actually use flags and we could say Dy but for   now let’s just keep it simple and later you learn  about these commands so press enter and you can   see that it says that the following packages will  be upgraded right so you see the list of all the   packages do you want to continue I can say why  why for yes cool now just give it a second and   now it’s actually upgrading these packages to  their latest versions so it’s almost done and   and now it says which Services should be restarted  leave everything as default and say okay so I’m   just going to press the tab and then okay cool  that’s it so now the last thing that we need to   do is to install Yun desktop so this point type  sud sudo a and then install Ubuntu Dash and then   desk and then top press enter and you can see  that it gives us a prompt I’m going to say w   and now we’ve go prompt and it says do you want  to continue I’m going to say y for yes and now   we just have to wait until it installs the Yun  to desktop and this is pretty much the graphical   user interface that will allows us to interact  with our operating system like we are using for   example the Mac OS right so this is the graphical  user interface but equally we do have the terminal   so if I open up the terminal quickly so terminal  so have a look so this is the terminal right so so   what we doing is we are basically installing the  same experience that we have within Mac OS so if   I click on the Apple logo and then basically use  all of the functionalities that this operating   system has to offer right so if I click on about  this Mac and then I can go to more info so on and   so forth so let me just cancel this and just wait  for a second until this finishes oky doie cool so   this is done and if you encounter any errors  or anything whatsoever just restart and then   run the exact same command but here you see that  there were no errors cool at this point there’s   no services to be restarted no containers and  all we have to do is re and then boot now just   wait for it and hopefully now at this point  you should go straight into the desktop okie   dokie you can see that now we managed to get the  desktop app and running cool so at this point just   click on it the password so this is my password  and I’m going to press enter hooray and we’ve   done it cool so if you managed to get this far  congratulations you have successfully installed   yuntu otherwise if you have any questions drop  me a message next let’s go ahead and set up Ubuntu okie dokie so we have yuntu desktop up  and running and from this point onwards let me   just put this as full screen and for some reason  I have to log in again again that’s fine cool so   you can see that the UI looks nice and sharp  and in here let’s just um basically say next   we don’t want to install the btu Pro and in  here whether you want to send information to   developers I don’t really mind to be honest  and location I’m just going to turn it off   and here it says you’re ready to go and let’s  just say done cool we have the home so here I   can just put this on this side and what we’re  going to do here is some customization this is   actually an operating system so you’ve got a  few things in here so you’ve got mail client   you’ve got files so if I click on files you  know this is a file system you know the same   as I have in my Mac so here let me just close  this and what I want to do is I want to go to   show all applications or I could just right  click in here and then I can say a few things   so one is display settings this is what I’m  mostly interested so in here I’m going to   put things a little bit bigger so fractional  scaling and here I’m going to increase this by 175% apply so that things are quite visible to  you so here keep changes and you can see that   now it’s nice and big cool so just move this in  here and it doesn’t look like it lets me right   So eventually it will let me move this but also  I can click on show all applications and I can go   to settings through here so the same thing and um  cool so you can go to keyboards you can you know   change according to your layout so I’m going to  leave my one as English UK which is fine you can   go to displays you can change the resolution if  you want to power configure that whether you want   power saver mode or not and um online accounts  so here I’m not going to connect to anything   privacy go back and I’m just showing you around  so background if you want to change the background   you’re more than welcome to do so here a couple of  different ones but for me I’m going to stick with   the default and appearance as well you can change  this right so here if you want a blue theme for   example which I kind of like to be honest or this  purple right here so let’s just actually choose   this blue for myself and for the desktop size  I’m going to say Lodge in here so that things   are visible to you okay and I can scroll down  and also icon size just as big as this and you   can show Auto Hide dock does that work probably  I don’t know right so I think it hides when yes   when this collides with this right so basically at  this point it just hides cool let me just remove   that I don’t think I need that and notifications  so you can go through and customize this the way   you want it but for us I think this is looking  good one other thing also is if you have a window   opened you can basically pull it all the way to  the left and it will just snap so if I open a   new so let’s just say I have um a new window for  example I can put this right in here and you can   see that it auto arranges for me which is kind  of nice and uh to be honest I think I’m going   to stick with the red so red not not there but I  think it was appearance yes I think this orange   or actually orange I think this orange looks nice  yeah I don’t know it’s very difficult cool so I   think I’ll just stick with this default for now  cool and um yeah so let me just close this and   this and this is pretty much it uh I don’t know  for some reason why this is not um oh actually let   me just click on arrange icons maybe that will  do it no I think it doesn’t do it because it’s   too big it doesn’t want to move but I think if I  restart then it should basically sort itself out   uh the other thing is so in here yes so here I can  basically remove so I’m going to remove this from   favorites same as this so stop and quit and remove  favorites the same with this and no need for help   and I think this is pretty much it awesome this  is my setup and also I think the clock is I think   it’s 1 hour behind so feel free to fix that but to  me it doesn’t really matter so this is pretty much   it if you have any questions drop me a message  but this is the configuration required for yuntu in order for us to install yuntu desktop on  Windows let’s use Virtual box which basically   allows you to install and run a large number  of guest operating systems so here you can   see uh Windows XP which I doubt you’ll ever use  Vista Windows and then Linux in here Solaris so   these are different distributions but basically we  need virtual box in order to install another guest   operating system on top of windows so navigate to  downloads and in here download the Windows host   so just give it a second and then open file there  we go I’m going to say next so the installation   process should be really straightforward and don’t  worry about this warning in here so just say say   yes and then it says missing pice dependencies  do you want to install it yes why not and then   install cool so this should take a while and you  can see that we have the shortcut being created   for us in here and we are good to go so let me  just unake this because we’re going to continue on   the next video say finish and we have successfully  installed virtual box catch me on the next one we do have virtual box installed and before I open  this application in here the next thing that we   need is the Ubuntu desktop itself so that we can  mount on top of virtual box so in here if I open   up my web browser and search for Ubuntu on Google  and basically go to ubuntu.com and you you should   see so if I accept in here you should see that  we can download so we have yunto server in here   and this is the current version as I speak and  whatever version that you see provided that is the   sorry this is not the latest this is the long-term  support but whatever long-term support you see   just download that so here go to developer and you  should see that we have yuntu desktop so click on   that and we can download yuntu desktop so you can  watch this video if you want but I’m not going to   but if I scroll down you can see that it says that  your buntu comes with everything you need to run   your organization School home or Enterprise and  you can see the UI in here so on and so forth so   let’s go ahead and download yuntu cool now if  I scroll down in here you can see that we have   this version so long-term support just download  whatever long-term support you see available so download and it should start very soon there we  go and it should take about 5 minutes or so to   complete or even less now and there we go now  let me open this on my desktop and you can see   that it’s right here awesome now that we have  Ubuntu desktop next let’s go ahead and uh use   Virtual box to install this ISO image in here  this is pretty much it catch me on the next one cool let’s open up virtual box in here  and I’ll walk you through the steps required   to get yuntu desktop up been running so if this  is the first time that you’re using virtual box   this should be completely empty so what we’re  going to do is create new and here we’re going   to name this as yuntu there we go and you can put  the version if you want but I’m going to leave it   as is then for the iso image is the one that we  downloaded so here let’s just select order and   then navigate to desktop and I’ve got my Ubuntu  ISO image open cool and in here you can see that   basically we can’t really select anything else  so let’s just click next and we can actually   have the username and password so in my case I’m  going to say Amigos and then code there we go and   then choose the password so if I click on this  I icon in here you can see that it says change   me right so you can change this or you can leave  it as default so in my case I’m going to leave as   change me but obviously I would never do this  and I want want to leave the host name as you   B to domain as uh what it is right now and then  next then we need to specify the base memory in   here as well as the CPU so for CPU let’s just  choose two cores in here and for memory if you   have more memory on your machine just feel free  to rank this up to maybe four gigs but for me I’m   going to leave as default next and then here it  says either to create a virtual hard disk or use   an existing or do not so in my case I’m going to  basically have 20 gigs so here I’m really saving   memory uh I don’t think there’s much space on  this Windows machine so 20 gigs I think should   be fine and uh yeah create a virtual hard disk  say next and now we have a summary you can read   through it and let’s finish cool so this is pretty  much it now you can see that it says powering VM up so just wait for a second until this is up  and running and you can see that I think it’s   done right so you can see that it’s actually  running now obviously if I click click on it and then we have this window and you can see  that it’s loading yuntu and it says mouse mouse   integration so click on here and then there as  well all right so just give her a second or so   and uh this should install successfully and there  we go you can see that this was really quick and   and here you can see that it’s installing few  things so this is now installing and basically   I’m going to leave this complete and then I’ll  come back to it so that we can proceed our setup   cool now it’s installing the system and I can  click on this button and you can see what it’s   doing on the terminal so let’s just wait until  this finishes and this should take a while for   you so for me I’m going to speed up this video but  uh you should yuntu up and running in a second and   in fact we could actually skip this all together  but I’m going to leave it finish and after a long   time of waiting it seems that it’s almost there  let’s just wait and finally we are done cool so   if you get to this point where you have your  user and then you can click on it and then in   here the password was change and then me right  so I didn’t change the password let me just show   you so change me if I press enter we should be  able to log in if the password is correct there   we go cool this is pretty much it I’m going to  leave it here and we’ll continue on the next video okie dokie so we are almost done  with the configuration so one thing that   I want to do is let’s just click on  Virtual box in here and uh click on settings and then let’s go to Advanced so under  General click on Advanced and then share clipboard   so we’re going to basically say bir directional  and the same for drag and drop so basically we   can basically drag stuff from our Windows to our  yuntu desktop and uh the same with the clipboard   say okay or actually let’s just go to system  and see whether we have to change something so   I don’t think we have to change anything else  and uh under storage so in here so just make   sure that this is empty so make sure that this  is empty that it doesn’t contain the iso image   in here cool audio everything should be fine if  you want to enable AUD the input feel free to   do so serial ports nothing USB shared folders and  user interface we’re going to leave everything as   is okay and in here I can just close this and uh  if I try to put this full screen in here you can   see what happens so to do this what we have to  do is install virtual box guest editions so in   here we’re not going to connect to any online  accounts let me just Skip and also I’m going   to skip the pro yuntu pro next and uh also if  you want to send data feel free but I’m not   going to send any data click on next and uh I’m  going to turn off location and there you go you   you see that it says you’re ready to go you can  use software to install apps like these so press   done and what I want to do is let’s open up the  T terminal so click on this button in here that   shows all applications and then open the terminal  so this is the terminal and with the terminal open   let me just put this full screen like that and  now what we’re going to do is type some commands   and at this point in here I don’t expect you to  know none of this because we’re going to learn   in detail how all of this works cool so the first  thing that that we want to do is is if you type   with me so P sudo and then here we’re going to say  a PT and then up and then date so if this command   in here does not work and now it’s asking me for  the password so change and then me now I’m typing   but you don’t see that I’m typing because this is  done by default because here I’m typing sensitive   information which is the password press enter  and and if it says that Amigo’s code is not in   sudo’s file this incident will be reported that’s  fine so all we have to do is so if this happens   to you type pseudo or actually sorry my bad Su and  then Dash and then here type the password again so   change and then me and or whatever password that  you added and there we go now we can type pseudo   and then add and then user so user and make sure  that add user is all together and then type Amigos   so the user in question so this is Amigos code for  me and then we want to add Amigos code to PSE sudo   just like that press enter and you can see that  this is basically added Amigos code to PSE sudo   and now it means that if I say Su and then Amigos  and then code and by the way Su just allows it to   change users and you will also learn about this  command press enter and now you can see that I’m   back to Amigos code in here and if we type PSE  sudo and then basically the the previous command   I’m just going to press the up aror this one so  P sudo AP and then update and then let’s add the   password once more so change me enter you can see  see that this time this command works so I’m going   to leave these commands that I’ve just did under  description of this video so that you can follow   along as well cool the next command that we need  to run is PSE sudo in here and then AP install   Dash and then Y and then build Dash and then  essential space and then Linux Dash and then   headers Dash and then add dollar sign and then  parenthesis and then you name space Dash and then   R and then close parentheses just like that cool  also you’ll find this command under description   of this video press enter and just give you a  second or so and there we go now navigate to   devices and then insert guest editions CD image  and you can see that we have this dis in here so   let’s just click on it and now what we want to do  is let’s take this file in here autorun Dosh and   then drag it to the terminal in here and let’s  see whether this works so if I so right at the   end if I press enter this doesn’t work and that’s  because I need to remove the quotes there we go so   the quote at the beginning and also the one at  the end and then press enter and it looks like   it doesn’t work so let’s just click on the dis  again and then here I’m going to right click and   then opening terminal so we have a new terminal  let me close the old one so close this terminal   and then we can close this as well and now if  I put this full screen all I want you to do is   to type dot slash and then autorun Dosh press  enter and now it’s asking me for the password   for Amigo’s code and the password was change me so  change me let me show you change me authenticate and it’s installing some modules now we have to  wait until this is complete and the last step   will be to restart our machine and uh it says  press return to close the window it seems to   be done so I’m just pressing return there we go  finished and now let’s together so in here click   on the battery icon and then let’s click on power  off restart restart and now if I restore down so   let’s just restore and and um what I want to do  is I want to put it full screen so if I maximize   now now you saw that the screen went black and uh  what we have to do is so let’s just basically make   this smaller open up virtual box and basically on  this Ubuntu which is running click on settings and   display and what we want to do is to change the  video memory now this is grade out because what   we need to do first is right click on the VM  itself and we want to stop it so stop and then   power off cool let’s switch it off now we can go  to settings and then display and now you can see   that we can change this now I’m going to put this  at 64 somewhere in the middle okay and if we click   on it so you can click here or you can start  if you want through this button just give you a second and very soon we should have so  let me just close this we don’t need this so it should start very soon there we go and  if we try to put this full screen on actually did   that for me but what I want to do is actually put  everything full screen you can see that this time   it works there we go and then if I click on Amigos  code the password was change me enter and we are   inside cool so now what we can do is go to view  and then you can say full screen mode and you   can switch in here and you can see that now all of  this is in full screen mode and we done it awesome   we successfully installed yuntu and if you want to  exit full screen you can see here I could just go   down View and then you have the keyboard shortcuts  as well but if I press on it you can see that I   came out from this and I do have access two in  here my Windows machine cool this is pretty much   it and also if you get software updata just  go and install as always but in my case I’m   going to be naughty and I want to say remind me  later this is pretty much it catch me on the next one cool in this video what I want to walk  you through is how we going to customize our   desktop so in here let’s together just put this  full screen and I’m going to switch there we go   and if you want to customize the look and feel  of yuntu desktop go to show applications at the   bottom and then click on settings cool now that we  have settings in here we are able to change couple   of things so you can change the network specific  information Bluetooths in here background so you   can choose for example if you don’t like this  background just choose this one for example you   can see that it changes but for my case I’m going  to stick with the default in here appearance so   appearance you can change the color theme in  here so maybe you like this color in here so   if I click on it you can see that the icons have  changed have a look right but I’m going to leave   the default in here so everything is consistent  throughout and you can change the icon size if   you want as well so I think the icon size I  think we have one icon in here so the oh icon   so if I increment this no it’s yeah the icon  size is basically this one right here on the   left right so I’m going to leave that as 64 you  can change this according to whatever you prefer   so for me it’s more about making sure that you  see everything visible in here notifications so   there’s nothing here search multitasking so you  can basically configure this uh I’m not going   to touch none of these applications so there’s  no configuration on any of these applications   in here let me just go back privacy same nothing  I’m going to change here and um online accounts   you can connect your Google account Microsoft and  whatnot sharing so there’s nothing here you can   change the the computer name if you want sound as  well power so basically you can have power saver   or not screen blank after whatever minutes screen  display and in here let’s basically scale this so   let’s say that we want 200 so apply and you can  see that things are now so big so I’m going to   keep these changes 200 and um let’s have a look  if I put this full screen what what do I get yeah   this looks nice right so 200 and then let me go  to I think it was background or sorry appearance   and then the icon size we can make a little bit  smaller now just like this you can leave it like   that uh but as as I said you could basically do  whatever you want okay so screen display and again   you can make this 100% I’m just making things  big so you can see sharply and then Mouse and   touchpad you can change the speed if you want the  keyboard so my one is so so let me just add United   Kingdom so this is my one English UK and add and  then delete this guy so remove there we go and   um printers nothing there removable media nothing  and device color profiles and obviously here I can   scroll down and you can see a bunch more right so  language region so here you can change the region   the language accessibility date and time so on and  so forth all right so also the same with users so   here we only have one user and uh you can change  the password if I’m not mistaken in here right   cool so my password is changed me I could change  for uh something better but I’ll show you how to   do all of this through the terminal which is uh  what we are here to learn how to use Linux andd   terminal let me cancel and then close this so  let’s just get rid of this from favorites I’m   going to get rid of this as well office as well  ubun to sofware as well help as well I want to C   I want to keep it clean eject there and I think  this is it awesome this is pretty much it if you   have any questions drop me a message but from now  on if you you followed the Mac installation this   is the exact same point and vice versa so from  now on both Mac and windows uses everything should   be the same because we are using Ubuntu desktop  this is pretty much it I’ll see you on the next one okayy doie so with Linux it’s all about the  terminal and really the reason why I installed the   desktop is so that you basically get an operating  system but what we’re going to focus throughout   this course is on the terminal so Linux it’s all  about the terminal and as you’ll see later when   we SS into a remote server we never have the  graphical user interface so it’s all about the   terminal cool so what is a terminal really  right so terminal also known as the command   line interface or CLI so in here if I go to show  applications and we have terminal so let’s just   take terminal and I think if we put it there  does it takes it from here so hold on so let   me just put it back in here right click add to  favorites oh yes it doesn’t really matter cool   so the terminal now it’s within the favorites and  now I can just click on it and open cool so what   is this terminal in here right so we have Amigos  code and then add Amigos code so the terminal   is a text based interface that allows you to  interact with a computer operating system by   entering commands so in here let me just type  one command and you’ll see how it works so if   I say date for example press enter so this  is giving me the current date so this was   a command and we’ll let learn more about this  um commands and what not in a second but this   is a command which allows me to interact with the  operating system so similarly if I want to create   a folder in here on my desktop I’m going to type  mkd and then here just type Tilda for a second so   tilder for SL desktop and then say for Slash and  here I’m going to say f for example press enter   and now have a look there’s a new folder that  was created for us full right so the terminal   allows us to interact with the computer operating  system by entering commands it provides a way to   execute commands navigate the file system manage  applications without the need of the graphical   user interface so to be honest we don’t even need  this UI right so usually you would right click   and then uh move to trash for example so this so  This basically deletes the file so this is with   the graphical user interface but in reality we  don’t need this right so here if I just say for   example RM and we’ll go through these commands in  a second so RM and then tiller for Slash and then   desktop and then F and actually so here I need  to say RM dasr and then F so you learn this in   a second if I press enter you can see that now  the folder has disappeared okay so this is the   terminal so the terminal allows us to interact  with the operating system the time not provides   a prompt so this is the prompt where we can  enter the commands and receive the output so   when we say date we get an output right so some  commands we don’t get an output but I’ll show   you um other other things that we can do right so  with this we can per perform a wide range of tasks   such as navigating directories creating modifying  files running programs accessing system resources   and whatnot so the terminal is commonly used by  developers and systems administrators to perform   a bunch of tasks including software development  server Administration and Automation and this is   a very powerful and efficient way to work with a  computer operating system and it’s an essential   tool for everyone working with programming and  development so knowing how to use the terminal   it’s a must for you right so this is the reason  why I’ve got this course for you because you   should be doing pretty much everything through  your terminal okay I don’t want to see you know   if I want to create a folder right click on your  uh graphical user interface new folder and then   say the folder name blah blah blah so this is  bad Okay so by the end of this course you oh   you see I’m actually deleting the folder using  uh the UI this is wrong but let me just do it   there we go but at the end of this course you  will familiarize yourself quite a lot with the   terminal so that you have all the required skills  in order to use the terminal and as you’ll see   a bunch of tools such as git Docker kubernetes  all of them you actually have to interact with   them through the CLI or The Terminal cool  this is pretty much it catch me on the next one within my Mac OS what I want to show you is  that I also have a terminal available within Mac   OS so here if I search for terminal so this right  here is the default terminal that comes with Mac   OS so here I can type any command and basically  this will be executed against my operating system   so if I say for example LS in here and you’re  going to learn about LS later but just type   this command press enter and in here this is just  listing all the contents that I have within home   right here so if I type clear for example so  this is another command so this actually clears   the terminal and here I can type for example  PWD in here you’ve seen this one so this is   users and then Amigos code so similarly there’s  also another ter available and this is not part   of the Mac OS operating system but it’s the one  that I use actually on my machine and that is   the iter so in here this is item so yet another  terminal this is way fancier than the other one   you can see the look is actually all black and  it has lots of customizations for example if I   want to split the screen into two for example  I could just do it like that and maybe three   times right here you can see that I’ve got one  two three and in this I can type LS in here I   can type PWD and in here I can type for example  Cal for example and you can see that basically   I’m executing commands in three different shells  and I’m going to talk about shells in a second   but basically you can see that this terminal  right here is way more powerful than the default   that comes with Mac OS so here let me just close  this and yeah so I just wanted to show different   terminals available for Windows what you have  is the command line or simply CMD and it kind   of looks like this and probably you’ve seen  this if you’re on Windows and again this is a   terminal so you can run commands and those will be  executed against your operating system and perform   whatever tasks that you tell it to do and this is  pretty much for this video catch me on the next one also what I’m going to show you is within  text editors and idees there will always be an   integrated terminal so you don’t necessarily  have have to use a terminal that ships with   your operating system or you don’t have to  install a ter for example so here I’ve got   VSS code so visual studio code open and within  Visual Studio code if I click on Terminal and   then here new terminal and in here you see  that I do have the terminal so here I can   type the exact same commands that you saw  so for example if we type who and then am   and then I so just type this command here if you  have Visual Studio code or any other text editor   so in here let me just type who and then um I so  don’t you worry about this uh we’ll cover all of   these commands but for now I’m just showing you  other the terminals so if I press enter you can   see that this gives me a MH code also so I think  so this is one is quite cool so within terminal   I can split the terminal in here so have a look  so the same way that you saw with item which is   quite nice right and here you actually have two  different shells so this is zsh and we’ll cover   uh shells in a second but here I can delete this  delete this as well and it’s gone also one of my   favorite ID is intellig so in here intell has an  integrated terminal if I open this you can see   that we have the terminal in here and I can type  again the same command so who am I press enter   and you can see that this basically gives you the  exact same output awesome so this is pretty much   about terminals if you have any questions drop  me a message otherwise catch me on the next one all right so you know what the terminal is now  let’s focus on understanding exactly what the   shell because often people use these two words  so terminal and shell they’re kind of the same   thing and if you do it that’s fine but it’s  very important that you understand what is   the actual difference between terminal and  shell and that’s what we’re going to focus   in this section and also you’ll see how we’re  going to switch from bash to zsh and you also   see different shells available for the Linux  environment so without further Ado let’s kick off in this section let’s focus on understanding  what the shell is and basically we’ll also   customize the default shell that we have to a  better one but inet shell a shell is a program   for interacting with the operating system right  so you’ve seen that uh we have the terminal in   here and the terminal is just an application  that allows users to input commands to the   shell and receive text based outputs from the  shell operations right now the shell is was   actually taking the commands themselves and then  executing those against the operating system let   me give you a quick demo so in here let me  just open the terminal and the terminal in   here is responsible for taking the inputs right  so the terminal basically allows you to create   uh multiple tabs allows you to expand uh allows  you to here new tab so this is a terminal right   but now whenever I type a command so if I type  for example touch and this is the command that   you’ve seen before so on the slide so touch  and here I’m want to say desktop and then   full bar.txt so if I press enter and don’t worry  too much about this command so you learn how this   works but basically this command in here right  so I’m passing this command through the terminal   so the terminal is responsible for taking the  commands and also outputting the results from   commands executed by the shell so the shell now  is responsible to interact against the operating   system so if I press enter you can see that  we have the file in here full bar.txt right   so the same if I say RM and basically the same  Command right so here let me just go back and   if I say RM right press enter you can see that  the file is gone and again don’t worry too much   about this you learn all of these commands  later but this is pretty much the concept of   terminal and shells now I’ve said shells because  there’s a bunch of different shells that you can   use with Linux you have bash in here so bash for  Born Again shell this is one of the most widely   used shells in the default and is a default  on many Linux distributions we have zsh so   this is the one that we’re going to to switch  to in a second and this is highly customizable   and offers Advanced features like autoc completion  spelling correction and a powerful plug-in system   and then you have fish and many others cool this  is pretty much the gist of shells next let’s go   ahead and understand and customize and change  and basically learn what you need to know about shells cool so you know that the shell is basically  what takes the commands and then basically   execute them and executes them and the terminal  is just the graphical user interface in here so   you saw item you saw the terminal for Mac OS  command line for Windows and the the shell   itself is basically the command line interpreter  right shell or command line interpreter they are   both the exact same thing so what I want to show  you here is how do you view the available shells   that you have installed but also how are we able  to change the current shell so let’s together   type in here so basically if you have Tilda and  then desktop in here or if you don’t have this I   think we did run the CD command before but what  I want to do is so that you have the exact same   screen as mine just type CD yeah so so you’ll  have something like the server name plus the   user in here so my one is just Amigos code at  Amigos code cool at this point let’s together   type we’re going to say cat so you’re going to  learn about the cat command later but here say   for SL and remember tab so I’m going to press  tab have a look so if I go back e and press tab   have a look I just get Auto competetion okay now  type SE e now type shells so sh and then tab so   if I tap tab again you see that we do have Shadow  Shadow Dash and then shells so shells like that   and and in here let me just contrl L and then run  this command all right cool so now have a look so   these are the available shells that we can use  so I think these are the defaults that come with   yonto so if I take this exact same command so CD  so cat Etsy and then shells and run it on my Mac   OS so here the same command but it just looks  a little bit different but it’s going to be the   exact same thing press enter and have a look so we  have bash we have chh Dash KS sh T C CH and then   zsh so I’m going to show you how to use this one  later but if you want to know the current shell   so the current shell that you are using so here  we could just type this command so I’m going to   basically say Echo and then dollar sign and then  shell so basically all caps and um we’ll go over   the echo command as well as dollar sign in here  but for now this is the command I need to run and   it will tell you the current shell that you are  using so in my case I’m using zsh if we take this   exact same command and running within Ubunto so  here Echo and then dollar sign and then shell run   it you can see that the default shell for yuntu  is Bash cool next let’s go ahead and install zsh zsh also called the zshell is an extended  version of Bor shell with plenty of new features   and support for plugins and themes and since  it’s based of the same shell as bash Zs has   many of the same features and switching over it  it’s a Nob brainer so in here you can see that   they say many original features were added  so let’s together in install zsh and as you   saw the default shell for Mac OS now is zsh or  zshell so let’s actually install this as well   in our Ubuntu desktop so in here you saw the  list of available shells so you saw that we   have bash in here which is a default right so  bin and then bash and when you run Echo shell   bin bash is a default so we want to change  this to zsh because it’s an improvement on   top of bash so here what we need to do first is  contrl L to clear the screen and to install zsh   we say pseudo and then AP and then space install  Zs so we’ll come back to AP or apt and this is the   pack manager basically that allows us to install  software okay so here let’s just press enter and   we need to enter the password for Amigo’s code  and in fact your password so here I’m going to   type and you might think that I’m not typing  anything but I’m actually typing so this input   right here doesn’t show the password for security  reasons so press enter and you can see that now   it went off and it’s installing and it’s just  waiting for us to confirm so in here just say Y and just wait for a second you can see that  we have the progress and boom so this is done   now to make sure that this was installed  correctly just type zsh and then Dash Dash   and then version press enter if you have  this output in here it means that you have   installed zsh so if I clear the screen control  l in here and then press the up Arrow a couple   of times and if we list the available shells  under ET C cat now you should see that we have   user bin and then sh right as well as bin dsh  and we’ll cover the difference between bin and   u or actually user or USR later on when  we discuss the Linux file structure cool   this point we just installed zsh but what  about using zsh let’s continue on the next video oky dokie now for us to use zsh what we need  to do is just simply type on the terminal Z red   s and then H press enter and now you can see that  the output is a little bit different and basically   instead of having this colid Amigos code at Amigos  code we just have Amigos code which is just a user   okay and at this point nothing else changes  because as I said zsh is built on top of bash   so all the commands that we execute for example in  here you saw that we run this this command before   LS so this command if I press enter this will work  so the output right here is not call it as before   but I’ll show you what we need to install later  so that we can improve the experience when using   zsh and to be honest this is it now if you want to  switch back to bash just type bash in here and now   we are back to bash and in fact let’s just press Z  SSH once more more and now if I search so here I’m   going to say dollar and then s basically and oh  actually sorry this will not even work because now   we are within a different shell so I was trying  to search for Echo and then shell so let’s just   type and not be lazy so Echo and then dollar sign  and then shell and I was expecting to say zsh but   the reason why is because zsh currently is not  the default one which means that if I open a new   tab in here and you can see that if I make this  smaller actually bigger and here I can type Echo   and then dollar sign and then shell just like that  and you can see that this is Bash in here cool so   let me just close this and you’ve just seen that  if you want to go back to bash you just say bash   in here right but also if I say cat for slash  etc for Slash and then shells press enter we   have all the shells so we have dash sh so let’s  just type sh for example in here so now we’re   going to switch from bash to sh boom you can see  that now this is sh so this is yet another shell   if I want to use for example dash dash this is  a another shell R bash R and then bash there we   go bash and zsh and this is pretty much how you  switch between shells but really what I want to   do is switch my defa shell to zsh and the way to  do it is by using this command in here so CH h s   and then Dash and then s and what we’re going  to do is point to the Shell itself so this one   user bin zsh so say for slash USR not user my bad  USR for slash bin SL Zs press enter let’s add the   password cool now if I show you something if I  open a new shell so contrl shift T have a look   this still Bash and I know because if I typee Echo  so let’s just type Echo and then dollar sign and   then shell and if I put this smaller press enter  you can see that it still says b bash so let me   just come out of this controll and then D and  now let’s just reboot so re and then boot press enter now let me loog in enter and if I open the terminal you can see that the first thing  that we are prompted with is to configure   zsh so in here let me just press control and  then minus so you see everything in here there   we go and you can see that this is the zshell  configuration function for new users you are   seeing this message because you have no zsh  startup files so basically this is the files   that it needs for configuring zsh and it says  you can quit or do nothing exit create in the   file continue to the main menu or populate your  zsh with the configuration recommended so this   is exactly what we’re going to do okay so type  one of the keys in parenthesis so we want two   and there we go so basically this has now created  a file called zshrc and U I’ll show you this in   a second right so from this point onwards we  have successfully installed zsh and now it’s   a default shell so if I clear the screen control  and then Z zero to increase the font and now if I   open a new shell control shift T have a look so  this is no longer bash so here let’s just type   Echo and then dollar sign shell press enter  have a look zsh in our previous one as well   and then type the same command Echo Dash and  then shell and you can see that now now it’s   zsh awesome we have successfully switched  to zsh and we have a better shell from now on cool now let’s switch our default shell  to zsh and the way to do it is by using this   command in here so CH H sh and then Dash and  then s and what we’re going to do is point   to the Shell itself so this one user bin zsh  so say for slash USR not user my bad USR for   slash bin for slash zsh press enter let’s add  the password cool now if I show you something   if I open a new shell so control shift T have  a look this still bash and I know because if   I type Echo so let’s just type Echo and  then dollar sign and then shell and if I   put this smaller press enter you can see  that it still says b bash so let me just   come out of this controll and then D and now  let’s just reboot so re and then boot press enter now let me loog in enter and if I open the terminal you can see that the first thing  that we are prompted with is to configure   zsh so in here let me just press control and  then minus so you see everything in here there   we go and you can see that this is the zshell  configuration function for new users you are   seeing this message because you have no zsh  startup files so basically this is the files   that it needs for configuring zsh and it says  you can quit or do nothing exit creating the   file continue to the main menu or populate your  Zs AG with the configuration recommended so this   is exactly what we’re going to do okay so type  one of the keys in parenthesis so we want two   and there we go so basically this has now created  a file called zshrc and um I’ll show you this in   a second right so from this point onwards we  have successfully installed zsh and now it’s   the default shell so if I clear the screen  control and then zero to increase the font   and now if I open a new shell control shift T  have a look so this is no longer bash so here   let’s just type Echo and then dollar sign shell  press enter have a look zsh in our previous one   as well and then type the same command Echo Dash  and then shell and you can see that now now it’s   zsh awesome we have successfully switched  to zsh and we have a better shell from now on the last thing that I want to do in this  section is to unleash the terminal like never   before with oh my zsh which is a delightful  open- Source Community Driven framework for   managing your zsh configuration it comes bundled  with thousands of helpful function helpers plugins   themes and basically you’ve got all the batteries  included and you can see here on the left you can   customize your theme and make it so powerful and  beautiful and uh yeah just a bunch of things that   will make you look like a professional so if I  scroll down you can read more about it in here   and they’ve got many plugins and you can see  that on GitHub so this is where this is hosted   and in fact if I click on this link in here so  let’s just give you a star I think I have done   it before but if not this is the right time  because it’s awesome so here we can see all   the staggers and let’s give it a star in here so  if you don’t have GitHub don’t worry so there we   go one more star and let’s click on this repo  in here or you can actually click on the code   Tab and here if I scroll down you can see some  description of what it is how to get started the   installation process in here have a look at this  method sh so this is a shell remember you saw sh   and you just pass this command with curl we’ll  look into curl as well and if I scroll down you   can see they talk about how to configure so this  is is zshrc so this is where the configuration   file is and also plugins g.m Mac OS and basically  you can install a bunch of plugins and also themes   they have a section on themes so you can choose a  theme and here I’ll show you this in a second how   to configure zshrc and um it might look like this  if you choose for example I think it’s this theme   in here but you can do a lot with this and also  you can choose a random theme for example which   is nice awesome so let’s install oh my zsh and  I can actually go back to the previous website   and in here they have a section on install oh  mysh now so what we’re going to do is let’s just   take this command and I’m going to copy this go  to yuntu desktop and here I’m logged out let me   just add the password there we go and just paste  the command so control shift and then V and let   me just put this smaller so you see what this  looks like whoops there we go you can see the   entire command in one line if I press enter  so have a look it’s doing few things so it’s   just cloning oh my that issh and basically it’s  just running some script and tada this is now   installed so oh my Zs is now installed before  you scream oh my Zs I actually screamed look   over the zshrc file to select plugins themes and  options also if you look closely so if I press   control 0 in here the so in here have a look so  so now the prompt has changed so you have this   arrow in here and you have Tia so Tia basically  means that you are in the home folder and we’ll   talk about home later but to be honest this is  pretty much it nice if I open up a new tab you   can see that this is already configured and zsh  is installed next let’s look how to configure zsh cool you saw that they said before you scream  oh my zsh look over the zshrc file to select   plugins and themes and other options so in order  for us to achieve this what we have to do is the   following I’m going to clear my screen crl L and  make sure to type CD just to make sure that we   are within the same folder so just type CD there  we go and what this does basically is if I say   for example CD and then desktop press enter so for  example maybe you are inside of a different folder   desktop so if you type CD it just takes you to the  home folder in here and again we’ll come back to   all of this commands in a second so type CD if I  claim my screen contrl l type VI space do zsh R   and then C you can just type tab so here if I type  zsh or Dot zsh and then tab have a look we’ve got   zsh history zsh RC and rc. pm. preo my zsh so  the one I want is our C right and if I click   the screen and then press enter and there we go  so this is the configuration for zsh and here if   we scroll down so just scroll down in here and  you can see that a few things are commented out   and scroll down in here you can see that we have  some stuff plugins so at the moment there’s only   one plug-in which is get but I’ll leave this up  to you to configure this the way you want it you   can explore themes and whatnot and also you can  configure alyses and a bunch of other things but   basically this is pretty much it if I go back to  the giab repository so here remember if I scroll   down I think they have a section on themes have a  look selecting a theme so once you find the theme   that you like you’ll see an environment variable  all caps looking like this right and to use a   different theme just change to agnos for example  so let’s try this and actually I think the themes   are available so I think there’s a link right  so yes in case you did not find a suitable theme   please have a look at the wiki so here if I click  on this link it takes me to external themes and   have a look so this one looks actually quite good  oh even this one wow so you can see that there’s   a oh you can see that there’s oh I’m getting  excited here you can see that there’s a bunch of   themes that you can use and basically just follow  the instructions in here on how to install them   but let’s just go back to the terminal and what  we’re going to do is so here if I scroll all the   way up to the top in here and have a look the zsh  theme is Robbie Russell so what I want to do is   the following so here we need to be really careful  and just follow exactly as I say because this is   VI and we will learn about this text editor so  here type J just type J and make sure that you   select the terminal type J and you can see that  the cursor is moving down so stop right here and   what I want to do is to type on your keyboard  the letter Y twice so y y and followed by the   letter P there we go so this basically duplicates  the line for us now I want you to type the letter   I and you can see that now it says insert and this  means that we can basically type on the text edit   editor itself so I want you to use the app arror  and we’re going to comment this line so here let’s   just comment this with the pound sign and then go  down and here I’m just using the arrow but I’ll   show you a better way later so let’s just remove  so delete anything within double quotes and let’s   use the AG Noster EG Noster and now I want you to  type the scape key on your keyboard and you can   see that insert is no longer here and then type  colon so colon in here W and then Q so write and   quit so this allows us to come out of this editor  in here press enter and that’s it awesome now   what we going to do is open a new tab you can see  that the theme looks slightly different and here   is actually missing some fonts which we have to  install but I’m going to leave this up to you in   terms of how you’re going to customize your IDE so  I’m not spending time on this okay so usually my   one is just black so here let me just close this  and let me go back to VI so I’m going to press the   app eror so here crl L and you can see the command  once more enter and what we’re going to do is the   following so here I’m going to press D and then D  so twice and make sure that the cursor is in this   line so DD twice so that is gone so basically that  deletes the line I’m going to press I for insert   and let’s just get rid of that and esape colon WQ  esape colon WQ I’ll leave instructions on how to   work with Vim but I’ll teach you Vim later on so  here press enter and now if I open a new tab you   can see that we have the default theme cool so  here control 0 to have the default font size crl   L and this is pretty much it I’ll leave some  links under the description of this video so   you can go and explore and Adventure yourself on  how to customize your ID e but if I show you my   one quickly on Mac OS it just looks like this so  it’s plain black and there’s no themes whatsoever   so let me just say uh in here VI and then zsh  zshrc so this is the exact same configuration if   I put this full screen in here have a look so the  exact same thing I didn’t change nothing and you   can add plugins and whatnot so I’ll leave this  up to you cool so here Escape W colon and then   Q this time I didn’t change this file and press  enter this is pretty much it catch me on the next video let us now focus on Linux commands because  moving forward we’re going to learn a bunch of   commands which essentially is what Linux is all  about right so it’s about learning a bunch of   commands that allows us to interact with the  operating system so a Linux command is a text   instruction that tells the operating system  what to do these commands can be entered in   the terminal or command Lin or basically CLI and  by now you should be familiar with the terminal   and um we basically pass those commands and then  an instruction is sent to the operating system   maybe you want to create a file you want to delete  a file you want to check the time or you want to   connect to a remote server so there’s a bunch  of commands that allows us to interact with the   underline operating system the Linux command  the commands themselves are case sensitive so   for example LS and LS in capital these are  two different commands Linux commands are   often various in options and arguments that can  modify their behavior allowing for a wide range   of functionality so in this example in here so  we have the command option and argument so this   is a command so LS is the command then we can  pass an optional argument so this is Dash and   then a and then an argument so here we are saying  dot which means the current directory so here are   some basic commands LS for listing files CD for  changing directories make di for creating a new   directory RM for removing files CP for copying  files and many more each of these commands they   have an instruction via the manual so if you  don’t know how to use a command you can see   the instructions or some guide on how to use  it effectively let’s go ahead and learn about commands in here I do have the terminal open and I  want to give you a quick introduction of commands   so throughout this course you actually seen some  of the commands that I’ve been using for example   LS so you saw that I did the type LS couple of  times on the terminal you also seen M KD iir or   make there you also seen I think it was sleep  so all of these are commands that allows us to   interact with the underlying operating system  so let me quickly just show you the ls command   and then we’ll go over the command itself the  options and the arguments and also on to show   you the list of all available commands as well  as alyses and the manual so the man page so in   here if I type LS you can see that this is a  command and literally just type LS anywhere   so if you are within a different folder or maybe  let’s just make sure that we are within the same   folder together so here type CD so CD this is a  command so press CD and and this will take you to   the home folder okay now we type CD so CD stands  for change directory so this is one command now   change directory means that you change in the  directory where the subsequent commands will be   run from so let’s just type LS so basically the  ls command will be run under this home folder   in here and come back to the tilder and home  folder as well so press enter and you can see   that we have desktop music templates documents  pictures videos downloads and public so these   right here these are folders currently okay but  I know that within this folder so in here if we   type PWD so this is another command and we’ll  come back to this in a second but this stands   for present working directory press enter and it  tells you that I’m under for slome for/ Amigos   code so this is the folder that I’m currently in  so we just typed LS under this folder and we have   these contents in here right now I know for a  fact that there are more stuff under the home   folder okay so this is home okay so home meaning  that if I say Echo so this is another command so   Echo and Echo takes an argument right so here  I want to pass the argument as the home so this   is actually an invironment variable and we’ll  cover environment variables later but this is   the command Echo and this is the argument in  our case for PWD we just executed the command   without no arguments nor options the same with  ls the same with CD so here if I press enter so   this will give me the home location which is  basically for slome and then the user itself   in here cool so LS in here so let me just clear  the screen so contrl L and here if I typ LS you   can see that we have desktop music templates blah  blah blah right now I know for a fact that there’s   more content inside of the home folder so here  let’s type LS and then we’re going to say Dash   and then a so a in here so this is an option  this is an option if I press enter now have   a look so what we have we have more stuff so if  I scroll up in here so we basically typed ls- a   and have a look so these are all the files bash  history we have the cache we have config then   we see so oops let me scroll down here so then we  see the desktop documents downloads as before but   here we are actually including as well as hidden  files so all of these are hidden now what do I   mean by hidden right so if I open files and in  here this is home right have a look under home   I see documents downloads music picture public  templates and videos so this is what I see so in   here let me just put this on this side like so and  then this guy right here and if I put the font a   little bit smaller and then crl L and if I type  LS without the option- a what we see is desktop   music templates so basically everything that you  see in here right but through the terminal if I   say ls- a now we have a bunch of more stuff so in  here what I can do is I can click on these three   lines at the top click on it and here show hidden  files click on it now can you see bash history profile Vim info zshrc so remember this file in  here so these are hidden files right so you saw   that by default it doesn’t come up in here but we  can toggle the hidden files so here this is the   Das a so – a means hidden files now before we move  on to the next video so one thing that I want to   show you also so LS in in here we could say LS and  then so let me just go back here say LS and then   dot so dot means the current directory and this is  actually optional with the ls command because we   are so here if I type again PWD present working  directory we are within Amigos code this folder   this is the home folder which is this one that you  see right so if I time LS and then dot this is the   exact same thing as LS okay so contrl C there let  me just type LS and then Dot and you can see that   is the exact same thing so what we’ve done before  was LS and then Dash and then a and then dot okay   so this is the command itself so LS the option and  this is the argument so here if I press enter you   can see that we get the exact same output now you  might be saying right so here the ls so if I press   the up error so ls- a and then dot so here this  is the argument well we are printing or well we   are listing the contents of the present working  directory which is home but let’s say that within   documents so let’s just go to documents in here  so documents and let’s just right click in here   new folder I’m going to say f in here okay press  enter let’s create another folder and then call   it bar create so now within documents we have  F and bar so we have two directories cool so   here let’s just press contrl + C I’m going to  type LS so you can see that we are able to see   desktop and here documents right so what we can  do is we can say LS and then the argument so we   want to list the contents of the folder called  documents so make sure that this is capital D   so the exact same name here I can press tab to  autocomplete press enter and have a look we see   F and bar so these are two folders that we are  seeing within documents so you can see that this   is the command and this is the argument we could  also say LS in here and if I go back and I can   say Dash and then a space enter and basically  we just see bar and then Fu okay so there’s no   hidden files Within the documents folder so this  is pretty much what a command is obviously there   are plenty of other commands which I’m going to  go through with you in this course but you should   know what a command is what are options and also  what are arguments in here so here there’s just   one argument but some commands might have multiple  arguments and also I actually forgot so remember   I said that commands they are case sensitive so  LS in here so if I type this command basically   command not found so this command is not the same  as LS in lowercase cool now that you know about   commands options and arguments next let me walk  you through the manual pages or simply the man page in this section let’s focus our attention  in Le in the Linux file system which is the   hierarchical structure used to organize and manage  files and directories in a Linux operating system   it follows the tree structure with the root  directory so here you can see this is the   root at the very top and all other directories  are organized below it so here we have bin is a   directory Etc another directory sbin USR VAR dev  then we have have home lib Mount opt proc root   so on and so forth so in this section basically  I want to give you the overview so that we can   start exploring and start using the CD command  PWD on all that good stuff so basically you have   the root in here and then after root you have all  the directories in here so sbin which is used for   essential user commands binaries so here bash gut  CP date Echo LS uh less kill and then basically   all of this commands are used before the USR so  here is mounted because within this USR so here   you can see that there’s also a for slash bin in  here right so these is where you find the programs   right so binaries are programs then you have Etc  so here it’s mainly used to store configuration   files for the system so here you can see fonts  Chown tabs in it and profile uh shells time zone   and whatnot so these are mainly for configuration  files then we have the sbin so sbin is similar to   bin but only for the super user then we have  USR or you can say user so here it’s read only   application support data and binary so you can  see binaries in here for SL include in here lib   right so here basically some code and packages and  also uh you can see some local software which is   stored as well under for SL looc you also have  the for/ share which is static data across all   architectures then we have the VAR so this was  initially uh named as variable because it was   used to store data that change frequently so here  you can see uh youve got cache so application   cache data lib data modified as program runs  lock for lock files to track resources in use   then log files are stored in here variable data  for installed packages and opt es poool tasks   waiting to be processed here you’ve got es poool  and then cron cups and mail and basically here   is where you store temporary data so once the  system reboots then the data is gone you have   Dev in here so this is for device files then we  have for slome so this is the home directory and   we’ll come back to this in a second you have lib  so here for libraries and carel modules Mount so   here Mount files for temporary file systems  such as USB then we have opt for optional   software applications proc for process and kernel  information files for/ root so this is the Home D   for the root user and this is pretty much it now  obviously here I’ve schemed through it and um as   you go through your journey in terms of learning  Linux and um using the command and navigating your   way around and even you know building software  then you start to familiarize yourself with all   all of these folders in here that I’ve just  talked about so this actually is from the   Linux Foundation org I’ll leave a link where  you can basically go and read more in detail   about what each of these folders and subfolders  do but this is pretty much the Linux file system   in a nutshell next let me go ahead and show you  how we can navigate around within the Linux file system all right so in here I’m with in my  terminal and let’s together explore the Linux   file system together so I want you to type this  command in here so CD in here literally just type   CD and then for Slash and then space and then  for slash so this whatever you are just type   CD and then for SL now CD in here means change  directory and basically allows us to change from   one location to another So currently I’m within  the home directory and I want to see I want to   change directory into forth slash so for slash  is the root so press enter now we are within root   if I type PWD it just gives us forth slash which  means root nice if I type LS so list directories   and basically so list the contents within this  directory press enter in here so anytime that   you see something which looks you know something  like bin lib proc serar boot Dev ety Mount up   temp user this is basically the Linux file system  from root so remember I’ve showed you so in here   we have root and then we have ban at C SB user  VAR Dev home lib so if I go back so have a look   bin lib VAR temp user in here so on and so forth  media Mount opt home as well in here have a look   home right so this is pretty much it now what I  want to do with you is so let me just clear the   screen crl L and in here let’s together type this  command we’re going to say PSE sudo and we’ll come   back to P sudo and a also apt we’ll come back to  this in a second and then say install and then   tree so this is basically a way of us installing  extra binaries into our operating system so press   enter Then adding the password and I’m typing  trust me but you can’t see press enter and now   this is installing the tree binary and there we  go so now if I type in here so I just clear the   screen I’m going to type tree or actually let’s  just say which and then tree press enter you can   see that this is under user bin and then tree  okay so it means that we have this binary that   we can use now this binary here so tree so here  I’m going to pass an option so the option will be   Dash and then capital l in here and then I have  to pass an argument into this option and press   enter and literally what this basically gives  me is this nicely formatted LS so basically we   are lising the directories within the root folder  but this is nicely formatted for us so here you   can see we have bin we have boot we have Dev we  have ety we have home lib and also these arrows   in here I’ll come back to them in a second but  in here so temp as well V are so this is pretty   much the Linux file structure from root and you  can see currently there’s 20 directories and   one file so the file is this swap. IMG awesome  next let’s go ahead and learn how to use the CD command all right so in order for us to navigate  around the Linux file system we need to use the   CD command so here let me just put this full  screen and clear the screen crl l so we need to   use the CD and then command so CD and if I press  tab let’s just press tab in here so this now is   giving me the list of all available option right  so here if I want to now move into the directory   called let’s say temp for example so this is where  temporary files are stored I can just say DM press   enter and now you can see that this reflects so  this is all my zsh and it’s telling me that I’m   within the temp folder and now if I press LS  and you can see that there are some files in   here so these are temporary files so if I say  ls- a and um yes so you can also see the dot so   file started with Dot in here and if you want more  information about it ls- and in here you can see   that basically anything that starts with d in here  and I’ll come back to what all of this means in a   second but these are directories in here and these  are files in here okay which means that we can you   know navigate into the snap and then private temp  or system d right so I’m not going to do it this   is p myit now I’m inside of so let me just press  control Z and then clear the screen I’m inside   of temp folder right here so let’s just type  this command and I want to go back to the root   again so how do I do it well I’ve got couple of  options I can say CD and then for slash root or   I can basically go back one folder right so here  if I say CD dot dot so this goes back a folder   so you see from temp it went back to root so if I  type CD TMP in here press enter again I can type   CD for slash so this is actually going directly  to the location instead of going back a folder   press enter and we get the same thing what about  if you want to switch between these two folders   for example right so you don’t want to say CD and  then temp or CD dot dot well you could just say   CD and then Dash and basically this flips between  the previous and the current folder and this goes   back to the previous folder whatever it is within  the file system so if I press enter I go back to   Temp if I press CD and then Dash again I should  go back to root have a look I went back to root   in here cool so I’ll show you more examples of  this in a second and this is pretty much how   you navigate around the Linux file system so  if I type LS once more clear the screen enter   you should see a bunch of folders if you want to  navigate into a particular folder you just say   CD let’s go into bin for example CD and then bin  this and then press enter and now I’m within bin   in here if you want to go for example within  media you don’t necessarily have to go back a   folder you could just say CD for Slash and then  media right so because media is within the root   right here press enter and you can see that now I  went back to Media if I type CD Dash This should   take me back to where think for a second so this  goes back to the previous location which was Bin   press enter you can see that now I’m within bin if  I press up arror and then CD Dash I should go back   to Media enter and you can see that I’m within  media this is pretty much it catch me on the next one all right in this section let’s focus our  attention in terms of working with files and   also in the next section I will show you file  permission in this section let’s focus our   attention in terms of working with files and  later I’ll show you um also directories and   then we’ll learn about permissions so in Linux  in here so you’ve seen that if I open the so   this folder files so in here remember if I click  on these three lines I can basically show hidden   files right how do we create files manually  with Linux so one we have two options so we   could use the UI and we could open so let’s  just open any of these so zshrc and this will   bring the text editor so here what we could do  is we could create a new document and here I   could say hello and then Amigos and then I can  save this I can give the destination so let’s   let’s just save it into documents I’m going  to say hello.txt and there we go close the   file close this let’s navigate to documents  so CD and then documents so you’ve learned   about the CD command LS and you can see that we  have our file in here right so obviously that   is the wrong way of doing that so hopefully  in this section we’ll go through in terms of   how to work with files creating files deleting  them and moving them to a different directory   I’ll show you how to print them as well and also  how to zip any file cool let’s begin in the next video cool in order for us to create a file with  Linux we have this command called touch so this   command allows us to create a file so here let’s  just say buy so buy. txt now obviously here if I   don’t specify the location and just give the  name so this is the name of the file so this   will be saved under the current working directory  which currently is documents right so home and   then documents so if I press enter now let’s type  LS and you can see that we have the file in here   called by. txt so this is how to create files  now obviously this file in here is empty let me   show you so before I actually show you the Linux  command in order for us to print this file if I   open up files in here and then let’s navigate  to documents we have buy. txt let’s open that   up and you can see that it’s absolutely empty so  this is to much how to create an empty file now   obviously it’s not useful because you know most  of the times what we want to do is to create a   file with some content so there are a couple ways  that we can do that and one way is for us to use   the echo command so here I’m going to say Echo  and here we have to pass a string and here I’m   going to say for example by by and then Maria for  example right so this is just a random string now   if I press enter this command just prints back  by Maria now what I can do is I can take this   command and then redirect to the file so here  I can give an existing file name or I can give   it a brand new file so let’s just overwrite the  file that we have which is b.txt so here by. txt   press enter and we get nothing so here we know  that basically if you don’t see anything on the   console and the command just run and executed  you know that it works so let me just clear the   screen crl L LS we have our buy. txt now if we  want to view the contents let’s just again just   open files and here let’s go to documents buy.  txt and sure enough we have buy and then Maria   so this is pretty much how to create a file both  an empty file as well as passing some string or   some output into the file so basically we use use  the echo command in here and then we pass a string   and then we say by. txt or if you want an empty  file you could just say basically so here you can   use the touch command okay so this is touch and  then you can say whatever right so lol and you   don’t even need the extension so here if I say  enter and then LS you can see that we have buy.   txt we have F we have low. txt actually these  are folders so I think we did these before we   created these folders before and um yeah so this  is pretty much it so if I open of files again once   more go to documents you can see that we have  three files in here both with extension and uh   without extension cool there’s another way that  we can create files which is so basically let’s   say that you want to type a couple of things  uh before you actually uh submit the content so   here you see that I’m just saying Echo and then  by Maria I’m redirecting the output from this   command into this file but maybe you want to type  a document or a piece of code right so this is not   feasible and I’ll show you later with Vim how to  do it but for now these are the basics of creating files cool in this section let’s learn how to work  with folders or directories so you saw that we   can basically create files we can delete files  through the terminal using commands and so far   I’ve been creating folders by right clicking and  then new folder and also the same with deleting   folders right click and then basically I think  it’s moved to trash in here right so there’s   better ways of doing it and through the terminal  we can use the mkdir so this right here allows   us to create folders or directories so in here  let’s just CD into and then add documents and let   me put my font a little bit smaller just like  that clear the screen now if I want to create   a folder in here I can say mkd I bar and then  hello bar for example so this now is the name   of my folder press enter and you can see that  we have a folder in here called hello and then   bar if I want to delete a folder which is empty I  can say rmd iir so this actually will remove the   folder only if it’s empty right so here if I press  enter you can see that the folder is no longer in   here if you want to create a folder or basically  nested folders you say mkd I Dash and then P so   Dash p in here and then you can say f for slash  in here and then the bar press enter and in here   actually uh I think we had a folder called Fu  which was here so it didn’t actually create a   new folder but basically inside of Fu now you can  see that we have a new folder called bar so let   me just go back in here and what I’m going to  do is I’m going to run the exact same command   but I’m going to say for example here test and  then bar now you can see that we have a folder   called test and inside of test we have a folder  called bar now if we try to delete so let’s just   say rmdir and then the folder called test in here  press enter you can see that RM failed to remove   test because it’s empty right so rmd just deletes  the folder if it’s empty remember how to delete   the files so we can use the RM command in here so  RM dashr in here and then I’m going to say f to   basically Force delete and accept the prompt so R  for recursive and then here I can say the name of   the folder which is test now this is the key so  if I say in here for Slash and instore right so   pretty much just delete anything under test and if  I open up test you can see that we have bar so if   I press enter here this is still going to prompt  me yes or no so because we have the force here so   let’s just press n for a second so what we want to  do is just add a trailing for slash so this will   basically remove without prompting it’s just going  to remove every single folder and subfolder so if   I press enter you can see that now the folder is  gone and we kept the parent folder in here so if   you want to keep let’s say you want to keep the  parent in here so let’s just again create a new   folder so make the- p test bar let’s also say bar  and then two or three doesn’t really matter and   let’s just have two in here right so here inside  we have three folders if you want to delete them   all all you do is you say rm-rf the name of the  folder for slashstar for slash so here you could   also do a pattern right so let’s just say you  want to delete anything that ends with three for   example so three in here press enter and you can  see that only the folder that ended with three was   gone right so star means pretty much any folder  right so also if for example here so you have   bar so let’s just create a new folder inside of  bar two for example so here I’m going to say FU   press enter now within bar two we have Fu okay  so I’ve just said- P to create subfolders so if   I was to reun the command in here so this will  pretty much just delete all subfolders including   folders within folders right so if I press enter  you can see that it’s gone and we can’t go back   right because the folder doesn’t exist so the  parent which was bar two doesn’t exist so here   let me just say okay and go to documents and test  and you can see that all folders are gone if you   want to delete basically everything including  the parent all you do is so let’s just create   a new folder here so basically bar two inside  with f so this is the command and you want to   delete everything including the parent folder  which is test all you do is mkd and then Dash   oh actually sorry rm-rf so D RF or f r is the  same thing but I’ve just switch the options   and then the name of the folder test then press  enter and you can see that the folder is now gone   and this is pretty much how you create folders  but also delete contents within your folders Linux is a multi-user environment where allows  us to keep users files separate from other users   we can add a new user by using the pseudo and  then user ad- M so this is a flag that allows   you to create the home directory and then you  pass the name we can also set the password for   the particular user by using the pass WD and  then the user in question and if we want to   switch between users we use the Su command I.E  substitute user if you also want to delete the   user you can say user Dell and then here we can  pass some flags and then the user in question   but I’ll show you the flags in question as well  so and with this we have two types of user we   have a normal user that can modify their own  files this user cannot make systemwide changes   install software update system files and also  cannot change other users file so You’ seen the   pseudo command I think throughout this course but  I didn’t cover it but I’ll show you in a second   when we try to install for example a package then  we are not allowed to do that unless we use the   pseudo command and then we have the super user  in here I.E root and this user can modify any   file on the system it can make systemwide changes  such as install software and even change files on   the operating system so in this section let’s  understand basically how all of this works and   then we also touch on files and permissions  which is very important and this is actually   very important that you must understand how it  works because it’s key towards your journey in   terms of becoming a Linux administrator  if you want to follow that path but for   a regular software engineer still crucial for  you to know how this works because it’s key to Linux cool you’ve seen that if I was to type this  command and we’ll learn about package managers   later but here let’s say that we want to install  a piece of software in our machine so basically a   binary so here I think you’ve seen this APK or  I think no it’s apt and then install and here   let’s just say tree so here just say tree and we  did this before but let’s just understand exactly   what we had to do to install this software  if I press enter in here it says could not   open lock file permission denied have a look  permission denied and then it says enable to   acquire the front end log blah blah blah are  you roote well so in order for us to execute   this command successfully we need to execute  this as root I.E with the pseudo command so   the way we do it is we can type in here pseudo  so PSE sudo this is the command that we need to   use and then here I’m going to say exclamation  mark exclamation mark twice and then press Tab   and basically this just adds in the previous  command that I had in my terminal and now if   I press enter now it’s actually asking me for the  password you’ve seen this before so here I’m going   to add the password so it looks like I’m not  typing but trust me it’s hiding the password   for security reasons so just type your password  and then press enter and in fact if I basically   have a wrong password press enter it will say that  the password was incorrect so now I need to type   the password again so here I’m going to type the  correct password press enter and you can see that   basically it tries to install but this is already  installed so this dependency is already installed   as we did before similarly if we try so in here  if I try to navigate to CD and then the root so   for slash LS so in here we have couple of folders  in here but one is root so let’s just try and say   LS and then root for example press enter you  can see that it says LS cannot open directory   root permission denied so if we want to execute  this command on this particular folder we need to   execute the exact same command as root so here  we can say pseudo LS and then root or if I add   exclamation mark exclamation mark twice tab it  just brings in the previous command so this is   a nice trick that I use all the time so if I press  enter now you can see that now we are able to list   the contents inside of the root directory so for  you this might say snap or it might say something   different or maybe nothing right but you can see  that with this command we have super powers now   obviously this here you have to be really careful  how you use this command so remember I said never   do this so sud sudo rm-rf in here and then root  right because if you do this basically you are   getting rid of your entire operating system and  you don’t want to do this so obviously you need   to be careful who you choose to allow to have  the super powers and I’ll will show you this   later in a second but this is the main idea  and basically this is the pseudo command in   NHL pseudo executes a given command with elevated  Privileges and these privileges are required to   perform certain tasks which are required by admins  let’s explore pseudo even further in the next video if you remember correctly when we  do an LS so if we type LS in here so LS   and then Dash a l you can see that we have  some output in here that contains a bunch   of information so in here have a look so we’ve  got that we’ve got this we’ve got all of this   and basically we have some information and  then this is the actual file itself right   so file or directory so in this section we’re  going to focus on understanding the files and   permissions in here and also I’ll explain the  uh output from the ls command so in here if   you remember correctly so if I type in here  ls- Dash and then help and then scroll up in   here so remember the dash so Dash and then l  in here use a long listing format so that’s   why you see all of the information and then  – A as well for Eden file in here so do not   ignore entry that start with DOT right which is  basically all of this right so this dot in here   so the dot files are for the- a and then the  L is for long listing which is for all of this   information in here cool let’s go ahead and uh  start learning about Linux files and permissions next in here I do have this awesome diagram where it  teaches about the output of the command ls- L and   more specific we’ve got the permissions here  which is the core of this section but let me   actually start from here and explain the output  for uh ls- L now in here you can see that we have   the folder name or the file basically the name of  the file that you list within that directory so in   our case we got food. txt as well as di so this  is the name of a folder in here and this could   be literally anything then we have the date and  time and this more specific is the last modified   date and time okay so if you create the file  so that will basically be the creation time and   if you change or modify the file then this will  reflect then we have the size so for a file this   is 4 kilobytes then for a directory this is 4,000  kilobytes and basically the total of whatever is   inside of the folder last section you’ve learned  about groups so this is the group name so to which   group the file belongs to so in this case Amigos  code so both files and then we have the owner so   the owner is the user so in my case Amigos code  earli on you saw that we created a user called   Jamal so this also will reflect then here we have  the number of hard links so two and one and we’ll   come back to hard links later then we have in here  the permissions and the very first character in   here so basically this so excluding D basically I  can’t select it but basically the first character   of this sequence in here it’s always the file  type and then we have the set of permissions   now for the file type in this case d stands for  for directory and then Dash stands for basically   a regular file now when it comes to permissions  this is divided into three sections as I said the   first one is the file type and then and then rwx  rwx r-x in here so basically what this means is   read write and execute R for read W for write and  X for execute the first three characters belongs   to the user so this means that a user can perform  a set of actions on the file type the second set   of characters so the first three for the user  the second three for the group so these are group   permissions and the last three are for everyone  else or others so if it doesn’t belong to the   user nor the group then the rest of of the world  and here’s an example so for example for this file   in here called f.txt so you can see that the file  type in here Dash so it’s a file read W and then   Dash so this means that Amigos code user can only  read and write it cannot execute and we’ll come   back to execute in a second so once we create a  Bash script but also for folders execute Works   a little bit different then the next three set  of characters read write and then Dash so when   it’s a dash it means that there’s no permissions  in there so here Amigos code group so the group   can read and write and then the last three are  dash dash it means that anyone can literally   read so we’ll go into details uh in a second in  terms of the actual permissions but this is the   general overview of the Linux file permissions  and they more specific when you perform ls- L   this is basically the output but as I said in  this section we want to focus on the permissions themselves we’re done with Linux and that’s not  Myer feat you’ve learned about some key commands   and you’re already on your way to becoming  an expert but how do we group those commands   together well that’s where shell scripting  comes in is shell scripting like a programming   language such as python or goang exactly  so you learn about conditions and Loops you   learn about functions how to do effective error  handling and that’s not all we have challenging   exercises waiting for you to put your skills  to the test I’m looking forward for it so am I scripting is where Linux comes in really handy  let’s dive into shell scripting a game changer   for anyone who wants to automate tasks in Linux  first things first what is Bash Bash stands for   Born Again shell a bit of a fun name isn’t it  it’s essentially a command line interpreter   which in simple terms means it’s your gateway  to communicate with your computer using text   based commands with bash you boost efficiency  Skyrocket productivity and can effortlessly   streamline tasks that might otherwise be tedious  think of bash as a way to create a sequence of   commands automating tasks and Performing complex  operations without breaking a sweat now how do   you write these magical scripts all you need to  start is an editor it could be as simple as Vim   which we’ve covered in this course or a feature  editor like Visual Studio code your choice once   you’ve penned down your script save it with  the extension Dosh which tells your system   hey this is a bash script now let’s explore  some fundamental elements of bash scripting   as we talk remember the true understanding  comes from practical application which we’ll   delve into shortly first up variables think of  them as containers they store and manipulate   data for you typically denoted by something like  dollar Vore name variables can hold a variety of   data be it strings numbers or even arrays  moving on to conditionals they are scripts   decision makers allowing it to make choices  based on specific conditions based on whether   something is true or false different blocks of  code will run making your scripts Dynamic and   responsive next up loops loops let you repeat  instructions over and over as needed with for   loops and while Loops you can iterate over  lists sift through directories or continue   a task until a specific condition is met last  but not least functions imagine grouping a set   of commands into one block you can call upon this  block or function multiple times throughout your   script they’re the essence of code reusability  modularity and organization in your script which   is a very key component when it comes to script  writing and there you have it an introduction to   Shell scripting with bash while this is just the  tip of the iceberg armed with these fundamentals   you’re well in your way to master the art of  scripting Linux so without further Ado let’s get started let’s write a simple script to get  a taste of B scripting in this example we’ll   create a simple script to greet the user first  let’s create our script we can use the touch   command followed by the name of our script let’s  call it my first script and make sure you use the   extension Dosh which indicates that these are  bad scripts let’s now open our file using Vim   my first script.sh now the first line of every  file starts with a shebang line don’t worry too   much about this line at the moment we’ll cover  this in a future video now we Echo hello world   in our script and then we can escape and then  we can save our file using coal WQ exclamation   mark now because scripts are executables we  have to also CH mod our script using CH mod   and we can use the symbolic notation plus X  followed by the script name my first script   and now we can run our script using the dot for/  prefix and my first script and there you have it   H world now this is just a basic example but  B scripting allows you to do so much more you   can manipulate files process data automate  backups and perform complex operations all   through the power of scripting so to become  proficient in B scripting it’s essential to   understand the fundamental concepts that form  the building blocks of scripting let’s briefly   cover some of these Concepts and that’s  all for this video I’ll see you in the next one in this video we’ll delve into an important  concept called shibang the shebang also known as a   hashbang or interpreted directive plays a crucial  role in the execution of bash scripts so let’s   first create a file we can just touch greet Dosh  for example and then press enter now we briefly   touched upon shebang line in the previous video  and that’s the first line that you find in any   bash script where you have followed by bin bash  this line is a she and it serves as a directive   to the operating system on how to interpret the  script in this case we’re asking the system to   interpret the script using the binary bash so the  path after the exclamation mark is essentially   pointing to the specific interpreter or shell that  should handle the script the shebang line provides   flexibility by allowing you to specify different  interpreters or different types of scripts for   example if you’re writing a python script you can  use a shebang line that instead has user being   Python and then you can decide if you want Python  3 or python 2 to ensure the script is executed   using the python interpreter and similar for  scripts written in Ruby for example you’ll just   change this binary to Ruby and so on now let’s  see the impact of the shebang connection suppose   in this bad script we want to print hello world  for example we want to write a greeting message   so first let’s write our she bang with bin bash  and then we do Echo hello world and then we escape   and then colon WQ to save this now remember B  scripts are executables which means we need to   give it the executable permission so to do this  we use a CH mode command followed by the symbolic   notation to give it executable permission so we do  plus X followed by the name of the file so greet   Dosh and then we press enter now this file is an  executable so we can check that this is the case   by running LS followed by the long form option  and as as you can see our greet Dosh file now has   executable permissions which is the X here okay  let’s clear our screen now to run this we can use   a for/ prefix followed by the script name and then  we press enter and as you can see it prints hello   world now this is only one way to run this bash  script we can also use the command sh to run the   bash script so greet Dosh and that gives you the  same thing and we can also use Bash read.sh and   we press enter this is for when you don’t specify  The Interpreter within the bash script so if we   remove our bin bash line or or a shebang line in  the bash script we can use these two commands to   interpret this script as bash great now the She  Bang is not limited to just the bash shell you   can use different interpreters depending on your  needs and by specifying the correct interpreter   in the shebang you ensure that your scripts are  executed consistently regardless of which sh or   environment they’re running so a quick summary the  shebang line starts with the hash followed by an   exclamation mark it specifies The Interpreter or  shell that should handle the script it enables   consistent execution of scripts across different  environments regardless of whatever shell you’re   using even though we’re using the zsh Shell here  it was still able to interpret the GRE Dosh file   as a bash script you can specify different  interpreters for different types of scripts   and the she bang line should be placed as the  first line of the script without any leading   spaces or characters before it and that’s it  thanks for watching and I’ll see you in the next one in a previous video we learned how to run  scripts using slsh and Bash so let’s recall our   simple script greet Dosh so if I do a cat greet  Dosh we can see that this script prints hello   world right now we can run it from its current  directory using for/ greet Dosh but what if we   want to run it from anywhere without specifying  its path well the trick is to place our script   in one of the directories that’s in our path  environment variable the path is an environment   variable that tells the shell which directories  to search for executable files in response to   commands so let’s clear our screen and if I do an  echo of the path environment variable we can see   that there are several directories separated  by colons any executable file placed in one   of these directories can be run from anywhere in  the terminal now a common directory to place user   scripts is user local bin that’s this directory  over here so let’s move our greet Dosh file into   this directory and give it executable permissions  now for this we are going to use pseudo because it   requires super user permissions to move scripts  into this directory so we run PSE sudo and then   move and then our script greet Dosh and we’re  going to move this to user local bin and we’re   also going to change the name to greet so it  becomes easy to run later on so now we can press   enter it will ask you for your password so enter  your password so that’s moved greet Dosh into the   user local bin directory now remember you also  have to CH mod since this is a script so once   again pseudo CH mod with the plus X symbolic  notation followed by user local bin and then   greet so we press enter now the reason we changed  the name to greet is so that for Simplicity this   is how we will call it now let’s clear our screen  now if I has to run the command greet just like   this it will give me hello world without using sh  without using the current directory and if I was   to also change it directory and call greet it will  still work so if I change directory to let’s say   desktop for example I can also run it from here as  GRE so you can see we were able to run our script   using just its name without needing to specify  any path or use for/ sh or bash so to recap by   adding our script to one of the directories in  a path environment variable we can conveniently   run it from anywhere in our terminal this can be  incredibly useful as you build up a library of   custom script just be cautious though and ensure  the scripts you add to Global paths are safe and   intended for Global use and that’s all for this  video Happy scripting and I’ll see you in the next one in this video we’ll explore the concept of  comments and how they can enhance the clarity   and understandability of your script comments  are lines in a script that are not executed as   part of the code instead they serve as informative  text for for us reading the script adding comments   to your scripts is considered a best practice  because it helps you and others understand the   purpose functionality and logic of the script so  let’s take a look at how comments are Written In A   bash script in bash there’s two types of comments  you have a single line comment and a multi-line   comment so let’s first go into our greet Dosh  file VM greet Dosh and then press enter now we   know what the script does it prints hello world  to the console when we run the script so first we   can press I to insert and to write a single line  comment simply start the line with the hash symbol   anything following the hash symbol on that line  will be treated as a comment so print greeting   to the console for muline comments you can enclose  the comment text between colon with single quotes   and then we can have our comments within the lines  enclosed between the single quotation marks so   anything between 6 and 9 will now be considered  a comment this is a multi-line comment and we can   just get rid of this line as well so Escape great  now if I was to exit and save this file and rerun   GRE Dosh you’ll notice that it only prints hello  world even though that in our GRE Dosh file we   have these two lines but because they are being  taken as comments they are therefore not executed   now let’s see the Practical benefits of comments  in action consider a bash script that renames all   txt files in a directory to have a Bak extension  so what we do here is VI extensions. sh file and   then press enter and here we have a for Loop  without comments the script may appear cryptic   especially for someone unfamiliar with the purpose  and inner workings of this for Loop especially for   someone who’s new to B scripting who doesn’t  really know how to write for Loops so in our   case it’s very important for us to write comments  here to improve the understandability so we start   with our hash and then we add our comment so what  we’re doing in this for Loop is renaming all txt   files Tob so we’re changing the extension of the  file now we can use multi line comments to add   more detail as to what the script is doing so to  do this we start with a colon and then the single   quotation mark and also close this with a single  quotation mark So now anything inclosed between   these two quotation marks would be considered  a comment so we can write explanation and then   what we’re doing is looping through all. txt  files in the current directory we are using   the move command as you can see move command to  rename each. txt file to do B and finally the   this part of the code is the syntax so the and  then we can paste that here is the syntax that   removes the txt extension and the pens B okay  let’s save the script WQ and exit let’s just   now cut this file and let’s zoom out a little  bit now notice by adding comments throughout   the script we can provide explanations and context  as to what the script is actually doing making it   easier for others and ourselves to understand the  script’s intention so comments not only help with   the script comprehension but also enable you to  temporarily disable or exclude specific sections   of code without deleting them let’s say we did  want the script to run these three lines or we   we can actually prevent those lines from running  by turning them into comments so let’s go back   into our file and what we do is let’s first do an  i and then add a hash in front of this so now it   turns into a comment and same for the remaining  two lines now you can see this script essentially   won’t run anything because now we’ve turned all  our commands into comments we can exit and we can   save this if we tried running the script we do  for/ extension. sh oops wrong file okay we get   permission denied because it’s not executable so  let’s make it executable sh and then rerun as you   can see nothing happens because all our commands  have now been commented okay and that’s all you   need to know about comments and how useful they  are within our scripts so by adding comments to   your scripts you improve the readability you  can you know Foster collaboration within your   team and you can ensure that the scripts purpose  remains evident throughout the life cycle of the   script so other people can read what the script  is doing and so later if changes need to be made   you know where those changes need to happen okay  thanks for watching and I’ll see you in the next one in this video we’ll delve into the world of  variables variables are an essential component   of bash scripting as they allow you to store and  manipulate data it makes your script Dynamic and   flexible in bash variables are like containers  that hold data such as text strings numbers or   even arrays they provide a way to store values  that can be accessed and modified throughout the   script so let’s look at how variables are created  and used in bash script to create a variable you   simply assign a value to it using the assignment  operator so let’s first create a file and call   this file. SH now first in this file let’s begin  with our shebang b bash and then let’s also assign   a variable called greeting and we can assign it  to the string hello world to access the value of   this variable you prepend the variable name with a  dollar sign so we start with dollar greeting let’s   say we want to use the echo command to Output  the value stored in greeting we just start with   Echo followed by Dollar greeting and then we can  escape and save our file make sure you CH mod your   script to give it executable permission v.sh and  then the/ prefix to run the script and there you   have it hello world now variables in bash are not  constrained to a specific data type they can hold   different types of data such as strings numbers  and arrays let’s create a variable that we can   assign a number so let’s reopen our v.sh and let’s  assign another variable I use all my keyboard to   go to the next line and we can assign the count  variable to the number 42 for example so as you   can see I’m not enclosing the number 42 within a  string because I want this bad script to interpret   this as a number and not a string right and then  we can call this variable using the same format   Echo count then let’s exit save our file and run  our bash script v.sh and there you have it it   prints the number 42 as well as our hello world  now variables can also hold an array so let’s   create another variable called fruits and assign  it to the values apple banana and orange so we do   that using parentheses first element will be apple  second element banana and the third element orange   and then you close your parenthesis and there you  have it the fruits variable assigned to this array   now you can also use variables within strings to  create Dynamic output this is known as variable   interpolation let’s see how we can do that let’s  assign a variable name to the name let’s say armid   for example we can now Echo and then within our  string we can use variable interpolation to say   hello to this variable name and Let’s Escape and  WQ to save and let’s call a.sh and there you have   it hello armid so it’s taken the name variable and  assigned it with within our string so essentially   we’re doing variable interpolation in this case  so the value stored in name is inserted into   the string using the dollar name syntax great  let’s summarize what we’ve learned variables   are created using the assignment operator  equals to access the value of a variable   we prend the name of the variable with a dollar  sign variables can hold different types of data   such as strings numbers and arrays and variable  interpolation allows you to use variables within   strings to create Dynamic output and that’s  all for variables I’ll see you in the next one in this video we’ll dive into the topic of  passing parameters to bash scripts by allowing   inputs from the command line you can make  your script more versatile and interactive   bash scripts can receive input values known  as parameters or arguments from the command   line when they are executed these parameters  allow you to customize the behavior of your   script and make it more flexible let’s look  at how to pass parameters to a b script when   running a script you provide parameters after  the script name so for example let’s say we   had a script.sh file we pass parameters just  like this parameter 1 parameter 2 and so on so   when running a script you provide the parameters  after the script name separated by spaces so the   parameters are all separated by spaces so in  this example we’re executing a script called   script.sh and passing two parameters parameter  1 and parameter 2 inside the B script you can   access these parameters using special variables  dollar one doll two and dollar three let’s look   at an example let’s create the script.sh file and  let’s start with our Shang bin bash and let’s say   we wanted to echo three parameters let’s say  the first parameter parameter one and we use   use a special variable so dollar one which  basically grabs the value of the parameter   passed into the script when we run the script  let’s say we have these lines three more times   so let’s just copy this line here copy and then  paste let’s say now parameter two we have two   and then for parameter three we have three so in  this script snippet we’re using the echo command   to display the value of these three parameters so  Let’s Escape and save this file now when I call   the script.sh I can pass in a parameter so let’s  say the first parameter let’s call it hello and   second parameter hi then press enter as you can  see because we’ve only passed in two parameters   it only prints the first two hello and hi because  this is taken as dollar one and this is taken as   dollar two if I was to pass in a third parameter  let’s call it hey and press enter now we have a   third parameter and it is printed in this third  line excellent so when executing the script with   parameters the values passed on the command line  will be substituted into the scripts parameter   variables dollar one doll two and doll 3 now what  if we wanted to access all the parameters passed   into a script we can do this using a special  variable so let’s go into our script.sh let’s   add another line and let’s say we want to Echo  all parameters right we use a special variable   followed by the at symbol and then quotation  marks and then now let’s save the script and   now when we run it we get all parameters and then  the parameters that we’ve passed into the script   in other words the echo command in that line  will output all the parameters passed to the   script great let’s summarize what we’ve learned  parameters are provided after the script name when   executing a script inside the script parameters  can be accessed using dollar one do two doll three   and so on based on their position and the special  variable dollar at can be used to access all the   parameters pass to the script so by allowing  inputs through parameters you can make your   script more interactive and versatile great that’s  all for this video and I’ll see you in the next one phew well done for reaching  the end of this course but your   journey doesn’t stop here whether  you’re taking the devil’s path or   the software engineering path well it’s  only the beginning we have courses to   help you on this journey it was a pleasure  teaching you and we’ll see you in the next one Assalamualaikum

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Full Stack Learning Management Application Development

    Full Stack Learning Management Application Development

    The text details the creation of a full-stack learning management application using Next.js, Node.js, and AWS. It covers the development process step-by-step, including front-end UI construction with ShadCN components and Tailwind CSS, back-end API design with database interaction, authentication via Clerk, and payment integration with Stripe. The tutorial extensively explains the use of Redux Toolkit Query for efficient data fetching and management. Finally, it addresses features like course creation, editing, and user progress tracking.

    Learning Management Application Study Guide

    Quiz

    1. What is the primary function of Node.js in the context of this application? Node.js is a server-side JavaScript runtime that allows JavaScript code to be executed on the server. In this application, it enables the creation of a backend that can handle requests and data management.
    2. Explain the purpose of npx create-next-app in the project setup. npx create-next-app is used to create a new Next.js application with a default configuration. This provides a quick start for building the frontend of the application.
    3. What are two essential VS Code extensions recommended in the source, and what are their purposes? The two essential extensions are ES7+ React/Redux/React-Native snippets, which helps create React components, and Prettier, which formats code automatically upon saving, ensuring consistent formatting.
    4. Describe the role of Clerk in the application. Clerk is an authentication service that is used to handle user sign-up, sign-in, and profile management within the learning management system. It simplifies the process of managing user accounts.
    5. What is Tailwind CSS, and how is it used in the project? Tailwind CSS is a utility-first CSS framework. In this application, it is used to style components by applying predefined classes, which are imported in a global CSS file, avoiding the need to write custom CSS from scratch.
    6. Why is DynamoDB chosen as the database for this application, and what type of database is it? DynamoDB is chosen for its scalability, performance, and suitability for applications with fewer tables and relationships. It is a NoSQL database and allows you to store data, in this application, such as courses, transactions, and user progress.
    7. What is the significance of the “non-dashboard” layout in the application? The “non-dashboard” layout is used for pages that do not require user authentication or are not part of a user dashboard. This includes the landing page, course search, and authentication pages.
    8. Explain the difference between the course object and the user course progress. The course object stores core course information such as the title, description, and teacher ID. The user course progress tracks how much progress a single user has made in a specific course, including how much they’ve completed. This is a separate object to avoid a massive object in the case of multiple users.
    9. What is the purpose of Shadcn UI libraries in this application? Shadcn UI libraries provide pre-built, accessible, and customizable React components. In this project, they are used to quickly build UI elements such as buttons, forms, and dropdowns with consistent styling.
    10. What is a payment intent in the context of Stripe, and how does it relate to the backend? A payment intent is a Stripe object that represents a customer’s intent to pay. The backend of the application creates a payment intent, and then the frontend uses this to process payments.

    Essay Questions

    1. Discuss the architectural choices made in the development of this full-stack learning management system, considering the trade-offs between different technologies and approaches. How do these decisions contribute to the scalability and maintainability of the application?
    2. Analyze the data modeling approach used in this application. Why were separate data structures used for course information and user course progress, and how do these choices impact the performance and complexity of the system?
    3. Evaluate the use of serverless functions (AWS Lambda) in this project. What are the benefits and challenges of using this technology, and how does it align with the overall goals of the learning management application?
    4. Explain the role of third-party services, such as Clerk and Stripe, in this learning management application. How do these services simplify development, and what are the potential drawbacks of relying on external providers?
    5. Describe the process of deploying and managing this application on AWS and Vercel. What steps were taken to ensure the security, performance, and reliability of the deployed system?

    Glossary of Key Terms

    AWS (Amazon Web Services): A cloud computing platform providing various services, including storage, computing power, and databases.

    API Gateway: An AWS service that acts as a front door for applications to access backend services. It helps in securing and managing APIs.

    CORS (Cross-Origin Resource Sharing): A browser security mechanism that restricts web applications from making requests to a domain different from the one that served the web application.

    Clerk: A third-party service for managing user authentication and authorization in web applications.

    CloudFront: AWS’s content delivery network (CDN) service. It stores content and delivers it from edge locations closer to the user, improving loading times.

    Container: A lightweight, standalone executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries, and settings. Docker is an example of container technology.

    Docker: A platform for developing, shipping, and running applications in containers.

    DynamoDB: A fully managed, serverless NoSQL database offered by AWS. It is designed for scalability and high performance.

    ECR (Elastic Container Registry): A managed Docker container registry that allows developers to store and retrieve Docker container images.

    Framer Motion: A library used for adding animations to React components.

    IM (Identity and Access Management): A service provided by AWS that helps in managing access to resources. It is used to create roles and manage permissions.

    Lambda: A serverless compute service by AWS that allows running code without provisioning or managing servers.

    Middleware: Software that provides services and capabilities that can be applied across different parts of an application.

    Molter: Middleware for handling multipart/form-data, which is primarily used for uploading files.

    Next.js: A React framework for building full-stack web applications. It provides features such as server-side rendering and routing.

    Node.js: A JavaScript runtime that allows JavaScript code to run on the server.

    NoSQL: A type of database that is not based on the traditional relational model (SQL). It is suitable for handling unstructured or semi-structured data.

    npm: The package manager for Node.js. It is used for installing and managing packages needed in a project.

    npx: A tool that executes npm packages.

    Redux Toolkit Query: A data fetching and caching solution built on top of Redux.

    Shadcn UI: A library of pre-built and customizable UI components for React applications.

    SQL: Structured Query Language is a language for managing and querying data in relational databases.

    S3 (Simple Storage Service): A scalable object storage service by AWS.

    Serverless: A cloud computing execution model where the cloud provider manages the infrastructure, and developers only focus on writing and deploying code.

    Stripe: A third-party service that provides payment processing infrastructure for applications.

    Tailwind CSS: A utility-first CSS framework that provides low-level utility classes to style HTML elements.

    TypeScript: A strongly typed superset of JavaScript that adds static typing to the language.

    Vercel: A platform for deploying and hosting frontend web applications, with a focus on performance and ease of use.

    VPC (Virtual Private Cloud): A virtual network in AWS that allows users to launch AWS resources in a logically isolated network environment.

    Full-Stack LMS Application Development

    Okay, here is a detailed briefing document summarizing the provided text, including key themes, ideas, and quotes:

    Briefing Document: Full Stack Learning Management Application

    Overall Theme: This document details the step-by-step construction of a complete, production-ready Learning Management Application (LMS). The application utilizes a Next.js frontend, a Node.js backend, and AWS for deployment, aiming to be a comprehensive portfolio piece. It stresses beginner accessibility by explaining concepts in simple terms, and the creator encourages the audience to use parts or the whole project in their own portfolios.

    Key Ideas and Facts:

    • Application Overview:The LMS features a landing page with animations, course listings, user signup/login (Clerk authentication), user profiles, billing, and course creation capabilities.
    • The application is intended to be production-ready with its own set of use cases.
    • “This application is probably one of the most extensive applications I’ve ever built on YouTube and I might even use this for my own purposes of creating a course.”
    • Frontend Technologies (Next.js):Utilizes Next.js for the frontend framework, building components with React.
    • Leverages Tailwind CSS for styling, with many classes pre-defined for rapid development, instead of spending time styling.
    • Imports Google Fonts (DM Sans) for styling.
    • Uses Shadcn for pre-built UI components and theming, enhancing the overall development process.
    • Implements framer-motion for animations, primarily for transitions and loading states.
    • Redux Toolkit Query is used for efficient data fetching and state management.
    • “We’re just going to be using those classes for our Styles they are already using Tailwind classes we’re going to be using those and we’re just going to apply those classes directly onto Those comp components”.
    • Backend Technologies (Node.js):Employs Node.js as the server-side JavaScript runtime.
    • Uses Express.js for creating the API endpoints.
    • DynamoDB (NoSQL) is selected as the database with data being persisted locally during development.
    • Dynamus provides schema validation and database interaction for DynamoDB
    • “Dynamo DB excels more so than mongod DB if you have less tables ideally you have less tables”
    • The app utilizes AWS SDK for direct database access.
    • Includes an environment variable configuration system with .env files.
    • Utilizes Multer to handle file uploads on the backend.
    • Database Design (DynamoDB):Data is modeled using three core schemas: course, transaction, and user course progress.
    • A key point is the separation of user course progress from the main course object to manage large amounts of data efficiently and prevent single object bloat.
    • “we do not store the progress of the user because you know how the user watches a video they are progressing through and we need to save information on how far they have gotten in that course whether they completed a certain section or a chapter that is where the user course progress is aligned.”
    • The project uses DynamoDB local for development, with persistence using dbPath config.
    • DynamoDB was chosen as it is well suited to the project’s data needs, as it has relatively few tables and is highly scalable.
    • “Dynamo DB is much more fast and performant and skills but it is even worse than mongod DB and document DB of complex filtering and sorting.”
    • Authentication (Clerk):Clerk is used for handling user authentication.
    • Middleware routes are created to protect specific pages (user/teacher dashboards) based on user roles.
    • Uses Clerk Provider to wrap the application for state and data management, and middleware to determine which routes require authentication.
    • User roles are stored in Clerk metadata as either “student” or “teacher”.
    • The project creates a separate “auth” folder for auth related pages.
    • Payment System (Stripe):Integrates with Stripe for handling payments.
    • The backend creates Stripe payment intents that connect directly to the front end.
    • The project integrates a Stripe Provider to wrap around payment content pages.
    • The project uses react-stripe-js to handle stripe functionality on the frontend.
    • UI Components & Styling:Emphasizes the usage of existing styles (Tailwind) and pre-built components (Shadcn) to avoid spending too much time doing styling.
    • Utilizes the Sunner library for creating toast notifications for user feedback.
    • Custom UI components are built to reuse common functionalities.
    • Loading screens and animations enhance the UI and user experience.
    1. Course Creation and Management:
    • Allows users with teacher roles to create courses by populating a course form.
    • Chapters and Sections can be added to courses via modals.
    • The application supports editing and deleting of courses, sections and chapters, and the ability for teachers to edit and upload videos, though this is implemented later in the series with S3 bucket.
    • State Management (Redux Toolkit):Uses Redux Toolkit and RTK query for handling client state and making API requests.
    • Custom base query is configured to show toast notifications from the API response.
    • Redux is used to manage the application’s state, like whether modals are open.
    • The project uses Redux toolkit query to handle API requests.
    • AWS Deployment:Application is deployed to AWS using Lambda, API Gateway, and S3.
    • Docker is used to containerize the backend application and deploy it to ECR.
    • IAM roles are configured to grant necessary permissions for Lambda to access other AWS services.
    • CloudFront is used for CDN to make loading video fast for users.
    • Vercel is used to host the front end application because the creator faced issues using AWS Amplify.
    • A basic budget system is recommended using AWS billing so that developers are not charged extra.
    • “. The Lambda is going to take some time to load it’s not that much but there is a little bit of delay if someone H if you don’t have assistant users constantly using your application”
    • Code Organization and Setup:The project is broken into several major directories, including client, server, and source.
    • The server has different folders for utils, seed, models, routes and controllers.
    • The client has different folders for components, app, lib, state and types.
    • The project uses typescript for both the client and the server and has necessary types installed for various libraries.
    • The project uses a custom base query to have consistent error handling across different API requests.

    Important Quotes (reiterated for emphasis):

    • “This application is probably one of the most extensive applications I’ve ever built on YouTube and I might even use this for my own purposes of creating a course.” (Emphasis on scope and usability)
    • “We’re just going to be using those classes for our Styles they are already using Tailwind classes we’re going to be using those and we’re just going to apply those classes directly onto Those comp components.” (Emphasis on rapid development with pre-defined styling.)
    • “Dynamo DB excels more so than mongod DB if you have less tables ideally you have less tables” (Reasoning behind database choice.)
    • “we do not store the progress of the user because you know how the user watches a video they are progressing through and we need to save information on how far they have gotten in that course whether they completed a certain section or a chapter that is where the user course progress is aligned.” (Emphasis on data modeling best practice)
    • “Dynamo DB is much more fast and performant and skills but it is even worse than mongod DB and document DB of complex filtering and sorting.” (Discussion about pros and cons of the chosen database)
    • “The Lambda is going to take some time to load it’s not that much but there is a little bit of delay if someone H if you don’t have assistant users constantly using your application” (Emphasis on cold start)

    Conclusion: This source provides a thorough walkthrough of building a modern web application from start to finish. It covers a broad range of technologies and best practices, making it a valuable resource for developers interested in full-stack development, cloud deployment, and understanding the interplay between various web components and services. The emphasis on production readiness and beginner accessibility makes it suitable for developers of all skill levels.

    Full-Stack LMS Application Development

    Frequently Asked Questions: Full-Stack Learning Management Application

    • What is the purpose of this application being developed? This project aims to create a comprehensive, production-ready Learning Management System (LMS) with a Next.js frontend, Node.js backend, and deployment on AWS. It’s designed to be a full-stack application that could be used for course creation and delivery. The application provides features for user authentication, course browsing, user settings management, and billing. The creator of this project also mentions that it can be used as a reference or portfolio project for other developers.
    • What technologies and tools are used in this project? The project utilizes several key technologies:
    • Frontend: Next.js for the user interface and React components, along with styling using Tailwind CSS and Shadcn UI components. Additional libraries like Framer Motion are used for animations and React Player is used for video playback.
    • Backend: Node.js and Express.js for the server-side logic, with AWS SDK for interacting with AWS services like DynamoDB. Data validation is done with ‘Dynamus’ and unique IDs are created using uuid.
    • Authentication: Clerk is used to manage user authentication and authorization including sign-up, sign-in, profile management, and session handling.
    • Database: DynamoDB (local for development and cloud-based on AWS for production) is chosen as the NoSQL database.
    • Cloud: AWS is used for hosting the application, including ECR for storing Docker images, Lambda for the backend server, S3 for storage, and CloudFront for content delivery. Vercel is used for hosting the front-end application. Other tools include npx, prettier, Visual Studio Code, pesticide, redux dev tools.
    • How is the user authentication handled in this application? User authentication is managed by Clerk, a third-party service that provides a comprehensive authentication platform. Clerk handles user registration, email verification, sign-in, and profile management. It also manages sessions and provides necessary components for easy integration with the frontend. The application also stores user types (student or teacher) in Clerk metadata. The application also uses a middleware that protects certain routes that can only be accessed through authentication using Clerk.
    • Why was DynamoDB chosen for the database? What are its advantages and disadvantages in this context? DynamoDB, an AWS NoSQL database, was chosen for its scalability, performance, and cost-effectiveness. Its advantages include:
    • Scalability and performance: DynamoDB is well-suited for handling large amounts of data and high-traffic applications with fast reads and writes.
    • Cost-effectiveness: It provides a generous free tier for developers and is generally cost-effective when scaled.
    • No complex relationships: This project’s schema is simple with only 3 tables, making DynamoDB a viable option. However, DynamoDB has disadvantages:
    • Not ideal for relationships: It is not ideal for complex relational data structures, hence not best practice to store nested data.
    • Filtering and sorting: It is not as strong at complex filtering and sorting of data compared to other NoSQL databases like MongoDB.
    • Data Nesting: DynamoDB isn’t well suited for nested data and can lead to dense data structures if not handled properly.
    • How is the data structured in this application (data modeling)? The data is structured with three main entities:
    • Course: Stores all details of a course, including teacher ID, title, description, price, and category.
    • Transaction: Contains details for each transaction or payment made including information about payment providers.
    • User Course Progress: Stores a user’s progress in a specific course, including completed sections and overall progress. This is separated from the main course object to avoid a large and dense data structure. This design decision prevents excessive data in the main course object when there are multiple users associated with the same course.
    • How is the backend API built and how can you test it? The backend API is built using Node.js, Express.js, and AWS SDK. It is structured with controllers containing the logic, models for the schema of our data, and routes to connect the endpoints. The setup is done by importing necessary modules and then the app is set up to use middleware such as express.json(), helmet(), and morgan() to handle and log request and security. The routes are then set up to handle different endpoints.
    • Testing the backend API can be done through tools like curl (directly in the terminal) or through a UI tool like Postman for making API calls and inspecting responses. Locally, the server is run through npm run dev, while building for production runs with npm run build.
    • How are payments integrated into the application? Payments are integrated using Stripe. The application utilizes the Stripe JavaScript library (stripe.js) along with @stripe/react-stripe-js. This setup is used to create payment intents on the backend, and to process payments through the client side. React context is used to manage payment information. The checkout flow involves steps to get course information, handle payment details and the creation of a client secret key, and finally the rendering of payment information before completion. This is all done with a Stripe provider.
    • How is the application deployed and how is a serverless function used? The application is deployed using several AWS services and Vercel. Here’s how it works:
    • Frontend Deployment: The frontend is deployed using Vercel, a platform that simplifies the deployment of front-end applications.
    • Backend Deployment: The backend is packaged into a Docker container and deployed on AWS Lambda. The Docker image is stored in AWS ECR (Elastic Container Registry) and is used by the Lambda function. Lambda provides a serverless compute service that runs the application code.
    • API Gateway: An API Gateway is used as a front-end for the Lambda function, providing a secure endpoint for the frontend to interact with the backend logic and routes.
    • Serverless Logic: The server uses the serverless-http library for compatibility with the serverless environment. The Lambda function has permissions granted using IAM roles that are assigned for different AWS services, allowing access to DynamoDB and S3.
    • S3 and CloudFront: AWS S3 is used to store static assets or files. AWS CloudFront is set up as a CDN (Content Delivery Network) to distribute the content to users for faster loading times.
    • The serverless function is used by exporting the Lambda handler. The Lambda handler handles seed functions in the database and defaults to the serverless app function otherwise.

    Full-Stack Learning Management Application Architecture

    The sources describe a full-stack learning management application built with a Next.js frontend, Node.js backend, and deployed on AWS. Here’s a breakdown of the key components and technologies used:

    Application Overview

    • The application includes a landing page with animations, a course catalog, user authentication, user profiles, billing information, and course progress tracking.
    • It is designed to be a production-ready application with a focus on scalability and customizability.
    • The application is also responsive, adapting to different screen sizes.

    Frontend Technologies

    • Next.js: Used as the primary framework for building the user interface.
    • Redux Toolkit: Manages the application state.
    • Redux Toolkit Query: Handles API interactions with the backend.
    • Tailwind CSS: Provides styling along with the Shadcn component library.
    • TypeScript: Used for type checking.
    • Framer Motion: Implements animations.
    • React Hook Form: Handles form management and Zod for form validation.

    Backend Technologies

    • Node.js and Express: Used to create the backend API, separate from the Next.js frontend, to enhance scalability.
    • Docker: The backend is containerized using Docker for consistent environment packaging.
    • AWS Lambda: Hosts the backend, using the Docker image from ECR.
    • API Gateway: Securely routes requests to Lambda functions.
    • DynamoDB: Serves as the NoSQL database.
    • S3: Handles storage of video content.
    • CloudFront: Used as a content delivery network for videos to ensure low latency and high availability.

    Authentication

    • Clerk: A third-party service is used for user authentication, offering pre-built components for sign-in, sign-up, and user management. It is used instead of AWS Cognito due to its easier setup.

    Deployment

    • AWS: The application utilizes a serverless containerized architecture on AWS.
    • Vercel: Hosts the Next.js frontend, integrating with other AWS services.

    Key Features

    • Course Management: Users can browse courses, view course details, and track their progress. Teachers can create and edit courses.
    • User Authentication and Management: The application uses Clerk for user authentication, profiles, and roles.
    • Billing: The application uses Stripe for payment processing.
    • Responsive Design: The application is designed to adapt to different screen sizes.

    Development Process

    • The development process includes setting up Node.js, NPX, and Visual Studio Code.
    • The project utilizes various libraries and extensions for React development and code formatting.
    • The application also uses a custom base query to format API responses, handling data and error messages.
    • The application is deployed on AWS using services such as Lambda, API Gateway, DynamoDB, S3, and CloudFront.
    • The deployment also includes setting up IM roles to manage permissions for Lambda to access other AWS services.

    Data Modeling

    • The application uses a NoSQL database, DynamoDB, due to the nature of the data and relationships.
    • The data model includes courses, sections, chapters, user progress, and transactions.
    • User progress is stored separately from course data to prevent overly large data objects.

    Additional Points

    • The application emphasizes learning backend and deployment skills, not just frontend.
    • The use of a custom base query in Redux Toolkit Query provides a way to format API responses and display toast notifications for successful mutations.
    • The application also utilizes custom form fields for managing user settings.
    • The application uses Shaden UI components for styling.

    This detailed overview should give you a solid understanding of this full-stack learning management application.

    Full-Stack Learning Management Application

    The sources detail a full-stack learning management application with a variety of features and technologies. Here’s a breakdown of the key aspects:

    Core Functionality

    • Course Catalog: The application allows users to browse courses, view course details, and enroll in courses.
    • User Authentication: Clerk is used for user authentication, offering features such as sign-in, sign-up, profile management, and user roles. User roles determine access to different parts of the application.
    • Course Creation: Teachers can create and edit courses, including course titles, descriptions, categories, and prices. Courses can be organized into sections and chapters, with video content for each chapter.
    • Billing: Stripe is used for handling payments and transactions.
    • Course Progress: The application tracks user progress through courses, including marking chapters and sections as complete.

    Key Features

    • User Roles: There are distinct roles for users and teachers, each with specific access and functionalities. Teachers can create and manage courses, while users can enroll and track their progress.
    • Responsive Design: The application is designed to be responsive, adapting to different screen sizes.
    • Scalability: The application is built with a focus on scalability, using a separate backend to avoid tight coupling.
    • Data Modeling: The application uses a NoSQL database, DynamoDB, due to the nature of the data and relationships. The data model includes courses, sections, chapters, user progress, and transactions.

    Technology Stack

    • Frontend:Next.js: The primary framework for building the user interface.
    • Redux Toolkit: Used for state management and API interactions.
    • Tailwind CSS and Shadcn: Used for styling and component library.
    • TypeScript: Used for type checking.
    • Framer Motion: Implements animations.
    • React Hook Form and Zod: Handles form management and validation.
    • Backend:Node.js and Express: Used to create the backend API.
    • Docker: Used to containerize the backend.
    • AWS Lambda: Hosts the backend using the Docker container.
    • API Gateway: Securely routes requests to Lambda functions.
    • DynamoDB: Serves as the NoSQL database.
    • S3: Handles the storage of video content.
    • CloudFront: A content delivery network (CDN) used to deliver videos with low latency.
    • Authentication:Clerk: A third-party service for user authentication.
    • Deployment:AWS: The application uses a serverless containerized architecture on AWS.
    • Vercel: Hosts the Next.js frontend.

    Development Highlights

    • Custom Base Query: The application uses a custom base query in Redux Toolkit Query to format API responses, handle data, and display toast notifications for successful mutations.
    • Form Management: Custom form fields are used for managing user settings, and react hook forms for form management and validation.
    • Backend Security: The backend API endpoints are secured using Clerk middleware, which requires authentication for certain routes.
    • Video Upload: Videos are uploaded to S3 using pre-signed URLs.
    • IM Roles: IM roles are created for Lambda to access AWS services such as DynamoDB, S3, and API Gateway.

    Additional Information

    • The application prioritizes backend and deployment skills alongside frontend development.
    • The choice of DynamoDB is due to the data structure, scalability, and performance requirements.
    • User progress is stored separately from course data to prevent overly large data objects and improve performance.

    In summary, this learning management system is a complex full-stack application with a variety of features, utilizing a modern tech stack and cloud infrastructure. It demonstrates a strong emphasis on scalability, customization, and user experience.

    Serverless Learning Management System on AWS

    The sources describe the deployment of a full-stack learning management application on AWS using a serverless, containerized architecture. The application leverages multiple AWS services to achieve scalability, performance, and cost-effectiveness. Here’s a detailed breakdown of the AWS deployment process:

    Core AWS Services

    • ECR (Elastic Container Registry): Docker images of the backend are stored in ECR.
    • Lambda: The backend is hosted using AWS Lambda, running the Docker image stored in ECR. Lambda is configured with a five-minute timeout and environment variables for production use.
    • API Gateway: Serves as a secure entry point for the application, routing requests to the Lambda function. It provides HTTPS endpoints without managing TLS certificates. A proxy resource is used in API Gateway to handle all requests, which are then routed to the Express server in the Lambda function.
    • DynamoDB: A NoSQL database used to store application data. The data model includes courses, sections, chapters, user progress, and transactions.
    • S3 (Simple Storage Service): Handles storage for video content.
    • CloudFront: A content delivery network (CDN) that delivers video content from S3 with low latency and high availability.

    Deployment Steps

    • Dockerization: The Node.js and Express backend is packaged into a Docker container. The Dockerfile includes instructions for building, installing dependencies, and setting up the production environment.
    • ECR Setup: A repository is created in ECR to store the Docker image. The Docker image is then pushed to the ECR repository using the AWS CLI.
    • Lambda Configuration: A Lambda function is created using the Docker image from ECR. The Lambda function is given an IAM role with the necessary permissions to access other AWS services.
    • IAM Roles: IAM (Identity and Access Management) roles are created to manage permissions for AWS services. The Lambda function is granted access to DynamoDB, S3, and API Gateway through a custom role. The IAM role includes a trust policy that allows both Lambda and API Gateway to assume the role.
    • API Gateway Setup: API Gateway is configured to route requests to the Lambda function. A proxy resource is used to forward all requests to the Lambda backend, allowing the Express server to handle routing.
    • S3 Configuration: S3 is set up with blocked public access, using a bucket policy to allow CloudFront read access. CORS (Cross-Origin Resource Sharing) settings are configured to allow different services to access S3.
    • CloudFront Configuration: CloudFront is set up to deliver video content from S3. It uses an origin access control setting, which requires a policy to be set on the S3 bucket. CloudFront is configured to redirect HTTP to HTTPS and allow various HTTP methods.
    • Environment Variables: Lambda environment variables are configured for production, including AWS region, S3 bucket name, CloudFront domain, Stripe keys, and Clerk keys.
    • Seeding the Database: A seed function is included in the Lambda code, triggered by an action parameter, allowing the database to be seeded directly from Lambda.

    Key Deployment Concepts

    • Serverless Architecture: The application uses serverless services like Lambda and DynamoDB, which reduces operational overhead and allows for automatic scaling.
    • Containerization: The backend is containerized using Docker, ensuring a consistent and portable environment for the application.
    • Pre-signed URLs: S3 pre-signed URLs are used to allow the client to upload videos directly to S3, bypassing the 10MB limit on API Gateway.
    • Cold Starts: Lambda functions may experience cold starts, where the first request after a period of inactivity can take longer to process.

    Additional Points

    • The deployment process prioritizes cost-effectiveness by utilizing free tier services on AWS, and budgets are created to monitor usage and prevent unexpected charges.
    • The application is deployed using a combination of the AWS Management Console, AWS CLI, and third-party services, like Vercel for the frontend.
    • The deployment emphasizes understanding the security and access requirements for each service, especially when dealing with data and video content.
    • The application’s architecture on AWS uses managed services to minimize the need for complex networking configurations.

    In summary, the application’s AWS deployment is a comprehensive process involving multiple services working together to create a scalable, secure, and performant learning management system. The deployment utilizes best practices for security, cost management, and efficiency, while leveraging serverless technology and containerization.

    Next.js Learning Management System Frontend

    The sources provide a detailed look at the Next.js frontend of a learning management application, highlighting its features, technologies, and development practices. Here’s a comprehensive overview:

    Core Functionality

    • User Interface: Next.js is the primary framework for building the application’s user interface. It handles routing, page rendering, and overall structure.
    • Dynamic Pages: Next.js is used to create dynamic pages for course listings, search, user profiles, and course editing.
    • Component-Based Architecture: The frontend uses a component-based architecture, making it easier to manage, reuse, and update the user interface.
    • Server-Side Rendering (SSR): Although the application uses client-side data fetching with Redux Toolkit Query, Next.js provides SSR capabilities, which can improve performance and SEO in some cases. This is a key feature of the framework.

    Key Technologies & Libraries

    • Redux Toolkit: Used for managing application state and handling API interactions. It includes features like Redux Toolkit Query for fetching data.
    • Tailwind CSS and Shadcn: Used for styling and UI components. Tailwind provides utility classes for styling, and Shadcn provides a library of pre-built, customizable components. The application uses a customized Tailwind configuration with its own color palette.
    • TypeScript: Used for static typing, making the code more robust and easier to maintain.
    • Framer Motion: Used for adding animations and transitions to the user interface.
    • React Hook Form and Zod: Used for handling form management and validation.
    • Clerk: Handles user authentication, including sign-in, sign-up, and user profile management. It integrates well with Next.js.
    • Stripe: Used for payment processing.

    Development Practices

    • Custom Hooks: The application uses custom React hooks to encapsulate and reuse logic, for example, useCarousel for image carousels and useCheckoutNavigation for managing navigation steps within the checkout flow.
    • Component Libraries: The use of Shadcn component library allows for consistent UI elements across the application, and components can be installed individually as needed.
    • Code Organization: The project is structured with clear separation of concerns, including components, utilities, styles, and state management. The src directory contains components, lib, state, types, and app directories. The app directory is for Next.js pages and routes.
    • Styling: The application emphasizes functionality and logic over extensive custom styling, using pre-defined Tailwind classes to quickly style components.
    • API Integration: Redux Toolkit Query is used to make API calls to the backend. The application uses a custom base query to handle responses and add authentication tokens to each request.
    • Environment Variables: Environment variables are used to manage configuration settings, API keys, and URLs.
    • Client-Side Data Fetching: The application fetches data on the client-side using Redux Toolkit Query. Although Next.js provides server-side rendering capabilities, this application primarily uses client-side data fetching.
    • State Management: Redux Toolkit is used for state management, providing a central store for application data.
    • Form Management: React Hook Form is used with Zod for form validation and management. The application also makes use of a custom form field for creating forms faster.

    Key Features in the Frontend

    • Landing Page: Includes a loading screen, animated elements, and a course search feature. It features a carousel of course images.
    • Search Page: Displays a list of available courses with filtering options, along with a detailed view of selected courses.
    • User Profile and Settings: Includes settings for notifications, email alerts, SMS alerts, and notification frequency, which are stored in Clerk’s user data.
    • Checkout Process: The checkout process is a multi-step wizard, including details, payment, and completion pages.
    • Course Editor: Provides a WYSIWYG editor for creating and modifying course content, structured into sections and chapters. It supports uploading video content.
    • Billing Page: Allows users to view their transaction history.
    • Navigation: The application has a navigation bar and a sidebar, which adapts to different screen sizes and contexts. The sidebar provides links to various parts of the application.
    • Loading Indicators: A shared loading component is used in various parts of the application.

    Additional Notes

    • The application uses a ‘non-dashboard layout’ for pages that don’t require user authentication and a ‘dashboard layout’ for pages that are behind the authentication wall.
    • The application emphasizes a balance between UI/UX and functionality, with styling applied efficiently using Tailwind CSS and pre-built components.

    In summary, the Next.js frontend of this learning management application is a well-structured and feature-rich component, utilizing a modern tech stack and best practices for frontend development. It’s built for scalability, maintainability, and a smooth user experience.

    Node.js Learning Management System Backend

    The sources describe the backend of a learning management application built with Node.js and the Express framework, emphasizing its scalability, customizability, and independence from the frontend. Here’s a detailed breakdown of the backend:

    Core Technologies & Architecture

    • Node.js and Express: The backend is built using Node.js as the runtime environment and Express as the web framework. This combination allows for handling server-side logic and routing API requests.
    • Separate Backend: The backend is designed to be a separate application, not part of the Next.js frontend. This separation allows the backend to scale independently and prevents tight coupling between the frontend and backend, which enhances maintainability.
    • Docker: The backend is containerized using Docker, ensuring a consistent and portable environment across different stages of development and deployment.
    • Serverless Architecture: The backend is designed to run in a serverless environment using AWS Lambda, allowing for automatic scaling and reduced operational overhead.

    Key Features and Functionality

    • API Endpoints: The backend provides a variety of API endpoints for managing courses, users, transactions, and video uploads.
    • Data Modeling: The backend uses a data modeling approach where the data is structured into courses, sections, chapters, comments, transactions, and user course progress.
    • Database Interaction: The backend uses DynamoDB as its NoSQL database for storing data. It’s chosen for its scalability and speed, as well as its low cost. The backend interacts with DynamoDB using the dynamus library which is similar to mongoose for MongoDB.
    • Authentication: The backend is integrated with Clerk for user authentication and authorization. Clerk is used to handle user sign-in, sign-up, and user roles.
    • File Uploads: The backend handles video uploads to S3 using pre-signed URLs for better scalability.
    • Payment Processing: The backend integrates with Stripe for payment processing and transaction management.
    • Middleware: The backend uses various middleware to add functionality like parsing request bodies, setting security headers, logging API calls, and managing CORS.
    • Route Management: Express Router is used to handle routes for different resources such as users, courses and transactions.
    • CORS: The backend is configured to handle cross origin requests with the CORS middleware so the frontend can communicate with the backend.
    • Environment Variables: The backend uses environment variables for configuration, like port numbers, database connection details, and authentication secrets.
    • Data Validation: The backend uses dynamus to validate data types, similar to mongoose.

    Backend Development Practices

    • Controllers: The backend uses controllers to manage the core logic, where each controller is focused on a specific resource like courses or user accounts.
    • Routes: Routes are organized to handle API endpoints for different resources.
    • Data Models: Data models are created to define the structure and validation of the data stored in DynamoDB. The data models are stored in a separate folder.
    • Middleware: Middleware functions are used to add extra functionality to the request handling, such as authentication, logging, and parsing.
    • Asynchronous Operations: Asynchronous operations are used for database interactions and other I/O bound operations.
    • Security: The backend uses helmet middleware for securing the application with proper HTTP headers and uses requireAuth middleware to protect API endpoints.
    • Error Handling: The backend uses try-catch blocks for error handling to send appropriate responses to the frontend.
    • Code Organization: The backend uses a structured folder approach to separate controllers, models, and routes.
    • Database Seeding: The backend has a seed script that inserts mock data into the DynamoDB database, which is useful for development.

    Key Components

    • Course Controller: Manages the API endpoints for courses, including listing, getting, creating, updating, and deleting courses.
    • User Clerk Controller: Manages the API endpoints for user settings, including updating user profile information in Clerk, using Clerk SDK.
    • Transaction Controller: Manages transactions for payment processing.
    • API Routes: The API endpoints are grouped into routes, making it easier to manage different resources.
    • Seed Script: Used for seeding the database with initial data.

    Deployment Preparation

    • Serverless HTTP: The backend is prepared for serverless deployment with serverless-http, which allows it to run as an AWS Lambda function.
    • Dockerization: The backend is packaged into a Docker image, which is stored in a container registry.
    • Lambda Handler: The application uses a custom handler that is compatible with AWS Lambda.
    • Environment Variables: Environment variables are set up in the Lambda environment for authentication and configuration.

    Important Points

    • The backend design emphasizes the importance of backend skills and knowledge for software engineers and discourages a sole focus on frontend development, emphasizing backend and DevOps skills as essential.
    • The backend is designed to be scalable and maintainable by separating concerns and using modern software engineering practices.
    • The backend utilizes a serverless, containerized architecture, taking advantage of AWS services to minimize infrastructure concerns and reduce operational overhead.
    • The backend is built to interact with a variety of services, including Clerk, Stripe, AWS Lambda, API Gateway, DynamoDB, and S3.

    In summary, the Node.js and Express backend of the learning management application is a robust and well-structured system that leverages modern software engineering practices and cloud-based services to provide a scalable, secure, and performant API for the frontend. It emphasizes customizability and the separation of backend logic from the frontend.

    Build a Nextjs Learning Management App | AWS, Docker, Lambda, Clerk, DynamoDB, ECR, S3, Shadcn, Node

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Why Kindness Makes People Disrespect You Modern Stoicism: Stoic Secrets: Kindness, Boundaries, and Respect

    Why Kindness Makes People Disrespect You Modern Stoicism: Stoic Secrets: Kindness, Boundaries, and Respect

    The sources examine the potential downsides of unchecked kindness, highlighting how it can lead to disrespect, exploitation, and burnout. They discuss how an excess of kindness without proper boundaries or wisdom can invite others to take advantage and disregard personal priorities. Drawing upon Stoic philosophy, the sources encourage practicing self-respect, setting clear boundaries, and discerning who genuinely appreciates kindness from those who seek to exploit it. They advocate for emotional regulation, purposeful action, and distancing oneself from those who deplete energy. Ultimately, the sources emphasize that true kindness stems from a place of strength and inner balance, benefiting both the giver and receiver.

    The Stoic Path to Kind and Respected

    Study Guide Contents:

    I. Quiz: Knowledge Review (Short Answer)

    II. Essay Questions: Critical Thinking & Application

    III. Glossary: Key Terms and Definitions

    I. Quiz: Knowledge Review (Short Answer)

    Answer each question in 2-3 sentences based on the provided source material.

    1. Why does excessive kindness, when given without boundaries, sometimes lead to disrespect according to the source?
    2. How do people generally value things that are difficult to obtain versus those that are easily accessible?
    3. What is the relationship between strength and kindness, according to the source? Are they mutually exclusive?
    4. According to the source, what message are you sending when you consistently allow people to push your limits?
    5. How does unchecked kindness contribute to an imbalance in relationships, according to the source?
    6. What does it mean to “reward appreciation, not entitlement,” and why is this important?
    7. Why might people see someone who is excessively kind as emotionally dependent?
    8. Explain the stoic view on the relationship between kindness and approval, describing what motivates “true kindness”.
    9. Why is protecting your energy considered as important as protecting your time, according to the source?
    10. According to the source, how does walking away from toxic situations command respect?

    Quiz Answer Key:

    1. Excessive kindness, when given without boundaries, can lead to disrespect because people tend to devalue what is easily accessible and unearned. This can transform kindness from a virtue into an expectation, leading others to feel entitled and not appreciate or reciprocate.
    2. People tend to value what they have to earn and respect those whose kindness must be earned. Anything easily obtained is often overlooked, while that which requires effort is cherished.
    3. The source suggests that strength and kindness are not opposites but go hand in hand. True kindness is not about being a doormat, but about balancing giving with self-protection, and understanding that saying no when necessary is a sign of self-worth.
    4. When you consistently allow people to push your limits, you are teaching them how to treat you. If you don’t set limits, you are silently approving of mistreatment and indicating that you don’t value yourself enough to stand firm.
    5. Unchecked kindness creates an imbalance in relationships because one person is always giving while the other is taking, leading to dependency and entitlement rather than mutual respect. This occurs when generosity is excessive or poorly placed.
    6. Rewarding appreciation, not entitlement, means acknowledging and valuing gratitude while refusing to enable demanding or expectant behavior. This is important because it reinforces a mindset of respect and gratitude rather than one of obligation.
    7. People might see someone who is excessively kind as emotionally dependent because their kindness may stem from a fear of rejection or a need for approval, indicating that their self-worth depends on the approval of others.
    8. The stoic view suggests that true kindness comes from strength, not a need for approval. It is motivated by a genuine desire to do good because it aligns with one’s values, rather than a strategic attempt to gain favor or validation.
    9. Protecting your energy is as important as protecting your time because your energy is a limited resource that needs to be carefully managed. Giving it away too freely leaves little left for what truly matters and can lead to burnout and resentment.
    10. Walking away from toxic situations commands respect because it demonstrates an unwavering commitment to self-respect and sets a standard for how you expect to be treated. It shows that you value your well-being and will not tolerate mistreatment.

    II. Essay Questions: Critical Thinking & Application

    Choose one of the questions below and develop an essay response based on the ideas presented in the source material.

    1. Discuss the potential dangers of unlimited self-sacrifice and how modern stoicism offers a balanced approach to generosity and self-preservation. Provide real-world examples to support your arguments.
    2. Analyze the relationship between kindness, boundaries, and respect. How can one practice kindness without becoming a “doormat”? Explore the stoic principles that support this balance.
    3. Examine the concept of “emotional dependence” as it relates to acts of kindness. How can one ensure that their generosity stems from a place of inner strength rather than a need for approval?
    4. Explain the stoic perspective on the role of expectations in relationships. How can letting go of unrealistic expectations lead to more authentic and fulfilling connections?
    5. Discuss how setting and enforcing personal boundaries protects your time and energy and communicates your worth to others.

    III. Glossary: Key Terms and Definitions

    TermDefinitionStoicismAn ancient Greek philosophy emphasizing virtue, reason, and living in accordance with nature. Focuses on what can be controlled (inner thoughts and actions) vs. what cannot (external events).Modern StoicismContemporary application of stoic principles to everyday challenges, focusing on self-improvement, resilience, and living a meaningful life.KindnessThe quality of being friendly, generous, and considerate; showing concern and compassion for others.BoundariesPersonal limits that define what behaviors a person will accept from others. Essential for maintaining healthy relationships and protecting one’s well-being.RespectA feeling of deep admiration for someone or something elicited by their abilities, qualities, or achievements.Self-RespectHaving pride and confidence in oneself; valuing one’s own well-being and dignity.EntitlementThe belief that one is inherently deserving of privileges or special treatment.Emotional DependenceA state of relying excessively on others for emotional support, validation, or a sense of self-worth.Self-SacrificeGiving up one’s own needs or interests for the sake of others; can be positive when balanced, but detrimental when excessive.VirtueMoral excellence; behavior showing high moral standards. In Stoicism, primary virtues include wisdom, justice, courage, and temperance.DiscernmentThe ability to judge well; having keen insight and good judgment, especially regarding moral or ethical matters.Emotional DetachmentThe ability to separate one’s emotions from a situation, allowing for a more objective and rational response.

    Okay, here’s a briefing document summarizing the key themes and ideas from the provided source, with relevant quotes:

    Briefing Document: Navigating Kindness with Stoic Wisdom

    Main Theme: The sources explore the nuanced relationship between kindness and respect, arguing that unchecked kindness can lead to disrespect, exploitation, and personal burnout. It advocates for a balanced approach, integrating stoic principles of self-respect, boundary setting, and emotional awareness to ensure kindness remains a virtue rather than a liability.

    Key Ideas and Facts:

    • Kindness Without Boundaries Breeds Disrespect: The fundamental premise is that excessive, freely given kindness can be devalued. People tend to value what they have to earn. “People value what they have to earn. Kindness is often seen as a virtue, yet paradoxically in the modern world it can lead to disrespect when given too freely and without boundaries.” The more available and accommodating you are, the less others may appreciate your efforts.
    • The Paradox of Kindness: Kindness can paradoxically lead to disrespect in the modern world when given too freely and without boundaries. “This is one of the great paradoxes of human nature: people tend to devalue what is easily accessible.” When kindness becomes expected, it’s no longer seen as a gift.
    • Self-Respect is Paramount: The foundation for healthy kindness is self-respect. “Respect starts with self-respect. If you respect yourself enough to set limits, others will follow suit.” Stoicism emphasizes controlling what’s within your power, and that begins with valuing your own time and energy. Epic tetus asked, “How long will you wait before you demand the best for yourself?”
    • Saying “No” is Essential: The ability to say “no” is a critical tool for setting boundaries and protecting personal well-being. “Practice saying no. When you are always agreeable, people take you for granted, but when you establish clear limits…your kindness retains its value.” Saying no is not unkind; it’s a sign of self-worth. “A truly kind person is not someone who always says yes, but someone who knows how to balance giving with self- protection…”
    • People Test Limits: Human nature tends to test boundaries. If you consistently allow things to slide, you’re teaching people how to treat you. Epictus wisely said “you are not to blame for being uneducated, but you are to blame for refusing to learn and one of the most crucial lessons in life is this people will only respect the boundaries that you enforce. “
    • Imbalance in Relationships: Unchecked kindness creates an imbalance where one person carries the burden. “When you are always the one offering help, making sacrifices, or accommodating others, you unconsciously set a precedent…where you are expected to give and others feel entitled to receive.” This can lead to resentment and feeling unappreciated. Seneca reminds us that “he who gives when he is asked has waited too long”
    • Vulnerability to Manipulation: Excessive kindness can make you a target for manipulators who seek to exploit those who are easily swayed. “You might believe that being kind will earn you respect, but to the wrong people, it signals weakness.” True kindness, when paired with wisdom, is a strength. “Marcus Aurelius one of the greatest stoic philosophers wrote the best revenge is to be unlike him who performed the injury”
    • Emotional Dependence: Kindness stemming from emotional dependence (fear of rejection, need for approval) is a silent invitation for disrespect. “People instinctively admire those who are emotionally independent, those who do not seek validation through their acts of kindness but rather offer it from a place of inner abundance. ” If your kindness is a bargaining tool, it backfires.
    • Intentional vs. Automatic Kindness: Kindness must be intentional, not automatic or reactive. “Commanding respect while maintaining kindness is a delicate balance, but it is not about people-pleasing or seeking approval; it is about acting with intention.” Stoicism emphasizes deliberate action based on values, not fear.
    • Reward Appreciation, Not Entitlement: It’s crucial to reward those who appreciate your kindness, rather than those who feel entitled to it. “The happiness of your life depends upon the quality of your thoughts and this applies to how you allow others to treat you if you continue to give kindness to those who feel entitled to it you reinforce the wrong mindset.”
    • Respect Over Approval: It’s more important to be respected than liked. Kindness rooted in a need for approval can backfire. “When you live with Integrity when your kindness is rooted in genuine goodwill rather than a desperate need to be liked people notice they might not always agree with you but they will respect you and more importantly you will respect yourself. “
    • Protect Your Energy: Energy is a finite resource. “Protect your energy as fiercely as your time.” Don’t allow yourself to be an emotional dumping ground. Associate with those who uplift you. If you invest your energy in things that don’t serve you, you lose a piece of yourself. “Marcus Aurelius advised the tranquility that comes when you stop caring what they say or think or do, only what you do when you stop allowing outside distractions to consume your inner peace you gain power.”
    • Know When to Walk Away: Walking away from toxic dynamics demonstrates self-respect. “The more we value things outside our control the less control we have your time energy and peace of mind are among your most valuable assets and not everyone deserves access to them. ” Seneca stated “associate with people who are likely to improve you. “
    • Don’t Set Yourself On Fire To Warm Others We must remember not to set ourselves on fire to warm others. This stoic principle speaks to the importance of maintaining boundaries and not sacrificing our own well-being in the name of helping others
    • Balance Generosity With Self-Care: Stoicism encourages us to live in accordance with reason and virtue, which includes making thoughtful decisions rather than acting impulsively or out of an emotional desire to please others. There is a fine line between offering assistance and overextending ourselves to the point of exhaustion.

    Stoic Solutions:

    • Emotional Detachment: Practicing emotional detachment can help manage reactions to others’ actions. It’s about consciously choosing how to respond, not becoming numb.
    • Forgiveness: Letting go of past hurts is essential for emotional freedom. It doesn’t mean excusing actions, but rather freeing yourself from the emotional weight. “Marcus Aurelius said ‘the best revenge is to be unlike him who performed the injury.’”
    • Reciprocity has an Expiration Date: The true value of generosity lies not in what we receive but in what we offer to others
    • Discernment: This includes not only understanding our emotions but setting boundaries and protecting our energy

    Overall Message: True kindness isn’t about unlimited self-sacrifice; it’s about acting with virtue, wisdom, and self-respect. By integrating stoic principles, individuals can ensure their kindness is a source of strength, enriching their lives and the lives of others. It’s about living a life rooted in clarity, resilience, and balance.

    I hope this is helpful!

    FAQ: Kindness, Respect, and Stoicism

    Here are some frequently asked questions that best capture the main themes and ideas from the provided sources.

    1. Why does being too kind sometimes lead to disrespect from others?

    Kindness, when given without boundaries, is often devalued. People tend to value what they have to earn or work for. When kindness becomes a constant, easily accessible presence, it transforms from a virtue into an expectation. Others may feel entitled to your generosity, no longer seeing it as a gift to appreciate or reciprocate. This can lead them to take advantage of your kindness and disregard your needs.

    2. How does unchecked kindness make me appear weak?

    In society, strength is often associated with assertiveness and the ability to set clear boundaries. Unchecked kindness can be mistaken for weakness because you may always say yes, always yield, and never push back. While kindness is not inherently a flaw, it can lead to disrespect when not balanced with self-respect. People may overlook or take advantage of someone who is endlessly accommodating.

    3. Why do people test my limits when I am consistently kind?

    Human nature tends to test limits. If you consistently let things slide and don’t enforce boundaries, people will push to see how far they can go. It’s not always malicious, but a way of understanding what is acceptable. By setting clear expectations, you show that you value yourself and your boundaries, commanding respect.

    4. How does unlimited kindness create an imbalance in relationships?

    When you are always the one offering help, making sacrifices, or accommodating others, you unconsciously set a precedent where you are expected to give and others feel entitled to receive. This creates an imbalance where one person carries the burden of maintaining the relationship, leading to feelings of being drained, used, and unappreciated. It’s crucial to establish fairness and reciprocity in relationships to avoid this imbalance.

    5. How does being kind make me a target for manipulators?

    Manipulators seek out people who are easy to sway. Being kind can signal weakness to them, making you an easy target to exploit. They may see it as an open invitation to push boundaries, take without giving, and bend you to their will. Balancing kindness with wisdom is essential to avoid being taken advantage of.

    6. How can kindness be rooted in emotional dependence, and why does this lead to disrespect?

    When kindness stems from a place of emotional dependence, such as fear of rejection or a need for approval, it becomes a silent invitation for disrespect. People instinctively admire those who are emotionally independent. If your kindness is driven by the need for validation, it ceases to be an act of virtue and instead becomes a bargaining tool, signaling that your worth depends on their approval. People are wired to value what is scarce to admire what is self-sufficient

    7. What is the difference between true kindness and people-pleasing?

    True kindness stems from strength, not from a need for approval. People-pleasing is often driven by a desire to be liked, gain validation, or secure affection. It comes across has neediness rather than generosity. When kindness is transactional it can come across has a form of emotional bribery. True kindness is an act of virtue that comes from Inner Strength, not the fear of rejection. Being a good person, does not mean being a doormat.

    8. How can I maintain kindness while commanding respect, according to stoicism?

    To command respect without losing your kindness, you must practice kindness with wisdom and boundaries. Make your kindness intentional, say no without explaining yourself, reward appreciation, and protect your energy. Stoicism emphasizes finding a balance between generosity and self-preservation. Setting limits, giving intentionally, and ensuring your kindness is valued (not exploited) is very important. Remember respect starts with self-respect.

    The Pitfalls of Excessive Kindness

    When overused, kindness can lead to several negative outcomes, including disrespect from others, the appearance of weakness, and the creation of imbalanced relationships. Here’s a breakdown of how excessive kindness can be detrimental, according to the sources:

    • Disrespect Kindness, when given too freely, can be devalued. People tend to value what they have to earn, so if kindness is a constant, unearned presence, it becomes an expectation rather than a virtue. This can lead to others feeling entitled to one’s generosity, making them less appreciative and less likely to reciprocate.
    • Appearing weak Unchecked kindness can be mistaken for weakness because society often associates strength with assertiveness and the ability to set boundaries. People who always say yes and never push back may be overlooked or taken advantage of.
    • Testing limits Human nature tends to test limits, and if someone is consistently kind without boundaries, others may push to see how far they can go. This isn’t necessarily malicious but rather a way of understanding what is acceptable.
    • Imbalance in relationships Excessive kindness can create an imbalance where one person is always giving and the other is always receiving. This can lead to the giver feeling drained, used, and unappreciated. People may begin to see the giver’s generosity as an obligation.
    • Target for manipulators Overly kind people can become targets for manipulators, who seek out those who are easy to sway and take advantage of. To those with bad intentions, kindness can signal weakness and an open invitation to push boundaries.
    • Emotional dependence Kindness that stems from a place of emotional dependence, such as a fear of rejection or a need for approval, can invite disrespect. People instinctively admire those who are emotionally independent and offer kindness from a place of inner abundance.
    • Sacrificing self-respect: True kindness comes from strength, not a need for approval. When actions are motivated by a desire to be liked or to gain validation, they lose their authenticity, and people sense when kindness is transactional.
    • Ignoring priorities: Overdoing kindness makes you the go-to person for everyone, but you begin to notice the important things are slipping. True kindness doesn’t require you to abandon your personal goals, it comes from balance where you have taken care of your own needs first.
    • Attracting opportunists: Although admirable, excessive kindness attracts opportunists who see your generosity as an endless resource to exploit.
    • Habit Forming: You create a dangerous imbalance when you overextend kindness because it leads to stress and triggers harmful coping mechanisms.

    To avoid these pitfalls, the sources suggest practicing kindness with wisdom and setting boundaries. This involves making kindness intentional rather than automatic, saying no when necessary, and ensuring that your generosity is valued and reciprocated. The key is to balance generosity with self-respect, ensuring that your kindness is a conscious choice and not a self-imposed burden.

    The Art of Setting Healthy Boundaries

    Setting boundaries is essential for maintaining healthy relationships and protecting one’s well-being. The sources emphasize that boundaries are not about withholding kindness but about ensuring that kindness is meaningful and does not lead to disrespect, exploitation, or burnout.

    Here’s a breakdown of key aspects related to setting boundaries, based on the sources:

    • Purpose of Boundaries:
    • Protecting Self-Respect: Setting limits indicates self-respect, which encourages others to follow suit.
    • Preserving Value: Establishing boundaries ensures that kindness remains a conscious act of virtue rather than an unconscious obligation.
    • Preventing Exploitation: Boundaries prevent others from taking advantage of one’s generosity.
    • Maintaining Balance: Setting limits ensures a balance between generosity and self-preservation, preventing exhaustion and bitterness.
    • How to Set Boundaries:
    • Saying No: Practice saying no without over-explaining or feeling guilty. A firm, clear “no” is enough.
    • Being Intentional: Make kindness a conscious choice rather than an automatic reaction.
    • Defining Limits: Clearly communicate your limits to others, teaching them how to respect your time and energy.
    • Enforcing Boundaries: Consistently uphold your boundaries and take action when they are crossed.
    • Protecting Energy: Guard your emotional and mental energy by limiting exposure to negativity and setting boundaries with your emotions.
    • Walking Away: Be willing to distance yourself from toxic dynamics or relationships where respect is absent.
    • Benefits of Setting Boundaries:
    • Earning Respect: Setting clear expectations and refusing to be taken advantage of often leads to greater respect from others.
    • Healthier Relationships: Boundaries foster relationships built on mutual respect rather than silent sacrifice.
    • Preventing Burnout: Establishing limits prevents overextension and burnout, ensuring that kindness is sustainable.
    • Promoting Self-Worth: Setting boundaries demonstrates self-worth, which encourages others to value your time and energy.
    • Avoiding Manipulation: Clear boundaries discourage manipulators and those who seek to exploit kindness.
    • Fostering Independence: Boundaries prevent you from over-helping, which allows other to discover their own strength.
    • Qualities of Effective Boundaries:
    • Firmness: Boundaries should be firm and unwavering.
    • Fairness: Boundaries should be fair and not cross over into being cruel.
    • Generosity: Boundaries should leave space for generosity, but not enable the other person to diminish your worth.
    • Mindfulness: Boundaries should be applied mindfully, and not used to punish someone.
    • Challenges and Misconceptions:
    • Fear of Disappointing Others: Overcome the fear of disappointing others or being seen as unkind.
    • Guilt: Recognize that saying no is not selfish but an act of self-respect.
    • Societal Pressure: Resist societal pressure to be endlessly accommodating.
    • Stoic Principles:
    • Self-Control: Exercise self-control and emotional regulation when setting and maintaining boundaries.
    • Wisdom: Use wisdom to discern when to say yes and when to say no.
    • Justice: Act with justice, ensuring fairness both to yourself and to others.
    • Virtue: Align your actions with virtue, making kindness a deliberate choice rather than an obligation.

    In essence, setting boundaries is about creating a framework that allows kindness to thrive without undermining one’s well-being. By setting limits, individuals can ensure that their generosity is valued, reciprocated, and sustainable, leading to healthier and more respectful relationships.

    Modern Stoicism: A Guide to Resilience, Regulation, and Virtue

    Modern Stoicism emphasizes the practical application of ancient Stoic philosophy to contemporary life. It focuses on cultivating inner resilience, emotional regulation, and ethical behavior to navigate the complexities of the modern world. Modern Stoicism adapts the core tenets of Stoicism—virtue, reason, and living in accordance with nature—to address the challenges and opportunities of today’s society.

    Here’s a breakdown of key aspects of Modern Stoicism, according to the sources:

    • Core Principles:
    • Virtue as the Only Good: Modern Stoicism, like its ancient counterpart, emphasizes that virtue (wisdom, justice, courage, and temperance) is the sole good and the foundation for a fulfilling life.
    • Control and Acceptance: A central tenet is differentiating between what one can control (thoughts, actions, and responses) and what one cannot (external events, others’ opinions). Modern Stoicism encourages focusing efforts on what is within one’s power and accepting what is not.
    • Living in Accordance with Nature: This involves understanding the natural order of the world and living in harmony with it, embracing reason and virtue in daily life.
    • Mindfulness: Modern Stoicism emphasizes being present in the moment, rather than dwelling on the past or worrying about the future.
    • Practical Applications:
    • Emotional Regulation: Modern Stoicism provides tools for managing emotions, helping individuals respond to challenges with reason rather than impulse. This involves recognizing emotions, understanding their triggers, and choosing thoughtful responses.
    • Setting Boundaries: Modern Stoicism underscores the importance of setting boundaries to protect one’s well-being and prevent exploitation. This includes learning to say no, defining limits, and enforcing those limits consistently.
    • Goal Setting: Stoicism encourages setting clear goals aligned with one’s values to give life direction and purpose, acting as a compass.
    • Cultivating Self-Awareness: Modern Stoicism emphasizes the importance of self-reflection and self-compassion, building self-worth from within and not relying on external validation.
    • Practicing Empathy and Compassion: While setting boundaries is vital, Modern Stoicism also promotes empathy and compassion, understanding others’ struggles and responding with kindness while maintaining one’s own emotional health.
    • Detachment: A key teaching involves detaching from the need to control external factors, and learning to give without expectation.
    • Recognizing relationships: It is key to recognize which relationships are opportunistic and which will help you grow. It’s also important to preserve energy by focusing on relationships that uplift you.
    • Habit Forming: Stoicism consistently encourages us to avoid extremes by embracing balance in our actions and protects us from chaos.
    • Benefits of Modern Stoicism:
    • Increased Resilience: Modern Stoicism equips individuals with the tools to bounce back from setbacks and navigate challenges with greater emotional stability.
    • Improved Relationships: By setting healthy boundaries and practicing empathy, Modern Stoicism promotes more balanced and respectful relationships.
    • Enhanced Self-Worth: Cultivating self-awareness and self-compassion leads to a stronger sense of self-worth, reducing dependence on external validation.
    • Greater Emotional Regulation: Learning to manage emotions and respond with reason promotes inner peace and reduces unnecessary conflict.
    • Purposeful Living: Aligning actions with values and setting clear goals fosters a sense of purpose and fulfillment.
    • Finding Peace: By letting go of past hurts and practicing forgiveness, Modern Stoicism unlocks freedom and creates room for joy.

    In essence, Modern Stoicism is a practical philosophy for living a virtuous and fulfilling life in the modern world, providing tools and techniques for cultivating inner strength, managing emotions, and building meaningful relationships. By focusing on what is within one’s control and acting with reason and virtue, individuals can navigate the complexities of life with greater resilience and peace.

    Modern Stoicism: Emotional Well-being Through Self-Awareness and Regulation

    Drawing upon the sources and our conversation history, emotional well-being involves several interconnected elements that, when cultivated, contribute to a balanced and fulfilling life. Modern Stoicism provides a framework for understanding and enhancing emotional well-being by emphasizing self-awareness, emotional regulation, and ethical behavior.

    Key components of emotional well-being, according to the sources, include:

    • Self-Worth and Self-Love:Cultivating self-worth from within, rather than relying on external validation, is essential for setting boundaries and protecting emotional well-being.
    • Practicing self-compassion and treating oneself with kindness reinforces self-esteem and emotional resilience.
    • Recognizing one’s intrinsic value and worthiness of love and respect is vital for maintaining healthy boundaries and relationships.
    • Emotional Regulation:Managing emotions and responding with reason rather than impulse is a core aspect of Stoicism.
    • Practicing emotional detachment involves understanding emotions without allowing them to dictate behavior, which helps in navigating challenging situations.
    • Developing the ability to pause and reflect before reacting to emotional triggers enables thoughtful responses aligned with one’s values.
    • Setting Boundaries:Establishing clear and healthy boundaries is crucial for protecting emotional energy and preventing exploitation.
    • Setting limits and saying “no” when necessary are acts of self-respect that ensure kindness comes from a place of strength rather than obligation.
    • Clearly communicating boundaries helps others respect one’s time, energy, and values.
    • Practicing Empathy and Compassion:Understanding and sharing the feelings of others allows for thoughtful responses rather than impulsive reactions.
    • Approaching difficult situations with kindness and understanding, while maintaining boundaries, fosters healing and balanced relationships.
    • Recognizing that others’ actions often stem from their own struggles promotes empathy and prevents resentment.
    • Letting Go of Past Hurts:Forgiveness is essential for freeing oneself from emotional burdens and releasing negative emotions.
    • Releasing emotional attachments to past events allows for a focus on personal healing and growth, enabling a more peaceful present.
    • Choosing peace over bitterness and focusing on personal growth helps in moving forward from past wrongs.
    • Living with Intention and Purpose:Setting clear goals aligned with one’s values provides direction and helps focus on what truly matters.
    • Aligning actions with values ensures that time and energy are directed toward pursuits that enrich personal growth and contribute to a sense of fulfillment.
    • Living in accordance with virtue and acting with reason fosters a sense of purpose and balance in life.
    • Managing External Influences:Distancing oneself from energy drainers and negative influences helps safeguard emotional and mental health.
    • Focusing on what is within one’s control and accepting what is not promotes inner peace and reduces unnecessary stress.
    • Surrounding oneself with supportive individuals fosters emotional resilience and personal growth.
    • Mindfulness and Self-Reflection:Being present in the moment, rather than dwelling on the past or worrying about the future, is essential for emotional regulation.
    • Regular self-reflection and self-assessment, including journaling and meditation, promote emotional awareness and help manage emotional overwhelm.

    These elements of emotional well-being are interconnected and mutually reinforcing. By cultivating self-awareness, practicing emotional regulation, setting healthy boundaries, and aligning actions with values, individuals can enhance their emotional resilience, build stronger relationships, and lead more fulfilling lives. Modern Stoicism provides practical tools and techniques for integrating these principles into daily life, enabling individuals to navigate challenges with greater clarity, purpose, and inner peace.

    The Art of Earning Respect: Kindness and Boundaries

    Drawing from the provided source, earned respect is achieved through a combination of kindness, wisdom, self-respect, and the establishment of clear boundaries. It is a reciprocal recognition of worth, not an entitlement or automatic response to generosity.

    Key aspects of respect earned, according to the sources:

    • Balance Between Kindness and Self-Respect:
    • Kindness, when given without boundaries, can lead to disrespect because people tend to devalue what is easily accessible.
    • Respect is commanded by acting in ways that show self-worth, not by simply giving oneself away.
    • Balancing generosity with self-preservation is crucial for earning genuine respect.
    • Setting and Enforcing Boundaries:
    • People respect the boundaries that are enforced.
    • Setting clear expectations and refusing to be taken advantage of often leads to greater respect.
    • Firmness and compassion are allies in earning respect; kindness should be strong, not weak.
    • Saying no is essential; those who know when to say no command true respect.
    • Intentional Kindness:
    • Kindness must be intentional, not automatic.
    • Acting with intention transforms kindness from appeasement to an expression of values.
    • Respect comes from being authentic, not just agreeable.
    • Kindness should be a conscious choice, not an unconscious habit.
    • Self-Control and Emotional Independence:
    • People instinctively admire those who are emotionally independent and do not seek validation through their acts of kindness.
    • True tranquility comes from mastering desires and detaching self-worth from others’ opinions.
    • A strong person offers kindness freely but does not beg for it in return.
    • Rewarding Appreciation, Not Entitlement:
    • Rewarding appreciation reinforces the right mindset and teaches people that kindness is a gift, not a debt.
    • Withdrawing kindness from those who demand it is necessary; self-respect is non-negotiable.
    • Avoiding Self-Sacrifice:
    • Generosity should not extend to the point of self-sacrifice or exhaustion.
    • True generosity involves offering help in a way that maintains dignity and well-being.
    • Kindness should never mean self-sacrifice at the expense of well-being.
    • Protecting Your Energy:
    • Protecting energy is as crucial as protecting time; respect is about how much of oneself is given, and to whom.
    • Being selective about where to invest energy and setting emotional boundaries are essential.
    • Knowing When to Walk Away:
    • Walking away from situations that undermine dignity demonstrates a commitment to self-respect and earns the respect of others.
    • It’s important to carefully discern where efforts are invested; kindness should not come at the cost of self-worth.

    In essence, earned respect is about creating a balance where kindness is a choice made from a position of strength and self-awareness, not a freely given resource that others can exploit. By setting boundaries, acting with intention, and valuing oneself, it’s possible to foster relationships built on mutual respect and appreciation.

    Why Kindness Makes People Disrespect You | Modern Stoicism

    The Original Text

    why kindness makes people disrespect you modern stoicism have you ever felt like the more kindness you show the less people respect you you offer a helping hand yet they start expecting it you go out of your way to be considerate yet you’re overlooked you try to be a good person yet somehow you become an easy target someone people take advantage of and here’s the real danger if you don’t recognize what’s happening you’ll keep wondering why people dismiss your needs walk over your boundaries and never truly appreciate you but don’t worry by the end of this video you’ll understand why kindness when used without wisdom can lead to disrespect and how to shift your approach to gain respect without losing losing your compassion because the problem isn’t kindness itself it’s how and when you apply it number one people value what they have to earn kindness is often seen as a virtue yet paradoxically in the modern world it can lead to disrespect when given too freely and without boundaries this is one of the great paradoxes of human nature people tend to devalue what is easily accessible the moment kindness becomes a constant unearned presence it transforms from a virtue into an expectation when others feel entitled to your generosity they no longer see it as a gift but as a given something they need not appreciate or reciprocate this is why modern stoicism teaches us the importance of self-respect and measured generosity Marcus Aurelius once wrote wa no more time arguing about what a good man should be be one but being a good person does not mean being a doormat if you are always available always saying yes and never establishing limits people will not admire your kindness they will assume it is simply who you are something they can take without consequence just as we value what we work hard for we also respect those whose kindness must be earned when you are too freely giving you teach others to expect rather than appreciate this is a hard truth that many people learn too late in life anything easily obtained is often overlooked while that which requires effort is cherished consider the example of luxury goods why do people covet designer Brands over cheap Alternatives it is not just about quality it is about scarcity and effort people respect what is rare what is different difficult to attain the same applies to Human Relationships if you are endlessly accommodating always bending over backward for others they may begin to see you as replaceable this is why setting boundaries is not about withholding kindness it is about ensuring that your kindness is Meaningful in letters from A stoic senica reminds us you act like Mortals in all that you fear and like Immortals in all that you desire if we desire respect we must act in ways that command it not simply give ourselves away expecting it in return the key is to make your kindness a conscious Choice rather than an unconscious habit when you say yes too often out of fear of disappointing others you become a tool rather than a person useful but not respected in Modern Life this lesson is especially relevant in a world driven by social media validation where people are pressured to be endlessly available many have lost the ability to say no the result burnout resentment and ironically a lack of true respect from those they strive to please the truth is when you set boundaries you teach others that your time and energy are valuable you show them that your kindness is not free flowing but intentional this is a core principle of stoic Secret control what is within your power and let go of what is not respect starts with self-respect if you respect yourself enough to set limits others will follow suit epic tetus taught how long will you wait before you demand the best for yourself this is a question worth reflecting on are you allowing yourself to be drained by the expectations of others or are you ensuring that your kindness remains a conscious Act of virtue rather than an unconscious obligation the practical application of this wisdom is simple yet powerful practice saying no when you are always agreeable people take you for granted but when you establish clear limits when you give selectively and intentionally your kindness retains its value instead of always being available be present on your own terms let people understand that your time and generosity are gifts not rights this will not make you less kind it will make your kindness more respected modern stoicism emphasizes the idea that true strength is found in balance between generosity and self-preservation between compassion and wisdom those who fail to find this balance often end up exhausted disrespected and bitter the world world does not reward unlimited self-sacrifice it rewards those who understand the value of their own worth number two unchecked kindness can make you seem weak unchecked kindness can often be mistaken for weakness not because kindness itself is a flaw but because the world respects those who balance compassion with self-respect in society we often see strength associated with assertiveness and the ability to set clear boundaries those who can confidently say no when necessary are viewed as people with strong principles while those who always say yes always yield and never push back can easily be overlooked or even taken advantage of stoicism teaches us that emotional control is a virtue but that does not mean we should be passive or allow others to walk all over us this does not mean being cold or unfeeling but rather understanding that true kindness cannot come at the cost of your own dignity real kindness isn’t just about how much you give it’s about knowing when to give and when to stand your ground think about the story of Daniel a man known for always helping others he never said no never stood up for himself and always put the needs of others before his own at first people admired his generosity but over time what happened his kindness was no longer seen as a virtue it became an expectation people stopped asking if he had the time or energy to help they simply assumed he would and the moment Daniel tried to say no people were upset they weren’t grateful for all he had done in the past instead they felt entitled to his help he hadn’t changed but the way people treated him had because he never established boundaries in the first place his kindness was real but Without Limits it lost its value now ask yourself how many times have you felt like your kindness was taken for granted how often have you agreed to something just to avoid disappointing others have you ever felt drained because you constantly put others before yourself this isn’t about becoming selfish or cruel it’s about realizing that kindness does not mean being a doormat for kindness to have meaning it must be given with intention and wisdom strength and kindness are not opposites they go handin hand if you don’t respect yourself don’t expect others to respect you a truly kind person is not someone who always says yes but someone who knows how to balance giving with self- protection someone who understands that saying no when necess necessary is not unkind it’s a sign of self-worth and that is the kind of person who earns true respect the lesson here is simple don’t let your kindness become a burden being kind does not mean letting others take advantage of you it means fostering relationships built on mutual respect if you want your kindness to be valued start by valuing yourself number three people test how far they can push you kindness is a virtue but when it is given without boundaries it can invite disrespect why because human nature tends to test limits if you consistently let things slide if you allow a friend to always be late without consequence if you accept extra work from a coworker without pushing back or if you tolerate a partner neglecting your needs what message are you really sending whether you realize it or not you’re teaching people how to treat you epicus wisely said you are not to blame for being uneducated but you are to blame for refusing to learn and one of the most crucial lessons in life is this people will only respect the boundaries that you enforce stoicism teaches us that while kindness is admirable it must be coupled with self-respect if not it becomes a silent signal that you don’t value yourself enough to stand firm have you ever noticed how those who set clear expectations who know their worth and refuse to be taken advantage of are often the most respected Marcus aelius one of the greatest stoic leaders understood this well he said the soul becomes dyed with the color of its thoughts if you constantly think that kindness means being endlessly accommodating your soul your character and your self-worth will reflect that but true stoic wisdom tells us that virtue is about balance be kind but never at the cost of your dignity imagine a river strong flowing and full of life it nurtures everything around it but it also carves Stone shapes Landscapes and determines its own path kindness should be like that generous but firm if people sense that you lack the strength to say no they will push to see how far they can go this isn’t because they’re necessarily malicious it’s simply how people operate even children test their parents patience to understand what is acceptable so why would adults be any different a stoic doesn’t resent this reality they accept it and act accordingly senica once said he who does does not prevent a crime when he can encourages it if you don’t set limits you are silently approving of mistreatment this doesn’t mean you should become harsh or unkind stoic lessons emphasize that self-control wisdom and Justice must work together be kind yes but let that kindness be strong not weak a person who truly embodies stoicism understands that firmness and compassion are not opposite they are allies so ask yourself are you being kind because it aligns with your values or because you fear confrontation are you letting others dictate your worth by how much you’re willing to endure the answer to these questions determines whether your kindness is a strength or a weakness kindness should never mean self-sacrifice at the expense of your well-being the stoics knew that a life lived with virtue requires wisdom knowing when to say yes and more importantly when to say no so the next time someone pushes your limits remember your response teaches them exactly how far they can go what lesson are you giving them if you’ve watched up to this point you’re already on the path to understanding the hidden dynamics of kindness and respect in today’s world comment below with stoic strength to affirm your commitment to master ing modern stoicism but don’t stop here there’s still valuable Insight ahead that can change the way you navigate respect boundaries and personal power stay until the end to uncover how true kindness Guided by wisdom earns genuine respect number four it creates an imbalance in relationships kindness when given without boundaries often creates an imbalance in relationships that many fail to recognize until they feel drained used or unappreciated modern stoicism teaches us the importance of equilibrium in human interactions giving without expectation but also ensuring we are not taken for granted senica once wrote he who gives when he is asked has waited too long this reminds us that generosity when excessive or poorly placed can foster dependency and entitlement rather than mutual respect when you are always the one offering help making sacrifices or accommodating others you unconsciously set a precedent one where you are expected to give and others feel entitled to receive the more you extend kindness Without Limits the less people value it and soon they no longer see it as generosity but as an obligation you owe them this leads to an unspoken Dynamic where one person carries the burden of maintaining the relationship while the other simply takes without feeling the need to reciprocate in the context of Modern Life we often see this imbalance in friendships workplaces and even within families the employee who always says yes to extra work without question soon becomes the one everyone relies on yet receives the least appreciation the friend who always listens and gives emotional support but never shares their own struggles becomes the emotional crutch for others yet is left alone in their own moments of need the partner who continuously compromises to keep the peace eventually realizes that their needs are ignored because they have never been firm about them this isn’t to say kindness is a weakness far from it the stoic secrets to maintaining respect lie in practicing kindness with wisdom Marcus Aurelius reminds us be tolerant with others and strict with yourself this means offering kindness but also setting boundaries that prevent you from being diminished by your own good nature if you give without discernment you risk turning your virtue into a vice where kindness is no longer an act of strength but a self-imposed burden a well-balanced relationship is built on mutual respect not silent sacrifice the greatest respect you can command from others is by demonstrating self-respect first people unconsciously mirror the way you treat yourself if you place no value on your time your energy and your efforts neither will they if you constantly say yes to every demand people will assume you have nothing better to do and your kindness will not only be undervalued but eventually ignored this means Having the courage to disappoint others sometimes to say no when necessary and to stand firm in your decisions this doesn’t mean becoming cold or indifferent but rather understanding that respect is built not on endless giving but on Mutual recognition of worth look at those who command true respect in life they are not the ones who say yes to everything but those who know when to say no they give where it matters but they also hold their ground when necessary modern stoicism reminds us that virtue is about balance if you lean too far into self-sacrifice you lose your own stability if you lean too far into selfishness you lose connection with others the key is to be kind but not to the extent that it breeds entitlement in others and exhaustion in yourself true generosity is not about giving endlessly but about giving wisely only to those who appreciate it and only when it does not come at the cost of your own dignity in relationships fairness must exist if your kindness is not reciprocated it is not kindness it is self- neglect so how do you correct this imbalance by first acknowledging your own worth by recognizing that your time and energy are not infinite resources to be drained by those who only take by understanding that true kindness does not mean always saying yes but knowing when to say no by reminding yourself that being a good person does not mean being a doormat and part of being a good person is ensuring that your kindness is respected not exploited in a world that often mistakes kindness for weakness be both firm and fair generous yet Discerning kindness should never be a burden but a gift one that when given wisely Fosters respect rather than diminishing it number five it makes you a target for manipulators kindness is a virtue but in a world where not everyone acts with good intentions it can also make you a target for manip ulators those who seek control whether it’s a toxic boss a selfish friend or a manipulative partner are always on the lookout for people who are easy to sway and who better to exploit than someone who always says yes always puts others first and never questions when their generosity is being taken advantage of you might believe that being kind will earn you respect but to the wrong people it signals weakness they see it as an open invitation to push boundaries to take without giving and to bend you to their will but here’s the truth kindness when paired with wisdom is not weakness it’s strength the stoics understood this well Marcus Aurelius one of the greatest stoic philosophers wrote the best revenge is to be unlike him who performed the injury this means you don’t have to become cold or cruel in response to manipulation but you do have to be Discerning being kind does not mean being naive and it certainly does not mean allowing others to take advantage of you consider the story of Jake a talented designer who always went out of his way to help his co-workers he would cover for them when they miss deadlines fix their mistakes and even stay late to ensure projects were completed on time at first he thought his kindness was appreciated until he realized his workload was twice that of anyone else’s and his so-called friends were dumping their responsibilities on him while taking credit for his efforts one day his boss asked him to stay late yet again to finish someone else’s work without so much as a thank you that was when it hit him his kindness wasn’t being respected it was being exploited Jake decided to set back boundaries he stopped saying yes to every request prioritized his own work and made sure his contributions were recognized some people resented this change but the ones who truly valued him adjusted he didn’t stop being kind but he stopped being an easy target so ask yourself are you being kind or are you being taken advantage of do the people in your life appreciate your kindness or do they simply expect it the stoics teach us to be mindful of who we allow into our Inner Circle and to recognize when kindness is being mistaken for weakness epicus reminds us the key is to keep company only with people who uplift you whose presence calls forth your best true kindness isn’t about pleasing everyone it’s about acting with Integrity wisdom and self-respect when you learn to balance kindness with strength you you command respect instead of inviting manipulation the lesson here is clear give kindness freely but not blindly because the moment you allow yourself to be used your kindness is no longer kindness It’s self-sacrifice at your own expense number six people see you as emotionally dependent kindness when rooted in strength is a powerful virtue but when it stems from a place of emotional dependence it can become a silent invitation for disrespect people instinctively admire those who are emotionally independent those who do not seek validation through their acts of kindness but rather offer it from a place of inner abundance if your kindness is driven by the fear of rejection or the need for approval it ceases to be an act of virtue and instead becomes a bargaining tool one that often backfires stoicism teaches us that true Tranquility comes from within from mastering our desires and detaching our selfworth from the fleeting opinions of others as Marcus Aurelius said you have power over your mind not outside events realize this and you will find strength a person who is kind because they choose to be because it aligns with their values not because they crave appreciation is naturally respected but when kindness is merely a mask for insecurity people sense it they may not always articulate it but they will feel it and in time their respect for you will diminish consider a man who tolerates blatant disrespect from a woman just to keep her in his life to an outsider it may seem like patience or devotion but in reality it signals weakness a person who does not set boundaries who allows mistreatment out of fear of loss is not truly kind they are emotionally dependent and dependence especially in relationships is rarely admired a strong person offers kindness freely but does not beg for it in return they do not tolerate abuse under the illusion of loyalty epic tetus reminds us if you want to improve be content to be thought foolish and stupid in other words prioritizing virtue over popularity requires the courage to be misunderstood to stand firm in your principles even when others do not immediately see their value why is it that people respect those who are willing to walk away but take advantage of those who cling too tightly the answer lies in human nature we are wired to Value what is scarce to admire what is self-sufficient when you are excessively kind in hopes of being liked you unwittingly communicate that your worth depends on the approval of others and the moment people sense that you need them more than they need you the power Dynamic shifts you become easy to take for granted this is why stoic lessons emphasize self-sufficiency the ability to be content with oneself regardless of external circumstances if your kindness is genuine it will not waver in the face of indifference if it is strategic it will eventually betray you think about it when was the last time you truly respected someone who lacked self-respect when you meet someone who stands firm in their values who does not compromise themselves for the sake of acceptance do you not instinctively admire them contrast that with someone who constantly seeks to please who bends over backward to accom odate everyone even at the cost of their dignity over time their efforts become predictable their presence easy to overlook this is not because kindness itself is weakness but because misplaced kindness kindness rooted in fear rather than principle is as senica wisely observed he who is brave is free the courage to assert yourself to establish boundaries to remain kind yet not sub subservient that is true Freedom so ask yourself is your kindness a choice or is it a strategy are you kind because it aligns with your character or because you hope to be liked in return if your answer leans toward the latter you must reassess your approach kindness should be an extension of strength not a symptom of emotional dependence true stoicism teaches us to act in accordance with virtue to do what is right without being attached to how others perceive us if people respect you for your kindness let it be because they recognize it as a reflection of your inner stability not because they see an opportunity to exploit it in the end the only approval that truly matters is the one you give yourself do you think kindness without self-respect leads to being taken for granted many mistake people pleasing for genuine kindness but true virtue comes from Inner Strength not the fear of rejection share your thoughts below kindness without self-respect invites disrespect number seven true kindness comes from strength not approval true kindness stems from strength not from a need for approval when your actions are motivated by a desire to be liked to gain validation or to secure affection they lose their authenticity people can sense when kindness is transactional when it’s a silent plea for acceptance rather than a genuine expression of Good Will the stoics teach us that our worth is not dictated by how others perceive us but by the virtues we embody when you give excessively gifts time attention without it being reciprocated and especially if your intent is to win favor it can come across has neediness rather than generosity and neediness repels imagine a man who constantly showers a woman with compliments expensive gifts and undivided attention not because he genuinely wants to give but because he hopes she will like him more he believes that by overwhelming her with kindness she will feel compelled to reciprocate but instead of admiration she may feel uncomfortable even pressured because the generosity is laced with expectation it’s not truly about her it’s about his need for validation this Dynamic plays out in friendships workplaces and even within families when someone senses that your kindness is a form of emotional bribery respect is lost think about it who do you admire more the person who gives freely because it is simply in their nature or the one who gives with the the silent hope of something in return people are drawn to those who are self-sufficient who give without attachment who are content with or without external validation the moment you make your selfworth dependent on how others receive your kindness you become vulnerable to manipulation and disappointment instead embrace the stoic principle of acting according to Virtue not reaction if you are kind be kind mind because it aligns with your values not because you need something in return the strongest relationships romantic or otherwise are built on mutual respect not desperation consider the story of Daniel a man who always put others first not because he was selfless but because he feared rejection he would go out of his way to please to avoid conflict to be liked by everyone yet despite his constant efforts people took him for granted they knew he wouldn’t say no that he was always available always seeking their approval over time he grew resentful feeling used and unappreciated but the truth was he had set the terms of those relationships by teaching others that his kindness came with an unspoken contract if I do this for you will you like me it wasn’t until he learned to give with without attachment to be kind without expectation that he found real peace some relationships faded but the ones that remained were genuine so ask yourself is your kindness an extension of your character or is it a strategy are you giving from a place of abundance or are you hoping to receive something in return true strength is found in self-sufficiency in knowing that your worth is not measured by how others respond to you when you stop seeking validation you become the kind of person who naturally commands respect and respect unlike approval is never begged for it is earned kindness is a virtue but when applied without wisdom it can become a liability the harsh truth is that people often take for granted what is freely given and unchecked generosity can lead to an imbalance in relationship exploitation and ultimately a loss of respect this is not because kindness itself is flawed but because human nature tends to test limits the stoics understood that true kindness must be paired with self-respect Marcus aelius senica and epicus all taught that a life of virtue requires balance between generosity and self-preservation between compassion and firmness to be truly kind you must also be Discerning you must recognize when your kindness is being valued and when it is being exploited and above all you must never let kindness come at the cost of your own dignity so where do we go from here how do we ensure that our kindness is respected rather than mistaken for weakness this is where Modern stoicism provides us with a practice iCal path forward in the next section we’ll explore how to command respect without losing your kindness because being kind does not mean being passive it does not mean saying yes to everything and it certainly does not mean allowing others to take advantage of you how to command respect without losing your kindness many believe that being kind means always saying yes of avoiding conflict and putting others first but as we’ve seen unchecked kindness can lead to disrespect and burnout so does this mean you should stop being kind not at all instead you must practice kindness with wisdom and boundaries stoicism teaches that true kindness isn’t about pleasing everyone it’s about acting with purpose Marcus Aurelius LED with virtue but never at the EXP expense of self-respect to command respect you must set limits give intentionally and ensure your kindness is valued not exploited in this section we’ll explore how to balance kindness with strength ensuring that your generosity earns respect rather than invites entitlement let’s begin number one kindness must be intentional not automatic commanding respect while maintaining kindness is a delicate balance but it is not about people pleasing or seeking approval it is about acting with intention Marcus Aurelius one of History’s Greatest stoic philosophers was known for his generosity and fairness but he never allowed himself to be controlled by the expectations of others his kindness was a choice not an obligation this is a crucial distinction in in modern stoicism to be truly kind one must be deliberate rather than reactive too often people mistake kindness for weakness thinking that saying yes to every request earns them admiration in reality respect is built on boundaries not blind compliance before extending your help or agreeing to something pause and ask yourself am I doing this because I genuinely want to or am I acting out of of fear of disapproval senica once said if you wish to be loved love but this love must be given freely not extracted through guilt or pressure when you make kindness intentional it transforms from an act of appeasement into an expression of your values this is a stoic secret true kindness does not seek validation it stems from inner strength in today’s world where social obligations workplace expectations and personal relationships often blur the lines between generosity and self-sacrifice it is vital to recognize that saying no does not make you unkind it makes you Discerning consider the difference between a leader who helps because they fear conflict versus one who helps because they see value in doing so the latter commands respect because their kindness is grounded in principle not in security people sense when kindness is genuine and when it is laced with silent resentment if you are constantly overextending yourself to avoid disappointing others you are not being kind you are being controlled the modern stoic understands that respect is earned by standing firm in their choices not by bending to every demand this does not mean turning cold or indifferent the key is to be as generous with your kindness as you are with your discipline epic tetus reminds us no man is free who is not master of himself if you allow external pressure to dictate your generosity you are no longer in command of your own will instead practice mindful kindness give when it aligns with your principles not when it is expected of you in the workplace for instance a boss who is always accommodating out of fear of being disliked will soon be taken for granted however a leader who helps when it makes sense while setting firm expectations earns both respect and appreciation in personal relationships the same rule applies consider a friend who always says yes to Favors even at their own expense over time their kindness loses its value because it is given without discernment but a friend who helps thoughtfully who knows when to give and when to say no is respected because their kindness holds weight this is why intentional kindness is so powerful it is rare it is valuable and it is given with meaning as the stoics teach respect comes not from being agreeable but from being authentic the modern world often pressures us to be endlessly accommodating mistaking self-sacrifice for virtue but self-sacrifice without purpose leads to resentment not respect true kindness as understood in modern stoicism is neither weak nor passive it is strong deliberate and aligned with your values to command respect without losing your kindness start by making each Act of generosity a conscious decision rather than an automatic reaction train yourself to pause before saying yes ensuring that your kindness is an expression of your strength not a response to fear as you practice this you will notice something remarkable people will respect you more not less they will see that your kindness is not a tool for approval but a reflection of your inner power this is the secret of those who live by stoic wisdom they do not seek to please yet they are deeply respected they do not Chase validation yet they are valued and they do not give out of fear but out of choice number two say no without explaining yourself respect and kindness are not opposites in fact the most respected people often possess both in Perfect Balance but one of the quickest ways to lose respect is to stretch yourself too thin to always be available always saying yes until your time energy and even selfworth become diluted senica said he who is everywhere is nowhere if you try to please everyone you’ll end up pleasing no one not even yourself the ability to say no without justifying without overe explaining without feeling guilty is one of the greatest strengths you can develop it’s a quiet assertion of self-respect and the world responds to it in kind think think about a time when someone asked you for a favor you didn’t really want to do maybe it was staying late at work when you had already sacrificed enough or a friend expecting you to drop everything to help when you were struggling with your own responsibilities you wanted to say no but you hesitated maybe you offered an excuse or softened your refusal with too much explanation but why why do we feel the need to justify protecting our own time and energy often it’s because we fear disappointing others or being seen as unkind but here’s the truth when you respect your own limits others do too if you constantly say yes to everything people will assume your time is free your boundaries are flexible and your needs come second that’s not kindness that’s self- neglect consider the story of James a hardworking designer who always said yes his colleagues knew they could count on him to pick up extra work his friends knew he’d always be there and his family knew he’d never say no even if it meant sacrificing sleep and personal time at first he felt good about being the Dependable one but over time resentment built up he felt exhausted used and strangely invisible the respect he thought he was earning by being agreeable wasn’t real it was conditional based on his willingness to be endlessly available one day when his boss asked him to take on yet another lastminute project James did something different he simply said I can’t do that no excuse no elaborate reason just a firm clear statement the room was silent for a moment then his boss nodded and moved on James realized in that moment that he had been giving away his power all along the fear of saying no had been far worse than the reality of it when you start saying no with confidence you may notice a shift in how people treat you some will push back especially if they’ve benefited from your constant compliance but others will respect you more recognizing that you are someone who values yourself and the most surprising thing the world doesn’t end when you say no your true friends the people who genuinely respect you won’t leave because you set a boundary they’ll stay and they’ll probably admire you even more for it ask yourself this what would change in your life if you stopped overexplained your refusals how much energy would you reclaim if you reserved your time for what truly matters learning to say no isn’t about being harsh it’s about being clear a simple I can’t or that doesn’t work for me is enough you don’t owe anyone an elaborate justification for prioritizing your well-being true kindness isn’t about sacrificing yourself it’s about offering your best self to the world and you can only do that when you protect your energy so the next time you feel pressured to explain your no pause let it stand on its own respect yourself first and others will follow number three reward appreciation not entitlement respect is not about being feared or blindly obeyed it’s about being valued and one of the strongest ways to ensure you are respected without losing your kindness is by rewarding appreciation not entitlement imagine this you offer someone your time your help your patience and they genuinely appreciate it they recognize your effort they thank you and they show gratitude in return you feel motivated to continue giving to continue being there because you know your kindness is respected but now imagine another scenario someone doesn’t acknowledge your efforts instead they expect them they assume you will always be there always saying yes always offering your kindness without question the moment someone demands your kindness rather than appreciates it they reveal their entitlement and this is where you must draw the line as Marcus aelius one of the greatest stoic philosophers said the happiness of your life depends upon the quality of your thoughts and this applies to how you allow others to treat you if you continue to give kindness to those who feel entitled to it you reinforce the wrong mindset not just in them but in yourself you teach them that you are always available no matter how they treat you but is that truly an act of kindness or is it self- neglect in stoicism self-respect is non-negotiable the stoics believed in virtue Justice and wisdom and part of that wisdom is knowing when to give and when to step back senica once wrote he who is not a good servant will not be a good Master this means that if you don’t command respect through your actions if you let others walk over your kindness you lose control not just over them but over yourself the person who respects themselves knows that kindness should never be given out of obligation it is a gift not a debt when people see that you reward appreciation and not entitlement they begin to respect your boundaries they understand that your kindness is not a weakness but a choice and this is where the power lies too often we fear that if we stop giving if we withdraw our kindness from those who take it for granted we will be seen as rude unkind or selfish but ask yourself why is it selfish to protect your energy why is it rude to expect basic respect in return the truth is it is not there is a crucial difference between kind and peop pleasing kindness is intentional strong and wise peop pleasing on the other hand is rooted in fear the fear of rejection the fear of conflict the fear of being disliked in other words if setting boundaries means some people see you as unkind let them your duty is not to meet the expectations of those who feel entitled to you it is to live virtuously with self-respect and wisdom a truly kind person does not just give endlessly they give wisely they recognize that kindness without boundaries turns into self-sacrifice and self-sacrifice without purpose leads to resentment have you ever found yourself exhausted drained or frustrated because you kept giving to someone who never appreciated it that frustration is a signal it is your mind telling you that something thing is off balance and balance is essential just like the stoics believed in controlling what is within our power you must take control of your kindness ask yourself who truly values what I give who sees my kindness as a gift rather than an expectation who if I stopped giving would still respect me these are the people worthy of your time your effort your kindness so what is the the takeaway do not be afraid to withdraw your kindness from those who demand it do not let fear dictate how you set your boundaries instead practice wise generosity give where appreciation exists and where it does not let go without guilt you are not unkind for choosing who gets access to your energy you are simply living by the stoic lessons that have guided the greatest thinkers of History self-respect wisdom and the courage to stand firm in your values because in the end respect is not commanded through endless giving it is earned through the way you value yourself and when you respect yourself others have no choice but to do the same if you’ve watched up to this point you’re already on the path to understanding the hidden dynamics of kindness and respect in today’s world comment below with stoic strength to airm your commitment to mastering modern stoicism but don’t stop here there’s still valuable Insight ahead that can change the way you navigate respect boundaries and personal power stay until the end to uncover how true kindness Guided by wisdom earns genuine respect number four be generous but not at your own expense being generous is a no quality but without boundaries it can lead to being undervalued or even taken for granted modern stoicism teaches us that true kindness is not about self-sacrifice to the point of exhaustion but about giving wisely to command respect without losing your kindness practice generosity from a place of strength not depletion if you constantly give without regard for your own well-being you risk becoming a resource rather than a person in the eyes of others the key to balanced generosity lies in discernment helping others while ensuring that your kindness is not exploited a common mistake people make is believing that being available and accommodating at all times earns them respect in reality the opposite often happens when you give without boundaries some will come to expect it and others will see it as a weakness to exploit this is why setting limits is not an act of selfishness it is an act of self-respect This Means holding yourself to high standards of kindness while also expecting fair treatment from others if a friend only reaches out when they need something but disappears when you need support it’s not wrong to step back people will respect you more when they realize that your generosity comes with principles a helpful rule in navigating gener generosity is to give from abundance not depletion if giving drains you whether it’s time energy or resources you need to reassess your approach imagine someone who always says yes to extra work hoping for recognition only to be overlooked for promotions while those who set boundaries are respected this happens because people respect what is valued and take for granted what is always available a wise leader knows that saying no at times allows them to say yes with greater impact when it truly matters it is the same in personal relationships if you are always available to solve problems for others while neglecting your own you teach them that your time is worth less than theirs true generosity is not about sacrificing yourself but about offering help in a way that maintains ains your dignity and well-being in Modern Life where people are often overwhelmed by demands from work family and social obligations understanding the stoic secrets of generosity is crucial the world is full of people who will take what you give without thinking twice but it is your responsibility to Define your limits a simple test if your generosity leaves you feeling drained unappreciated or resentful it’s time to adjust those who truly value you will respect the boundaries you set while those who only seek to benefit from you may fade away and that is a good thing this is not about withholding kindness but about ensuring that it is given to those who deserve it as Epictetus wisely noted attach yourself to what is spiritually Superior regardless of what other people think or do hold to your truth true aspirations no matter what is going on around you your kindness is a gift but only when given with wisdom does it truly command respect number five be kind but don’t seek approval if you want to command respect without losing your kindness one of the most powerful stoic lessons to embrace is this be kind but don’t seek approval too often people confuse kindness with people pleasing believing that in order to be liked they must always agree always comply always put others before themselves even at their own expense but in reality seeking approval is a weakness not a virtue when you make other people’s opinions the measure of your self-worth you give away your power Marcus aelius wisely said it never ceases to amaze me we all love ourselves more than other people but care more about their opinion than our own why do we exhaust ourselves trying to be liked trying to fit into a mold trying to meet expectations that were never ours to begin with when your kindness comes from a place of insecurity when you say yes just to avoid conflict when you go along with something just to keep the peace people will sense it and here’s the heart truth they will respect you less not more true kindness is an act of strength not submission a truly kind person does not need validation to feel whole they do good not because they want something in return but because it aligns with their principles epicus taught if you wish to be good first believe that you are bad that is to say recognize the ways in which you compromise yourself notice where your need for approval is dictating your actions and then correct it kindness when done right is not about making others comfortable at your own expense it’s about embodying your values regardless of how others respond imagine a scenario where someone presents an idea that you don’t agree with a people pleaser might nod along forcing a smile afraid to challenge the moment but a strong kind person will hold their ground while while remaining respectful I see where you’re coming from but I have a different perspective a simple sentence but one that shows you have your own mind you don’t need to agree to be agreeable you don’t need to please to be respected ask yourself how often do you say yes when you really mean no how many times have you swallowed Your Truth just to avoid disappointing someone else if you want to command respect start by respecting yourself the stoics believed that virtue courage wisdom Justice and Temperance should be the guiding force of your life not the shifting opinions of others when you live with Integrity when your kindness is rooted in genuine goodwi rather than a desperate need to be liked people notice they might not always agree with you but they will respect you and more importantly you will respect respect yourself so the next time you find yourself hesitating afraid to express your thoughts or enforce your boundaries remember this you were not put on this Earth to be agreeable you were put here to be strong wise and virtuous choose kindness yes but choose it on your terms not as a currency for approval now I want to hear from you what’s more important to you being liked or being respected com comment respect over approval always if you agree that self-worth comes before approval or comment being liked matters just as much if you think being liked matters just as much let’s see where you stand number six protect your energy as fiercely as your time if you want to command respect without losing your kindness one of the most critical stoic lessons to embrace is this protect your energy as fiercely as your time too often people focus on guarding their schedules setting boundaries around their availability and ensuring their time is not wasted but what about their emotional and mental energy respect is not just about how much time you give it’s about how much of yourself you give and to whom Marcus Aurelius wrote in meditations you have power over your mind not outside events realize this and you will find strength this wisdom applies directly to how you manage your energy you cannot control how others act but you can control how much of yourself you allow them to drain your energy is a limited resource if you give it away too freely to the wrong people to pointless conflicts to those who do not value it you will have little left for what truly matters consider the difference between two types of people one person allows everyone to vent their frustrations solve their problems and demand their attention Without Limits by the end of the day they feel drained frustrated and unseen the second person however is kind but selective they support others when they can but they do not absorb unnecessary negativity they listen but they do not take on burdens that are not theirs which person do you think commands more respect kindness does not mean allowing yourself to be an emotional Dumping Ground many people mistake being a good person for being endlessly available but true generosity true kindness comes from a place of strength not exhaustion if you constantly deplete yourself for others without replenishing your own energy you will become resentful not respected this is why stoicism teaches us to be intentional about where we place our Focus senica once said associate with those who will make a better man of you in other words surround yourself with people who uplift you not those who take without giving there is a difference between helping someone who genuinely appreciates your kindness and allowing someone to drain your energy because they see you as an easy source of support the modern world is full of distractions endless notifications unnecessary drama and people who thrive on conflict every time you engage in something meaningless you lose a piece of your energy ask yourself how often do I give my mental and emotional energy to things that do not serve me how many times have I left a conversation feeling worse than when I entered it to command respect you must first respect yourself enough to protect your energy this does not mean cutting people off or becoming indifferent it means recognizing when to engage and when to step back it means setting boundaries not just with your time but with your emotions for example if a friend only reaches out when they need something never offering support in return it it is not unkind to limit how much energy you invest in that relationship if a colleague constantly brings negativity into conversations it is not rude to excuse yourself if social media drains you rather than inspires you it is wise to reduce your time spent on it the strongest people are not those who give endlessly they are those who know when to say I have given enough the most respected leaders think of and mentors do not allow their energy to be dictated by external forces they decide where to invest their focus this is why Marcus Aurelius advised the Tranquility that comes when you stop caring what they say or think or do only what you do when you stop allowing outside distractions to consume your inner peace you gain power power over yourself power over your emotions and ultimately power over how others treat you so what does this mean in practice it means setting mental boundaries as firmly as you set time boundaries it means choosing your battles wisely deciding which conversations deserve your energy and knowing when to walk away from situations that add no value to your life if you want to command respect while maintaining your kindness remember this energy like time is finite give it wisely protect it fiercely and spend it only on what truly matters the world respects those who know their worth and nothing signals self-respect more than guarding your energy from those who do not deserve it number seven know when to walk away knowing when to walk away is one of the most understated yet powerful aspects of commanding resp effect without compromising your kindness in a world where many equate kindness with weakness the ability to step back from toxic Dynamics sends a message far louder than words people will often test boundaries consciously or unconsciously to gauge how much you are willing to tolerate if you allow disrespect to persist you inadvertently signal that such treatment is acceptable however when you decisively walk away from situation s that undermine your dignity you demonstrate an unwavering commitment to self-respect something that naturally earns the respect of others as the stoic philosopher epicus wisely said The more we value things outside our control the less control we have your time energy and peace of mind are among your most valuable assets and not everyone deserves access to them modern stoicism teaches that we must carefully discern where we invest our efforts there is a fine line between being patient and being a pushover you may think that by enduring mistreatment you are displaying resilience but in reality you may be enabling bad behavior whether it’s a friendship that drains your energy a workplace that consistently undervalues your contributions or a relationship that thrives on imbalance staying in such situations does not make you Noble it makes you complicit in your own suffering true kindness is not about allowing others to walk all over you it is about maintaining generosity while ensuring that your own worth is never diminished in the process walking away does not always mean Burning Bridges or severing ties in Anger it means making a conscious decision to remove yourself from situations where respect is absent sometimes distancing yourself is the only way to make people realize your value many only understand what they had once it is gone the moment you show that you are willing to leave when necessary people begin to treat your presence with the respect it deserves this is not about manipulation it’s about setting a standard for how you expect to be treated kindness should never come at the cost of self-worth as senica stated associate with people who are likely to improve you surrounding yourself with those who respect and uplift you is not selfish it is essential for personal growth and mental well-being in today’s fast-paced world where relationships and professional environments can often become transactional it is easy to fall into the Trap Of overgiving The Secret of modern stoicism lies in Striking the perfect balance being kind yet firm G generous yet Discerning compassionate yet self-respecting the ability to walk away when necessary does not make you unkind it makes you wise those who truly value you will respect your boundaries and those who do not were never worthy of your kindness in the first place life is too short to spend it proving your Worth to those who refuse to see it the moment you internalize this truth you not only command respect effortlessly but also cultivate inner peace the ultimate stoic secret to a fulfilling life kindness is a virtue but without wisdom it can lead to disrespect and exhaustion the key is balance being generous yet Discerning compassionate yet firm set boundaries protect your energy and give where your kindness is valued true respect starts with self-respect if you found this video helpful like share and subscribe to the channel turn on notifications so you don’t miss our next video on stoic wisdom for a stronger wiser life see you next time are you being too kind seven lessons on how to deal with those who hurt you modern stoicism don’t set yourself on fire to keep others warm this powerful saying captures a key lesson we often Overlook in our quest to be kind and generous while kindness is a virtue that strengthens relationships and builds character there are moments when being too kind can come at a cost our own well-being in today’s video we’ll dive into how modern stoicism offers invaluable wisdom on balancing generosity with self-care will explore seven powerful lessons on how to navigate relationships set healthy boundaries and stop sacrificing our mental emotional and physical health for the sake of others are you someone who tends to put others first even when it harms you let’s talk about how you can use stoic principles to protect your peace while still being the compassionate person you are if you’ve ever struggled with setting limits in your relationships leave a comment below and share your experience don’t forget to subscribe to stoic secrets for more insights on how stoicism can help you live a life of balance resilience and personal growth number one don’t set yourself on fire to warm others in Modern Life we often find ourselves caught in the cycle of giving whether it’s helping a colleague with a project so supporting a friend through a tough time or stepping in to fix someone else’s problem while kindness and generosity are noble virtues there’s a crucial lesson from stoicism that we must remember don’t set yourself on fire to warm others this stoic principle speaks to the importance of maintaining boundaries and not sacrificing your own well-being in the name of helping others stoicism encourages us to live in accordance with reason and virtue which includes making thoughtful decisions rather than acting impulsively or out of an emotional desire to please others it teaches that we must first tend to ourselves if we are to be of any true help to others there is a fine line between offering assistance and overextending ourselves to the point of exhaustion when we constantly give without checking in on our own needs we risk burning out physically emotionally and M mentally the act of self-sacrifice though often celebrated in modern culture can be counterproductive if it leads to our own suffering in today’s fast-paced world saying yes is often seen as a sign of commitment Good Will and even self-worth however this desire to be helpful or liked can make us blind to the toll it takes on our own lives we can easily become the person who is always ready to lend a hand but never takes time for their own needs as the stoic philosopher epicus wisely stated when you are about to start some task stand for a moment and reflect on the nature of the task you are about to perform this simple but profound advice encourages us to pause before jumping into another commitment it’s important to ask ourselves will helping this person take away from my ability to care for myself if the answer is yes it may be time to practice the stoic virtue of self-discipline and set a boundary this act of reflection doesn’t mean we lack compassion it simply means we recognize that true generosity comes from a place of balance not from self-destruction in our relationships especially with loved ones there’s an underlying temptation to give so much of ourselves that we lose sight of our own needs we may find find ourselves taking on too much thinking we can handle it all but just as a candle cannot burn at both ends in definitely we too cannot sustain endless self-sacrifice without burning out stoicism teaches us that our actions should be governed by Reason Not by guilt or obligation we need to assess whether the task at hand aligns with our values and whether it is a reasonable request to help others with without harming ourselves requires wisdom and discernment in modern stoicism this means taking a step back to ensure we are not giving at the expense of our mental and physical health moreover stoicism reminds us that we cannot control how others respond to our boundaries in fact we may face resistance or even criticism when we choose to say no but this too is part of the stoic practice of accepting what is beyond beond our control the most important thing is that our actions align with our own well-being and integrity Marcus Aurelius the Roman Emperor and stoic philosopher taught waste no more time arguing about what a good man should be be one this wisdom encourages us to act in accordance with our values without feeling the need to justify our choices to others saying no when needed is not a failure of kindness it is a conscious decision to preserve our own peace and resources so we can continue to offer help when it truly serves both others and ourselves in Modern Life where the pressure to constantly give and be available can be overwhelming practicing the art of balance is crucial remember that true generosity doesn’t mean sacrificing your happiness or health it means offering what you can in a sustainable and mindful way by learning to set boundaries and make thoughtful decisions we can live according to the wisdom of stoicism and cultivate a life that honors both our ability to help others and our need for self-care number two reciprocity has an expiration date in a world where we often seek validation stoicism offers us an alternative giving freely without the expectation of anything in return this ancient philosophy teaches that the true value of generosity lies not in what we receive but in what we offer to others when we extend kindness support or love without any anticipation of reciprocation we create a source of inner peace and fulfillment however as human beings we are naturally inclined to hope for some form of acknowledgement or return whether it’s a favor gratitude or simply a gesture of kindness this natural desire to receive something in return can lead to disappointment frustration and even bitterness when our expectations are not met the emotional toll of expecting reciprocity can be profound as we might start mentally tallying up what others owe us whether it’s a favor or a thank you when these debts go unpaid we can feel hurt or betrayed and that emotional burden can chip away at our sense of well-being modern stoicism however teaches us to break free from this cycle of expectation epicus one of the great stoic philosophers famously stated there are two rules to keep ready that there is nothing good or bad outside my own choice and that we should not try to lead events but follow them this powerful teaching reminds us that while we cannot control how others respond to our generosity we can control how we choose to act and react by relinquishing our expectations of reciprocation we free ourselves from the emotional roller coaster that often accompanies unfulfilled desires the more we give without expecting a return the more we cultivate a sense of emotional freedom in this way we are no longer dependent on others to meet our our emotional needs or validate our worth think about the peace that comes from giving for the sheer Joy of it without attaching any strings this sense of Detachment from expectations is not only liberating but essential for our mental well-being it allows us to preserve our peace of mind even in the face of indifference or in gratitude in the modern world we are constantly bombarded with messages that tell us to expect more or demand better but stoicism teaches us that true wealth doesn’t come from material possessions or reciprocal acts it comes from the ability to give without wanting anything in return when we practice this we enrich our lives in ways that are far deeper than any external rewards could provide by embracing this mindset we maintain a sense of equinity and inner tranquility regardless of how others respond to our kindness as you navigate life’s interactions remember that giving

    without expectation is not a sign of weakness or naivity it is a powerful form of emotional resilience in fact it strengthens your inner resolve and enables you to weather the ups and downs of relationships without being tossed around by every slight or unfulfilled promise the stoic philosophy ER Sena echoed this sentiment when he said it is not the man who has little but he who desires more that is poor by focusing on the act of giving rather than on what we might receive we redefine our sense of wealth and fulfillment in the end the key to True generosity is not what we get from others but the peace we cultivate within ourselves as a result of giving freely and without expectation [Music] in the fastpaced and often transactional world we live in today adopting the stoic practice of giving without the need for reciprocity is not only a way to preserve your peace of mind but it is also a profound Act of self-care it allows you to move through life with Grace undisturbed by the fluctuations of others Behavior so the next time you offer something to someone whether it’s a helping hand a kind kind word or an act of Love remember that your true reward is not in what you receive in return but in the calm and fulfillment that come from giving freely without the burden of expectation this is the essence of modern stoicism the freedom that comes when we stop seeking approval and start living according to our own principles of kindness and generosity number three received requests have no limits one of the core principles of stoicism that many of us tend to overlook in our busy fast-paced lives is the importance of setting limits especially when it comes to helping others in a world that constantly demands our attention it can feel like we’re always on call ready to assist give advice or offer emotional support to those who reach out and as human beings it’s natural to want to help we feel good when we are generous when we show kindness and when we make others feel supported but here’s the catch without clear boundaries our willingness to help can quickly spiral into frustration resentment and burnout have you ever said yes to someone even when you felt like saying no simply because you didn’t want to disappoint them or felt guilty for not being able to help it’s easy to slip into this pattern when we lack the courage to set limits however this unchecked eagerness to help others can leave us emotionally drained physically exhausted and mentally overwhelmed and worse it can prevent the very people we’re trying to help from developing the strength and Independence they need to navigate their own lives take the story of a mother who spent her entire life caring for her adult daughter who struggled with illness the mother’s love and support were constant always available and always filled with care but in her efforts to protect and care for her daughter the mother unintentionally stunted her daughter’s growth she did everything for her handled the chores managed the finances and even made decisions that the daughter should have been making herself the mother’s unrelenting desire to help created a pattern of dependency that kept the daughter from learning how to manage on her own when the mother passed away the daughter was suddenly forced to stand on her own to everyone’s surprise she adjusted remarkably well she stepped up took responsibility and began thriving without her mother’s constant help the tragedy here wasn’t the loss of the mother but that her constant giving prevented her daughter from learning how to take charge of her own life life the lesson here is simple yet profound when we overh help we risk preventing others from discovering their own strength from a stoic perspective this is a powerful illustration of why setting boundaries is not just a tool for protecting our own well-being but a crucial part of fostering Independence in others stoicism teaches us that we must learn to distinguish between times when we can truly offer help and times when our assistance may actually be more harmful than beneficial as Marcus Aurelius one of the greatest stoic philosophers famously said a man’s job is to stand upright not to be kept upright by others this quote is a reminder that while helping others is a noble and compassionate act there’s a limit to how much we should intervene in the lives of others by constantly offering assistance Without Limits we may inadvertently dis Empower others from developing the skills they need to face their own challenges think about it how many times have you stepped in to solve someone else’s problem only to realize later that your help didn’t actually solve anything or worse that it only delayed their growth in those moments it’s important to ask yourself is this a situation where my help is necessary or is it one where this person needs to learn and grow on their own own setting clear and healthy boundaries doesn’t mean you don’t care or that you’re unwilling to help it’s simply means that you recognize when your help will be empowering and when it might inadvertently prevent someone from standing on their own by setting limits you not only protect your own energy but also help the people you care about to build their own resilience stoic Secrets like this remind us that generosity isn’t just about giving Without Limits it’s about knowing when and how to give in a way that Fosters long-term growth for both the giver and the receiver we need to balance our kindness with wisdom and that starts with asking is my help really helping here or am I just making it easier for someone to avoid their own responsibility the next time someone asks for your assistance take a moment to reflect ask yourself whether this is a opportunity to guide them toward Independence or whether you’re simply doing what they could and should be doing for themselves by setting healthy boundaries you’re ensuring that your generosity doesn’t come at the cost of your well-being and that it empowers others to manage their own lives boundaries are not just a way to protect your time and energy they are a way to teach others how to take charge of their own growth so let your kindness be a gift that supports Independence rather than creating dependency remember true help isn’t about doing things for others but about giving them the tools and space to do things for themselves if something from today’s video resonated with you share your thoughts in the comments below whether you’re new here or have been with us for a while I want to hear from you if you’re just joining us comment I’m new here or if you’re a seasoned member of our Community drop her I’m seasoned member in the comments to let us know how you’ve been applying these stoic principles in your life your engagement means so much and is a constant source of inspiration for us to keep creating meaningful content now let’s continue our journey of stoic wisdom together number four being seen and treated as fragile in today’s fast-paced world where the pressure to be kind helpful and accommodating is ever present we often Overlook a critical aspect of personal well-being the importance of setting boundaries we may feel compelled to give freely help whenever we can and always say yes to the demands of others however if we give too much without recognizing our own limits we risk not only burning ourselves out but also being perceived as fragile or incapable of asserting our needs this perception can undermine our Authority erode respect and in the long run damage our sense of self-worth this is a fundamental lesson rooted in stoic philosophy which emphasizes Inner Strength self-control and the importance of respecting oneself when we fail to set clear boundaries in our relationships we inadvertently open ourselves up to exploitation it is easy to fall into the Trap of trying to please others driven by a desire to be liked or to feel needed we want to be seen as generous understanding and compassionate but there is a fine line between being helpful and over extending ourselves if we are always available always ready to lend a hand and never set a firm no we send a message to others that we lack the strength to protect our time energy and emotional well-being over time this continuous availability can lead to exhaustion and frustration as others may take advantage of our kindness expecting more from us than is reasonable the issue however is not our desire to help it’s that we haven’t properly safeguarded our own well-being by setting boundaries stoicism offers a powerful remedy for this situation at its core stoic philosophy teaches us to respect ourselves and our time by asserting our boundaries we communicate to others that we value our energy and resources and that we are not endlessly available for the taking saying no is not a sign of selfishness but an important exercise in self-respect when we set clear limits we redefine how others perceive us not as a person to be exploited but as someone who values their own time and well-being as Cicero a well-known stoic philosopher reminds us what you think of yourself is much more important than what others think of you this simple but profound statement reflects the stoic belief that our sense of self-worth should not be defined by external approval or the opinions of others but by our own principles and the respect we show ourselves while saying no might feel uncomfort able especially in a world that often equates kindness with accommodating others it is essential for maintaining our own mental and emotional health in Modern Life we are often made to feel guilty if we don’t help others or if we refuse requests that drain us we may worry about exclusion criticism or being seen as unkind these feelings are natural but from a stoic perspective they are opportunities for growth the discomfort we feel in asserting our boundaries reveals our attachment to the approval of others and challenges us to examine our priorities stoicism teaches us that such challenges are not obstacles but tests of our inner strength and wisdom by facing these tests we gain valuable insights into who truly respects our boundaries and who is simply taking advantage of our generosity over time we become more skilled at Discerning who deserves our time and energy and who simply seeks to exploit our kindness setting boundaries is not about shutting ourselves off from others it’s about creating space for the things that truly matter it’s about making sure we can give to others in a sustainable way without depleting ourselves healthy boundaries allow us to engage with the world from a place of strength not fragility they help us protect our well-being while still fostering meaningful relationships with those who respect us and reciprocate our efforts when we say no we are not rejecting others we are protecting ourselves ensuring that we can continue to contribute positively and maintain a healthy balance in our lives modern stoicism teaches us that by navigating the challenges of setting boundaries we cultivate resilience and self-awareness each time we practice the art of saying no we become better at balancing our generosity with self-respect ultimately leading to deeper more fulfilling relationships this practice strengthens us and those around us enriching our lives and helping us live with greater purpose and Clarity in a world that often demands more than we can give stoicism offers a frame work for reclaiming our strength and ensuring that our kindness is sustainable by setting boundaries with respect and Clarity we can navigate our relationships with wisdom avoid burnout and build a life where both our own needs and the needs of others are honored through Modern stoicism we learn that true strength comes not from constant giving but from knowing when to say no and preserving our energy for what truly matters number five we will see who our true friends are in today’s world where superficial and transactional relationships often dominate stoicism encourages us to approach our interactions with discernment and wisdom at the core of stoic philosophy is the belief that actions speak louder than words true friendship according to stoicism is Def defined by consistent thoughtful actions rather than Grand promises or declarations not all relationships are built on this Foundation often we encounter people who value US not for who we are but for what we can provide these individuals may seek our company when we are generous with our time energy or resources only to distance themselves once we stop overextending ourselves while this can be painful stoicism helps us view such experiences not as betrayals but as opportunities to understand the true nature of these relationships as Marcus Aurelius wisely said when you are offended at any man’s fault turn to yourself and reflect in what way you are a culprit by embracing this self-reflection we can move past resentment and accept that others Behavior often reflects their needs and limitations rather than our worth stoicism also emphasizes the practice of discernment which allows us to differentiate between genuine relationships and those that are opportunistic it teaches us to observe not only what people say but how they act especially in times of need this Discerning perspective is invaluable in navigating both personal and professional Relationships by focusing on those who truly appreciate us for Who We Are we can protect our emotional well-being and invest our energy in relationships that are mutually beneficial stoicism does not discourage generosity or kindness but it advocates for directing these qualities toward people who will value them when we stop overextending ourselves we create space for more authentic connections relationships that are based on respect reciprocity and shared growth by doing so we preserve our our energy and flourish in environments where our presence is respected not exploited the reality is that relationships may not always stay balanced people we thought would be there for us may turn away when the dynamic of give and take shifts however stoicism helps us deal with these disappointments with Grace it teaches us that we cannot control others actions but we can control how we respond we are not respons responsible for others choices but we are responsible for how we navigate these situations the stoic approach encourages us to let go of resentment and focus on cultivating relationships that support our growth and well-being true friends are not just there in times of convenience but are those who respect our boundaries offer support in struggles and encourage our development these are the relationships that bring True Value to Our Lives as we practice discernment we create space for Meaningful lasting connections that enhance our lives in profound ways these relationships grounded in mutual respect and understanding encourage us to reflect on the quality of the connections we maintain stoicism teaches that true friendship is about understanding and being understood as senica said one of the most beautiful qualities of true friendship is to understand and to be understood in Modern Life where we are often distracted and pulled in many directions this stoic perspective on friendship provides both Clarity and a sense of Peace it reminds us that the quality of our relationships not their quantity is what truly matters modern stoicism teaches us that the true measure of friendship lies not in what others cannot offer us but in how they value us as individuals by practicing discernment and reflecting on the quality of our relationships we can identify those who genuinely support us and invest our time and energy in those connections we are not obligated to maintain relationships that drain us or leave us feeling unappreciated instead we can focus on cultivating authentic meaningful relationships that contribute to our well-being and fulfillment embracing this stoic approach frees us from the disappointment of shallow one-sided friendships and opens the door to deeper more rewarding connections that sustain us over time number six the power of emotional Detachment one of the most commonly misunderstood Concepts in stoicism is emotional detachment many believe it means becoming cold indifferent or even heartless in reality emotional Detachment is about learning to manage our emotions so that they do not control our actions or reactions in a world where we are constantly faced with emotional triggers whether it’s a harsh comment from a coworker a misunderstanding with a friend or everyday stress stoicism offers a valuable tool for navigating this emotional turbulence it teaches us to respond with Reason Not impulse the goal isn’t to suppress or ignore our feelings but to understand them and choose how we respond to them by doing this we can avoid reacting in ways that do not align with our values or best interests when we practice emotional Detachment we are not denying our feelings we are simply preventing them from dictating our behavior for example imagine imagine you’re in a meeting and a colleague sharply criticizes your idea your first instinct might be to feel anger or frustration and perhaps even to respond defensively but stoic emotional Detachment encourages you to pause and reflect before reacting in that moment you can take a deep breath acknowledge your feelings and choose a response that is thoughtful measured and aligned with your values this pause between stimulus and response is key in stoic philosophy it allows us to see emotions as signals not commands rather than being Swept Away by emotional impulses we can choose the best course of action preserving our dignity and peace of mind this practice of emotional Detachment becomes especially important when others attempt to provoke us or manipulate our emotions for example if a friend or family member says something hurtful emotional Detachment helps prevent an impulsive reaction it doesn’t mean you stop caring about others or their feelings rather it means you don’t let their behavior disturb your inner peace by managing our emotions we can stay grounded and calm in situations that might otherwise lead to unnecessary conflict this approach isn’t about avoiding difficult conversations or conflict but responding to Life’s challenges from a place of clarity and reason take Sarah for example she often found herself in conflict with her friends every time someone made a critical or hurtful comment she immediately felt wounded which led to arguments and strained relationships one day Sarah decided to practice emotional Detachment the next time a comment upset her instead of reacting immediately with anger or hurt she paused she took a moment to the time Sarah found that she wasn’t as affected by the words of others she still cared about her friends but emotional Detachment helped her respond calmly and thoughtfully ultimately bringing her more peace as the stoic philosopher epicus wisely said wealth consists not in having great possessions but in having few wants this concept of Detachment is key when we detach from the need to control everything or everyone we open up space for Freedom emotional Detachment allows us to preserve our peace and respond to Life’s challenges in a measured way protecting our emotional well-being and avoiding unnecessary conflict it also helps us deal with toxic individuals who might try to drain our energy or bring negativity into our lives by practicing Detachment we can protect ourselves from their harmful behaviors and remain focused on what truly matters it’s important to note that emotional Detachment is not about becoming emotionally numb or disengaged rather it’s about consciously choosing how we respond to the world around us when we practice Detachment we gain the ability to respond with logic and Clarity instead of emotional impulsivity this practice helps us build healthier more balanced relationships because we are no longer at the mercy of emotional highs and lows we can still care deeply about others but we no longer let their actions determine our emotional state stoic Secrets like this teach us that by letting go of the need to control everything we gain control over our own happiness and inner peace the next time you find yourself in an emotional situation ask yourself am I reacting out of impulse or am I responding with calm and Clarity by practicing emotional Detachment you can maintain control over your emotions protect your inner peace and navigate even the most challenging situations with Grace emotional Detachment is not about being cold or detached from others it’s about being wise enough to recognize your emotions and choose the best response no matter what life throws your way this practice empowers you to live more peacefully thoughtfully and authentically number seven letting go of past hurts letting go of past hurts is one of the most liberating practices we can Embrace in our lives holding on to grudges anger or resentment only serves to poison our own minds and Spirits leaving us trapped in negative emotions that prevent us from fully experiencing the present in fact clinging to these feelings doesn’t harm the person who wronged us it harms us modern stoicism teaches us that forgiveness is not just a moral or ethical Choice it is a powerful means of freeing ourselves from emotional burdens that weigh us down the pain we hold from the past often tethers us to harmful emotions keeping us stuck in a cycle of frustration and Sorrow by choosing to release these emotional weights we open ourselves to a life of peace tranquility and emotional Freedom it’s crucial to understand that Letting Go doesn’t mean forgetting or excusing the actions of others it means making the conscious decision to sever the emotional attachment to those past events that caused us pain choosing instead to focus on our own healing and growth stoicism encourages us to focus on what is within our control our our thoughts feelings and responses while accepting that we cannot change the past in doing so we gain the power to move forward instead of being defined by the wrongs done to us Marcus Aurelius one of the most revered stoic philosophers offers powerful guidance on this subject when he says the best revenge is to be unlike him who performed the injury this wisdom teaches us that the most effective way to respond to harm is not through retaliation or bitterness but by Rising above it maintaining our integrity and using the experience as a stepping stone for personal growth choosing to rise above harm allows us to preserve our peace of mind and keep our emotional equilibrium intact rather than being Shackled by resentment we can reclaim our inner peace and emotional strength the act of Letting Go begins with a an knowledging the pain and reflecting on its source it is only through understanding the root causes of our emotional hurt that we can begin the process of releasing it mindfulness and self-reflection are invaluable Tools in this journey of forgiveness they allow us to step back and look at our emotions objectively helping us separate the person who hurt us from the emotional baggage We Carry in the process of forgiving we don’t condone the behavior that caused us harm we simply choose to no longer allow that behavior to have a hold on our present state of being in this way forgiveness becomes not a gift we give to others but a gift we give ourselves allowing us to break free from the chains of anger and resentment by letting go of past hurts we release ourselves from the cycle of pain and open up space for healing emotional balance and stronger more authentic relationships this is a practice that directly aligns with the stoic goal of cultivating emotional resilience allowing us to live more freely and fully in the present moment forgiveness is not about excusing harmful Behavior or forgetting the wrongs that were done to us it’s about choosing peace over bitterness it’s about acknowledging the hurt learning from it and then choosing to release the hold it has over us it’s a process of reclaiming our emotional freedom and taking back control of our lives in doing so we make space for a future that is not burdened by the weight of past grievances by choosing to forgive we become better versions of ourselves more compassionate more resilient and more focused on creating a life rooted in peace rather than past pain modern stoicism reminds us that we are the masters of our responses and by by letting go of past hurts we reclaim our power and create room for Joy growth and emotional balance when we practice forgiveness we are not only improving our emotional health but we are also strengthening our relationships and cultivating a future that is open to possibility rather than weighed down by the Shadows of the past letting go of past hurts is essential for emotional well-being and it is one of the most free steps we can take in our personal development by embracing the stoic principle of forgiveness we clear the path for emotional balance healing and deeper connections with others as we let go of resentment and bitterness we unlock the freedom to move forward with a lighter heart and a clearer mind in this way forgiveness becomes the key that unlocks the door to a brighter more peaceful future one that is no longer defined by past pain but by the strength resilience and wisdom we gain from overcoming it what do you think about setting boundaries to protect your peace it can be tough but it’s so necessary for our emotional health here are three simple responses you can share in the comments boundaries are essential for peace or it’s hard but necessary or setting limits saves energy be sure to watch until the end of the video especially the section on insights on healing and setting boundaries you’ll find some deep thought-provoking tips that could change how you approach relationships insights on healing and setting boundaries having explored seven crucial lessons on how to deal with those who hurt you it’s time to delve deeper into to the next phase of healing and personal growth once we understand these lessons the next step is to gain further insights into how to heal set healthy boundaries and cultivate emotional resilience let’s now explore how you can continue your journey toward emotional well-being and self-empowerment number one developing self-worth and self-love self-worth is the internal compass that shapes how we perceive ourselves and is essential for setting boundaries that protect our emotional well-being it is not determined by others opinions or actions but by recognizing our own intrinsic value modern stoicism teaches us to cultivate self-worth from within rather than relying on external validation when we learn to see ourselves as valuable and Des deserving of respect we naturally create boundaries that preserve our peace of mind this self-awareness serves as a shield preventing others from taking advantage of us or diminishing our sense of worth the Cornerstone of this process is self-love a practice that nurtures our emotional health and strengthens our ability to stand firm in our decisions self-love is not about selfishness or narcissism it is about cultivating a balanced sense of self-respect and treating ourselves with the same kindness and compassion we would offer to a dear friend by embracing self-love we set an example for how we wish to be treated and we can enforce the boundaries that Safeguard our emotional well-being without self-love asserting our needs or saying no can become difficult often leaving us conflicted or guilty building self-worth involves understanding that our value does not depend on external approval an essential part of this process is practicing self-compassion when we make mistakes or face setbacks instead of being harsh on ourselves we learn to treat ourselves with the same understanding we would extend to others as the stoic philosopher epicus said wealth consists not in having great possessions but in having few wants similarly our true wealth lies in our ability to recognize and affirm our own worth rather than depending on others opinions practicing self-compassion helps to strengthen our emotional resilience and positive affirmations can reinforce our self-esteem each small victory no matter how seemingly insignificant should be celebrated as it builds confidence and belief in ourselves by acknowledging our progress we reinforce our worthiness of love respect and care another key aspect of self-worth as taught by stoicism is focusing on what we can control in Modern Life we cannot control the actions of others or external circumstances but we can control our reactions by cultivating self-love we free ourselves from the need for external validation as we no longer depend on others to feel secure in our worth this emotional Independence is crucial for developing the resilience needed to set and maintain healthy boundaries as Marcus Aurelius wisely said the happiness of your life depends upon the quality of your thoughts if we reinforce our selfworth and treat ourselves with respect we create a solid foundation for emotional well-being this Inner Strength allows us to maintain boundaries without guilt or second guessing our decisions in a world where external pressures and societal expectations often fuel self-doubt developing a strong sense of self-worth has never been more important it empowers us to prioritize our needs and establish relationships that are mutually respectful and supportive by setting boundaries rooted in self-love we approach others from a place of emotional strength ensuring that our relationships enhance Our Lives rather than depleting us moreover developing self-worth and self-love is an ongoing Journey not a one-time effort each day presents an opportunity to reaffirm our value practice self-compassion and protect our emotional well-being with the wisdom of modern stoicism we are reminded that by focusing on what we can control our thoughts and actions and responses we can navigate life’s challenges with resilience and peace through self-love we build a deep Inner Strength that supports Us in all areas of life enabling us to grow heal and Thrive cultivating self-worth and self-love is essential for living a fulfilling and peaceful Life by recognizing our inherent value we create space for healthy relationships and meaningful connections modern stoicism teaches us that we are The Architects of our own happiness and by embracing our worth we free ourselves from the need for external validation this emotional Independence allows us to protect our well-being while fostering relationships that are rooted in mutual respect as we continue to nurture self-love we equip ourselves with the emotional resilience needed to face life’s challenges with confidence creating a life that aligns with our true values and is authentic to our inner selves number two the importance of patience and understanding one of the most powerful stoic Secrets is the virtue of patience and understanding particularly when we face the pain caused by others in a world where we’re often encouraged to react quickly and defend ourselves in the face of hurt stoicism offers a different approach creating space between our emotions and our actions when we’re hurt our immediate Instinct might be to lash out or defend ourselves but stoicism teaches us to pause Instead This pause allows us to reflect process our emotions and choose a thoughtful response rather than reacting impulsively practicing patience helps us build emotional resilience ensuring that we’re not controlled by our immediate reactions it doesn’t mean suppressing feelings but rather understanding and managing them to make better decisions in difficult situations a key aspect of patience is understanding the behavior of others it’s easy to take offense when someone says or does something hurtful but often their actions come from their own struggles when we see their behavior through the lens of compassion instead of of anger we realize their actions might be more about them than about us people often lash out because they’re dealing with their own pain or unresolved issues understanding this helps us respond with empathy not resentment this shift in perspective doesn’t excuse harmful Behavior but it allows us to protect our peace and avoid letting their actions disrupt our emotional state with patience we create space for both both ourselves and others to heal enabling us to respond with more clarity and calm emotional healing too requires patience when we’re hurt the natural urge is to move past the pain quickly however emotional wounds don’t heal overnight if we rush through the process we might only cover the wound temporarily without truly addressing the underlying issue stoicism teaches that emotional healing is a journey much like physical healing instead of suppressing or rushing our feelings we should give ourselves time to process and reflect on them patience allows us to heal more fully gaining Clarity and resilience this process isn’t always easy but through patience we grow stronger from our experiences and emerge with a healthier mindset consider a modern example Sarah a young woman who often found herself in conflict with her friends each time someone made a hurtful comment Sarah’s first reaction was anger leading to arguments and strained relationships one day she decided to apply the stoic principle of patience the next time she was hurt she paused and reflected she realized her friend was struggling with personal issues and the comment wasn’t a personal attack on her this shift in perspective allowed ER to respond with understanding instead of defensiveness over time her practice of patience not only helped her heal emotionally but also strengthened her relationships and brought her a deeper sense of Peace as stoic philosopher epicus said wealth consists not in having great possessions but in having few wants in the same way emotional wealth isn’t about avoiding pain or controlling every situation but about without cultivating patience and understanding in the face of adversity detaching from the need for immediate resolution allows us to approach challenges with wisdom and Grace practicing patience helps us respond thoughtfully preventing impulsive actions we might regret to cultivate patience in daily life try mindfulness practices like deep breathing meditation or simply taking a moment before reacting to emotional triggers these techniques help us slow down Center ourselves and respond more clearly the next time you’re hurt or facing a challenge ask yourself am I reacting out of impulse or am I responding with patience and understanding this question can help you apply the stoic secret of patience enabling you to navigate life with greater Clarity emotional resilience and peace patient allows us to protect our emotional well-being and respond with empathy both for others and for ourselves by practicing patience we can heal grow and ultimately find peace in the face of adversity number three the power of perspective one of the most powerful Tools in managing hurt and adversity is perspective modern stoicism teaches us that pain and suffering are inevitable but they don’t have to Define us while we can’t always control what happens we can control how we respond pain rather than being our enemy can be a catalyst for growth resilience and self-discovery by adjusting our perspective we can transform difficult situations into opportunities for personal development instead of letting negative emotions consume us we can shift our view seeing pain as a lesson rather than a burden in this way we lighten the emotional load and turn adversity into a stepping stone for growth reframing negative events is a crucial skill for maintaining emotional balance instead of seeing hurtful situations as personal attacks we can choose to view them as valuable lessons for instance a difficult conversation with a friend might reveal where our communication needs Improvement or a challenging situation at work May highlight areas where we need to assert ourselves more confidently this shift in perspective doesn’t deny the hurt but reframes it allowing us to focus on what can be learned from the experience by changing the narrative we gain control over our emotional response which is key to navigating life’s difficulties with resilience resilience the ability to bounce back from setbacks thrives on this mindset shift it’s not about avoiding pain but learning to navigate it without losing emotional stability resilient individuals focus on what’s within their control our thoughts feelings and actions and remain Anchored In what truly matters our integrity and growth instead of being paralyzed by setbacks we use them as fuel for Progress this perspective allows us to stay grounded and move forward with determination even in the face of adversity a practical tool for shifting perspective is the practice of gratitude in a world that often highlights the negative gratitude helps us focus on the positives even in the toughest of times there’s always something to be grateful for a supportive friend a moment of peace or simply the chance to learn from a difficult experience making gratitude a habit trains our minds to look for the good in every situation helping us maintain a positive outlook even in challenging times stoic philosopher senica wisely said we suffer more often in imagination than in reality this reminds us that much of our pain is not from external circumstances but from our own negative interpretations gratitude and mindfulness help us stay grounded in the present preventing us from spiraling into despair another way to shift perspective is by challenging negative thoughts as they arise in moments of difficulty it’s easy to fall into self-pity or blame the stoics understood that our thoughts shape our emotional experience if we can recognize and challenge negative thoughts we regain control over how we respond acknowledging painful emotions without letting them control us allows us to reframe the situation and move forward with Clarity and strength the power of perspective is about more than just denying pain or pretending challenges don’t exist it’s about choosing how to respond to adversity stoicism teaches that we are not at the mercy of external events we hold the key to our emotional Freedom through our thoughts and attitudes by reframing negative experiences and maintaining a resilient Outlook we reduce the emotional turbulence that life brings as Marcus Aurelius wisely said the happiness of your life depends upon the quality of your thoughts in today’s world where challenges are constant the ability to shift perspective is more important than ever by practicing gratitude mindfulness and reframing we can navigate life’s difficulty ulties with emotional balance and purpose the power of perspective is essential for managing hurt and adversity by adjusting our mindset we not only release the emotional weight of pain but also create space for growth resilience and emotional strength through the lens of modern stoicism we can transform hardships into opportunities for self-improvement and learning we are not defined by the pain we experience but by how we Rise Above It by reframing challenges and focusing on what is within our control we Empower ourselves to live with greater Clarity peace and emotional balance based on the stoic principles you’ve been learning you’re building a strong inner resilience to manage your emotions and create a more peaceful Life share with us in the comments I value myself or I see challenges as opportunities for growth to let us know how you’re applying these principles in your life and don’t forget to stay tuned there’s only one lesson left and you’ll regret missing it number four practicing empathy and compassion empathy is the ability to understand and share the feelings of another and it plays a vital role in managing challenging relationships and emotional pain even when we are hurt empathy allows us to to pause and consider the other person’s motivations struggles and challenges rather than reacting impulsively with anger or resentment empathy provides the emotional space needed to respond thoughtfully this concept is deeply rooted in modern stoicism which teaches us that while we cannot control the actions of others we can control how we react as epicus wisely said it’s not what happens to you you but how you react to it That Matters by stepping into the other person’s shoes we break free from the cycle of emotional retaliation fostering our own healing and building healthier more balanced relationships this approach helps us make conscious choices that align with our values allowing us to move forward with Clarity and resilience compassion an extension of empathy acts as an antidote to resentment holding on to anger or bitterness only empowers others to control our emotions trapping Us in the very pain we seek to escape compassion on the other hand releases us from this grip it doesn’t mean tolerating mistreatment but rather approaching difficult situations with kindness and understanding without compromising our boundaries as Marcus Aurelius said the best revenge is to be unlike him who performed the injury compassion allows us to respond with dignity healing from past wounds while still protecting our peace of mind it enables us to let go of negative emotions freeing us to move forward without becoming bitter or emotionally drained empathy and healthy boundaries are not mutually exclusive they can coexist understanding the struggles behind another person’s harmful Behavior allows us to set clear and compassionate boundaries without escalating conflict we can acknowledge the other person’s pain while asserting our own needs and protecting our emotional well-being modern stoicism teaches that we have the power to control how we respond to others by practicing empathy we can protect our emotional health without compromising our values or becoming overwhelmed setting healthy boundaries ensures our peace while still respecting the humanity of others fost ing a balanced emotional environment cultivating empathy requires active listening and a conscious effort to understand others perspectives this involves more than hearing words it means recognizing the emotions and struggles beneath the surface reflecting on our own experiences of pain can deepen our empathy reminding us that everyone faces challenges even if they are not visible when we recall moments when we were hurt or misunderstood we develop a greater sense of compassion for others empathy in this way becomes both a tool for personal growth and a bridge to Stronger more resilient Relationships by practicing empathy regularly we navigate difficult relationships with more grace setting boundaries that protect us while fostering meaningful connections modern stoicism provides a powerful framework for practicing EMP empathy and compassion it teaches us that we cannot control others actions but we can control our responses by adopting this stoic mindset we learn to understand those who may hurt us protecting ourselves in ways that Foster personal growth instead of conflict stoic philosophy reminds us that true peace comes not from external circumstances but from maintaining inner calm and compos Ure when we approach hurt and betrayal with empathy and compassion we strengthen our emotional resilience and create space to set healthy boundaries that preserve our well-being these practices lead to a more Balanced Life free from anger and resentment enabling us to thrive emotionally and mentally practicing empathy and compassion doesn’t mean being passive or tolerating mistreatment it means responding to hurt with understanding while still protecting our emotional health modern stoicism teaches us that while we cannot control what others do we can control how we react by cultivating empathy we approach difficult relationships with compassion turning potential conflicts into opportunities for growth this balanced approach not only Fosters emotional healing but also strengthens relationships empowering us to move forward with greater peace and Clarity in our lives as we wrap up today’s video I want to remind you of the key takeaways setting boundaries is not just important it’s essential for maintaining your mental and emotional well-being by establishing clear boundaries you protect yourself from burnout and preserve your energy for the things that truly matter remember practicing stoicism in daily life through self-discipline emotional awareness and discernment will help you build stronger healthier relationships and navigate challenges with resilience and peace of mind now take a moment to reflect on your current relationships are there areas where you’ve been overextending yourself where can you set healthier boundaries to prioritize your own needs if you found today’s lesson helpful please like this video share it with someone who could benefit And subscribe to stoic secrets for more content on stoicism and personal growth don’t forget to turn on notifications so you never miss out on our upcoming videos thank you for being here today remember it’s okay to say no when you need to and true generosity always comes from a place of balance and self-respect I wish you strength and peace as you continue to apply stoic principles in your life see you in the next video nine ways how kindness will ruin your life stoicism modern stoicism while kindness is often celebrated as one of life’s greatest virtues what happens when that kindness begins to hurt more than it helps Society constantly pushes us to put others first encouraging selflessness as the ultimate goal but in the modern world excessive kindness can have unintended consequences it can leave you drained exploited and even stripped of your own sense of self-worth here at stoic secrets we uncover the Truths Behind modern stoicism and how its ancient wisdom can help us navigate these challenges in this video we’ll explore nine ways how kindness will ruin your life and reveal how the principles of stoicism can Empower you to set boundaries protect your well-being and transform your relationships for the better stay with us as we uncover how to make kindness a strength not a sacrifice number one people will take advantage kindness is often celebrated as a noble and admirable virtue a quality that strengthens relationships and fosters good will however when offered without boundaries it can become a double-edged sword cutting into your well-being and opening the door for others to take advantage of your generosity excessive kindness given freely and Without Limits sends the message that your resources whether time energy or effort are infinite and always available this creates fertile ground for exploitation where people begin to rely on you not because they value your help but because it has become convenient for them over time this imbalance subtly erodes mutual respect and leaves you feeling unappreciated even resentful picture a coworker who constantly leans on you to complete their tasks but never offers to assist you in return such a scenario illustrates how unchecked kindness Fosters dependence undervaluing your contributions while ignoring your boundaries this cycle of overextending yourself is not just emotionally draining but also counterproductive when you consistently give without considering your own needs you inadvertently teach others that your kindness is not a gift but an obligation they may come to expect your help as a given rather than appreciating it as an intent Act of Good Will Marcus Aurelius one of the great stoic philosophers reminds us you have power over your mind not outside events realize this and you will find strength his words underscore the importance of self-awareness and mindful action qualities that modern stoicism emphasizes as essential for navigating the complexities of contemporary Life by understanding your own limits and acting with intention you can ensure that your kindness remains meaningful and does not become a source of personal depletion in today’s fast-paced world where demands on our time and energy are constant the principle of setting boundaries is more important than ever boundaries are not about denying kindness but about protecting its integrity and ensuring that it is given from a place of genuine care rather than obligation when you communicate your limits confidently and assertively you teach others to respect your time and effort this Clarity Fosters a dynamic where kindness is valued and mutual respect is preserved setting these boundaries may feel uncomfortable at first but It ultimately empowers you to maintain balance and prioritize your well-being kindness when practiced with wisdom and moderation becomes a source of strength rather than a vulnerability modern stoicism offers valuable guidance here teaching us to approach kindness not as a limitless resource but as a deliberate choice that aligns with our principles by embracing the stoic ideal of temperance you transform your kindness into a practice that uplifts both yourself and others creating meaningful connections that are rooted in mutual respect as you navigate life’s complexities remember that kindness should not come at the expense of your own Inner Harmony by balancing compassion with self-awareness you create a life where your generosity remains a powerful force for good both for others and for yourself number two you may be seen as weak kindness when given freely and without boundaries can sometimes bring about unintended and even painful consequences what starts as a genuine desire to help can be misunderstood as a lack of resolve or strength encouraging others to take advantage of your accommodating nature have you ever had a friend who repeatedly borrows money never repaying it not because they can’t but because they see your generosity as weakness or perhaps a colleague who constantly relies on you to clean up their messes assuming you’ll always step in over time these situations can leave you feeling drained unappreciated and even disrespected your energy is consumed your confidence eroded and you may begin to wonder why your kindness doesn’t lead to the connection and appreciation you had hoped for the respect you once commanded starts to diminish as others assume you’ll always comply no matter how inconvenient or costly it is to you this isn’t just a blow to your emotional well-being it’s a quiet Insidious erosion of your dignity stoicism however offers a perspective that can help you navigate this delicate balance the philosophy teaches that kindness while a noble virtue is most powerful when it is deliberate and measured kindness without boundaries loses its Essence and often its value picture a workplace scenario a colleague consistently dumps l last minute tasks on you knowing you’ll never say no at first you take on the extra work out of a desire to be helpful or a fear of being seen as uncooperative but the weight of their responsibilities starts to overwhelm you finally you draw a line calmly explaining that while you’re happy to support when needed you can’t manage additional tasks at the expense of your own priorities to your surprise they don’t react negatively instead they acknowledge your honesty and make an effort to respect your time by asserting yourself you not only protect your energy but also shift the dynamic earning respect and fostering a healthier interaction the stoic secrets of inner strength and self-discipline remind us that saying no is not an act of Cruelty but a declaration of self-respect when you practice assertiveness you send a clear message your kindness is a conscious choice not a limitless resource to be taken for granted this approach allows you to build relationships grounded in mutual respect where kindness is a shared exchange rather than a onesided expectation true kindness uplifts both the giver and the receiver creating connections rooted in understanding and balance take a moment to reflect how often have you felt depleted because someone mistook your kindness for weakness could things have been different if you had established firmer boundaries stoicism doesn’t ask you to close your heart or become indifferent instead it calls you to protect your energy and ensure that your actions stem from strength and Clarity when you give freely but thoughtfully your kindness becomes more impactful and sustainable the next time you’re tempted to stretch yourself too thin pause and ask is this act of kindness coming from a place of genuine willingness or is it depleting me are you helping others while neglecting your own well-being remember the courage to say no when necessary is not selfish it’s an act of self-preservation that ensures you can continue to give authentically even the smallest no can be one of the kindest gifts you offer to your yourself and to those around you by embracing this balance you’ll find that your kindness becomes a source of strength enriching your relationships and your life in ways that are both profound and enduring number three your priorities will be ignored let’s take a deeper dive into kindness and how when it’s not balanced it can become a silent thief of your priorities and personal growth both picture this you’ve become the go-to person for everyone around you a coworker needs help finishing a project a friend needs advice late into the night your neighbor needs a hand with their latest Home Improvement naturally you step up helping others feels rewarding at first it’s uplifting to know you’re making someone’s life easier bringing a smile to their face or being the person they can count on but over time you begin to notice something the things that are most important to you are slipping further and further down your priority list that weekend project you wanted to finish still untouched the quiet evening of rest you promised yourself forgotten you’re running on empty frustrated and wondering where all your energy went have you ever asked yourself at what point does helping others turn into sacrificing myself this is where Modern stoicism provides much needed Clarity and direction if you’re constantly pouring yourself into others needs while neglecting your own you’re not engaging in kindness you’re engaging in self-neglect and here’s the hard truth when you allow your well-being to erode the kindness you offer becomes less effective and authentic how can you truly support others if your own Foundation is crumbling true kindness doesn’t require you to exhaust yourself or abandon your personal goals it comes from a place of balance where you can give generously because you’ve taken care of your own needs first think of it like this you can’t pour from an empty cup when you fail to set boundaries or say no when necessary you risk burnout resentment and a gradual loss of self-respect epicus wisely observed no man is free who is not master of himself so ask yourself are you in control of your time or are you letting the demands of others dictate your life the key to preserving both your kindness and your sense of self lies in learning to set firm compassionate boundaries saying no isn’t a rejection of others it’s an affirmation of your priorities and self-respect take a moment to reflect on what truly matters to you when someone asks for your help pause and ask yourself will this align with the life I want to build communicating your needs openly and honestly with yourself and with others is one of the most empowering acts of self-care you can practice it’s not about being selfish it’s about ensuring that your kindness is sustainable and that it enhances your life as much as it supports others remember your time and energy are finite resources and how you spend them shapes the person you become balance is everything when you protect your priorities you’re not just benefiting yourself you’re also ensuring that the help and support you offer come from a place of genuine strength and abundance modern stoicism teaches us to live intentionally to focus on what we can control and to build lives filled with purpose and fulfillment so let me leave you with this question how can you give your best to the world if you’re not being true to yourself number four you will attract opportunists excessive kindness though admirable in intent can sometimes have unintended consequences attracting opportunists who see your generosity not as a meaningful Exchange but as an endless resource to exploit imagine a colleague who consistently asks for favors borrows your time or leans on your support yet never reciprocates when you are in need these are not mere instances of imbalanced kindness they are warning signs of relationships that take far more than they give over time such Dynamics do more than exhaust your physical energy they deplete your emotional Reserves leaving you feeling unvalued and drained the wisdom of the ancient stoic philosopher epicus offers Insight here it is impossible for a man to learn what he thinks he already knows this serves as a call to approach relationships with Clarity and self-awareness recognizing the critical difference between genuine connections and exploitative ones the core of stoic philosophy lies in discernment the ability to evaluate situations and relationships with wisdom and precision this is especially vital in today’s fastpaced and interconnected world where opportunities for connection abound but so too do the risks of engaging with individuals who lack mutual respect or Genuine appreciation relationships that thrive are built on shared effort Mutual care and a sense of equality while those with opportunists often become imbalanced leaving one party to carry the weight of the connection perhaps you’ve encountered people who consistently demand your attention time or resources but never offer anything meaningful in return in such situations the stoic secret to peace lies in establishing and maintaining boundaries a practice that isn’t selfish but essential for preserving your self-worth and well-being setting clear expect ations in relationships is a profound Act of self-respect by observing how others respond to your boundaries you can discern who truly values your kindness and who merely seeks to benefit at your expense those who genuinely care will respect your limits while opportunists will often become frustrated or withdraw when they realize they cannot take advantage of you senica’s Timeless advice associate with those who will make a better man of you serves as a reminder to carefully choose your companions and focus on fostering relationships that contribute to your growth and Happiness by prioritizing connections with individuals who uplift and support you you align yourself with stoic principles of balance and virtue ensuring your kindness is met with equal appreciation and reciprocity kindness should never come at the cost of your inner peace your emotional stability it is a powerful and transformative Force but it must be guided by wisdom and self-awareness to wield kindness effectively you must learn to balance generosity with discernment understanding that not every relationship is worth your time and energy by practicing self-reflection and remaining Vigilant in your interactions you protect yourself from the emotional toll of one-sided Connections in instead you create space for Meaningful enriching relationships that Inspire and fulfill you the stoic secrets of discernment and self-awareness provide Timeless guidance for navigating these challenges allowing your kindness to shine as a light that warms others while preserving your own flame in doing so you live in harmony with stoic ideals embodying a life of wisdom virtue and resilience let me ask you this are you ready to reclaim your time protect your energy and align your relationships with your values if so take the first step now like this post and share your thoughts below kindness with wisdom is power remember true strength lies not in giving endlessly but in Discerning where your kindness will truly Thrive number five you will be doubted kindness though often celebrated as one of Humanity’s greatest virtues can sometimes bring about unexpected challenges for those who practice it consistently and wholeheartedly while acts of generosity are generally appreciated when your kindness becomes frequent or seemingly excessive it may invite unwarranted skepticism people might question your motives suspecting that your actions are more strategic than sincere as if hidden agendas were driving your Goodwill for instance if you consistently assist a coworker with their tasks the quiet hum of office gossip might suggest you are seeking to Curry favor with your boss rather than simply extending a helping hand this type of Suspicion though often baseless has a way of straining relationships and unsettling your confidence over time the weight of being Mis understood or undervalued might even lead you to question the worth of your kindness causing you to suppress your natural inclination to do good modern stoicism however offers an empowering perspective to navigate these moments of doubt it encourages us to ground our actions in our principles and focus on the purity of our intent rather than the shifting perceptions of others Marcus aelius wisely noted waste no more time arguing about what a good man should be be one this Timeless reminder serves as a beacon guiding us to act according to our values regardless of how others interpret our actions if your kindness stems from a genuine place of virtue and integrity no amount of external doubt

    should deter you yes misunderstandings and skepticism are inevitable but your purpose is not to control control others opinions it is to remain steadfast in living as the person you strive to be the key to overcoming this challenge lies in unwavering consistency when your actions consistently reflect your values they create a pattern of sincerity that becomes impossible to ignore even those who doubt your motives initially may come to recognize the authenticity behind your Deeds As Time unfolds while you cannot expect to change every skeptical mind those who truly matter will eventually understand your intentions in the meantime it is essential to remember that others judgments are beyond your control as epicus wisely observed it is not what happens to you but how you react to it that matters holding on to this perspective allows you to maintain your integrity and peace of mind in the face of external doubts in today’s world where cynicism often overshadows Goodwill staying committed to kindness requires resilience and self-awareness your acts of generosity are not transactional they are a reflection of your character and values if others doubt your motives resist the temptation to retreat into bitterness or defensiveness instead treat these situations as opportunities to practice patience and self-discipline knowing that your worth is not tied to others perceptions modern stoicism reminds us that a life lived in harmony with our principles is its own reward by embracing this truth you free yourself from the weight of external validation and discover that the value of kindness when rooted in virtue far surpasses any Shadow of Doubt let this conviction anchor you for kindness is never wasted when it arises from a place of integrity and authenticity number six you may become dependent on others have you ever noticed how excessive kindness despite its good intentions can sometimes backfire leaving you feeling vulnerable or even disempowered one of the subtle dangers of being overly kind is falling into a cycle of dependency not just for practical support but for emotional validation when you consistently put others needs ahead of your own it can teach you often without realizing it to lean on their approval to feel worthy or valued imagine this have you ever delayed an important decision waiting for a friend or loved one to weigh in just so you could feel reassured while it might seem harmless at first over time this pattern can quietly erode your confidence making you doubt your own instincts and judgment it’s almost like handing over the control of your happiness to someone else only to feel a drift and unsure when that support disappears let me share a story that illustrates this Clara a woman admired for her boundless kindness was always there for her friends she was the one everyone could count on offering a listening ear solving problems and sacrificing her own needs to lift others up But as time went on Clara realized she had unknowingly become reliant on the feedback of her loved ones for every major decision in her life when her closest friend moved abroad Clara suddenly felt lost uncertain and unable to trust her own choices it was a harsh wakeup call she had spent so much time prioritizing others and seeking their input that she had forgotten how to stand on her own two feet Clara’s Journey back to self-reliance wasn’t easy it required uncomfortable periods of solitude self-reflection and rebuilding her trust in herself but through this process she uncovered a strength she hadn’t realized she possessed and she grew more resilient and self assured this is where stoicism comes in stoicism a philosophy rooted in self-mastery reminds us that our true worth and happiness come from within not from the everchanging opinions or actions of others when we become overly reliant on external validation we give others the power to dictate our inner peace this leaves us vulnerable not just to disappointment but also to manipulation or emotional instability when that validation is no longer available one of the most valuable stoic Secrets is learning to cultivate your inner strength and embrace solitude as a way to grow your resilience this doesn’t mean you shut others out or stop seeking connection instead it’s about building a strong Foundation of self- trust so that the support of others is a bonus not a necessity think about your own life are there times when you feel stuck unable to move forward without someone else’s input how often do you find yourself doubting your own decisions waiting for validation before taking a step these might be signs that it’s time to look Inward and build your Independence start small maybe today you make a decision any decision without consulting anyone else notice how it feels even if it’s uncomfortable at first over time as you practice trusting yourself you’ll find that your confidence grows and you’ll rely Less on external validation to feel grounded here’s the lesson kindness is a beautiful and necessary part of life but it must be balanced with self-reliance when you cultivate the ability to trust your own judgment and embrace the Stillness of solitude you strengthen not only your Independence but also your relationships instead of giving out of a place of neediness you give from a position of balance and Inner Strength this in turn allows you to live a life of Greater fulfillment and peace remember the key to a fulfilled life isn’t found in how much you give to others it’s found in how much you nurture your own resilience and Inner Strength so ask yourself are you ready to embrace this balance and reclaim control over your happiness number seven you will have unrealistic expectations one of the pitfalls of being overly kind is that it can lead to unrealistic expectations and this is a lesson many of us learn the hard way when you give generously of yourself your time your energy your support it’s natural to Hope even subconsciously that others will do the same in return after all doesn’t the world feel like it should operate on the principle of fairness but let me ask you how often does reality actually meet those hopes perhaps perhaps you’ve gone out of your way to help a friend during a difficult time only to find that when your own life took a turn for the worse they weren’t there to offer the same level of support that feeling of disappointment can sting and when it lingers it can even grow into resentment carrying that kind of emotional weight is exhausting and it’s here that modern stoicism offers us a Lifeline helping us realign our focus with what we can truly control our actions and reactions Marcus Aurelius one of the most revered stoic philosophers reminds us in his meditations you have power over your mind not outside events realize this and you will find strength this simple yet profound truth has the power to shift how we approach kindness by expecting others to reciprocate our generosity in the exact way we envision we hand over control of our emotional well-being to forces we cannot govern think about that for a moment do you really want your happiness your peace of mind to depend on whether others meet your expectations it’s a precarious position to be in and the burden can be heavy are you prepared to carry that weight or is it time to reexamine how and why you give in the first place the problem lies not in kindness itself but in the invisible strings we sometimes attach to it when we tie our happiness to how others respond to our generosity we create a recipe for frustration it’s like expecting a garden to bloom exactly the way you imagined forgetting that the soil the weather and the seeds all have their own will but what if you let go of that expectation entirely What If instead of giving with a silent hope for a return you gave simply because it aligns with your values senica another brilliant stoic thinker wisely observed he who is brave is free and isn’t it an act of courage to give without expecting anything back when you free yourself from the need for others to meet your standards you also free your emotions you can begin to accept people as they are in all their flaws and complexities rather than feeling disappointed when they don’t behave as you’d hoped this shift doesn’t just protect your peace it enhances your relationships making them more authentic and less transactional letting go of expectations is not an overnight process it’s a practice a mindset that requires patience and introspection it means confronting your own habits of mind and asking tough questions why do I give what am I hoping for in return am I aligning my actions with my values or am I seeking external validation every step you take toward answering these questions helps you cultivate a lighter Freer self modern stoicism teaches us that kindness should never be a transaction it should be an expression of who you are at your core a reflection of your character and your commitment to making the world a little brighter think of kindness as planting a seed you don’t plant it because you’re certain of a harvest or because you demand fruit from it you plant it because it’s an Act of Faith a way to contribute to the beauty and vitality Of The World Isn’t that reason enough when you Embrace this perspective you’ll find that the rewards of kindness come not from what others give you in return but from the quiet satisfaction of knowing you’ve acted in alignment with your values and here’s the beauty of it this approach not only nurtures your own peace of mind but it also creates healthier more meaningful relationships ask yourself are you ready to embrace this form of kindness can you see how it might transform not only your relationships but your own sense of inner peace modern stoicism reminds us that kindness is one of the purest forms of strength it’s not about what you gain it’s about who you become through the act of giving by shifting your focus from expectation to intention you can reclaim your emotional freedom and walk through life with a lighter heart and a stronger sense of purpose so the next time you give do it not because you’re waiting for something in return but because it’s a reflection of the person you choose to be can you imagine how much lighter your life could feel if you let go of those unrealistic expectations it’s worth considering isn’t it number eight you might develop harmful habits overextending yourself for others often feels Noble but it can quickly become a double-edged sword leading to stress and triggering harmful coping mechanisms when you constantly sacrifice your time energy and emotional reserves without prioritizing your well-being you create a dangerous imbalance in such states of exhaustion it’s easy to turn to Temporary Comforts like overeating binge watching TV excessive alcohol consumption or other self-destructive habits as a way to manage feelings of frustration and burnout these fleeting escapes May provide relief in the moment but they only mask the deeper issues never addressing their root causes instead they compound your challenges adding physical strain and emotional guilt to an already overwhelming situation stoicism with its core focus on moderation self-discipline and inner balance warns us against succumbing to such patterns of excess senica wisely noted it is not the man who has too little but the man who craves more that is poor chasing external distractions or temporary relief does not resolve the struggle within it amplifies it the key to Breaking Free from this cycle lies in taking a proactive approach rooted in stoic principles to confront stressors directly Begin by examining the sources of your stress is it a packed schedule that leaves no room for rest unrealistic expectations from yourself or others or perhaps the difficulty of setting boundaries which often comes with the fear of disappointing people but by identifying these triggers you can approach them with Clarity and reason taking intentional steps to address the actual problem rather than merely numbing its symptoms this deliberate confrontation requires courage and reflection but it is far more effective than avoidance stoicism also teaches us that self-care is not Indulgence it is wisdom as epicus remarked no man is free who is not master of himself this Mastery begins with cultivating habits that restore your energy and promote mental Clarity mindfulness is a powerful tool in this process by practicing mindfulness whether through meditation breathing exercises or simply taking time to notice the present moment you can anchor yourself in the here and now this helps you manage emotional overwhelm and maintain perspective preventing ing your emotions from hijacking your reason additionally creating space for restorative practices such as regular exercise journaling or spending time in nature allows you to recharge in a sustainable way building resilience against stress and reducing Reliance on unhealthy behaviors a balanced life is one of Harmony and stoicism consistently encourages us to avoid extremes when you Embrace balance in your actions you protect yourself from the chaos of overextension and the destructive Tendencies it Fosters for example learning to say no to excessive demands is not selfish it is an act of self-respect and self-preservation by doing so you cons serve the energy needed to focus on what truly matters and ensure that the kindness you offer others stems from a place of abundance not depete completion developing healthier habits aligned with reason and virtue not only safeguards your well-being but also strengthens your ability to navigate challenges effectively and with dignity these stoic Secrets remind us that life’s demands will always be present but how we respond determines our Peace of Mind balance is the essence of living meaningfully it Shields us from the chaos of harmful habits while imp empowering us to act with purpose ensuring that our kindness enriches both others and ourselves by prioritizing moderation and self-discipline we create a life that is steady and fulfilling a life where kindness becomes a strength rather than a burden if you’ve made it this far it’s clear that you value thoughtful reflection and the pursuit of balance in life let’s continue the conversation share your thoughts in the comments by say simply saying balance begins with boundaries together we’ll keep learning and growing through these powerful stoic principles stay tuned there’s more eye-opening content coming your way soon number nine your boundaries will be violated failing to establish and enforce boundaries in your acts of kindness often leads to others overstepping and disregarding your limits leaving you feeling overburdened and unappreciated when your time energy or values are ignored repeatedly you may find yourself in a cycle where your good will is taken for granted consider a coworker who continually adds tasks to your workload knowing you’ll always say yes while this might seem harmless initially overtime it Fosters a dynamic where your contributions are undervalued and your kindness is treated as an expectation rather than a choice these violations of boundaries not only deplete your emotional reserves but also lead to frustration and resentment as your efforts go unnoticed and unreciprocated senica the stoic philosopher aptly reminds us no person hands out their money to passes by but to how many do we hand out our lives we are tight-fisted with property and money yet think too little of what wasting time the one thing about which we should all be the toughest misers his words underscore the importance of valuing our own resources time and energy enough to safeguard them with boundaries in the philosophy of modern stoicism boundaries are seen as essential tools for living with intention and balance they are not walls to isolate yourself but Frameworks that allow your kindness to thrive without undermining your well-being setting clear limits ensures that your acts of generosity come from a place of genuine care rather than obligation creating healthier and more respectful relationships when you communicate your boundaries assertively whether by declining extra work or addressing a pattern of overreach in a relationship you teach others to respect you while preserving your emotional and physical health this act of self-respect also aligns with the stoic principle of living in accordance with nature as maintaining balance in our interactions is critical to a harmonious life in today’s world where demands on our time and energy are seemingly endless boundary setting becomes even more vital without boundaries you risk burnout and discontent as others May unknowingly exploit your generosity to prevent this practice the art of saying no when needed and follow through with consistent action when your limits are crossed for instance if a colleague continues to assign you tasks without your consent it is perfectly reasonable to redirect the work back to them or involve a supervisor to establish Clarity by doing so you protect your time and energy ensuring your kindness is appreciated rather than exploited through these measures you are uphold the stoic ideal of moderation transforming your kindness from a source of stress into a meaningful expression of Good Will kindness without boundaries is unsustainable both for you and those you aim to help by defining and enforcing limits you preserve the value of your generosity ensuring it uplifts rather than depletes you modern stoicism teaches us that living with purpose and mindfulness is key to maintaining Harmony in our lives protecting your boundaries allows you to act with intention offering kindness where it matters most and fostering relationships built on mutual respect in doing so you embody the wisdom of the stoics cultivating a life that balances compassion with self-respect a balance that not only benefits you but also enriches the lives of those around you the ways kindness can ruin your life reveal an important truth even positive traits can become burdensome if not carefully managed and applied correctly kindness itself isn’t wrong but when it’s abused it can lead to losing your sense of self setting unrealistic expectations and breaking personal boundaries to avoid falling into this negative cycle understanding the risks and knowing how to manage them is key five stoic strategies to stop being taken advantage of while kindness can have unintended consequences this doesn’t mean you need to abandon it instead you can apply stoic strategies to maintain kindness in a balanced and empowering way helping you protect yourself from being taken advantage of while staying true to your values keep watching to discover how stoicism can help you stay kind when without being exploited and transform your kindness into an unshakable source of Power number one understand your emotions understanding your emotions is the Cornerstone of stoic philosophy and a vital tool for preventing the emotional burnout that often stems from unchecked kindness when you give endlessly without considering your emotional capacity feelings of frustration exhaustion or even resentment can creep in and quietly take hold these emotions may seem insignificant at first but they tend to accumulate emerging later as irritability stress or a sense of being unappreciated imagine helping a friend over and over again offering rides lending a hand with projects or being their emotional support system only to feel overlooked when they don’t acknowledge your efforts that unspoken disappointment can morph into resentment souring not only your relationship with them but also your own emotional well-being stoicism with its Timeless wisdom encourages us to observe our emotions not as enemies to be suppressed but as signals guiding us toward balance the stoic Secrets teach us to approach our feelings with curiosity identifying their roots and understanding understanding their triggers for instance when you notice yourself feeling drained after yet another act of kindness pause and ask what’s behind this feeling am I giving too much too often without ensuring my own needs are met this self-awareness allows you to recognize when your boundaries are being stretched too thin giving you the power to recalibrate your actions before they lead to burnout it’s not about withdrawing your kindness it’s about offering it in ways that are genuine sustainable and aligned with your own emotional health one powerful strategy for cultivating this balance is regular self-reflection carve out time each day even just a few minutes to ask yourself questions like how do I feel after helping others or am I sacrificing my well-being for the sake of being seen as kind consider a modern example a co-worker who frequently asks you to cover their shifts or pick up their slack you comply fearing conflict or wanting to maintain a helpful image but over time you start to dread their requests and feel resentment building if you reflect on your emotions and acknowledge this pattern you can prepare yourself to set boundaries perhaps by saying I’d love to help but I can’t this time this small Act of assertion not only protects your energy but also reshapes the dynamic into one of mutual respect here’s an important truth to internalize understanding your emotions and setting limits isn’t selfish it’s essential if you’re running on empty how can you continue to give authentically the stoic approach to kindness isn’t about closing off your heart it’s about ensuring that your kindness flows from a place of strength and intention when you acknowledge and respect your emotions you create a healthier foundation for your relationships and preserve your capacity to give in meaningful ways let me ask you this how often do you find yourself feeling stretched too thin yet reluctant to say anything for fear of being seen as unkind could tuning into your emotions and adjusting your actions make a difference remember stoicism reminds us that a life lived with self-awareness is a life lived with purpose by embracing this principle you can transform your kindness into something that uplifts both you and those around you the next time you feel your generosity tipping into exhaustion take a step back and reflect is this kindness depleting you or is it rooted in genuine care when you find that balance you you’ll discover that your acts of kindness become not only more impactful but also deeply fulfilling for both you and the people in your life number two learn to say no let’s talk about one of the hardest but most liberating words you can ever learn to say no it seems simple doesn’t it but for so many of us saying no feels like a betrayal of kindness we worry about letting people down being seen as selfish or even facing rejection so we keep saying yes yes to the extra project at work even when your plate is already full yes to helping a friend move even when your own weekend is packed with plans at first it feels good to help like you’re being dependable and kind but then the weight of overc commitment sets in you feel overwhelmed stressed maybe even resentful and here’s the kicker the more you say yes when you really mean no the more you teach others to take your time and energy for granted have you ever stopped to ask yourself how much of my life am I giving away and at what cost to myself this is where Modern stoicism offers a Lifeline the stoics masters of wisdom and discipline understood the value of setting boundaries they knew that saying no is not an act of Cruelty it’s an act of self-respect Marcus Aurelius wrote it is not death that a man should fear but he should fear never beginning to live by overcommit and prioritizing everyone else’s needs above your own you risk losing the time and energy needed to live a life aligned with your values modern stoicism reminds us that we can only be truly kind when our action come from a place of strength not obligation learning to say no is one of the most powerful ways to protect your well-being when you decline a request that doesn’t align with your priorities you’re not just setting a boundary you’re reclaiming control over your life think of it this way every time you say yes to something you’re also saying no to something else often something that matters more to you how often are you sacrificing your own goals peace of mind or even your health just to avoid the discomfort of a no epic tetus reminds us he who is not master of himself is a slave are you a master of your time or are you letting fear of disapproval dictate your choices start small practice saying no to minor requests that don’t serve your priorities use polite but firm language like I’d love to help but I’m fully committed right now notice how empowering it feels to draw a line and stand by it over time this builds confidence and reinforces your boundaries it’s not about being selfish it’s about ensuring your kindness remains genuine and balanced when you protect your own time and energy the help you offer others comes from a place of abundance not exhaustion remember remember people who truly value you will respect your boundaries and those who don’t they likely never valued you only what you could do for them saying no isn’t rejection it’s an affirmation of your priorities and your Worth Modern stoicism teaches us that discipline and self-respect are key to living a fulfilling life so ask yourself what kind of Life am I building if I never Never Say No by learning to decline what doesn’t serve you you open the door to a life that truly does after all how can you live authentically if you’re always living for others number three dedicate time to yourself dedicating time to yourself is not an act of selfishness it is a fundamental pillar of emotional and mental well-being in a society that often confuses worth with constant availability self-care can easily feel like an Indulgence instead of a necessity however the truth is that endlessly prioritizing others whether by helping friends with their projects or giving up weekends for everyone else’s needs inevitably leads to neglecting your own this imbalance may not be noticeable at first but over time it breeds burnout dissatisfaction and even resentment senica’s Timeless wisdom reminds us it is not that we have a short time to live but that we waste a lot of it his words are a call to action urging us to use our time deliberately and to recognize that self-care is not a luxury but an essential practice for leading a balanced and meaningful life stoicism teaches that true strength and productivity arise from self-mastery and this Mastery is only possible when we make time for reflection renewal and personal growth taking time for yourself might involve physical activities like exercising mental enrichment through reading or learning or simply finding moments of peace to let your mind rest these practices are not escapes from your responsibilities they are the very Foundation that equips you to face life’s demands with Clarity and vigor the stoic secret to thriving lies in treating self-care as a non-negotiable commitment without it you risk depleting the energy you need to effectively support others and to pursue your own aspirations to make self-care a sustainable habit Begin by intentionally scheduling regular time for yourself and treating it as sacred whether it’s an hour in the morning to meditate an evening to journal or a week can to immerse yourself in a hobby this time should be viewed as non-negotiable just as you would not cancel a crucial meeting or family obligation respect these commitments to yourself set clear boundaries with those around you and don’t hesitate to say no when interruptions arise dedicating time to yourself is not about withdrawing from others but rather about fortifying your ability to connect with and care for them more effectively when you nurture your own well-being you create a foundation of strength and Clarity that benefits not only you but also those who rely on you this is an act of profound self-respect and a demonstration of the stoic principle of balance by prioritizing self-care you ensure that your kindness and efforts for others stem from a place of abundance rather than exhaustion taking care of yourself is the Cornerstone of a life lived with Clarity purpose and resilience by carving out time for your well-being you align with the stoic ideal of purposeful living ensuring that your energy is used wisely and your actions reflect your values this practice not only empowers you to thrive but also enriches your ability to contribute meaningfully to the lives of others your well-being is not just a gift to yourself it is the foundation from which all other aspects of your life can flourish if you’ve ever struggled with the guilt of taking time for yourself or felt drained from constantly prioritizing others share your resolve by commenting I honor my well-being below your commitment to self-care can Inspire others to recognize the importance of nurturing their own strength and living a life of balance and purpose let’s support each other in building lives rooted in clarity resilience and the stoic principle of balance number four set clear goals setting clear goals is essential for creating Direction in life giving you a sense of purpose and helping you focus on what truly matters without defined objectives it’s easy to be pulled in countless directions by the demands and expectations of others leaving you feeling aimless and unfulfilled imagine committing to a professional growth plan such as completing a certification course only to find your time consumed by favors and distractions that have no connection to your aspirations this scenario underscores the importance of clarity in your goals as they act like a compass guiding your actions toward meaningful progress sener a stoic philosopher wisely stated if one does not know to which Port one is sailing no wind is favorable this Timeless wisdom highlights how essential it is to know your destination both in life and in your daily actions to avoid being Swept Away by distractions modern stoicism teaches us the value of purposeful living emphasizing the importance of aligning your actions with your values and long-term aspirations setting goals is not just about productivity it is about ensuring that your time and energy are directed toward Pursuits that enrich your personal growth and contribute to your sense of fulfillment by having a Clear Vision of what you want to achieve you Empower yourself to make intentional decisions that serve your best interests rather than succumbing to external pressures or fleeting demands this Focus not only strengthens your resolve but also preserves your mental and emotional well-being as you no longer feel burdened by obligations that pull you away from your true priorities to make this principle actionable start by identifying your priorities and breaking them into smaller manageable steps for example if your goal is to enhance your career outline specific tasks such as researching programs enrolling in courses and dedicating time each week to study regularly revisit your goals to measure your progress and make adjustments as needed ensuring they remain relevant and achievable additionally clearly communicate your objectives to those around you helping them understand why your time and energy are dedicated to specific Pursuits this transparency not only reinforces your commitment to your goals but also teaches others to respect your boundaries and the importance of your aspirations in Modern Life where distractions are constant and time feels increasingly scarce having clear goals is more critical than ever without them it becomes easy to say yes to every request leaving little room for personal growth or meaningful achievement by consciously prioritizing your objectives and asserting your boundaries you not only Safeguard your progress but also Inspire others to do the same modern stoicism M encourages this disciplined approach showing us that living with purpose and Clarity leads to a more harmonious and fulfilling life when you align your actions with your goals you cultivate a mindset of intentionality turning every decision into a step toward a life of meaning and balance number five distance yourself from energy drainers distancing yourself from energy drainers those who constantly take from you without giving anything in return is one of the most important steps you can take to safeguard your emotional and mental health we’ve all encountered these people maybe it’s the coworker who always has a crisis but never listens when you share your struggles or a friend who endlessly leans on you for support yet is never available when you need a shoulder these individuals don’t intentionally set out to harm you but they’re relentless less negativity and one-sided needs leave you feeling exhausted undervalued and emotionally drained over time this imbalance can chip away at your well-being making you question why you’re always left Running on Empty while they seem to take and take without giving back stoicism offers Timeless wisdom for navigating these relationships one of its stoic Secrets is the principle of discernment carefully choosing who you invest your time and energy in the stoics teach that our peace of mind is precious and should be fiercely protected to do this you must first recognize the signs of an energy drainer do you feel consistently depleted after interacting with someone do their demands feel excessive or their negativity overwhelming if the answer is yes it might be time to re-evaluate that relationship take a modern example a colleague who always vents about their workload and demands your help with their tasks but never reciprocates when you’re under pressure by continuing to indulge them you not only reinforce the behavior but also neglect your own priorities and emotional balance creating distance doesn’t mean shutting people out cruy it means setting healthy boundaries start by limiting how often and How Deeply you engage with energy drainers if they they constantly ask for favors politely decline when their requests feel excessive redirect the conversation or gently remind them that you have your own responsibilities to focus on at the same time make a conscious effort to surround yourself with positive supportive individuals those who Inspire and encourage you a friend who listens as much as they talk or a colleague who collaborates and shares the workload can have an incredible impact on your sense of balance and fulfillment these are the relationships that build emotional resilience and promote personal growth let me ask you how often do you find yourself saying yes to someone even when it feels like too much how does that leave you feeling afterward recognizing and addressing these Dynamics can transform your relationships and protect your mental health remember stoicism isn’t about avoiding all challenges or cutting off everyone who frustrates you it’s about focusing your energy on what truly matters and what aligns with your values when you let go of negativity you create space for relationships that are uplifting and enriching where kindness and support flow both ways so the next time you find yourself faced with an energy drainer pause and reflect is this connection nurturing you or draining you is it time to step back and reclaim Your Peace by putting the stoic principle of discernment into practice you’ll discover that your kindness and energy are most valuable when shared with those who truly appreciate and respect them protect your peace of mind and you’ll cultivate a life filled with balance growth and meaningful connections as we wrap up let’s refle on the key takeaway kindness is a powerful and admirable trait but without boundaries it can lead to burnout frustration and a loss of self-respect by applying the Timeless strategies of modern stoicism like self-awareness clear goal setting and nurturing healthy relationships you can Safeguard your priorities while still fostering meaningful connections the wisdom of the stoics teaches us that true kindness begins with respect for yourself and when you live in alignment with your values you can give to others in a way that’s both genuine and sustainable now it’s time to take action how will you apply these stoic secrets to your own life are there areas where you need to set better boundaries or say no to protect your well-being I’d love to hear your thoughts share your experiences in the comments below and if if you found value in today’s video don’t forget to like subscribe to stoic secrets and hit the Bell icon for more insights into stoicism and personal growth together let’s continue this journey toward a balanced and fulfilling life Guided by the wisdom of the stoics

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Financial Accounting Fundamentals

    Financial Accounting Fundamentals

    This collection of text comprises a series of video lectures on financial accounting. The lectures explain fundamental accounting concepts, including the preparation of financial statements (income statement, statement of changes in equity, balance sheet), and the calculation and interpretation of financial ratios. The lectures also cover adjusting journal entries, bad debt expense, bank reconciliations, and depreciation methods. Specific accounting methods like FIFO, LIFO, and weighted average are demonstrated, and the importance of internal controls is emphasized. Finally, the lectures discuss the statement of cash flows and its preparation using both direct and indirect methods.

    Financial Accounting Study Guide

    Quiz

    Instructions: Answer each question in 2-3 sentences.

    1. What is the key difference between an asset and a liability?
    2. Explain the concept of “accounts payable” in the context of a company’s liabilities.
    3. How do revenues differ from expenses for a business?
    4. Define the term “dividends” and explain their relationship to a company’s profits.
    5. What distinguishes a current asset from a long-term asset?
    6. What does it mean for a company to “debit” an account?
    7. What is the significance of the accounting equation (A = L + SE)?
    8. What is the purpose of a journal entry in accounting?
    9. Explain the concept of “accumulated depreciation” and its function.
    10. Briefly describe the difference between the FIFO, LIFO, and weighted-average methods of inventory valuation.

    Quiz Answer Key

    1. An asset is something of value that a company owns or controls, whereas a liability is an obligation a company owes to someone else, requiring repayment in the future. Assets are what the company possesses, and liabilities are what the company owes.
    2. Accounts payable represents a company’s short-term debts, usually due within 30 days, often arising from unpaid bills like phone bills or supplier invoices. It is a common liability found on a balance sheet.
    3. Revenues are the money a company earns from its core business activities, such as sales or service fees, and expenses are the costs incurred in running the business, like salaries or utilities. Revenues are inflows, and expenses are outflows.
    4. Dividends are a portion of a company’s profits that shareholders receive, representing a distribution of earnings. They are a payout to owners of the company if they choose to take money out of the business.
    5. A current asset is expected to be used or converted into cash within one year, such as cash or inventory, while a long-term asset is intended for use over multiple years, such as land or equipment. The one-year mark is the distinguishing line.
    6. A debit is an accounting term that increases asset, expense, or dividend accounts while decreasing liability, shareholders’ equity, or revenue accounts. The usage of debits and credits is core to the accounting system.
    7. The accounting equation, A = L + SE, represents that a company’s total assets are equal to the sum of its liabilities and shareholders’ equity. It’s a foundational concept ensuring the balance of a company’s financial position.
    8. A journal entry is the first step in the accounting cycle and records business transactions by detailing debits and credits for at least two accounts. They create a trackable record for every transaction.
    9. Accumulated depreciation represents the total amount of an asset’s cost that has been expensed as depreciation over its life to date. It is a contra-asset account that reduces the book value of the related asset.
    10. FIFO (first-in, first-out) assumes that the oldest inventory is sold first. LIFO (last-in, first-out) assumes that the newest inventory is sold first. Weighted average uses the average cost of all inventory to determine the cost of goods sold.

    Essay Questions

    Instructions: Write an essay that thoroughly explores each of the following prompts, drawing on your understanding of the course material.

    1. Discuss the importance of understanding the differences between assets, liabilities, and shareholders’ equity for making sound business decisions. Consider how these elements interact and contribute to a company’s overall financial health.
    2. Explain the different types of journal entries covered in the source material and how the concept of debits and credits is essential for accurately recording financial transactions. Why is it so important that a journal entry balance?
    3. Compare and contrast the straight-line, units of production, and double-declining balance methods of depreciation. Under what circumstances might a business choose one method over another, and why?
    4. Describe the components of a cash flow statement and their importance to understanding a company’s overall financial performance. Discuss how the operating, investing, and financing sections are used to evaluate a company’s financial decisions.
    5. Explain the different inventory valuation methods (FIFO, LIFO, Weighted Average) and how they can affect a company’s cost of goods sold and net income. What are the implications of using one method over another?

    Glossary of Key Terms

    Accounts Payable: A short-term liability representing money owed to suppliers for goods or services purchased on credit.

    Accounts Receivable: A current asset representing money owed to a company by its customers for goods or services sold on credit.

    Accrued Expense: An expense that has been incurred but not yet paid in cash.

    Accrued Revenue: Revenue that has been earned but for which payment has not yet been received.

    Accumulated Depreciation: The total depreciation expense recorded for an asset to date; a contra-asset account that reduces the book value of an asset.

    Asset: Something of value that a company owns or controls, expected to provide future economic benefit.

    Balance Sheet: A financial statement that presents a company’s assets, liabilities, and equity at a specific point in time.

    Bond: A long-term debt instrument where a company borrows money from investors and promises to pay it back with interest over a specified period.

    Cash Flow Statement: A financial statement that summarizes the movement of cash into and out of a company over a specific period.

    Common Shares: A type of equity ownership in a company, giving shareholders voting rights and a claim on the company’s residual value.

    Contra-Asset Account: An account that reduces the value of a related asset (e.g., accumulated depreciation).

    Cost of Goods Sold (COGS): The direct costs of producing goods that a company sells.

    Credit: An accounting term that decreases asset, expense, or dividend accounts, while increasing liability, shareholders’ equity, or revenue accounts.

    Current Asset: An asset expected to be converted into cash or used within one year.

    Current Liability: A liability due within one year.

    Debit: An accounting term that increases asset, expense, or dividend accounts, while decreasing liability, shareholders’ equity, or revenue accounts.

    Depreciation: The allocation of the cost of a tangible asset over its useful life.

    Depreciable Cost: The cost of an asset minus its residual value, which is the amount to be depreciated over the asset’s useful life.

    Discount (on a bond): Occurs when a bond is sold for less than its face value. This happens when the market interest rate exceeds the bond’s stated interest rate.

    Dividend: A distribution of a company’s profits to its shareholders.

    Double-Declining Balance Depreciation: An accelerated depreciation method that applies a multiple of the straight-line rate to an asset’s declining book value.

    Equity (Shareholders’ Equity): The owners’ stake in the assets of a company after deducting liabilities.

    Expense: A cost incurred in the normal course of business to generate revenue.

    FIFO (First-In, First-Out): An inventory valuation method that assumes the first units purchased are the first units sold.

    Financial Statements: Reports that summarize a company’s financial performance and position, such as the income statement, balance sheet, and cash flow statement.

    General Ledger: A book or electronic file that contains all of the company’s accounts.

    Gross Profit (Gross Margin): Revenue minus the cost of goods sold.

    Income Statement: A financial statement that reports a company’s revenues, expenses, and profits or losses over a specific period.

    Inventory: Goods held by a company for the purpose of resale.

    Journal Entry: The recording of business transactions showing the debits and credits to accounts.

    Liability: A company’s obligation to transfer assets or provide services to others in the future.

    LIFO (Last-In, First-Out): An inventory valuation method that assumes the last units purchased are the first units sold.

    Long-Term Asset: An asset that a company expects to use for more than one year.

    Long-Term Liability: A liability due in more than one year.

    Net Income: Revenue minus expenses; the “bottom line” of the income statement.

    Premium (on a bond): Occurs when a bond is sold for more than its face value. This happens when the market interest rate is less than the bond’s stated interest rate.

    Preferred Shares: A type of equity ownership in a company, where shareholders have a preference over common shareholders in dividends and liquidation.

    Retained Earnings: The cumulative profits of a company that have been retained and not paid out as dividends.

    Revenue: Money a company earns from its core business activities.

    Residual Value (Salvage Value): The estimated value of an asset at the end of its useful life.

    Straight-Line Depreciation: A depreciation method that allocates an equal amount of an asset’s cost to depreciation expense each year of its useful life.

    T-Account: A visual representation of an account with a debit side on the left and a credit side on the right.

    Units of Production Depreciation: A depreciation method that allocates an asset’s cost based on its actual usage rather than time.

    Vertical Analysis: A type of financial statement analysis in which each item in a financial statement is expressed as a percentage of a base amount. On an income statement, it is usually expressed as a percentage of sales. On a balance sheet, it’s usually expressed as a percentage of total assets.

    Weighted-Average Method: An inventory valuation method that uses the weighted-average cost of all inventory to determine the cost of goods sold.

    Financial Accounting Concepts and Analysis

    Okay, here is a detailed briefing document summarizing the key themes and ideas from the provided text, incorporating quotes where relevant.

    Briefing Document: Financial Accounting Concepts and Analysis

    I. Introduction

    This document provides a review of core financial accounting concepts, focusing on assets, liabilities, equity, revenues, expenses, dividends, journal entries, and financial statement analysis. The source material consists of transcribed video lectures from an accounting course, delivered by a professor (likely “Tony”) with a conversational and relatable style.

    II. Core Accounting Terms and Concepts

    A. Assets: * Defined as “something of value that a company can own or control.” * Value must be “reasonably reliably measured.” * Examples: * Accounts Receivable: “our customer hasn’t paid the bill right we did some work for the customer they haven’t paid us yet we would expect to collect in less than a year” * Inventory: “Walmart expects to sell through any piece of inventory in less than a year” * Long-term investments, land, buildings, and equipment are also assets. * Distinction between Current vs Long-term Assets * Current Assets are expected to be liquidated or used up within one year. * Long-Term Assets are those expected to be used beyond one year.

    B. Liabilities: * Defined as “anything that has to be repaid in the future.” * Technical definition: “any future economic obligation.” * Examples: * Accounts Payable: “within typically within 30 days you’ve got to pay it back” * Notes Payable: “bank loans, student loans, mortgages,” all categorized under “note payable” which is a contract promising repayment. * Distinction between Current vs Long-term Liabilities * Current Liabilities are obligations to be repaid within one year. * Long-Term Liabilities are obligations to be repaid over a period longer than a year, such as a mortgage.

    C. Shareholders’ Equity: * Represents the owners’ stake in the company. * “If I were to sell them off pay off all my debts what goes into my pocket that is my equity in the company” * Includes common shares and retained earnings.

    D. Revenues: * Defined as what a company “earns” when it “does what it does to earn money.” * Examples: Sales revenue, tuition revenue, rent revenue. * “How is the money coming in? It’s the revenue-generating part of the business.”

    E. Expenses: * Defined as “costs” associated with running a business. * Examples: Salary expense, utilities expense, maintenance expense.

    F. Dividends: * Represent “shareholders pulling profits from the company,” essentially taking cash out of the company’s retained earnings. * Payable when “revenues exceed the expenses” or when the company is profitable. * Shareholders “can keep the money keep those profits in the company or the shareholders can say I’d like some of that money.”

    III. Journal Entries

    A. The Concept: * Based on Newton’s third law of motion, “for every action there is an equal and opposite reaction.” * “There’s not just one thing happening there’s always kind of equal and opposite forces acting in a journal entry.” * Every transaction has at least one debit and at least one credit and the value of the debits must equal the value of the credits.

    B. Debits and Credits: * Debits (Dr) and Credits (Cr) are not related to credit cards or bank accounts, but they are used to increase or decrease different types of accounts. * The basic accounting equation: Assets = Liabilities + Shareholders’ Equity (A=L+SE) * Accounts on the left side (Assets) go up with a debit and down with a credit. Accounts on the right side (Liabilities and Equity) go up with a credit and down with a debit.

    C. Journal Entry Table: * The presenter suggests this mnemonic “a equal L + SE” with “up arrow down arrow down arrow up arrow down arrow up Arrow then beneath I write Dr CR Dr CR R Dr CR.” * This is used as a visual aid to determine the correct debits and credits for a transaction.

    **D. Journal Entry Elements:**

    * Each journal entry must include:

    * A date.

    * A debit account.

    * A credit account.

    * The value of the debit and credit, which must be equal.

    * A description of the transaction, avoiding the use of dollar signs.

    E. Examples * Purchase a car for cash. * Debit: Car Asset * Credit: Cash Asset. * Purchase a car with a car loan. * Debit: Car Asset * Credit: Car loan payable Liability * Purchase a car with part cash and a car loan. * Debit: Car Asset * Credit: Cash Asset * Credit: Car loan payable Liability

    IV. Adjusting Journal Entries

    A. Types of Adjustments * Prepaids: When expenses are paid in advance, like insurance. The prepaid asset is reduced as the expense is recognized. * Example: Prepaid insurance becomes insurance expense over time. * Depreciation: When a long-term asset’s value is reduced over time. * Example: Vehicles, equipment. * Accrued Expenses: When expenses build up but are not yet paid. This creates a liability. * Example: Accrued interest on a loan. * Accrued Revenues: When revenues are earned but not yet received. This creates a receivable. * Example: Service revenue earned on account.

    B. The Purpose: * To ensure financial statements accurately reflect the company’s financial position at the end of the period. * Adjustments are necessary because “the lender isn’t calling me saying hey it’s December 31st where’s my money no they know they’re not getting paid till July so the accountant just has to know oh I’ve got a liability here that’s building up.”

    V. Financial Statement Analysis

    A. Trial Balance * An unadjusted trial balance is a list of all accounts and their balances before making any adjusting entries. * An adjusted trial balance is created after all adjusting entries are made. B. Income Statement * Shows the company’s revenues and expenses for a period. * Calculates net income: Revenues – Expenses. C. Balance Sheet * Shows the company’s assets, liabilities, and equity at a specific point in time. * The basic accounting equation (Assets=Liabilities + Equity) must always balance. D. Statement of Cash Flows * Categorizes cash flows into operating, investing, and financing activities. * It provides a summary of how cash changed during a given period. * Uses both changes in balance sheet accounts and information in the income statement to create the full picture.

    E. Ratio Analysis: * Liquidity Ratios assess a company’s ability to meet its short-term obligations. Includes the current ratio. * Profitability Ratios assess a company’s ability to generate profit. Includes gross profit margin and net profit margin. * Solvency Ratios assess a company’s ability to meet its long-term obligations, such as the debt-to-equity ratio.

    F. Vertical Analysis (Common Sized Statements): * Expresses each item on a financial statement as a percentage of a base figure. * On the income statement, each item is expressed as a percentage of total sales. * On the balance sheet, each item is expressed as a percentage of total assets. * Allows for comparison of companies of different sizes or for comparing trends across years.

    VI. Other Concepts Covered

    • Inventory Costing Methods: FIFO (First-In, First-Out), LIFO (Last-In, First-Out), and Weighted Average methods.
    • Bank Reconciliation: Adjusting bank statements and company records to reconcile the different balances in order to identify errors and discrepancies.
    • Allowance for Bad Debts: A contra-asset account used to estimate uncollectible receivables.
    • Bonds: Accounting for bonds issued at a premium or discount, and the amortization of those premiums or discounts over the life of the bond.
    • Shareholders’ Equity: Different types of shares, such as common shares and preferred shares.
    • Closing Entries: Resetting revenue, expense, and dividend accounts to zero at the end of an accounting period.

    VII. Key Themes

    • The Importance of Understanding Journal Entries: “you really need to understand them… if you haven’t understood it well it’s just going to haunt you for the rest of class”
    • Financial Accounting is About Tracking Financial Events: “accounting is all about tracking Financial events.”
    • Accounting is Logical and Systematic: The goal is to keep track of transactions “in a logical way that’s not going to drive you crazy.”
    • Practical Application: Emphasis is placed on real-world examples and applications.
    • Mistakes are Opportunities to Learn: “it’s not even the end of the world if you fail a course but really it’s not the end of the world if you fail a test you can put it together you can put yourself together and you can improve.”

    VIII. Conclusion This source material provides a detailed explanation of accounting and financial analysis concepts. The speaker employs practical examples and a relatable, conversational teaching style that aims to both inform and engage students, encouraging deep understanding and retention of these core principles.

    Financial Accounting Fundamentals

    Financial Accounting FAQ

    • What is the difference between an asset and a liability in accounting? An asset is something of value that a company owns or controls. This could include tangible items like inventory, buildings, and equipment, or intangible items like patents and trademarks. The key thing to remember is that an asset has economic benefit to the company, and the value can be reasonably and reliably measured. A liability, on the other hand, is an obligation of the company, something it owes to others, that has to be repaid in the future. Examples include bank loans, mortgages, accounts payable (money owed to suppliers), and even unpaid phone bills. Essentially, assets are what a company has and liabilities are what it owes.
    • What is the difference between “current” and “long-term” when classifying assets and liabilities? The distinction between “current” and “long-term” depends on the timeframe over which the asset will be converted to cash or the liability will be paid off. A current asset is expected to be liquidated (turned into cash) or used up within one year or less. Examples of current assets include cash, inventory (for companies that expect to sell it quickly), and accounts receivable (money due from customers for short-term credit). A long-term asset, in contrast, is not expected to be liquidated within a year; it includes things like land, buildings, and machinery that are intended for long-term use by the company. A current liability is an obligation that’s expected to be paid within a year, such as short-term debt, accounts payable, or wages payable. A long-term liability is an obligation that’s not due within a year; it includes things like long-term bank loans or mortgages. The one-year line is a key point in financial accounting.
    • What are the key components of shareholders’ equity, and how do they relate to the balance sheet? Shareholders’ equity represents the owners’ stake in a company. It’s comprised primarily of two main components. Common shares reflect the original investments made by shareholders in exchange for ownership in the company. Retained earnings represent the accumulated profits that a company has not distributed as dividends to its shareholders but has kept to reinvest in the business. These amounts are listed on the balance sheet under the heading “Shareholder’s Equity” and represent the residual value of the company after all its debts are paid. The basic accounting equation that connects all of these is Assets = Liabilities + Shareholders’ Equity.
    • How do revenues, expenses, and dividends affect a company’s profitability? Revenues are the income a company earns from its normal business operations, such as sales, service fees, or rent. They are the “earn” component of the income statement. Expenses are the costs a company incurs to generate revenue. This could include salaries, utilities, rent, cost of goods sold, and so on. If revenues exceed expenses, the company is profitable; if expenses exceed revenues, the company is operating at a loss. Dividends are payments of a portion of a company’s profits that are made to the shareholders (owners) of the business. They are not an expense but are instead a distribution of profits, so while they don’t affect net income, they do affect how much profit the company can keep for reinvestment.
    • What are journal entries, and why are they so important in financial accounting? Journal entries are the initial step in recording business transactions. Every journal entry will have at least one debit and at least one credit that balance with each other. They serve to record the financial effects of business transactions (like buying a car, getting a loan, selling services etc) in a formal and organized manner. They adhere to the fundamental accounting equation and follow a consistent debit/credit format so that the effects of each financial transaction are accurately tracked. They create an audit trail and prevent mistakes. Journal entries are very important because, without them, it would be difficult to track where a company’s resources are, what the company owes, and how successful the company is in generating profits. Without a solid understanding of journal entries, it is very difficult to learn more advanced topics in accounting.
    • What is a “T-account” and how is it used in accounting? A T-account is a simple visual representation of a general ledger account. It’s literally shaped like the letter T with the account name (e.g. Cash, Accounts Payable) above the T. The left side of the T is the “debit” side, while the right side is the “credit” side. After a transaction has been recorded in a journal entry, the details are transferred to the appropriate T-accounts, a process called “posting.” This helps to track the increases and decreases in every financial account of the company. T accounts are the basis for preparing financial statements and allow accountants to determine the ending balance of every account.
    • What are adjusting journal entries and what types are common? Adjusting journal entries are made at the end of an accounting period to correct errors, recognize transactions that have occurred over time but not yet been recognized, or to update the financial records. Common adjusting journal entries include: prepaid expenses, where a company pays for something in advance and uses it up over time, like insurance or rent; depreciation, which is where we record the wearing out of long term assets over time like equipment or buildings; accrued expenses, which are costs that have built up over time but have not yet been paid (think of interest owed or salaries earned by employees); and finally, accrued revenues which are revenues earned that have not been paid by customers yet. The core concept is that some transactions don’t happen in one single moment of time, they happen over a period of time and it is important to reflect this in a company’s financial statements.
    • What are closing entries and why are they important in the accounting cycle? Closing entries are made at the end of an accounting period to transfer the balances of temporary accounts (like revenues, expenses, and dividends) into a permanent account, which is normally the retained earnings account. Temporary accounts are used only to track an individual year’s performance. Once closed, they start fresh at zero for the next accounting period. The closing process ensures that revenue and expense information is summarized for each period, that they don’t carry forward from year to year, and that the profit generated by a company (net income) flows into retained earnings. Closing entries are a key part of closing one fiscal year and beginning another.

    Financial Accounting Fundamentals

    Okay, here is the detailed timeline and cast of characters based on the provided text:

    Timeline of Events (as presented in the text):

    • General Accounting Concepts Introduced:Discussion of Assets (things of value), Liabilities (obligations to repay), and Equity (what’s left after liabilities are paid from assets).
    • Explanation of Current vs. Long-term Assets and Liabilities (one year is the cutoff).
    • Explanation of Revenues (earned income), Expenses (costs incurred), and Dividends (shareholder profits taken from retained earnings).
    • Example of Account Classification:Categorization of various accounts as Assets, Liabilities, Equity, Revenue, or Expense (e.g., Long-term Investments, Accounts Receivable, Accounts Payable, Common Shares, etc).
    • Classification of assets and liabilities as current or long-term.
    • Personal Accounting Mistake and Encouragement:The speaker shares a story about getting a very low mark on their first accounting exam (28%) and the subsequent struggle, but ultimate success in the class and eventual career.
    • The speaker encourages viewers to keep going and improve if they struggle.
    • Introduction to Journal Entries:Explanation of the concept of debits and credits in journal entries, relating them to Newton’s third law (“for every action, there is an equal and opposite reaction”).
    • Example of a purchase (car for cash) to demonstrate journal entries (debit cars, credit cash).
    • Example of a purchase of a car using a loan (debit cars, credit car loan payable).
    • Example of buying a car with both cash and a loan (debit car, credit cash and credit car loan payable).
    • Practice with Journal Entries:Recording of several business transactions using journal entries including:
    • Share Issuance.
    • Payment of Rent.
    • Borrowing Money.
    • Equipment Purchase (part cash, part payable)
    • Purchase of Supplies on Account.
    • Completion of a Taxidermy Job on Account.
    • Dividend Payment.
    • Payment of Utilities Bill.
    • Payment for a past Equipment Purchase.
    • Receipt of Telephone Bill.
    • Collection of Receivable.
    • Payment for Supplies (Cash).
    • Sale of Taxidermy Services.
    • Rent Revenue.
    • Payment of Salaries.
    • Posting Journal Entries to T-Accounts:Introduction of T-accounts as a way of organizing journal entries into separate accounts (assets, liabilities, equity, revenue, expense).
    • Example of transferring debits and credits to T-accounts.
    • Adjusting Entries:Introduction to the concept of adjusting journal entries, which are not typically triggered by external transactions.
    • Examples of adjusting entries:
    • Prepaid Expenses: The example used was insurance, how to use up that asset over the life of the insurance.
    • Depreciation: Recording the reduction in value of an asset over time.
    • Accrued Expenses: Interest on a loan that is building up (but not yet paid).
    • Accrued Revenue: Revenue earned, but cash not received.
    • Discussion of how these adjusting entries are necessary for properly representing a company’s financial position.
    • Comprehensive Problem 1:A large multi-step problem that combined several concepts:
    • Making adjusting journal entries (for supplies, prepaid insurance, unearned revenue, depreciation etc.)
    • Preparing an Adjusted Trial Balance.
    • Preparing a full set of Financial Statements (Income Statement, Statement of Changes in Equity, Balance Sheet).
    • Closing Entries:Explanation of the purpose of closing entries (to reset temporary accounts).
    • Demonstration of closing entries with a focus on the income statement accounts.
    • Preparation of a Post-Closing Trial Balance.
    • Bank Reconciliations:Explanation of the purpose of a bank reconciliation.
    • Walk-through of bank reconciliation example.
    • Accounts Receivable and Bad Debts:Discussion of accounts receivable and the need for an allowance for uncollectible accounts.
    • Calculation and journal entry for bad debts expense and allowance for doubtful accounts.
    • Explanation of how a “write off” works to remove a bad debt.
    • Inventory and Cost of Goods Sold:Example of a simple inventory purchase and sale with the related journal entries.
    • Example of inventory purchases at multiple prices, and their impact on COGS.
    • Introduction of different inventory costing methods (FIFO, LIFO, Weighted Average).
    • Discussion of the Specific Identification method.
    • Inventory Methods (FIFO, LIFO, Weighted Average):Walk-through of inventory record example using FIFO (first in, first out).
    • Walk-through of inventory record example using LIFO (last in, first out).
    • Walk-through of inventory record example using weighted average method.
    • Depreciable Assets and Depreciation Methods: * Discussion of depreciation for assets with an estimated residual value. * Example and calculation of depreciation using straight-line method, including partial-year depreciation. * Example and calculation of depreciation using units of production method. * Example and calculation of depreciation using double declining balance method.
    • Sale of Assets:Example of selling a depreciated asset. Calculation of gains and losses on the sale and the related journal entries.
    • Bonds PayableDiscussion of Bonds Payable – both at a premium and at a discount, the need for amortization of premiums and discounts.
    • Examples of bond issue, interest payment and discount amortization.
    • Shareholder EquityDiscussion of preferred shares and their relative advantages to common shares.
    • Statement of Cash Flows:Explanation of the purpose of the Statement of Cash Flows and its three categories: Operating, Investing, and Financing.
    • Example of the reconciliation of retained earnings to arrive at dividends for the cash flow statement.
    • Preparation of a simple statement of cash flows from a balance sheet and income statement.
    • Financial Statement Analysis (Vertical Analysis):Introduction to Vertical Analysis and how it is useful to make comparisons between unlike sized companies.
    • Examples of preparing a common-sized income statement and a common-sized balance sheet.
    • Financial Ratio Analysis:Introduction to the importance and use of financial ratios for analysis.
    • Calculation and discussion of several financial ratios (current ratio, acid-test ratio, debt-to-equity ratio, return on equity, gross profit margin, return on assets).

    Cast of Characters (Principal People Mentioned):

    • The Instructor (Tony Bell): An accounting professor, presumably the narrator of the videos. He shares personal anecdotes about his own struggles with accounting, provides clear explanations of concepts, and guides viewers through the practice problems. He encourages viewer engagement with likes and subscribes.
    • Isaac Newton: A famous physicist whose third law is used as an analogy to explain the debit and credit relationship in journal entries.
    • Maria: The owner/shareholder of a company, implied in the journal entry example where they take a dividend.
    • W. White: The customer that wrote the bad NSF check in the bank reconciliation example.
    • The Car Dealer – the entity that sells the car to the instructor in the journal entry example.
    • MIT (Massachusetts Institute of Technology) The entity that issues bonds in an illustrative example.
    • Harvard University The entity used as a competitive example in the bond discussion.
    • Kemp Company: Hypothetical company used in the depreciation examples.
    • Bill’s Towing: The hypothetical company used in the asset sale example.
    • Tinger Inc. The hypothetical company used in the bond issuance examples.
    • Abdan Automart: The hypothetical company used in the inventory method examples.
    • Romney Inc.: Hypothetical company used in the combined purchase and sale inventory example.
    • Harre Gil & Hussein Inc.: The hypothetical entities compared using Vertical Analysis.

    This should give you a solid overview of the content covered in the provided text. Please let me know if you have any other questions or requests.

    Understanding the Income Statement

    An income statement, also called the statement of operations or profit and loss (P&L) statement, summarizes a company’s revenues and expenses to determine its profitability [1, 2].

    Key aspects of the income statement, according to the sources:

    • Purpose: To show whether a company was profitable, and if so, how much money it made [1]. It answers the question of whether earnings exceeded costs [2].
    • Components:
    • Revenues are what a company earns from its business activities [3]. Examples include sales revenue, tuition revenue, and rent revenue [3]. Revenues are considered “earned” [3].
    • Expenses are the costs of earning revenue [3]. Examples include salary expense, utilities expense, and maintenance expense [3].
    • Net Income or Profit is calculated by subtracting total expenses from total revenues [1].
    • Format:
    • A proper income statement title includes three lines: the company’s name, the name of the statement, and the date [4].
    • The date must specify the time period the statement covers (e.g., “for the year ended”) [4].
    • Revenues are listed first, followed by expenses [5].
    • A total for expenses is shown [5].
    • The net income is double-underlined [6].
    • Dollar signs are placed at the top of each column and beside any double-underlined number [6].
    • Gross Profit: In a retail business, the income statement includes the cost of goods sold (COGS). Sales revenue minus sales returns and allowances equals net sales. Net sales minus COGS equals gross profit [7, 8].
    • A gross profit percentage can be calculated by dividing gross profit by net sales [9].
    • Operating Income: The income statement lists operating expenses, which, when subtracted from gross profit, gives the operating income or profit [8, 9].
    • Non-operating Items: The income statement may include non-operating expenses, such as interest and income tax [10, 11].
    • Usefulness: An income statement is typically one of the first places an analyst will look to assess a company’s performance [2].

    It is important to note that the income statement should be compared to prior periods to assess whether a company’s profit is trending up or down [6]. An analyst may also compare the income statement to those of other companies [4].

    Statement of Changes in Equity

    A statement of changes in equity summarizes how a company’s equity accounts changed over a period of time [1, 2]. The statement details the changes in the owner’s stake in the company [1, 3].

    Key aspects of the statement of changes in equity, according to the sources:

    • Purpose: The statement shows the changes in equity accounts over a period [2]. It summarizes what happened to the shareholders’ equity accounts during the year [1].
    • Components:
    • Beginning Balance: The statement begins with the balances of each equity account at the start of the period [2]. For example, the beginning balance of common shares and retained earnings on January 1st [2].
    • Changes During the Period: The statement then shows how each equity account changed during the period.
    • For common shares, this may include increases from issuing new shares or decreases from repurchasing shares [3, 4].
    • For retained earnings, this includes increases from net income, and decreases from dividends [3, 4].
    • Ending Balance: The statement ends with the balance of each equity account at the end of the period [4].
    • Key Accounts: The main equity accounts that are tracked are:
    • Common shares [1, 3] (also called share capital [3]) which represents the basic ownership of the company [3].
    • Retained earnings [1, 3] which represents the accumulated profits of the company that have not been distributed to shareholders [3].
    • Preferred shares, which are a class of shares that have preferential rights over common shares, such as a preference for dividends [5].
    • Dividends:
    • Dividends represent the distribution of profits to shareholders [6].
    • Cash dividends reduce retained earnings and shareholders’ equity [3].
    • A stock dividend involves issuing new shares to existing shareholders [7]. This does not affect the total value of shareholders’ equity [8].
    • Format:
    • The statement includes a three-line title: company name, the name of the statement, and the date [2].
    • The date specifies the period the statement covers (e.g., “for the year ended”) [2].
    • Each equity account is listed as a column heading [2].
    • Dollar signs are placed at the top of each column and beside any double-underlined numbers [4].
    • Relationship to Other Statements:The net income from the income statement is used to calculate the change in retained earnings [4, 9].
    • The ending balances of the equity accounts are carried over to the balance sheet [10].
    • The changes in retained earnings shown on the statement of changes in equity are captured in the closing journal entries [9].

    In summary, the statement of changes in equity provides a detailed view of how the owners’ stake in the company has changed over time, linking the income statement and the balance sheet [1].

    Understanding the Balance Sheet

    A balance sheet, also called the statement of financial position, is a financial statement that presents a company’s assets, liabilities, and shareholders’ equity at a specific point in time [1, 2]. The balance sheet is based on the fundamental accounting equation: Assets = Liabilities + Shareholders’ Equity [3].

    Key aspects of the balance sheet, according to the sources:

    • Purpose: To provide a snapshot of what a company owns (assets), what it owes (liabilities), and the owners’ stake in the company (equity) at a specific date. It shows the financial position of the company at that moment in time [2].
    • Components:
    • Assets: These are things a company owns or controls that have value [4, 5]. They are resources with future economic benefits [5]. Assets are listed in order of liquidity, from most to least liquid [6].
    • Current assets are expected to be converted to cash or used up within one year [7]. Examples include cash, accounts receivable, inventory, and office supplies [5, 7, 8].
    • Long-term assets, also called property, plant, and equipment (PP&E), are assets that are not expected to be converted to cash or used up within one year. Examples include buildings, land, and equipment [5].
    • Assets are recorded at their net book value, which is the original cost minus any accumulated depreciation [9].
    • Liabilities: These are obligations of the company to others, or debts that must be repaid in the future [10]. They represent future economic obligations [10]. Liabilities are also categorized as either current or long-term.
    • Current liabilities are obligations due within one year [7]. Examples include accounts payable, wages payable, and notes payable [10].
    • Long-term liabilities are obligations due in more than one year. Examples include bank loans and mortgages [10].
    • Shareholders’ Equity: This represents the owners’ stake in the company, and is the residual interest in the assets of the company after deducting liabilities [3].
    • Key accounts include common shares (or share capital) and retained earnings [11].
    • Retained earnings are the accumulated profits that have not been distributed to shareholders [11].
    • Format:
    • The balance sheet has a three-line title: company name, the name of the statement, and the date [2].
    • Unlike the income statement or statement of changes in equity, the balance sheet is dated for a specific point in time, not for a period (e.g., “December 31, 2024,” not “for the year ended”) [2].
    • Assets are typically listed on the left side, and liabilities and shareholders’ equity are on the right side [6].
    • Assets are listed in order of liquidity, from the most current to the least [6].
    • Dollar signs are placed at the top of each column and beside any double-underlined numbers [12, 13].
    • Relationship to other Statements:
    • The ending balances of the equity accounts are taken from the statement of changes in equity [14].
    • The balance sheet provides information for the statement of cash flows, particularly for noncash assets and liabilities [15].
    • Balancing: The balance sheet must always balance, meaning that total assets must equal total liabilities plus total shareholders’ equity [1, 6].

    In summary, the balance sheet provides a fundamental overview of a company’s financial position at a specific point in time, showing the resources it controls, its obligations, and the owners’ stake in the company [2].

    Financial Ratio Analysis

    Financial ratios are calculations that use data from financial statements to provide insights into a company’s performance and financial health [1]. They are used to analyze and compare a company’s performance over time or against its competitors [1-3].

    Here’s a breakdown of key financial ratios discussed in the sources, categorized by the aspects of a company they assess:

    I. Liquidity Ratios These ratios measure a company’s ability to meet its short-term obligations [4, 5].

    • Current Ratio: Calculated as current assets divided by current liabilities [4, 6]. It indicates whether a company has enough short-term assets to cover its short-term debts [4, 6].
    • A general rule of thumb is that a current ratio above 1.5 is considered safe [5]. However, this may not apply to all companies [5].
    • A higher ratio generally indicates better liquidity [5].
    • Asset Test Ratio (or Quick Ratio): Calculated as (cash + short-term investments + net current receivables) divided by current liabilities [7, 8]. This ratio is a stricter measure of liquidity, focusing on the most liquid assets.
    • A general rule of thumb is that an asset test ratio of 0.9 to 1 is desirable [7].
    • It excludes inventory and prepaid expenses from current assets [7, 8].

    II. Turnover (Efficiency) Ratios These ratios measure how efficiently a company is using its assets [8].

    • Inventory Turnover: Calculated as cost of goods sold (COGS) divided by average inventory [8]. It measures how many times a company sells and replaces its inventory during a period [8].
    • A higher turnover indicates better efficiency [9].
    • Receivables Turnover: Calculated as net sales divided by average net accounts receivable [9]. It measures how many times a company collects its average accounts receivable during a period [9].
    • A higher turnover indicates a company is more effective in collecting its debts [9].
    • Days to Collect Receivables: Calculated as 365 divided by receivables turnover [9]. It measures the average number of days it takes a company to collect payment from its customers [9].
    • A lower number is generally better, as it indicates a company is collecting payments more quickly [9].

    III. Long-Term Debt-Paying Ability Ratios These ratios assess a company’s ability to meet its long-term obligations and its leverage [9].

    • Debt Ratio: Calculated as total liabilities divided by total assets [9]. It indicates the proportion of a company’s assets that are financed by debt [9].
    • A lower debt ratio is generally considered safer, as it indicates less reliance on debt financing [9, 10].
    • Times Interest Earned: Calculated as operating income divided by interest expense [10]. It measures a company’s ability to cover its interest expense with its operating income [10].
    • A higher ratio indicates a greater ability to pay interest [10].

    IV. Profitability Ratios These ratios measure a company’s ability to generate profits from its operations [10].

    • Gross Profit Percentage: Calculated as gross profit divided by net sales [11]. It measures a company’s profitability after accounting for the cost of goods sold [11].
    • A higher percentage indicates a better ability to generate profit from sales [11].
    • Return on Sales: Calculated as net income divided by net sales [11]. It measures how much profit a company generates for each dollar of sales [11].
    • A higher percentage indicates better profitability [11].
    • Return on Assets (ROA): Calculated as (net income + interest expense) divided by average total assets [11]. It measures how effectively a company is using its assets to generate profit [11].
    • A higher ROA indicates better asset utilization and profitability [12].
    • Return on Equity (ROE): Calculated as (net income – preferred dividends) divided by average common shareholders’ equity [12]. It measures how much profit a company generates for each dollar of shareholders’ equity [12].
    • A higher ROE indicates better returns for shareholders [12].

    V. Stock Market Performance Ratios These ratios assess a company’s performance from the perspective of stock market investors [13].

    • Price-Earnings Ratio (P/E Ratio): Calculated as market price per share divided by earnings per share [13]. It indicates how much investors are willing to pay for each dollar of a company’s earnings [13].
    • A higher P/E ratio may indicate that a stock is overvalued [1, 13].
    • Dividend Yield: Calculated as dividends per share divided by market price per share [13]. It indicates the percentage of the stock price that is returned to shareholders as dividends [13].
    • A higher yield can be attractive to income-focused investors [13].

    Additional Notes:

    • Horizontal Analysis compares financial data over different time periods (e.g. year over year) [14].
    • Vertical Analysis (or Common-Size Analysis) expresses each item in a financial statement as a percentage of a base number, such as net sales for the income statement or total assets for the balance sheet [3]. This helps compare companies of different sizes [3].
    • When analyzing ratios, it is important to compare them to industry averages or to a company’s historical performance to assess if the ratio is considered good or bad [1, 2].
    • It is important to note that a ratio may be interpreted differently depending on the company and industry [5, 10].
    • Many companies will focus on gross profit percentages, and will be especially interested if costs of goods sold are outpacing sales, impacting margins [2].
    • Analysts are typically interested in seeing positive and growing operating cash flows from the statement of cash flows [15].
    • A company’s cash flow statement and ratios are often used to determine if the company has enough cash on hand to meet its short-term obligations [16].

    Bank Reconciliation: A Comprehensive Guide

    A bank reconciliation is a process that compares a company’s cash balance as per its own records (book balance) with the corresponding cash balance reported by its bank (bank balance) [1]. The goal is to identify and explain any differences between these two balances and to correct any errors or omissions [1].

    Here are key points about bank reconciliations based on the sources:

    • Purpose:
    • To identify discrepancies between the bank’s record of cash and the company’s record of cash [1].
    • To ensure that a company’s cash records are accurate and up to date.
    • To identify errors made by either the company or the bank and make corrections to those errors [1, 2].
    • To detect fraud or theft by identifying unauthorized transactions [1, 2].
    • To provide better internal control of cash [1].
    • Timing: Bank reconciliations are typically prepared monthly [1].
    • Format:A bank reconciliation typically starts with the ending balance per bank statement and the ending balance per the company’s books [2].
    • It includes adjustments to each of these balances to arrive at an adjusted or reconciled cash balance [2].
    • The format of a bank reconciliation resembles a balance sheet, where the left side pertains to the bank’s perspective and the right side pertains to the company’s perspective [3].
    • Items Causing Differences:Bank side adjustments: These are items that the bank knows about but the company does not know about until it receives the bank statement.
    • Deposits in transit: Deposits made by the company but not yet recorded by the bank [3].
    • Outstanding checks: Checks written by the company but not yet cashed by the recipients, and thus not yet deducted from the bank balance [3, 4].
    • Book side adjustments: These are items that the company knows about, but that the bank doesn’t know about until it receives the company’s information [5].
    • Non-sufficient funds (NSF) checks: Checks received from customers that have bounced due to insufficient funds in the customer’s account [6].
    • Bank collections: Amounts collected by the bank on the company’s behalf, such as notes receivable [6].
    • Electronic funds transfers (EFT): Payments or collections made electronically that may not yet be recorded by the company [6].
    • Bank service charges: Fees charged by the bank [6].
    • Interest earned: Interest credited to the company’s account by the bank [6].
    • Errors: Mistakes in recording transactions by either the bank or the company [2].
    • For example, the company may have recorded a check for an incorrect amount [2]. If a check was recorded for too much, cash needs to be debited by the difference, and vice versa [6, 7].
    1. Steps in Preparing a Bank Reconciliation:Start with the ending cash balance per the bank statement and the ending cash balance per the company’s books [3].
    2. Identify and list all the deposits in transit and outstanding checks, and make the necessary additions to or subtractions from the bank balance [3, 4].
    3. Identify and list all items that need to be adjusted on the book side, such as NSF checks, bank collections, electronic funds transfers, bank service charges, and errors [5-7].
    4. Make the necessary additions to or subtractions from the book balance [5-7].
    5. Calculate the adjusted or reconciled cash balance on both the bank and book sides [5, 7]. These adjusted balances should be the same if the reconciliation is done correctly.
    • Journal Entries:
    • Journal entries are required for the adjustments made to the company’s book balance [7].
    • These entries are made to correct the company’s cash account for items that the company did not know about, as well as any errors discovered during the bank reconciliation process.
    • All of these entries will involve the cash account [7, 8].

    In summary, a bank reconciliation is a critical control activity that ensures the accuracy of a company’s cash records. It involves comparing the bank’s records to the company’s records, identifying any discrepancies, and making necessary adjustments to both sets of records. The process helps maintain accurate financial statements and protect the company from errors and fraud [1].

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Al Riyadh Newspaper: March 04, 2025 Charitable Campaigns, Diverse Insights, Efforts to Mediate

    Al Riyadh Newspaper: March 04, 2025 Charitable Campaigns, Diverse Insights, Efforts to Mediate

    The provided texts offer diverse insights into recent events and ongoing initiatives in Saudi Arabia and the wider world. Several articles focus on Saudi Arabia’s domestic affairs, highlighting cultural events, economic developments, and charitable campaigns, including those associated with Ramadan. A key focus is on Saudi Arabia’s foreign relations and its role in regional diplomacy, including the Lebanese president’s visit and efforts to mediate in the Russia-Ukraine conflict. Furthermore, some items discuss economic issues such as oil prices, stock market performance, and trade relations, both within the Kingdom and on a global scale. There is also coverage on events surrounding the Israeli-Palestinian conflict, and the impacts of geopolitical issues on oil prices. Finally, one article focuses on how brands such as Bata incorporate sustainable practices in order to foster a good public image.

    Study Guide: Saudi Arabia in 2025 – A Deep Dive

    Quiz (Short Answer)

    1. According to the text, what are the main benefits of the agreement between the US and Ukraine on rare minerals?
    2. What role does the Crown Prince of Saudi Arabia play in supporting charitable work, as mentioned in the text?
    3. How does the Saudi Vision 2030 relate to the economic cooperation between Saudi Arabia and Lebanon, according to the text?
    4. What are some of the consequences of Netanyahu’s actions in Gaza, according to the Israeli analyst Harel?
    5. What is the significance of the “Year of Handicrafts 2025” initiative in Saudi Arabia, as presented in the text?
    6. What is the “Markaz,” and what is its significance during Ramadan in Jeddah?
    7. What is the Saudi Forum for Media intended to do for the Kingdom?
    8. What are the two sides hoping to get out of the Saudi Pro League?
    9. What is the main impact of the Russian-Ukrainian war for European allies?
    10. According to the source, how does Bata integrate sustainable practices in its company culture?

    Quiz Answer Key

    1. The agreement allows the US to invest in rare minerals needed for industries like AI and renewable energy and provides Ukraine with security assurances against the war. It would give the US investment rights to 50% of Ukraine’s rare minerals.
    2. The Crown Prince actively supports charitable initiatives with significant funding, demonstrating the Kingdom’s commitment to improving citizens’ lives and promoting social solidarity. He donated 150 million riyals.
    3. Saudi Vision 2030 aligns with efforts to boost Saudi-Lebanese economic cooperation, particularly in sectors like technology and energy, fostering investment and development in Lebanon.
    4. Harel suggests that Netanyahu’s policies lead to resumed conflict, increased Israeli casualties, and the potential sacrifice of hostages due to Hamas’ strengthened defensive capabilities.
    5. It aims to boost the cultural tourism sector by promoting traditional crafts, supporting local artisans, and raising awareness of Saudi Arabia’s heritage, while integrating them to the new digital economy.
    6. The “Markaz” is a traditional gathering place, especially in historic Jeddah neighborhoods, where people gather to socialize, share Ramadan drinks, and enjoy traditional sweets, strengthening social bonds during the holy month.
    7. The Saudi Forum for Media intends to promote Saudi Arabia’s interests, enhance its positive image, and foster communication with global media organizations, highlighting the Kingdom’s progress and development in various sectors.
    8. The teams hope to overcome challenges and push for victory and the Asian Championship as the teams work towards the elimination stage.
    9. The Russian-Ukrainian war has encouraged allies like those in Europe to increase their defense spending in light of the dangers associated with war.
    10. Bata strategically integrates sustainability by launching internal awareness campaigns, publishing reports on sustainability initiatives, participating in dialogues with stakeholders, and engaging with media to improve its sustainable initiatives.

    Essay Format Questions

    1. Analyze the evolving relationship between Saudi Arabia and Lebanon as depicted in the article, considering historical ties and future economic prospects.
    2. Discuss the implications of the Israeli-Palestinian conflict, focusing on the role of international actors and the humanitarian consequences, as presented in the provided document.
    3. Evaluate the significance of Saudi Arabia’s Vision 2030 in the context of its domestic social and economic reforms and its role in regional and international affairs.
    4. Examine the impact of the Russian-Ukrainian war on global energy markets and the diplomatic efforts to resolve the conflict, as presented in the provided news excerpts.
    5. Assess the role of media and cultural initiatives in promoting Saudi Arabia’s national identity and its engagement with the international community, using examples from the document.

    Glossary of Key Terms

    • ولي العهد (Wali al-Ahd): Crown Prince. The designated successor to the throne in a monarchy.
    • روؤية 2030 (Ru’yah 2030): Vision 2030. Saudi Arabia’s strategic framework to reduce its dependence on oil, diversify its economy, and develop public service sectors.
    • مبادرات (Mubadarat): Initiatives. New programs or plans, often related to development or reform.
    • التحديات (Al-Tahadiyat): Challenges. Difficulties or obstacles that need to be overcome.
    • السلام (As-Salam): Peace. The condition marked by the absence of war or conflict.
    • القضايا المستدامة (Al-Qadaya al-Mustadama): Sustainable issues. Problems or challenges that deal with responsible resource management and environmental consciousness.
    • المنظمة الصحية (Al-Munazzama as-Sihiyya): Health Organization. Typically refers to an entity focused on health, like a public health ministry.
    • المسجد النبوي (Al-Masjid an-Nabawi): The Prophet’s Mosque. One of the holiest sites in Islam, located in Medina.
    • القطاع الصحي (Al-Qita’ as-Sihi): The Health Sector. Encompasses all health-related services and institutions.
    • الإعلام (Al-I’lam): Media. Various means of communication, such as newspapers, television, and the internet.
    • الحرف اليدوية (Al-Hiraf al-Yadawiyya): Handicrafts. Objects made by hand, often representing traditional culture.
    • دبلوماسية (Diblomasiya): Diplomacy. The art and practice of conducting negotiations between representatives of states.
    • الإصلاحات (Al-Islahat): Reforms. Changes to improve a system or institution.

    Al Riyadh Newspaper Analysis: Themes and Key Ideas

    Okay, here’s a briefing document based on the provided Arabic text excerpts.

    Briefing Document: Analysis of Themes and Key Ideas

    Date: October 26, 2023

    Source: Excerpts from “20705.pdf,” a daily newspaper published by Al Yamamah Press Foundation (Issue: 20705, dated March 4, 2025)

    Executive Summary:

    This document summarizes the main themes and key ideas found in the provided excerpts from the Al Riyadh newspaper. The articles cover a range of topics, including Saudi Arabia’s charitable initiatives, diplomatic relations with Lebanon and Bulgaria, internal matters such as the appointment of new governors, global economics (US-China Trade), and the Russian-Ukraine war, among others. The texts highlight Saudi Arabia’s commitment to domestic and international development, humanitarian aid, and regional stability, while also addressing pressing global issues and their impact on the Kingdom.

    Key Themes and Ideas:

    1. Saudi Arabia’s Commitment to Charity and Humanitarian Aid:
    • The excerpts emphasize the Kingdom’s dedication to charitable work, both domestically and internationally. This is portrayed as a long-standing tradition, particularly amplified during Ramadan.
    • Quote: “على اململكة اعتادت نوعية مبادرات واالرتقاء براجمه وتفعيل اخلري، صناعة صدام، ومنهج ممُ بشكل مشروعًا أصول بثمراته إلى أكر عدد من للو الرامج هذه كانت وإذا استفيدين، المل العام، شهور طيلة متواصلة والمشروعات فهي تكون مكثفة خالل شهر مصان المبارك، والأفراد الدولة مؤسسات تتنافس حيث الثواب كسب يف طمعًا اخلري، عمل يف من عند الله، بتشجيع من والة الأمر الذين ال يدخرون جهدًا يف دعم كل املبادرات” (Translation: “The Kingdom is accustomed to quality initiatives, upgrading its programs, and activating charity, creating an impact, and a systematic approach in its projects to deliver its fruits to the largest number of beneficiaries. These programs have been continuous throughout the year, and projects are intensified during the blessed month of Ramadan. Individuals and state institutions compete, where rewards are earned in the pursuit of good deeds, inspired by God, and encouraged by the rulers who spare no effort in supporting all initiatives.”)
    • Specific initiatives, such as the King Salman Center for Relief and Humanitarian Aid, are highlighted as models for effective aid delivery.
    • Quote: “متثل المناطق جود حملة كانت وإذا صناعة اخلري داخل مناطق ل من نموذجًا للإغاثة، سلمان امللك مركز يبقى اململكة، النموذج املتنوعة ومشروعاته براجمه الأبرز لصناعة اخلري خارج الحدود، ما ابتكار يف اململكة ريادة للجميع يؤكد النبيلة انسانية املبادرات وتنفيذ” (Translation: “If the ‘Joud’ campaign was a good example, then making goodness inside areas for example, the King Salman Center remains the Kingdom’s model for relief, a diverse model with programs and projects being the most prominent for making goodness outside the borders, any innovation in the Kingdom emphasizes its leadership for all noble human initiatives and implementation.”)
    • The “Joud” campaign is mentioned as a model, along with King Salman Center which also operates beyond the Kingdom’s borders.
    • Prince Faisal bin Salman launches “Ajer Ghair Mamnoun” (“Unrewarded Reward”) campaign to support charitable giving, and “Al Shefa” health waqf fund.
    1. Saudi-Lebanese Relations:
    • The visit of the Lebanese President to Saudi Arabia is framed as a turning point in relations, marking a new phase of cooperation after a period of challenges.
    • Quote: “لبنان بن التاريخية الروابط عمق تعكس خطوة يف واململكة العربية السعودية، حلَّ الرئيس اللبناني جوزيف عون صيفًا على الرياض تلبية لدعوة كرمية من صاحب السمو الملكي الأمير محمد بن سلمان، ويل العهد رئيس مجلس الوزراء. هذه الزيارة متثل نقطة حتول يف مسار العديد شهدت حلقبة حدًا وتضع البلدين، بن العالقات التعاون من جديدة مرحلة ببداية إيذانًا التحديات، من” (Translation: “A step that reflects the depth of the historical ties between Lebanon and the Kingdom of Saudi Arabia, the Lebanese President Joseph Aoun arrived in Riyadh in response to a generous invitation from His Royal Highness Prince Mohammed bin Salman, Crown Prince and Prime Minister. This visit represents a turning point in the course of relations between the two countries, setting a limit to an era that witnessed many challenges, marking the beginning of a new phase of cooperation.”)
    • Saudi Arabia’s “Vision 2030” is mentioned as an opportunity for Lebanon, and the Crown Prince’s efforts to support Lebanese stability are highlighted.
    • The historical support of Saudi Arabia for Lebanon, dating back to the reign of King Abdulaziz Al Saud and its role in the Taif Agreement, are also referenced.
    • The visit renewed hopes for economic ties, particularly in agricultural, industrial, and electronic products.
    • Investment opportunities are opening in technology, energy aligning with Vision 2030
    1. Saudi-Bulgarian Relations:
    • The Saudi leadership sent congratulatory messages to the President of Bulgaria on the occasion of the country’s National Day, indicating positive diplomatic engagement.
    1. Local events:
    • Princess Fahda bint Falah Al Hithlain sponsored the awarding of the King Salman Prize for memorizing the Quran
    • Prince Faisal bin Mishaal visits judges and sheikhs
    1. Israeli-Palestinian Conflict:
    • The article cites an Israeli analyst who criticizes Netanyahu’s government for taking “adventurous” steps in the Palestinian territories, Syria, and Gaza.
    • Quote: “احلكومة رئيس خطوات عواقب من إسرائيليون، حمللون حذر الإسرائيلية، بنيامن نتنياهو، يف الأيام الأخرية، بدعم من إدارة الرئيس الأمريكي، دونالد ترمب، وأشاروا إلى اأن مواقف ترمب احلالية ميكن اأن تتغري وفقا ملصالحه.” (Translation: “Israeli analysts warned of the consequences of the steps of the head of the Israeli government, Benjamin Netanyahu, in recent days, with the support of the administration of US President Donald Trump, and pointed out that Trump’s current positions may change according to his interests.”)
    • The analyst alleges violations of agreements, expansion of settlements, and restrictions on humanitarian aid to Gaza.
    • The article touches on potential international criticism and accusations of “deliberate starvation” against Israel.
    • The capture of 187 Palestinians
    1. Global Economic Issues:
    • The article addresses the potential impact of a trade war between the US and China, as well as the US with Canada and Mexico.
    • Quote: “الأمريكي الرئيس وإصرار اوكرانيا تواجهها التي املصاعب تظهر حجم عليها، وإن الإدارة الأمريكية ترى اأن كييف مدينة لها بهذه التفاقية مقابل” (Translation: “And given the insistence of the American president, the extent of the difficulties Ukraine is facing is evident, and the American administration sees that Kiev is indebted to it by this agreement in return for what was presented for American financial support.”)
    • The potential for a “minerals agreement” with Ukraine is discussed in the context of the Russia-Ukraine war and US support.
    • The article touches on the need for international partnerships and cooperation in the face of complex economic challenges.
    1. Russia-Ukraine War:
    • The article discusses French President Macron’s proposal for a truce in Ukraine during the Olympics, focusing on energy infrastructure.
    • Concerns about the war’s impact on global oil supplies and prices are mentioned.
    • There is an analysis of the conflict’s impact on the world economy.
    • Reported that Zelensky offered his resignation in exchange for NATO membership.
    1. Oil Market Dynamics:
    • The impact of the Trump-Zelensky “shouting match” on the global oil market.
    • Reports on attacks on Russian refineries impacting exports.
    1. Financial Market Activity:
    • Increase in Gold prices as Safe Haven
    • Increase in Saudi stock market (TASI)
    1. Cultural Initiatives:
    • Three films supported by the Red Sea Film Foundation win awards at the Berlin Film Festival
    • The “Abu Samel” family returns in “Jack Al-Alam 2”
    • Highlight on the “Year of Handicrafts 2025”
    • Importance of traditional medicine
    1. Other domestic events:
    • Arar’s Ramadan traditions
    • The inauguration of three free bus stations
    1. Sports:
    • Al-Nassr ties to Al-Istiqlal
    • Al-Ahli faces Al-Rayyan
    • Al-Hilal faces Pakhtakor
    • Al-Ittihad fails to beat Al-Akhdoud
    • The Saudi national weightlifting team travels to Turkey for preparations

    Quotes and specific article titles:

    • “The Kingdom and Lebanon Close the Page on ‘Challenges’”
    • “Saudi Arabia and Lebanon are turning a new page on economic relations. 100,000 Lebanese residents welcome the return of momentum to relations between the two countries”
    • “Israeli Analyst: Netanyahu’s Government Behaves Adventurously on All Fronts”
    • “Clash between Trump and Zelensky.. Disrupts Oil Markets”
    • “Russian-Ukrainian War and the Expected Riyadh Summit”
    • “Metals of Ukraine… and the American-Chinese Separation”
    • “‘Deaf with Health’… Awareness Efforts for Quality of Life”
    • “90% of residents of the Jenin camp displaced”

    Potential Implications:

    • The Saudi focus on charity and aid reinforces its image as a responsible global actor and leader in the Islamic world.
    • Improved Saudi-Lebanese relations could lead to increased economic cooperation and regional stability.
    • The concerns raised about Israeli policies may reflect a desire for a more balanced approach to the Israeli-Palestinian conflict.
    • Economic analysis suggests a cautious approach to global trade tensions, with a focus on diversification and partnerships.
    • Coverage of the Russia-Ukraine war highlights the need for diplomatic solutions and mitigation of economic consequences.

    Further Research:

    • Investigate the specific details of the “Joud” campaign and other Saudi charitable initiatives.
    • Analyze the economic impact of renewed Saudi-Lebanese cooperation.
    • Examine Saudi Arabia’s position on the Israeli-Palestinian conflict in greater depth.
    • Assess the potential consequences of a US-China trade war on the Saudi economy.

    I hope this briefing document is helpful.

    Global Affairs and Saudi Arabia’s Initiatives

    What is the significance of the Saudi campaign to promote good deeds during Ramadan?

    The campaign, supported by Saudi leadership, encourages charitable acts, highlights Islamic values, and fosters social solidarity. It provides support to citizens in need and aims to ensure adequate housing and promote unity. It emphasizes innovative initiatives, and aims to serve as an example for global relief efforts, reinforcing Saudi Arabia’s leadership in noble endeavors.

    What does the visit of the Lebanese President to Saudi Arabia signify?

    The visit signifies a renewal of economic ties and reflects the deep historical relations between Lebanon and Saudi Arabia. It marks a turning point in the relationship and the beginning of a new phase of cooperation, with the Saudi Vision 2030 offering opportunities for Lebanon’s development. This also hopes to boost financial stability between the two countries.

    How is the Israeli government behaving, according to analysts, and what are the potential consequences?

    According to Israeli analysts, the Netanyahu government is acting recklessly on all fronts, with the support of the U.S. administration. This includes violating agreements, seizing Syrian territory, threatening intervention in Syria, and restricting aid to Gaza. These actions risk reigniting conflict and sacrificing the well-being of hostages, as well as potentially further destabilizing the region.

    What is the “Ajer Ghair Mamnoon” campaign and what are its goals?

    The “Ajer Ghair Mamnoon” campaign, launched by Prince Faisal bin Salman, aims to promote charitable giving during Ramadan. It encourages individuals, organizations, and donors to contribute to the Waqf Fund, which supports healthcare initiatives and provides assistance to beneficiaries in Medina and Mecca. The campaign reflects Islamic values and fosters social cohesion.

    What are the economic implications of the tension between President Trump and President Zelensky?

    The tension between Presidents Trump and Zelensky has broader economic implications, potentially disrupting oil markets and global trade. Trump’s trade policies, including tariffs on goods from China, Mexico, and Canada, could harm the American economy and lead to increased inflation. The article also mentions the importance of stable relationships with oil exporting countries like Russia and Iraq.

    How are the arts and cultural programs in Saudi Arabia being promoted?

    Saudi Arabia actively promotes arts and culture through initiatives like the Red Sea International Film Festival, which supports local filmmakers and showcases Saudi talent on the global stage. Additionally, the Ministry of Culture’s initiative to recognize 2025 as the “Year of Handicrafts” aims to preserve and promote traditional crafts as a vital part of Saudi cultural heritage and tourism.

    How has the conflict between Russia and Ukraine impacted global oil prices and what factors might contribute to price stabilization?

    The Russia-Ukraine war disrupted global oil supplies, leading to price volatility. Attacks on Russian refineries further exacerbated concerns about exports of refined products. However, potential factors that could stabilize prices include increased oil production by OPEC+, a potential peace agreement between Russia and Ukraine, and increased U.S. pressure on Iraq to resume exports from the Kurdistan region.

    What are the diplomatic efforts aiming to address the Russia-Ukraine conflict, and what are the challenges involved?

    Diplomatic efforts include proposals for ceasefires during specific periods, but challenges persist, including Ukraine’s desire to regain territory and concerns over Russia’s territorial control. Negotiations are underway, with the United States playing a key role, but reaching a resolution that satisfies all parties remains difficult. The importance of effective diplomacy to mitigate conflict and promote sustainable solutions is emphasized.

    Saudi Arabia: Culture, Diplomacy, and Humanitarian Efforts

    Saudi Arabia’s internal and external efforts, plus some traditions, are mentioned throughout the sources:

    • Leadership & Philanthropy: Saudi Arabia is recognized for initiating programs, improving them, and activating charitable projects to benefit a large number of people. The state’s institutions compete in doing good, encouraged by the government.
    • Humanitarian Aid: The Kingdom has several humanitarian initiatives. The King Salman Center serves as a model for relief efforts inside the Kingdom. It is also considered a leading example for charitable work outside its borders through its diverse programs and projects.
    • Relationship with Lebanon: Saudi Arabia plays a pivotal role in supporting Lebanon, with deep-rooted historical ties dating back to the era of King Abdulaziz Al Saud. The Kingdom is portrayed not just as an economic gateway but also as a political partner to Lebanon. The Saudi market is a main source of Lebanese exports.
    • Cultural and Religious Significance: مكة (Mecca) is recognized as a central religious hub for Muslims. مدنة (Medina) is a destination for pilgrims. The country emphasizes the values of Islamic authenticity, societal cohesion, and sustained giving.
    • Economic Development: Saudi Arabia aims to achieve sustainable development goals by fostering a conducive environment for all citizens.
    • Modernization & Vision 2030: The Kingdom’s Vision 2030 aims to boost high-quality linguistic initiatives, strengthen identity, and enrich Arabic content.
    • ** رمضان (Ramadan) Celebrations & Traditions:**
    • Many people decorate the facades of houses in Jeddah with illuminated lanterns and Ramadan decorations that reflect the spiritual atmosphere of the month of Ramadan.
    • In Jazan, presenting ” الماء المبخر” ( Mabkhar water) is a tradition that symbolizes hospitality and generosity.
    • In the northern region, نق�ش الحناء (Henna نقش ) is used to encourage young girls to fast.
    • Global Diplomacy: Saudi Arabia is emerging as a crucial player in the changing geopolitical landscape, tackling challenges through dialogue. The upcoming summit hosted by Saudi Arabia, with the participation of the Crown Prince, is portrayed as a vital opportunity to stop losses and work towards a fair and lasting peace.

    Russia-Ukraine War: Negotiations, Global Impact, and Key Players

    Here’s what the sources say about the Russia-Ukraine war:

    • Saudi Arabia’s Role: Saudi Arabia is seen as a key regional player in resolving the Russia-Ukraine war.
    • US-Ukraine Relations: The US administration sees an agreement with Ukraine as a way to address challenges. However, conflicting reports suggest that the US president and the President of Ukraine had a heated meeting, and that the Ukrainian President left without an anticipated agreement concerning sharing rights to Ukrainian metals.
    • Negotiations & Peace Talks:European leaders are proposing a month-long truce in Ukraine.
    • There are increasing doubts about a US-brokered peace agreement between Russia and Ukraine.
    • The Ukrainian President’s advisor was critical of the US for trying to end the war while, in their view, the Ukrainian President has different goals.
    • Global Impact:The potential disruption of a peace agreement between Russia and Ukraine is causing instability.
    • The war is contributing to uncertainty and fluctuations in global markets, including oil prices.
    • The conflict is a significant concern for the United States and European countries.
    • Turkey’s Role:Turkey had halted a pipeline in March 2023 and is ready to resume operations that carry oil exports from the region of Kurdistan.

    Saudi Football League: Competition, Teams, and Players

    Here’s what the sources say about football leagues:

    • Saudi League Importance The Saudi League garners significant attention from followers and football enthusiasts.
    • Competition and Excitement The presence of approximately eight teams vying to avoid relegation to the First Division enhances the competitiveness and excitement of the league matches. These teams strive to win to secure their position among the top teams and remain in what is considered one of the greatest Arab leagues.
    • Increased Competition The current situation in the league makes the competition stronger among all competing teams.
    • Team Efforts and Fan Expectations Team coaches are doing everything they can, but more effort is needed to realize the dreams of sports fans.
    • Potential for Upsets There is an acknowledgement that the final weeks of the league could be unpredictable, with potential shifts in team positions.
    • Al-Nassr’s Position: If Al-Nassr does not improve to the top position, their current position is threatened. There is a mention of the team being affected by arrogance and poor luck.
    • Al-Ahli’s Performance: If Al-Ahli had been in good form from the start, they might have been a strong contender for the title.
    • Al-Hilal’s Performance: Al-Hilal is described as facing pressure with potential injuries, absences and exhaustion affecting the team.
    • Saudi Teams in the AFC Champions League:Al-Nassr tied a game against Esteghlal of Iran in the AFC Champions League.
    • Al-Ahli is preparing to play Al Rayyan of Qatar in the AFC Champions League.
    • Al-Hilal is set to face Pakhtakor in the AFC Champions League.
    • AFC Champions League Details:The final stages of the AFC Champions League Elite will be held in Jeddah, Saudi Arabia.
    • Matches are significant in the Saudi League.
    • Player Spotlight:Sami Al-Khabrani, despite being a distinguished player, has not been selected for the national team, prompting questions about the selection criteria.
    • There is hope that Al-Khabrani will get an opportunity to prove himself.
    • Salem Al-Dawsari shined in the league stage, tying for the top scorer position.
    • Riyad Mahrez is recognized as a standout player in Al-Ahli.

    Ramadan Traditions, Preparations, and Health Initiatives

    Here’s what the sources say about Ramadan events:

    • General Atmosphere: Ramadan is characterized by a spiritual atmosphere.
    • Traditions: There are several traditions associated with welcoming Ramadan:
    • Decorating homes with lights and Ramadan ornaments in areas like Jeddah.
    • Presenting ” الماء المبخر” (Mabkhar water) in the Jazan region, as a symbol of hospitality and generosity.
    • نق�ش الحناء (Henna نقش) is used to encourage young girls to fast in the northern region.
    • Efforts to help people observe Ramadan:
    • “حافلات المدينة” (Hafilat Al-Madinah) announced the development of 3 free subsidiary stations to facilitate access to the Prophet’s Mosque.
    • قطار الحرمين (Haramain Train) is raising its operating capacity to 1.6 million seats.
    • Health Initiatives: There are efforts to promote healthy habits during Ramadan. A campaign titled “صم بصحة” (Seh biseha) aims to promote a healthy lifestyle through Ramadan. It includes awareness of healthy eating, hydration, physical activity, and consultation with doctors to control chronic diseases.

    Media’s Influence: Shaping Opinion, Policy, and Global Diplomacy

    The sources discuss media power in the context of diplomacy, public perception, and cultural influence:

    • Influence on Public Opinion: The media has become a powerful force, capable of shaping public opinion, influencing policies, and affecting countries. The media is not just a means of conveying news, but a tool for directing and reshaping opinion, impacting policies, and influencing countries.
    • Media as a Battleground: The presence of journalists can be like a battle, especially when public statements are used to create doubt about something.
    • Impact on Political Leaders: The media can affect the standing of a political leader, influence public opinion, and even save or hurt them. The coverage can influence domestic and foreign public opinion.
    • Agenda Setting: Governments and leaders use the media to promote their agendas.
    • American Media’s Influence: The American media is a political and economic force that extends its influence beyond the United States. America uses its media as a tool to send specific messages to countries, using news channels and newspapers to shape how the global audience views events.
    • Examples of Media Influence: The meeting between President Trump and Ukrainian President Zelensky revealed the media’s role in shaping political discourse. The media can turn an event into a political tool and raise questions about the importance and danger of media on the international stage.
    • Need for Media Awareness: Because of the power of media, there is a need to be aware of its influence. The modern media is a force that can build or destroy alliances and promote or undermine leaders.
    • Sports Media: Media related to sports receives great attention from followers and those interested in the sport.
    • Communication strategies: Effective communication strategies include conveying specific messages, promoting interaction with the public, and building trust and transparency.
    • Cultural Dissemination: The “Literary Partner” initiative uses cafes to spread culture and literature, raising cultural awareness. The initiative contributes to opening new channels of communication between authors and society through the cultural sector.

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • True Crime: British Killers – A Prequel by Jason Neal

    True Crime: British Killers – A Prequel by Jason Neal

    This excerpt from True Crime: British Killers – A Prequel: Six Disturbing Stories of Some of the UK’s Most Brutal Killers explores the lives and crimes of several notorious British murderers. The book presents detailed accounts of each killer’s background, motives, and methods, and details the investigations and trials. Among those profiled are Anthony Hardy, known as the Camden Ripper, Peter Bryan, the London Cannibal, John George Haigh, known as the Acid Bath Killer, Dena Thompson, the Black Widow, and Levi Bellfield, the Bus Stop Killer, and Steven Wright, the Suffolk Strangler. The text also examines the impact of the crimes on the victims, their families, and society, including potential healthcare failures.

    True Crime: British Killers – A Prequel Study Guide

    Key Figures and Cases

    Chapter 1: The Camden Ripper (Anthony Hardy)

    • Anthony Hardy: The “Camden Ripper,” a British serial killer who murdered three women in Camden, London. He was obsessed with Jack the Ripper and struggled with mental illness and violent tendencies.
    • Sally Rose White: A developmentally challenged prostitute murdered by Anthony Hardy.
    • Elizabeth Valad & Brigette MacClennan: The other two women murdered by Anthony Hardy, whose body parts were found in garbage bags near Hardy’s flat.
    • Freddy Patel: The pathologist who initially determined that Sally Rose White died of natural causes.

    Chapter 2: The London Cannibal (Peter Bryan)

    • Peter Bryan: The “London Cannibal,” a man with a history of mental illness who killed three people and engaged in cannibalism.
    • Nisha Sheth: A shop assistant Bryan murdered after she rejected his advances.
    • Brian Cherry: A friend of Bryan’s whom he murdered and cannibalized after being transferred to a low-support accommodation.
    • Richard Loudwell: An inmate at Broadmoor who was strangled by Bryan.
    • Giles Forrester: During the trial, this judge stated, “You killed on these last two occasions because it gave you a thrill and a feeling of power when you ate flesh.”

    Chapter 3: The Acid Bath Killer (John George Haigh)

    • John George Haigh: Known as the “Acid Bath Killer,” he murdered multiple people and dissolved their bodies in sulfuric acid.
    • William McSwan: Haigh’s first victim, whom he killed for financial gain.
    • Amy & Donald McSwan: William’s parents, who were also murdered by Haigh.
    • Archibald and Rose Henderson: Another wealthy couple murdered by Haigh.
    • Olivia Durand-Deacon: A wealthy widow and Haigh’s final victim.
    • Dr. Keith Simpson: The forensic pathologist who found traces of Mrs. Durand-Deacon, leading to Haigh’s arrest.

    Chapter 4: The Black Widow (Dena Thompson)

    • Dena Thompson: A con artist and attempted murderer known as the “Black Widow” for her manipulative relationships and schemes.
    • Lee Wyatt: Dena’s first husband, whom she defrauded and falsely accused.
    • Julian Webb: Dena’s second husband, whom she murdered with an overdose of drugs.
    • Robert Waite: A lover of Dena Thompson who was drugged while on vacation with her.
    • Richard Thompson: Dena’s third husband, whom she attempted to murder with a baseball bat.
    • Stoyan Kostavj: A Bulgarian native who was in a relationship with Dena Thompson and has been reported missing.

    Chapter 5: The Bus Stop Killer (Levi Bellfield)

    • Levi Bellfield: The “Bus Stop Killer,” convicted of murdering Milly Dowler, Marsha McDonnell, and Amélie Delagrange, and attempting to murder Kate Sheedy.
    • Milly Dowler: A thirteen-year-old girl who was abducted and murdered by Bellfield.
    • Marsha McDonnell: A nineteen-year-old woman murdered by Bellfield.
    • Amélie Delagrange: A twenty-two-year-old French student murdered by Bellfield.
    • Kate Sheedy: A young woman who survived an attempted murder by Bellfield.
    • Johanna Collins: Bellfield’s ex-partner who provided crucial information to the police.
    • Yusuf Rahim: Levi Bellfield’s name after converting to Islam.

    Chapter 7: A Tragic December (Vincent Tabak)

    • Joanna Yeates: A landscape architect murdered by her neighbor, Vincent Tabak.
    • Greg Reardon: Joanna Yeates’ boyfriend.
    • Christopher Jeffries: Joanna Yeates’ landlord, who was initially vilified by the media.
    • Vincent Tabak: Joanna Yeates’ murderer, who initially claimed the death was accidental.

    Quiz

    1. What was Anthony Hardy’s initial job after graduating from Imperial College London, and how did his career progress before his life spiraled downwards?
    2. Describe the events that led to Anthony Hardy’s arrest for the murder of Sally Rose White, focusing on the key pieces of evidence and his initial explanations to the police.
    3. Explain the circumstances surrounding Peter Bryan’s first murder and why he was originally charged with manslaughter on the grounds of diminished responsibility.
    4. What was Peter Bryan’s defense to the killing of Joanna Yeates?
    5. Describe John George Haigh’s method for disposing of bodies and his reasoning behind this approach.
    6. Explain how John George Haigh was ultimately caught, despite his efforts to destroy all evidence.
    7. Describe Dena Thompson’s elaborate scheme to convince her first husband, Lee Wyatt, that he needed to go into hiding.
    8. Explain how Julian Webb died.
    9. Describe the key evidence that linked Levi Bellfield to the murder of Milly Dowler.
    10. Why was Christopher Jeffries initially suspected of the death of Joanna Yeates, and what details were the media focusing on?

    Quiz Answer Key

    1. Anthony Hardy landed a high-paying job with British Sugar and quickly moved up the corporate ranks. However, a severe economic downturn in the mid-1970s led to him losing his job and suffering from depression, ultimately leading to deviant behavior.
    2. After a dispute with his upstairs neighbor, Hardy vandalized her door with graffiti and battery acid, leaving a trail of footprints that led back to his flat. When police searched his apartment, they found the naked body of Sally Rose White in a locked bedroom; Hardy claimed it was his roommate’s room, but police found the key in his coat pocket.
    3. Peter Bryan murdered Nisha Sheth after she rejected his advances and he was fired from his job due to theft. He struck her repeatedly with a claw hammer. He pleaded guilty to manslaughter on the grounds of diminished responsibility and was sentenced to a psychiatric unit.
    4. Vincent Tabak claimed that he was waving back at Joanna Yeates when she came to her kitchen window. He said that he went inside to chat with her, and when he tried to kiss her, she screamed, so he put his hands around her throat. He said it was not premeditated.
    5. John George Haigh dissolved his victims’ bodies in sulfuric acid, believing that if there was no body, there could be no murder conviction. He gained access to sulfuric acid while working in the tinsmith factory in Lincoln Prison.
    6. Despite Haigh’s efforts to destroy all evidence, police found traces of Mrs. Durand-Deacon’s sludge in the yard, including gallstones and false teeth. Additionally, bloodstains were found inside the workshop, leading to his arrest.
    7. Dena Thompson concocted an elaborate story involving a deal with Disney that supposedly went wrong and involved the mafia. She convinced Lee that the mafia was after him and would eliminate him, so he needed to go into hiding to protect himself.
    8. Julian Webb died from an overdose of dothiepin, an anti-depressant, and aspirin in his curry. Dena Thompson spiked the curry with a massive dose of the drugs. The coroner recorded an “Open Verdict” because there was insufficient evidence that Julian died of suicide.
    9. The only evidence they had on the murder was the CCTV footage of the red Daewoo Nexia pulling out of Collingwood Place just ten minutes after Milly was last seen. When police realized that Bellfield’s wife owned the Daewoo Nexia, it was clear that he was responsible for that murder as well.
    10. Christopher Jeffries was vilified by the tabloid press because he was the landlord of the building. Since there was no sign of forced entry, investigators believed that Joanna had been murdered by someone she knew or someone that had access to the flat; Jeffries had access to the flat.

    Essay Questions

    1. Discuss the role of mental illness in the cases of Anthony Hardy and Peter Bryan. To what extent did their mental states contribute to their crimes, and how did the legal system address this factor?
    2. Compare and contrast the methods used by John George Haigh and Anthony Hardy to attempt to evade detection. What made Haigh’s plan ultimately fail, and what similarities can be drawn between the two cases?
    3. Analyze the character of Dena Thompson. What were her primary motivations, and how did she exploit the vulnerabilities of others to achieve her goals?
    4. Examine the police investigation of Levi Bellfield. How did they eventually link him to the murders of Milly Dowler, Marsha McDonnell, and Amélie Delagrange, and what role did CCTV footage play in the investigation?
    5. Critically evaluate the media coverage of the Joanna Yeates case, focusing on the initial portrayal of Christopher Jeffries. How did the media contribute to public perception, and what were the consequences of their reporting?

    Glossary of Key Terms

    • Serial Killer: An individual who murders three or more people over a period of more than 30 days, with a “cooling off” period between each murder, and whose motives are often psychological.
    • Postmortem Examination (Autopsy): A surgical procedure consisting of a thorough examination of a corpse to determine the cause and manner of death and to evaluate any disease or injury that may be present.
    • CCTV: Closed-circuit television, a television system in which signals are not publicly distributed but are monitored, primarily for surveillance and security purposes.
    • Forensic Science: The application of scientific methods and techniques to matters of law and criminal justice.
    • Sulfuric Acid: A highly corrosive strong mineral acid with the molecular formula H2SO4; John George Haigh used this to dissolve the bodies of his victims.
    • Diminished Responsibility: A legal defense that argues a defendant’s mental capacity was impaired, reducing the severity of the charge.
    • Red-Light District: A specific area in a city where prostitution and other sexual activities are concentrated.
    • Luminol: A chemical that exhibits chemiluminescence, with a striking blue glow, when mixed with an oxidizing agent. It is used by forensic investigators to detect traces of blood, even if it has been cleaned or removed.
    • Curfew: A regulation requiring people to remain indoors between specified hours, typically at night.
    • Parole: The release of a prisoner temporarily (for a special purpose) or permanently before the completion of their sentence, on the promise of good behavior.

    True Crime: British Killers – A Prequel: Six Disturbing Stories

    Okay, here is a briefing document summarizing the main themes and key details from the provided excerpts from “True Crime: British Killers – A Prequel: Six Disturbing Stories…”.

    Briefing Document: “True Crime: British Killers – A Prequel”

    Overall Theme: The book appears to be a collection of true crime stories focusing on various British serial killers and other criminals, exploring their backgrounds, crimes, and the investigations that led to their capture or conviction. It also touches upon the failures and shortcomings of healthcare and justice systems.

    Chapter 1: The Camden Ripper (Anthony Hardy)

    • Background: Tony Hardy, born in 1952, grew up in a lower-middle-class family. He was driven by a desire for greatness and saw himself as intellectually superior. He attended Imperial College London and eventually became a mechanical engineer.
    • Obsession and Decline: He developed an obsession with Jack the Ripper, admiring his ability to evade police. His marriage deteriorated due to his extreme sexual desires, and he suffered a severe economic downturn, which led to depression and violent outbursts. He was diagnosed as bipolar.
    • Criminal Behavior: He attempted to murder his wife but was only charged with domestic violence and spent time in a mental hospital. After release, he stalked his ex-wife and hired prostitutes, eventually killing one (Sally Rose White). He was also found guilty of the murders of Elizabeth Valad and Brigitte MacClennan.
    • Key Points: Hardy believed he was too intelligent to be caught, mirroring his fascination with Jack the Ripper. Despite his mental illness, he was deemed fit for release from a mental hospital, only to commit murder shortly after.
    • Quote: A friend recounted, “Anthony was obsessed with serial killers and we talked about them on several occasions. We had long discussions about Jack the Ripper, and Anthony thought he had a brilliant mind. He reckoned Jack the Ripper was a very clever bloke because he murdered all those prostitutes and never got caught.”
    • Forensic Issues: Despite the bizarre staging of Sally Rose White’s body, the initial postmortem examination ruled that she died of natural causes. This highlights potential issues with the initial investigation.
    • Outcome: Hardy received three life sentences and was given a whole life tariff in 2012, meaning he will never be released from prison.

    Chapter 2: The London Cannibal (Peter Bryan)

    • Background: Peter Bryan had a troubled upbringing.
    • Crimes: He committed manslaughter and was sent to a psychiatric unit. Eventually, he was moved to a low-security facility and allowed to leave the building unsupervised. He murdered Brian Cherry, dismembering his body and reportedly eating parts of it. He also strangled Richard Loudwell at Broadmoor.
    • Key Points: Bryan’s case exemplifies failures in the mental healthcare system. Despite a history of violence and mental health issues, he was repeatedly moved to less secure facilities and given unsupervised access to the community.
    • Quote: Bryan said, “I ate his brain with butter. It was really nice.” This shows a lack of remorse and demonstrates his disturbing actions.
    • Failures in the System: Reports from the National Health Services point to extreme failures in the healthcare system at every level.
    • Outcome: Bryan was sentenced to two life terms and is unlikely to ever be released.

    Chapter 3: The Acid Bath Killer (John George Haigh)

    • Background: John George Haigh had a strict upbringing and was drawn to crime early on.
    • Crimes: He murdered William McSwan, Amy and Donald McSwan and disposed of their bodies using sulfuric acid to fully dissolve the body. Then he murdered Archibald and Rose Henderson and Olivia Durand-Deacon, again attempting to dissolve their bodies in acid.
    • Key Points: Haigh believed that if there was no body, there could be no murder conviction.
    • Quote: Haigh said, “Mrs. Durand-Deacon no longer exists. I have destroyed her with acid. You will find the sludge which remains at Leopold Road. Every trace of her body has gone. How can you prove a murder if there is no body?”
    • Forensic Triumph: Haigh was mistaken, and the police were able to convict Haigh using traces of the victims found in the sludge that remained.
    • Outcome: Haigh was found guilty of the murder of Mrs. Durand-Deacon and was hanged at Wandsworth prison.

    Chapter 4: The Black Widow (Dena Thompson)

    • Deception: Dena Thompson manipulated and deceived multiple men for financial gain. She defrauded her first husband Lee Wyatt, and she poisoned her second husband, Julian Webb.
    • Crimes: She was found guilty and sentenced to life in prison with a minimum sentence of sixteen years for the murder of her second husband. She attempted to murder her third husband but was acquitted of the attempted murder charges.
    • Parole: After Dena Thompson’s conviction, investigators teamed with Interpol to look at all of her past lovers. She was granted parole and subsequently released from prison.
    • Quote: Her third husband said upon news of her parole, “She definitely tried to kill me, and they proved that she murdered her second husband. She would have been a serial killer if she had been successful. God knows what else she has done.”

    Chapter 5: The Bus Stop Killer (Levi Bellfield)

    • Crimes: Levi Bellfield was convicted of the murders of Amélie Delagrange, Marsha McDonnell, and the attempted murder of Kate Sheedy. He was later found guilty of the murder of Milly Dowler.
    • Vehicle Link: A key piece of evidence was a grainy CCTV footage of a red Daewoo Nexia pulling out of Collingwood Place, just ten minutes after Milly Dowler was last seen. The car was owned by Bellfield’s girlfriend.
    • Motive and Patterns: Bellfield had an extreme hatred for young blonde women.

    Chapter 6: The Suffolk Strangler (Steven Wright)

    • Victims: Within a matter of six weeks, five young women had been murdered. The victims were Paula Clennell, Annel Alderton, Gemma Adams, Tania Nicol and Annette Nicholls.
    • CCTV and Forensic Evidence: The key to the case was the large amount of CCTV footage that showed Wright in the area of the crimes and the forensic evidence that linked Wright to the victims.
    • Quote: During the trial, the prosecutor asked Wright about the coincidences, to which Wright replied “It would seem so, yes.”
    • Outcome: Wright was sentenced to life imprisonment with a recommendation of no parole.

    Chapter 7: A Tragic December (Vincent Tabak)

    • Victim: Joanna Yeates was murdered in December.
    • Circumstantial Evidence: Vincent Tabak, the neighbor, was eventually arrested after Joanna’s body was found. Despite Tabak’s attempt to give himself an alibi, detectives found that Tabak had searched Google street view at the precise location on Longwood Lane where Joanna’s body was found just days before her body was found there. Blood was found in the trunk of his car that matched Joanna’s and the DNA that was found on Joanna’s body matched his own.
    • Confession and Conviction: Tabak confessed to a prison chaplain that he had killed Joanna. Vincent Tabak was given a life sentence with a minimum term of twenty years in prison.

    True Crime Case Studies

    • What was Tony Hardy’s early life and background?

    Tony Hardy was born in 1952 into a lower-middle-class family in Staffordshire, England. His father worked in the gypsum mines, and Tony was expected to follow in his footsteps. However, from a young age, Tony felt destined for greatness and desired a life beyond that of a laborer.

    • How did Tony Hardy’s obsession with Jack the Ripper manifest itself?

    While attending Imperial College, Tony developed a fascination with Jack the Ripper, reading every book he could find about the notorious killer. He admired the Ripper’s ability to evade police and considered him highly intelligent. He discussed his obsession with Jack the Ripper often with his friends and family, and spoke of him as being a “brilliant bloke”. After attempting to murder his wife in Tasmania, and subsequently deported back to the United Kingdom he would tell his friends it was an act to avoid jail time. He believed he could outwit everyone, just like Jack the Ripper.

    • What were the circumstances surrounding the murder of Sally Rose White and how was Tony Hardy involved?

    Tony Hardy’s roommate, Sally Rose White, who was developmentally challenged and worked as a prostitute, was found dead in their apartment. The scene was staged with disturbing elements like a rubber Satan mask, crucifixes, and photo equipment. Initially, a pathologist determined she died of natural causes, but investigators were suspicious due to the staged scene and blood evidence. After further investigation, Tony was arrested for the murder.

    • What was John George Haigh’s method for disposing of his victims, and why did he believe it would lead to acquittal?

    Haigh used sulfuric acid to dissolve the bodies of his victims. He believed that if there was no body, there could be no murder conviction, operating under the misunderstanding of the Latin term “corpus delicti.”

    • How did Dena Thompson manage to deceive her husbands and lovers, and what were her motives?

    Dena Thompson was a master manipulator who wove elaborate lies to deceive her husbands and lovers. Her motives were primarily financial, as she sought to enrich herself through insurance money, pension funds, and property. She created false narratives involving the mafia, forged documents, and even convinced one husband to go into hiding, all to maintain her deceit.

    • What were some of the key pieces of evidence that linked Levi Bellfield to his crimes?

    Key evidence included security camera footage placing his vehicles near the scenes of the crimes, his ex-partner’s testimony about his hatred of blonde women and his ownership of a white Ford cargo van, and DNA evidence linking him to the victims. Fiber analysis also connected carpet fibers from his van to the hair of one of the victims.

    • What role did CCTV play in the investigation into Levi Bellfield?

    CCTV was a critical component of the investigation into Levi Bellfield. Police used it to track Bellfield’s movements and identify vehicles of interest.

    • How was Joanna Yeates’s body discovered, and what was the cause of death?

    Joanna Yeates’s body was found on Christmas Day by a couple walking their dog. Her body was discovered in a snow-covered mound, and the cause of death was determined to be manual strangulation. She had been missing for eight days and was found with forty-three cuts and bruises on her body.

    UK Serial Killer Cases

    The source discusses several serial killer cases in the United Kingdom:

    • Anthony Hardy, also known as the Camden Ripper, was responsible for multiple murders of prostitutes in the Camden area of London. He had an obsession with Jack the Ripper and a history of mental illness and violent behavior. In 2012, Hardy received a whole life tariff, meaning he will never be released from prison.
    • Peter Bryan, known as the London Cannibal, was convicted of manslaughter for killing a girl with a hammer. Bryan was transferred to a low-security facility and later killed his friend. He was sentenced to two life terms and is unlikely to ever be released.
    • John George Haigh, also known as the Acid Bath Killer, murdered multiple victims and disposed of their bodies using sulfuric acid. He was found guilty and hanged in 1949.
    • Dena Thompson, known as the Black Widow, was convicted of deception and the murder of her second husband. On May 23, 2022 Dena Thompson was granted parole and subsequently released from prison.
    • Levi Bellfield, known as the Bus Stop Killer, was found guilty of the murders of Amélie Delagrange, Marsha McDonnell, and Milly Dowler. He was sentenced to a whole-life tariff.
    • Steven Wright, known as the Suffolk Strangler, was convicted of murdering five prostitutes in Ipswich. Wright was sentenced to life imprisonment with no parole.
    • Vincent Tabak was found guilty of the murder of Joanna Yeates and was given a life sentence with a minimum of twenty years in prison.

    British True Crime Cases: Notorious Killers

    The source provides details of several true crime cases involving British Killers.

    • Anthony Hardy: Also known as the Camden Ripper, Hardy murdered prostitutes in London. He was obsessed with Jack the Ripper and had mental health issues. He received a life sentence in 2012.
    • Peter Bryan: Known as the London Cannibal, Bryan was convicted of manslaughter for killing a girl with a hammer. While in a low-security facility, he killed his friend. Bryan received two life sentences.
    • John George Haigh: Also known as the Acid Bath Killer, Haigh murdered victims and disposed of their bodies with sulfuric acid. He was found guilty and hanged in 1949.
    • Dena Thompson: Known as the Black Widow, Thompson was convicted of deception and murdering her second husband. She was granted parole on May 23, 2022.
    • Levi Bellfield: Known as the Bus Stop Killer, Bellfield was found guilty of murdering Amélie Delagrange, Marsha McDonnell, and Milly Dowler. He received a whole-life tariff.
    • Steven Wright: Known as the Suffolk Strangler, Wright was convicted of murdering five prostitutes in Ipswich and received a life sentence with no parole.
    • Vincent Tabak: Tabak was found guilty of murdering Joanna Yeates and received a life sentence with a minimum of twenty years.

    British Serial Killer Investigations: Case Details

    The source provides details about the criminal investigations into several British serial killer cases:

    • Anthony Hardy: In December 2002, the police followed a trail of battery acid to Hardy’s door after he vandalized a neighbor’s property. Upon entering his apartment, they found the naked body of Sally Rose White, along with evidence suggesting a simulated rape. Later, investigators found dismembered body parts in garbage bags that Hardy had deposited using a loyalty card from a local Sainsbury’s grocery store.
    • John George Haigh: Police became suspicious of Haigh after Mrs. Lane reported Mrs. Durand-Deacon missing. They discovered Haigh had a history of fraud and forgery. A search of his workshop in Crawley revealed tools, chemicals, a gas mask, and a rubber apron with stains. Although Haigh claimed he had destroyed Mrs. Durand-Deacon with acid, police found traces of her remains, including bloodstains, gallstones, and false teeth.
    • Levi Bellfield: Police examined security camera footage and identified a silver Vauxhall Corsa stalking Marsha McDonnell. After another attack, police realized they were looking for a serial killer. They found a white Ford cargo van that had driven the route at the time of another murder. Bellfield’s ex-partner identified him as the owner of the van. Police put Bellfield under surveillance and then arrested him.
    • Steven Wright: Police discovered that Wright had a prior offense on his record and that his DNA was in the national DNA database. Detectives examined over 10,000 hours of security camera footage to map Wright’s movements. They found footage of Wright’s car in the areas where the victims disappeared. Forensic scientists found DNA from the victims in Wright’s car and home.
    • Vincent Tabak: Security cameras showed Tabak driving to a supermarket, going inside, leaving without buying anything, and then returning to buy items. Tabak had searched Google Street View for the location where Joanna Yeates’ body was discovered. Blood was found in the trunk of Tabak’s car, and his DNA matched the DNA on Joanna’s body.

    Forensic Investigations: Hardy, Haigh, Bellfield, Wright, and Tabak

    The source details how police forensics played a role in the investigations of several cases:

    • Anthony Hardy Police used Luminol to find traces of blood in Hardy’s apartment, even after attempts to clean. The police were able to connect Hardy to dismembered body parts found in garbage bags by using security camera footage that showed him depositing the bags using his Sainsbury’s loyalty card.
    • John George Haigh Although Haigh tried to dissolve the bodies of his victims using acid, forensic evidence was used to convict him of murder. Despite Haigh’s belief that a murder was unprovable without a body, Forensic Pathologist Dr. Keith Simpson found traces of Mrs. Durand-Deacon in the sludge remaining at Leopold Road. Police found bloodstains inside the workshop. Additionally, police found gallstones and Mrs. Durand-Deacon’s false teeth that were not dissolved by the acid.
    • Levi Bellfield Pollen experts analyzed foliage from Milly Dowler’s remains.
    • Steven Wright Forensic scientists were able to duplicate DNA samples and develop a full DNA profile. Microscopic comparison of a nylon fiber found in Tania Nicol’s hair matched the carpet in Wright’s car. Forensic tests on work gloves found in Wright’s home revealed DNA from three of the girls. Fabric from Wright’s home was found on four of the five bodies.
    • Vincent Tabak Vincent Tabak had searched Google street view at the precise location on Longwood Lane where Joanna’s body was found. Blood was found in the trunk of his car that matched Joanna’s DNA.

    British Killers and Their Crimes

    The source and conversation history provide details on several British killers and their crimes:

    • Anthony Hardy, known as the Camden Ripper, murdered prostitutes in London and was obsessed with Jack the Ripper. In December 2002, police found the naked body of Sally Rose White in his apartment and later discovered dismembered body parts in garbage bags linked to Hardy via his Sainsbury’s loyalty card. Despite a pathologist’s initial assessment of natural causes, investigators found the scene suspicious. Hardy received a life sentence in 2012.
    • Peter Bryan, the London Cannibal, was convicted of manslaughter for killing a girl with a hammer. He killed his friend while in a low-security facility. Bryan received two life sentences.
    • John George Haigh, the Acid Bath Killer, murdered victims and disposed of their bodies using sulfuric acid. Despite his attempts to destroy the evidence, traces of his victim Mrs. Durand-Deacon were found in the sludge at his workshop, including bloodstains, gallstones, and false teeth. Haigh was found guilty and hanged in 1949.
    • Dena Thompson, the Black Widow, was convicted of deception and the murder of her second husband. She was granted parole on May 23, 2022.
    • Levi Bellfield, the Bus Stop Killer, was found guilty of the murders of Amélie Delagrange, Marsha McDonnell, and Milly Dowler. Security camera footage showed a silver Vauxhall Corsa stalking Marsha McDonnell, and later, a white Ford cargo van was identified as being at the scene of another murder. Bellfield’s ex-partner identified him as the van’s owner, leading to his arrest. He received a whole-life tariff.
    • Steven Wright, the Suffolk Strangler, was convicted of murdering five prostitutes in Ipswich. His DNA was in the national DNA database due to a prior offense. Police used security camera footage to map his movements and found victim DNA in his car and home. Wright received a life sentence with no parole.
    • Vincent Tabak was found guilty of the murder of Joanna Yeates and received a life sentence with a minimum of twenty years. He searched Google Street View for the location where her body was discovered. Blood matching Joanna’s DNA was found in his car.

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Modern SQL Data Warehouse Project: A Comprehensive Guide

    Modern SQL Data Warehouse Project: A Comprehensive Guide

    This source details the creation of a modern data warehouse project using SQL. It presents a practical guide to designing data architecture, writing code for data transformation and loading, and creating data models. The project emphasizes real-world implementation, focusing on organizing and preparing data for analysis. The resource covers the ETL process, data quality, and documentation while building bronze, silver, and gold layers. It provides a comprehensive approach to data warehousing, from understanding requirements to creating a professional portfolio project.

    Modern SQL Data Warehouse Project Study Guide

    Quiz:

    1. What is the primary purpose of data warehousing projects? Data warehousing projects focus on organizing, structuring, and preparing data for data analysis, forming the foundation for any data analytics initiatives.
    2. Briefly explain the ETL/ELT process in SQL data warehousing. ETL/ELT in SQL involves extracting data from various sources, transforming it to fit the data warehouse schema (cleaning, standardizing), and loading it into the data warehouse for analysis and reporting.
    3. According to Bill Inmon’s definition, what are the four key characteristics of a data warehouse? According to Bill Inmon’s definition, the four key characteristics of a data warehouse are subject-oriented, integrated, time-variant, and non-volatile.
    4. Why is creating a project plan crucial for data warehouse projects, according to the source? Creating a project plan is crucial for data warehouse projects because they are complex, and a clear plan improves the chances of success by providing organization and direction, reducing the risk of failure.
    5. What is the “separation of concerns” principle in data architecture, and why is it important? The “separation of concerns” principle involves breaking down a complex system into smaller, independent parts, each responsible for a specific task, to avoid mixing everything and to maintain a clear and efficient architecture.
    6. Explain the purpose of the bronze, silver, and gold layers in a data warehouse architecture. The bronze layer stores raw, unprocessed data directly from the source systems, the silver layer contains cleaned and standardized data, and the gold layer holds business-ready data transformed and aggregated for reporting and analysis.
    7. What are metadata columns, and why are they useful in a data warehouse? Metadata columns are additional columns added to tables by data engineers to provide extra information about each record, such as create date or source system, aiding in data tracking and troubleshooting.
    8. What is a surrogate key, and why is it used in data modeling? A surrogate key is a system-generated unique identifier assigned to each record to make the record unique. It provides more control over the data model without dependence on source system keys.
    9. Describe the star schema data model, including the roles of fact and dimension tables. The star schema is a data modeling approach with a central fact table surrounded by dimension tables. Fact tables contain events or transactions, while dimension tables hold descriptive attributes, related via foreign keys.
    10. Explain the importance of clear documentation for end users of a data warehouse, as highlighted in the source.

    Clear documentation is essential for end users to understand the data model and use the data warehouse effectively.

    Quiz Answer Key:

    1. Data warehousing projects focus on organizing, structuring, and preparing data for data analysis, forming the foundation for any data analytics initiatives.
    2. ETL/ELT in SQL involves extracting data from various sources, transforming it to fit the data warehouse schema (cleaning, standardizing), and loading it into the data warehouse for analysis and reporting.
    3. According to Bill Inmon’s definition, the four key characteristics of a data warehouse are subject-oriented, integrated, time-variant, and non-volatile.
    4. Creating a project plan is crucial for data warehouse projects because they are complex, and a clear plan improves the chances of success by providing organization and direction, reducing the risk of failure.
    5. The “separation of concerns” principle involves breaking down a complex system into smaller, independent parts, each responsible for a specific task, to avoid mixing everything and to maintain a clear and efficient architecture.
    6. The bronze layer stores raw, unprocessed data directly from the source systems, the silver layer contains cleaned and standardized data, and the gold layer holds business-ready data transformed and aggregated for reporting and analysis.
    7. Metadata columns are additional columns added to tables by data engineers to provide extra information about each record, such as create date or source system, aiding in data tracking and troubleshooting.
    8. A surrogate key is a system-generated unique identifier assigned to each record to make the record unique. It provides more control over the data model without dependence on source system keys.
    9. The star schema is a data modeling approach with a central fact table surrounded by dimension tables. Fact tables contain events or transactions, while dimension tables hold descriptive attributes, related via foreign keys.
    10. Clear documentation is essential for end users to understand the data model and use the data warehouse effectively.

    Essay Questions:

    1. Discuss the importance of data quality in a modern SQL data warehouse project. Explain the role of the bronze and silver layers in ensuring high data quality, and provide examples of data transformations that might be performed in the silver layer.
    2. Describe the Medan architecture and how it’s implemented using bronze, silver, and gold layers. Discuss the advantages of this architecture, including separation of concerns and data quality management, and explain how data flows through each layer.
    3. Explain the process of creating a detailed project plan for a data warehouse project using a tool like Notion. Describe the key phases and stages involved, the importance of defining epics and tasks, and how this plan contributes to project success.
    4. Explain the importance of source system analysis in a data warehouse project, and describe the key questions that should be asked when connecting to a new source system.
    5. Compare and contrast the star schema with other data modeling approaches, such as snowflake and data vault. Discuss the advantages and disadvantages of the star schema for reporting and analytics, and explain the roles of fact and dimension tables in this model.

    Glossary of Key Terms:

    • Data Warehouse: A subject-oriented, integrated, time-variant, and non-volatile collection of data designed to support management’s decision-making process.
    • ETL (Extract, Transform, Load): A process in data warehousing where data is extracted from various sources, transformed into a suitable format, and loaded into the data warehouse.
    • ELT (Extract, Load, Transform): A process similar to ETL, but the transformation step occurs after the data has been loaded into the data warehouse.
    • Data Architecture: The overall structure and design of data systems, including databases, data warehouses, and data lakes.
    • Data Integration: The process of combining data from different sources into a unified view.
    • Data Modeling: The process of creating a visual representation of data structures and relationships.
    • Bronze Layer: The first layer in a data warehouse architecture, containing raw, unprocessed data from source systems.
    • Silver Layer: The second layer in a data warehouse architecture, containing cleaned and standardized data ready for transformation.
    • Gold Layer: The third layer in a data warehouse architecture, containing business-ready data transformed and aggregated for reporting and analysis.
    • Subject-Oriented: Focused on a specific business area, such as sales, customers, or finance.
    • Integrated: Combines data from multiple source systems into a unified view.
    • Time-Variant: Keeps historical data for analysis over time.
    • Non-Volatile: Data is not deleted or modified once it enters the data warehouse.
    • Project Epic: A large task or stage in a project that requires significant effort to complete.
    • Separation of Concerns: A design principle that breaks down complex systems into smaller, independent parts, each responsible for a specific task.
    • Data Cleansing: The process of correcting or removing inaccurate, incomplete, or irrelevant data.
    • Data Standardization: The process of converting data into a consistent format or standard.
    • Metadata Columns: Additional columns added to tables to provide extra information about each record, such as creation date or source system.
    • Surrogate Key: A system-generated unique identifier assigned to each record, used to connect data models and avoid dependence on source system keys.
    • Star Schema: A data modeling approach with a central fact table surrounded by dimension tables.
    • Fact Table: A table in a data warehouse that contains events or transactions, along with foreign keys to dimension tables.
    • Dimension Table: A table in a data warehouse that contains descriptive attributes or categories related to the data in fact tables.
    • Data Lineage: Tracking the origin and movement of data from its source to its final destination.
    • Stored Procedure: A precompiled collection of SQL statements stored under a name and executed as a single unit.
    • Data Normalization: The process of organizing data to reduce redundancy and improve data integrity.
    • Data Lookup: Joining tables to retrieve specific data, such as surrogate keys, from related dimensions.
    • Data Flow Diagram: A visual representation of how data moves through a system.

    Modern SQL Data Warehouse Project Guide

    Okay, here’s a detailed briefing document summarizing the main themes and ideas from the provided text excerpts.

    Briefing Document: Modern SQL Data Warehouse Project

    Overview:

    This document summarizes the key concepts and practical steps outlined in a guide for building a modern SQL data warehouse. The guide, presented by Bar Zini, aims to equip data architects, data engineers, and data modelers with real-world skills by walking them through the creation of a data warehouse project using SQL Server (though adaptable to other SQL databases). The project emphasizes best practices and provides a professional portfolio piece upon completion.

    Main Themes and Key Ideas:

    1. Data Warehousing Fundamentals:
    • Definition: The project begins by defining a data warehouse using Bill Inmon’s classic definition: “A data warehouse is subject oriented, integrated, time variant, and nonvolatile collection of data designed to support the Management’s decision-making process.”
    • Subject Oriented: Focused on business areas (e.g., sales, customers, finance).
    • Integrated: Combines data from multiple source systems.
    • Time Variant: Stores historical data.
    • Nonvolatile: Data is not deleted or modified once entered.
    • Purpose: To address the inefficiencies of data analysts extracting and transforming data directly from operational systems, replacing it with an organized and structured data system as a foundation for data analytics projects.
    • SQL Data Warehousing in Relation to Other Types of Data Analytics Projects: The guide mentions that SQL Data Warehousing is the foundation of any data analytics projects and that it is the first step before being able to do exploratory data analyzes (EDA) and Advanced analytics projects.
    1. Project Structure and Skills Developed:
    • Roles: The project is designed to provide experience in three key roles: data architect, data engineer, and data modeler.
    • Skills: Participants will learn:
    • ETL/ELT processing using SQL.
    • Data architecture design.
    • Data integration (merging multiple sources).
    • Data loading and data modeling.
    • Portfolio Building: The guide emphasizes the project’s value as a portfolio piece for demonstrating skills on platforms like LinkedIn.
    1. Project Setup and Planning (Using Notion):
    • Importance of Planning: The guide stresses that “creating a project plan is the key to success.” This is particularly important for data warehouse projects, where a high failure rate (over 50%, according to Gartner reports) is attributed to complexity.
    • Iterative Planning: The planning process is described as iterative. An initial “rough project plan” is created, which is then refined as understanding of the data architecture evolves.
    • Project Epics (Main Phases): The initial project phases identified are:
    • Requirements analysis.
    • Designing the data architecture.
    • Project initialization.
    • Task Breakdown: The project uses Notion (a free tool) to organize the project into epics and subtasks, enabling a structured approach.
    • It is also mentioned the importance of icons to add a personal style to the project and to keep it more organized.
    • Project success: One important element of the project to be successful is to be able to visualize the whole picture in the project by closing small chunks of work and tasks that gives a sense of motivation and accomplishment.
    1. Data Architecture Design (Using Draw.io):
    • Medallion Architecture: The guide advocates for a “Medallion architecture” (Bronze, Silver, Gold layers) within the data warehouse.
    • Separation of Concerns: A core architectural principle is “separation of concerns.” This means breaking down the complex system into independent parts, each responsible for a specific task, with no duplication of components. “A good data architect follow this concept this principle.”
    • Layer Responsibilities:Bronze Layer (Raw Data): Contains raw data, with no transformations. “In the bronze layer it’s going to be the row data.”
    • Silver Layer (Cleaned and Standardized Data): Focuses on data cleansing and standardization. “In the silver you are cleans standard data.”
    • Gold Layer (Business-Ready Data): Contains business-transformed data ready for analysis. “For the gos we can say business ready data.”
    • Data Flow Diagram: The project utilizes Draw.io (a free diagramming tool) to visualize the data architecture and data lineage.
    • Naming Conventions: A naming convention is created to ensure clarity and consistency, creating specific naming rules for tables and columns. Examples include fact_sales for a fact table and dim_customers for a dimension. It is recommended to create clear documentation about each rule and to add examples so that there is a general consensus about how to proceed.
    1. Project Initialization and Tools:
    • Software: The project uses SQL Server Express (database server) and SQL Server Management Studio (client for interacting with the database). Other tools include GitHub and Draw.io. Notion is used for project management.
    • Initial Database Setup: The guide outlines the creation of a new database and schemas (Bronze, Silver, Gold) within SQL Server.
    • Git Repository: The project emphasizes the importance of using Git for version control and collaboration. A repository structure is established with folders for data sets, documents, scripts, and tests.
    • ReadMe: it is important to create a read me file at the root of the repo where the main characteristics and goal of the repo are specified so that other developers can have a better understanding of the project when collaborating.
    1. Building the Bronze Layer
    • The process to build the bronze layer is by first doing data analysis about what is to be built. The goal of this first process is to interview source system experts, identify the source of the data, the size of the data to be processed, the performance of the source system so that it is not to be affected and authentication/authorization like access tokens, keys and passwords.
    • The project also makes a step-by-step approach from creating all the required queries and stored procedures to loading them efficiently. This step contains steps about testing that the tables have no nulls and that the separator used matches with the data.
    1. Building the Silver Layer
    • The specifications of the silver layer are to have clean and standardized data and building tables inside the silver layer. The data should be loaded from the bronze layer using full load, truncating and then inserting the data after which we will apply a lot of data transformation.
    • In the silver layer, we will implement metadata columns where more data information is stored that doesn’t come directly from the source system. Some examples that can be stored are create and update dates, the source system, and the file location where this data came from. This can help track where there are corrupted data as well as find if there is a gap in the imported data.
    1. Building the Gold Layer

    *The gold layer is very focused on business goals and should be easy to consume for business reports. That is why we will create a data model for our business area. *When implementing a data model, it should contain two types of tables: fact tables and dimension tables. Dimension tables are descriptive and give some context to the data. One example of a dimension table is to use product info to use the product name, category and subcategories. Fact tables are events like transactions that contain IDs from dimensions. The question to define whether we should use a dimension table or a fact table comes to be: * How much and How many: fact table *Who, What, and Where: dimension table

    1. General Data Cleaning
    • In the project we will be building data transformations and cleansing where we will be writing insert statements that will have functions where the data will be transformed and cleaned up. This will include data checks in the primary keys, handling unwanted space, identifying the inconsistencies of the cardinality (the number of elements in a table) where we will be replacing null values, and fixing the dates and values of the sales order.
    • During the data cleaning process, one tool to check the quality of our data is through quality checks where we can go and select data that is incorrect, and then we can have a quick fix. For any numerical column it is best to validate it against the negative numbers, null values, and against the data type to make sure to convert into the right format. *In the silver layer, some techniques will have to be applied for the data that is old, in that case, it will have to be removed or have a flag, and for the birthday, we can filter data in the future. *To find errors in SQL, it is possible to use try and catch in between code blocks and then print error messages, numbers, and states so that the messages can be handled to find errors easier. *There is a lot of information that might have missing values. The code includes techniques to fill missing values and then also to provide data normalization.

    In summary, this guide provides a comprehensive, practical approach to building a modern SQL data warehouse, emphasizing structured planning, sound architectural principles, and hands-on coding experience. The emphasis on building a portfolio project makes it particularly valuable for those seeking to demonstrate their data warehousing skills.

    SQL Data Warehouse Fundamentals

    # What is a modern SQL data warehouse?

    A modern SQL data warehouse, according to the excerpt from “A Journey Through Grief”, is a subject-oriented, integrated, time-variant, and non-volatile collection of data designed to support management’s decision-making process. It consolidates data from multiple source systems, organizes it around business subjects (like sales, customers, or finance), retains historical data, and ensures that the data is not deleted or modified once loaded.

    # What are the key roles involved in building a data warehouse project?

    According to the excerpt from “A Journey Through Grief”, building a data warehouse involves different roles including:

    * **Data Architect:** Designs the overall data architecture following best practices.

    * **Data Engineer:** Writes code to clean, transform, load, and prepare data.

    * **Data Modeler:** Creates the data model for analysis.

    # What are the three types of data analytics projects that can be done using SQL?

    The three types of data analytics projects, according to the excerpt from “A Journey Through Grief”, are:

    * **Data Warehousing:** Focuses on organizing, structuring, and preparing data for analysis, which is foundational for other analytics projects.

    * **Exploratory Data Analysis (EDA):** Involves understanding and uncovering insights from datasets by asking the right questions and finding answers using basic SQL skills.

    * **Advanced Analytics Projects:** Uses advanced SQL techniques to answer business questions, such as identifying trends, comparing performance, segmenting data, and generating reports.

    # What is the Medici architecture and why is it relevant to designing a data warehouse?

    The Medici architecture is a layered approach to data warehousing, which this source calls “Medan” and which is composed of:

    * **Bronze Layer:** Raw data “as is” from source systems.

    * **Silver Layer:** Cleaned and standardized data.

    * **Gold Layer:** Business-ready data with transformed and aggregated information.

    The Medici architecture enables separation of concerns, allowing unique sets of tasks for each layer, and helps organize and manage the complexity of data warehousing. It provides a structured approach to data processing, ensuring data quality and consistency.

    # What tools are commonly used in data warehouse projects, and why is creating a project plan important?

    Common tools used in data warehouse projects include:

    * **SQL Server Express:** A local server for the database.

    * **SQL Server Management Studio (SSMS):** A client to interact with the database and run queries.

    * **GitHub:** For version control and collaboration.

    * **draw.io:** A tool for creating diagrams, data models, data architectures and data lineage.

    * **Notion:** A tool for project management, planning, and organizing resources.

    Creating a project plan is essential for success due to the complexity of data warehouse projects. A clear plan helps organize tasks, manage resources, and track progress.

    # What is data lineage, and why is it important in a data warehouse environment?

    Data lineage refers to the data’s journey from its origin in source systems, through various transformations, to its final destination in the data warehouse. It provides visibility into the data’s history, transformations, and dependencies. Data lineage is crucial for troubleshooting data quality issues, understanding data flows, ensuring compliance, and auditing data processes.

    # What are surrogate keys, and why are they used in data modeling?

    Surrogate keys are system-generated unique identifiers assigned to each record in a dimension table. They are used to ensure uniqueness, simplify data relationships, and insulate the data warehouse from changes in source system keys. Surrogate keys provide control over the data model and facilitate efficient data integration and querying.

    # What are some essential naming conventions for data warehouse projects, and why are they important?

    Essential naming conventions help ensure consistency and clarity across the data warehouse. Examples include:

    * Using prefixes to indicate the type of table (e.g., `dim_` for dimension, `fact_` for fact).

    * Consistent naming of columns (e.g., surrogate keys ending with `_key`, technical columns starting with `dw_`).

    * Standardized naming for stored procedures (e.g., `load_bronze` for bronze layer loading).

    These conventions improve collaboration, code readability, and maintenance, enabling efficient data management and analysis.

    Data Warehousing: Architectures, Models, and Key Concepts

    Data warehousing involves organizing, structuring, and preparing data for analysis and is the foundation for any data analytics project. It focuses on how to consolidate data from various sources into a centralized repository for reporting and analysis.

    Key aspects of data warehousing:

    • A data warehouse is subject-oriented, integrated, time-variant, and a nonvolatile collection of data designed to support management’s decision-making process.
    • Subject-oriented: Focuses on specific business areas like sales, customers, or finance.
    • Integrated: Integrates data from multiple source systems.
    • Time-variant: Keeps historical data.
    • Nonvolatile: Data is not deleted or modified once it’s in the warehouse.
    • ETL (Extract, Transform, Load): A process to extract data from sources, transform it, and load it into the data warehouse, which then becomes the single source of truth for analysis and reporting.
    • Benefits of a data warehouse:
    • Organized data: A data warehouse helps organize data so that the data team is not fighting with the data.
    • Single point of truth: Serves as a single point of truth for analyses and reporting.
    • Automation: Automates the data collection and transformation process, reducing manual errors and processing time.
    • Historical data: Enables access to historical data for trend analysis.
    • Data integration: Integrates data from various sources, making it easier to create integrated reports.
    • Improved decision-making: Provides fresh and reliable reports for making informed decisions.
    • Data Management: Data management is important for making real and good decisions.
    • Data Modeling: Data modeling is creating a new data model for analyses.

    Different Approaches to Data Warehouse Architecture:

    • Inmon Model: Uses a three-layer approach (staging, enterprise data warehouse, and data marts) to organize and model data.
    • Kimball Model: Focuses on quickly building data marts, which may lead to inconsistencies over time.
    • Data Vault: Adds more standards and rules to the central data warehouse layer by splitting it into raw and business vaults.
    • Medallion Architecture: Uses three layers: bronze (raw data), silver (cleaned and standardized data), and gold (business-ready data).

    The Medallion architecture consists of the following:

    • Bronze Layer: Stores raw, unprocessed data directly from the sources for traceability and debugging.
    • Data is not transformed in this layer.
    • Typically uses tables as object types.
    • Full load method is applied.
    • Access restricted to data engineers only.
    • Silver Layer: Stores clean and standardized data with basic transformations.
    • Focuses on data cleansing, standardization, and normalization.
    • Uses tables as object types.
    • Full load method is applied.
    • Accessible to data engineers, data analysts, and data scientists.
    • Gold Layer: Contains business-ready data for consumption by business users and analysts.
    • Applies business rules, data integration, and aggregation.
    • Uses views as object types for dynamic access.
    • Suitable for data analysts and business users.

    The ETL Process: Extract, Transform, and Load

    The ETL (Extract, Transform, Load) process is a critical component of data warehousing used to extract data from various sources, transform it into a usable format, and load it into a data warehouse. The data warehouse then becomes the single point of truth for analyses and reporting.

    The ETL process consists of three key stages:

    • Extract: Involves identifying and extracting data from source systems without changing it. The goal is to pull out a subset of data from the source in order to prepare it and load it to the target. This step focuses solely on data retrieval, maintaining a one-to-one correspondence with the source system.
    • Transform: Manipulates and transforms the extracted data into a format suitable for analysis and reporting. This stage may include data cleansing, integration, formatting, and normalization to reshape the data into the required format.
    • Load: Inserts the transformed data into the target data warehouse. The prepared data from the transformation step is moved into its final destination, such as a data warehouse.

    In real-world projects, the data architecture may have multiple layers, and the ETL process can vary between these layers. Depending on the data architecture’s design, it is not always necessary to use the complete ETL process to move data from a source to a target. For example, data can be loaded directly to a layer without transformations or undergo only transformation or loading steps between layers.

    Different techniques and methods exist within each stage of the ETL process:

    Extraction:

    • Methods:
    • Pull: The data warehouse pulls data from the source system.
    • Push: The source system pushes data to the data warehouse.
    • Types:
    • Full Extraction: All records from the source tables are extracted.
    • Incremental Extraction: Only new or changed data is extracted.
    • Techniques:
    • Manual extraction
    • Querying a database
    • Parsing a file
    • Connecting to an API
    • Event-based streaming
    • Change data capture (CDC)
    • Web scraping

    Transformation:

    • Data enrichment
    • Data integration
    • Deriving new columns
    • Data normalization
    • Applying business rules and logic
    • Data aggregation
    • Data cleansing:
    • Removing duplicates
    • Data filtering
    • Handling missing data
    • Handling invalid values
    • Removing unwanted spaces
    • Casting data types
    • Detecting outliers

    Load:

    • Processing Types:
    • Batch Processing: Loading the data warehouse in one large batch of data.
    • Stream Processing: Processing changes as soon as they occur in the source system.
    • Methods:
    • Full Load:
    • Truncate and insert
    • Upsert (update and insert)
    • Drop, create, and insert
    • Incremental Load:
    • Upsert
    • Insert (append data)
    • Merge (update, insert, delete)
    • Slowly Changing Dimensions (SCD):
    • SCD0: No historization; no changes are tracked.
    • SCD1: Overwrite; records are updated with new information, losing history.
    • SCD2: Add historization by inserting new records for each change and inactivating old records.

    Data Modeling for Warehousing and Business Intelligence

    Data modeling is the process of organizing and structuring raw data into a meaningful way that is easy to understand. In data modeling, data is put into new, friendly, and easy-to-understand formats like customers, orders, and products. Each format is focused on specific information, and the relationships between those objects are described. The goal is to create a logical data model.

    For analytics, especially in data warehousing and business intelligence, data models should be optimized for reporting, flexible, scalable, and easy to understand.

    Different Stages of Data Modeling:

    • Conceptual Data Model: Focuses on identifying the main entities (e.g., customers, orders, products) and their relationships without specifying details like columns or attributes.
    • Logical Data Model: Specifies columns, attributes, and primary keys for each entity and defines the relationships between entities.
    • Physical Data Model: Includes technical details like data types, lengths, and database-specific configurations for implementing the data model in a database.

    Data Models for Data Warehousing and Business Intelligence:

    • Star Schema: Features a central fact table surrounded by dimension tables. The fact table contains events or transactions, while dimensions contain descriptive information. The relationship between fact and dimension tables forms a star shape.
    • Snowflake Schema: Similar to the star schema but breaks down dimensions into smaller sub-dimensions, creating a more complex, snowflake-like structure.

    Comparison of Star and Snowflake Schemas:

    • Star Schema:
    • Easier to understand and query.
    • Suitable for reporting and analytics.
    • May contain duplicate data in dimensions.
    • Snowflake Schema:
    • More complex and requires more knowledge to query.
    • Optimizes storage by reducing data redundancy through normalization.
    • The star schema is commonly used and perfect for reporting.

    Types of Tables:

    • Fact Tables: Contain events or transactions and include IDs from multiple dimensions, dates, and measures. They answer questions about “how much” or “how many”.
    • Dimension Tables: Provide descriptive information and context about the data, answering questions about “who,” “what,” and “where”.

    In the gold layer, data modeling involves creating new structures that are easy to consume for business reporting and analyses.

    Data Transformation: ETL Process and Techniques

    Data transformation is a key stage in the ETL (Extract, Transform, Load) process where extracted data is manipulated and converted into a format that is suitable for analysis and reporting. It occurs after data has been extracted from its source and before it is loaded into the target data warehouse. This process is essential for ensuring data quality, consistency, and relevance in the data warehouse.

    Here’s a detailed breakdown of data transformation, drawing from the sources:

    Purpose and Importance

    • Data transformation changes the shape of the original data.
    • It is a heavy working process that can include data cleansing, data integration, and various formatting and normalization techniques.
    • The goal is to reshape and reformat original data to meet specific analytical and reporting needs.

    Types of Transformations There are various types of transformations that can be performed:

    • Data Cleansing:
    • Removing duplicates to ensure each primary key has only one record.
    • Filtering data to retain relevant information.
    • Handling missing data by filling in blanks with default values.
    • Handling invalid values to ensure data accuracy.
    • Removing unwanted spaces or characters to ensure consistency.
    • Casting data types to ensure compatibility and correctness.
    • Detecting outliers to identify and manage anomalous data points.
    • Data Enrichment: Adding value to data sets by including relevant information.
    • Data Integration: Bringing multiple sources together into a unified data model.
    • Deriving New Columns: Creating new columns based on calculations or transformations of existing ones.
    • Data Normalization: Mapping coded values to user-friendly descriptions.
    • Applying Business Rules and Logic: Implementing criteria to build new columns based on business requirements.
    • Data Aggregation: Aggregating data to different granularities.
    • Data Type Casting: Converting data from one data type to another.

    Data Transformation in the Medallion Architecture In the Medallion architecture, data transformation is strategically applied across different layers:

    • Bronze Layer: No transformations are applied. The data remains in its raw, unprocessed state.
    • Silver Layer: Focuses on basic transformations to clean and standardize data. This includes data cleansing, standardization, and normalization.
    • Gold Layer: Focuses on business-related transformations needed for the consumers, such as data integration, data aggregation, and the application of business logic and rules. The goal is to provide business-ready data that can be used for reporting and analytics.

    SQL Server for Data Warehousing

    The sources mention SQL Server as a tool used for building data warehouses. It is a platform that can run locally on a PC where a database can reside.

    Here’s what the sources indicate about using SQL Server in the context of data warehousing:

    • Building a data warehouse: SQL Server can be used to develop a modern data warehouse.
    • Project platform: In at least one of the projects described in the sources, the data warehouse was built completely in SQL Server.
    • Data loading: SQL Server is used to load data from source files, such as CSV files, into database tables. The BULK INSERT command is used to load data quickly from a file into a table.
    • Database and schema creation: SQL scripts are used to create a database and schemas within SQL Server to organize data.
    • SQL Server Management Studio: SQL Server Management Studio is a client tool used to interact with the database and run queries.
    • Three-layer architecture: The SQL Server database is organized into three schemas corresponding to the bronze, silver, and gold layers of a data warehouse.
    • DDL scripts: DDL (Data Definition Language) scripts are created and executed in SQL Server to define the structure of tables in each layer of the data warehouse.
    • Stored procedures: Stored procedures are created in SQL Server to encapsulate ETL processes, such as loading data from CSV files into the bronze layer.
    • Data quality checks: SQL queries are written and executed in SQL Server to validate data quality, such as checking for duplicates or null values.
    • Views in the gold layer: Views are created in the gold layer of the data warehouse within SQL Server to provide a business-ready, integrated view of the data.
    SQL Data Warehouse from Scratch | Full Hands-On Data Engineering Project

    The Original Text

    hey friends so today we are diving into something very exciting Building Together modern SQL data warehouse projects but this one is not any project this one is a special one not only you will learn how to build a modern Data Warehouse from the scratch but also you will learn how I implement this kind of projects in Real World Companies I’m bar zini and I have built more than five successful data warehouse projects in different companies and right now I’m leading big data and Pi Projects at Mercedes-Benz so that’s me I’m sharing with you real skills real Knowledge from complex projects and here’s what you will get out of this project as a data architect we will be designing a modern data architecture following the best practices and as a data engineer you will be writing your codes to clean transform load and prepare the data for analyzis and as a data Modell you will learn the basics of data moding and we will be creating from the scratch a new data model for analyzes and my friends by the end of this project you will have a professional portfolio project to Showcase your new skills for example on LinkedIn so feel free to take the project modify it and as well share it with others but it going to mean the work for me if you share my content and guess what everything is for free so there are no hidden costs at all and in this project we will be using SQL server but if you prefer other databases like my SQL or bis don’t worry you can follow along just fine all right my friends so now if you want to do data analytics projects using SQL we have three different types the first type of projects you can do data warehousing it’s all about how to organize structure and prepare your data for data analysis it is the foundations of any data analytics projects and in The Next Step you can do exploratory data analyzes Eda and all what you have to do is to understand and cover insights about our data sets in this kind of project you can learn how to ask the right questions and how to find the answer using SQL by just using basic SQL skills now moving on to the last stage where you can do Advanced analytics projects where you going to use Advanced SQL techniques in order to answer business questions like finding Trends over time comparing the performance segmenting your data into different sections and as well generate reports for your stack holders so here you will be solving real business questions using Advanced SQL techniques now what we’re going to do we’re going to start with the first type of projects SQL data warehousing where you will gain the following skills so first you will learn how to do ETL elt processing using SQL in order to prepare the data you will learn as well how to build data architecture how to do data Integrations where we can merge multiple sources together and as well how to do data load and data modeling so if I got you interested grab your coffee and let’s jump to the projects all right my friends so now before we Deep dive into the tools and the cool stuff we have first to have good understanding about what is exactly a data warehouse why the companies try to build such a data management system so now the question is what is a data warehouse I will just use the definition of the father of the data warehouse Bill Inon a data warehouse is subject oriented integrated time variance and nonvolatile collection of data designed to support the Management’s decision-making process okay I I know that might be confusing subject oriented it means thata Warehouse is always focused on a business area like the sales customers finance and so on integrated because it goes and integrate multiple Source systems usually you build a warehouse not only for one source but for multiple sources time variance it means you can keep historical data inside the data warehouse nonvolatile it means once the data enter the data warehouse it is not deleted or modified so this is how build and mod defined data warehouse okay so now I’m going to show you the scenario where your company don’t have a real data management so now let’s say that you have one system and you have like one data analyst has to go to this system and start collecting and extracting the data and then he going to spend days and sometimes weeks transforming the row data into something meaningful then once they have the report they’re going to go and share it and this data analyst is sharing the report using an Excel and then you have like another source of data and you have another data analyst that she is doing maybe the same steps collecting the data spending a lot of time transforming the data and then share at the end like a report and this time she is sharing the data using PowerPoint and a third system and the same story but this time he is sharing the data using maybe powerbi so now if the company works like this then there is a lot of issues first this process it take too way long I saw a lot of scenarios where sometimes it takes weeks and even months until the employee manually generating those reports and of course what going to happen for the users they are consuming multiple reports with multiple state of the data one report is 40 days old another one 10 days and a third one is like 5 days so it’s going to be really hard to make a real decision based on this structure a manual process is always slow and stressful and the more employees you involved in the process the more you open the door for human errors and errors of course in reports leads to bad decisions and another issue of course is handling the Big Data if one of your sources generating like massive amount of data then the data analyst going to struggle collecting the data and maybe in some scenarios it will not be any more possible to get the data so the whole process can breaks and you cannot generate any more fresh data for specific reports and one last very big issue with that if one of your stack holders asks for an integrated report from multiple sources well good luck with that because merging all those data manually is very chaotic timec consuming and full of risk so this is just a picture if a company is working without a proper data management without a data leak data warehouse data leak houses so in order to make real and good decisions you need data management so now let’s talk about the scenario of a data warehouse so the first thing that can happen is that you will not have your data team collecting manually the data you’re going to have a very important component called ETL ETL stands for extract transform and load it is a process that you do in order to extract the data from the sources and then apply multiple Transformations on those sources and at the end it loads the data to the data warehouse and this one going to be the single point of Truth for analyzes and Reporting and it is called Data Warehouse so now what can happen all your reports going to be consuming this single point of Truth so with that you create your multiple reports and as well you can create integrated reports from multiple sources not only from one single source so now by looking to the right side it looks already organized right and the whole process is completely automated there is no more manual steps which of course it ru uses the human error and as well it is pretty fast so usually you can load the data from the sources until the reports in matter of hours or sometimes in minutes so there is no need to wait like weeks and months in order to refresh anything and of course the big Advantage is that the data warehouse itself it is completely integrated so that means it goes and bring all those sources together in one place which makes it really easier for reporting and not only integrate you can build in the data warehouse as well history so we have now the possibility to access historical data and what is also amazing that all those reports having the same data status so all those reports can have the same status maybe sometimes one day old or something and of course if you have a modern Data Warehouse in Cloud platforms you can really easily handle any big data sources so no need to panic if one of your sources is delivering massive amount of data and of course in order to build the data warehouse you need different types of Developers so usually the one that builds the ATL component and the data warehouse is the data engineer so they are the one that is accessing the sources scripting the atls and building the database for the data warehouse and now for the other part the one that is responsible for that is the data analyst they are the one that is consuming the data warehouse building different data models and reports and sharing it with the stack holders so they are usually contacting the stack holders understanding the requirements and building multiple reports based on the data warehouse so now if you have a look to those two scenarios this is exactly why we need data management your data team is not wasting time and fighting with the data they are now more organized and more focused and with like data warehouse and you are delivering professional and fresh reports that your company can count on in order to make good and fast decisions so this is why you need a data management like a data warehouse think about data warehouse as a busy restaurant every day different suppliers bring in fresh ingredients vegetables spices meat you name it they don’t just use it immediately and throw everything in one pot right they clean it shop it and organize everything and store each ingredients in the right place fridge or freezer so this is the preparing face and when the order comes in they quickly grab the prepared ingredients and create a perfect dish and then serve it to the customers of the restaurant and this process is exactly like the data warehouse process it is like the kitchen where the raw ingredients your data are cleaned sorted and stored and when you need a report or analyzes it is ready to serve up exactly like what you need okay so now we’re going to zoom in and focus on the component ETL if you are building such a project you’re going to spend almost 90% just building this component the ATL so it is the core element of the data warehouse and I want you to have a clear understanding what is exactly an ETL so our data exist in a source system and now what we want to do is is to get our data from the source and move it to the Target source and Target could be like database tables so now the first step that we have to do is to specify which data we have to load from the source of course we can say that we want to load everything but let’s say that we are doing incremental loads so we’re going to go and specify a subset of the data from The Source in order to prepare it and load it later to the Target so this step in the ATL process we call it extract we are just identifying the data that we need we pull it out and we don’t change anything it’s going to be like one to one like the source system so the extract has only one task to identify the data that you have to pull out from the source and to not change anything so we will not manipulate the data at all it can stay as it is so this is the first step in the ETL process the extracts now moving on to the stage number two we’re going to take this extract data and we will do some manipulations Transformations and we’re going to change the shape of those data and this process is really heavy working we can do a lot of stuff like data cleansing data integration and a lot of formatting and data normalizations so a lot of stuff we can do in this step so this is the second step in the ETL process the transformation we’re going to take the original data and reshape it transformat into exactly the format that we need into a new format and shapes that we need for anal and Reporting now finally we get to the last step in the ATL process we have the load so in this step we’re going to take this new data and we’re going to insert it into the targets so it is very simple we’re going to take this prepared data from the transformation step and we’re going to move it into its final destination the target like for example data warehouse so that’s ETL in the nutshell first extract the row data then transform it into something meaningful and finally load it to a Target where it’s going to make a difference so that’s that’s it this is what we mean with the ETL process now in real projects we don’t have like only source and targets our thata architecture going to have like multiple layers depend on your design whether you are building a warehouse or a data lake or a data warehouse and usually there are like different ways on how to load the data between all those layers and in order now to load the data from one layer to another one there are like multiple ways on how to use the ATL process so usually if you are loading the data from the source to the layer number one like only the data from the source and load it directly to the layer number one without doing any Transformations because I want to see the data as it is in the first layer and now between the layer number one and the layer number two you might go and use the full ETL so we’re going to extract from the layer one transform it and then load it to the layer number two so with that we are using the whole process the ATL and now between Layer Two and layer three we can do only transformation and then load so we don’t have to deal with how to extract the data because it is maybe using the same technology and we are taking all data from Layer Two to layer three so we transform the whole layer two and then load it to layer three and now between three and four you can use only the L so maybe it’s something like duplicating and replicating the data and then you are doing the transformation so you load to the new layer and then transform it of course this is not a real scenario I’m just showing you that in order to move from source to a Target you don’t have always to use a complete ETL depend on the design of your data architecture you might use only few components from the ETL okay so this is how ETL looks like in real projects okay so now I would like to show you an overview of the different techniques and methods in the etls we have wide range of possibilities where you have to make decisions on which one you want to apply to your projects so let’s start first with the extraction the first thing that I want to show you is we have different methods of extraction either you are going to The Source system and pulling the data from the source or the source system is pushing the data to the data warehouse so those are the two main methods on how to extract data and then we have in the extraction two types we have a full extraction everything all the records from tables and every day we load all the data to the data warehouse or we make more smarter one where we say we’re going to do an incremental extraction where every day we’re going to identify only the new changing data so we don’t have to load the whole thing only the new data we go extract it and then load it to the data warehouse and in data extraction we have different techniques the first one is like manually where someone has to access a source system and extract the data manually or we connect ourself to a database and we have then a query in order to extract the data or we have a file that we have to pass it to the data warehouse or another technique is to connect ourself to API and do their cods in order to extract the data or if the data is available in streaming like in kfka we can do event based streaming in order to extract the data another way is to use the change data capture CDC is as well something very similar to streaming or another way is by using web scrapping where you have a code that going to run and extract all the informations from the web so those are the different techniques and types that we have in the extraction now if you are talking on the transformation there are wide range of different Transformations that we can do on our data like for example doing data enrichment where we add values to our data sets or we do a data integration where we have multiple sources and we bring everything to one data model or we derive a new of columns based on already existing one another type of data Transformations we have the data normalization so the sources has values that are like a code and you go and map it to more friendly values for the analyzers which is more easier to understand and to use another Transformations we have the business rules and logic depend on the business you can Define different criterias in order to build like new columns and what belongs to Transformations is the data aggregation so here we aggregate the data to a different granularity and then we have type of transformation called Data cleansing there are many different ways on how to clean our data for example removing the duplicates doing data filtering handling the missing data handling invalid values or removing unwanted spaces casting the data types and detecting the outliers and many more so we have different types of data cleansing that we can do in our data warehouse and this is very important transformation so as you can see we have different types of Transformations that we can do in our data warehouse now moving on to the load so what do we have over here we have different processing types so either we are doing patch processing or stream processing patch processing means we are loading the data warehouse in one big patch of data that’s going to run and load the data warehouse so it is only one time job in order to refresh the content of the data warehouse and as well the reports so that means we are scheduling the data warehouse in order to load it in the day once or twice and the other type we have the stream processing so this means if there is like a change in the source system we going to process this change as soon as possible so we’re going to process it through all the layers of the data warehouse once something changes from The Source system so we are streaming the data in order to have real time data warehouse which is very challenging things to do in data warehousing and if you are talking about the loads we have two methods either we are doing a full load or incremental load it’s a same thing as extraction right so for the full load in databases there are like different methods on how to do it like for example we trate and then insert that means we make the table completely empty and then we insert everything from the scratch or another one you are doing an update insert we call it upsert so we can go and update all the records and then insert the new one and another way is to drop create an insert so that means we drop the whole table and then we create it from scratch and then we insert the data it is very similar to the truncate but here we are as well removing and drubbing the whole table so those are the different methods of full loads the incremental load we can use as well the upserts so update and inserts so we’re going to do an update or insert statements to our tables or if the source is something like a log we can do only inserts so we can go and Abend the data always to the table without having to update anything another way to do incremental load is to do a merge and here it is very similar to the upsert but as well with a delete so update insert delete so those are the different methods on how to load the data to your tables and one more thing in data warehousing we have something called slowly changing Dimensions so here it’s all about the hyz of your table and there are many different ways on how to handle the Hyer in your table the first type is sd0 we say there is no historization and nothing should be changed at all so that means you are not going to update anything the second one which is more famous it is the sd1 you are doing an override so that means you are updating the records with the new informations from The Source system by overwriting the old value so we are doing something like the upsert so update and insert but you are losing of course history another one we have the scd2 and here you want to add historization to your table so what we do so what we do each change that we get from The Source system that means we are inserting new records and we are not going to overwrite or delete the old data we are just going to make it inactive and the new record going to be active one so there are different methods on how to do historization as well while you are loading the data to the data warehouse all right so those are the different types and techniques that you might encounter in data management projects so now what I’m going to show you quickly which of those types we will be using in our projects so now if we are talking about the extraction over here we will be doing a pull extraction and about the full or incremental it’s going to be a full extraction and about the technique we are going to be passsing files to the data warehouse and now about the data transformation well this one we will cover everything all those types of Transformations that I’m showing you now is going to be part of the project because I believe in each data project you will be facing those Transformations now if we have a look to the load our project going to be patch processing and about the load methods we will be doing a full load since we have full extraction and it’s going to be trunk it and inserts and now about the historization we will be doing the sd1 so that means we will be updating the content of the thata Warehouse so those are the different techniques and types that we will be using in our ETL process for this project all right so with that we have now clear understanding what is a data warehouse and we are done with the theory parts so now the next step we’re going to start with the projects the first thing that you have to do is to prepare our environment to develop the projects so let’s start with that all right so now we go to the link in the description and from there we’re going to go to the downloads and and here you can find all the materials of all courses and projects but the one that we need now is the SQL data warehouse projects so let’s go to the link and here we have bunch of links that we need for the projects but the most important one to get all data and files is this one download all project files so let’s go and do that and after you do that you’re going to get a zip file where you have there a lot of stuff so let’s go and extract it and now inside it if you go over here you will find the reposter structure from git and the most important one here is the data ass sets so you have two sources the CRM and the Erp and in each one of them there are three CSV files so those are the data set for the project for the other stuffs don’t worry about it we will be explaining that during the project so go and get the data and put it somewhere at your PC where you don’t lose it okay so now what else do we have we have here a link to the get repository so this is the link to my repository that I have created through the projects so you can go and access it but don’t worry about it we’re going to explain the whole structure during the project and you will be creating your own repository and as well we have the link to the notion here we are doing the project management here you’re going to find the main steps the main phes of the SQL projects that we will do and as well all the task that we will be doing together during the projects and now we have links to the project tools so if you don’t have it already go and download the SQL Server Express so it’s like a server that going to run locally at your PC where your database going to live another one that you have to download is the SQL Server management Studio it is just a client in order to interact with the database and there we’re going to run all our queries and then link to the GitHub and as well link to the draw AO if you don’t have it already go and download it it is free and amazing tool in order to draw diagrams so through the project we will be drawing data models the data architecture a data lineage so a lot of stuff we’ll be doing using this tool so go and download it and the last thing it is nice to have you have a link to the notion where you can go and create of course free account accounts if you want to build the project plan and as well Follow Me by creating the project steps and the project tasks okay so that’s all those are all the links for the projects so go and download all those stuff create the accounts and once you are ready then we continue with the projects all right so now I hope that you have downloaded all the tools and created the accounts now it’s time to move to very important step that’s almost all people skip while doing projects and then that is by creating the project plan and for that we will be using the tool notion notion is of course free tool and it can help you to organize your ideas your plans and resources all in one place I use it very intensively for my private projects like for example creating this course and I can tell you creating a project plan is the key to success creating a data warehouse project is usually very complex and according to Gardner reports over 50% of data warehouse projects fail and my opinion about any complex project the key to success is to have a clear project plan so now at this phase of the project we’re going to go and create a rough project plan because at the moment we don’t have yet clear understanding about the data architecture so let’s go okay so now let’s create a new page and let’s call it data warehouse projects the first thing is that we have to go and create the main phases and stages of the projects and for that we need a table so in order to do that hit slash and then type database in line and then let’s go and call it something like data warehouse epic and we’re going to go and hide it because I don’t like it and then on the table we can go and rename it like for example project epics something like that and now what we’re going to do we’re going to go and list all the big task of the projects so an epic is usually like a large task that needs a lot of efforts in order to solve it so you can call it epics stages faces of the project whatever you want so we’re going to go and list our project steps so it start with the requirements analyzes and then designing data architecture and another one we have the project initialization so those are the three big task in the project first and now what do we need we need another table for the small chunks of the tasks the subtasks and we’re going to do the same thing so we’re going to go and hit slash and we’re going to search for the table in line and we’re going to do the same thing so first we’re going to call it data warehouse tasks and then we’re going to hide it and over here we’re going to rename it and say this is the project tasks so now what we’re going to do we’re going to go to the plus icon over here and then search for relation this one over here with the arrow and now we’re going to search for the name of the first table so we called it data warehouse iix so let’s go and click it and we’re going to say as well two-way relation so let’s go and add the relation so with that we got a fi in the new table called Data Warehouse iix this comes from this table and as well we have here data warehouse tasks that comes from from the below table so as you can see we have linked them together now what I’m going to do I’m going to take this to the left side and then what we’re going to do we’re going to go and select one of those epics like for example let’s take design the data architecture and now what we’re going to do we’re going to go and break down this Epic into multiple tasks like for example choose data management approach and then we have another task what we’re going to do we’re going to go and select as well the same epic so maybe the next step is brainstorm and design the layers and then let’s go to another iic for example the project initialization and we say over here for example create get repo prepare the structure we can go and make another one in the same epic let’s say we’re going to go and create the database and the schemas so as you can see I’m just defining the subtasks of those epics so now what we’re going to do we’re going to go and add a checkbox in order to understand whether we have done the task or not so we go to the plus and search for check we need the check box and what we’re going to do we’re going to make it really small like this and with that each time we are done with the task we’re going to go and click on it just to make sure that we have done the task now there is one more thing that is not really working nice and that is here we’re going to have like a long list of tasks and it’s really annoying so what we’re going to do we’re going to go to the plus over here and let’s search for roll up so let’s go and select it so now what we’re going to do we have to go and select the relationship it’s going to be that data warehouse task and after that we’re going to go to the property and make it as the check box so now as you can see in the first table we are saying how many tasks is closed but I don’t want to show it like this what you going to do we’re going to go to the calculation and to the percent and then percent checked and with that we can see the progress of our project and now instead of the numbers we can have really nice bar great so as well we can go and give it a name like progress so that’s it and we can go and hide the data warehouse tasks and now with that we have really nice progress bar for each epic and if we close all the tasks of this epic we can see that we have reached 100% so this is the main structure now we can go and add some cosmetics and rename stuff in order to make things looks nicer like for example if I go to the tasks over here I can go and call it tasks and as well go and change the icon to something like this and if you’d like to have an icon for all those epics what we going to do we’re going to go to the Epic for example design data architecture and then if you hover on top of the title you can see add an icon and you can go and pick any icon that you want so for example this one and now now as you can see we have defined it here in the top and the icon going to be as well in the pillow table okay so now one more thing that we can do for the project tasks is that we can go and group them by the epics so if you go to the three dots and then we go to groups and then we can group up by the epics and as you can see now we have like a section for each epic and you can go and sort the epics if you want if you go over here sort then manual and you can go over here and start sorting the epics as you want and with that you can expand and minimize each task if you don’t want to see always all tasks in one go so this is really nice way in order to build like data management for your projects of course in companies we use professional Tools in order to do projects like for example Gyra but for private person projects that I do I always do it like this and I really recommend you to do it not only for this project for any project that you are doing CU if you see the whole project in one go you can see the big picture and closing tasks and doing it like this these small things can makes you really satisfied and keeps you motivated to finish the whole project and makes you proud okay friends so now I just went and added few icons a rename stuff and as well more tasks for each epic and this going to be our starting point in the project and once we have more informations we’re going to go and add more details on how exactly we’re going to build the data warehouse so at the start we’re going to go and analyze and understand the requirements and only after that we’re going to start designing the data architecture and here we have three tasks first we have to to choose the data management approach and after that we’re going to do brainstorming and designing the layers of the data warehouse and at the end we’re going to go and draw a data architecture so with that we have clear understanding how the data architecture looks like and after that we’re going to go to the next epic where we’re going to start preparing our projects so once we have clear understanding of the data architecture the first task here is to go and create detailed project tasks so we’re going to go and add more epes and more tasks and once we are done then we’re going to go and create the naming conventions for the project just to make sure that we have rules and standards in the whole project and next we’re going to go and create a repository in the git and we can to prepare as well the structure of the repository so that we always commit our work there and then we can start with the first script where we can create a database and schemas so my friends this is the initial plan for the project now let’s start with the first epic we have the requirements analyzes now analyzing the requirement it is very important to understand which type of data wehous you’re going to go and build because there is like not only one standard on how to build it and if you go blindly implementing the data warehouse you might be doing a lot of stuff that is totally unnecessary and you will be burning a lot of time so that’s why you have to sit with the stockholders with the department and understand what we exactly have to build and depend on the requirements you design the shape of the data warehouse so now let’s go and analyze the requirement of this project now the whole project is splitted into two main sections the first section we have to go and build a data warehouse so this is a data engineering task and we will go and develop etls and data warehouse and once we have done that we have to go and build analytics and reporting business intelligence so we’re going to do data analysis but now first we will be focusing on the first part building the data warehouse so what do you have here the statement is very simple it says develop a modern data warehouse using SQL Server to consolidate sales data enabling analytical reporting and informed decision making so this is the main statements and then we have specifications the first one is about the data sources it says import data from two Source systems Erb and CRM and they are provided as CSV files and now the second task is talking about the data quality we have to clean and fix data quality issues before we do the data analyses because let’s be real there is no R data that is perfect is always missing and we have to clean that up now the next task is talking about the integration so it says we have to go and combine both of the sources into one single userfriendly data model that is designed for analytics and Reporting so that means we have to go and merge those two sources into one single data model and now we have here another specifications it says focus on the latest data sets so there is no need for historization so that means we don’t have to go and build histories in the the database and the final requirement is talking about the documentation so it says provide clear documentations of the data model so that means the last product of the data warehouse to support the business users and the analytical teams so that means we have to generate a manual that’s going to help the users that makes lives easier for the consumers of our data so as you can see maybe this is very generic requirements but it has a lot of information already for you so it’s saying that we have to use the platform SQL Server we have two Source systems using using the CSV files and it sounds that we really have a bad data quality in the sources and as well it wants us to focus on building completely new data model that is designed for reporting and it says we don’t have to do historization and it is expected from us to generate documentations of the system so these are the requirements for the data engineering part where we’re going to go and build a data warehouse that fulfill these requirements all right so with that we have analyzed the requirements and as well we have closed at the first easiest epic so we are done with this let’s go and close it and now let’s open another one here we have to design the data architecture and the first task is to choose data management approach so let’s go now designing the data architecture it is exactly like building a house so before construction starts an architect going to go and design a plan a blueprint for the house how the rooms will be connected how to make the house functional safe and wonderful and without this blueprint from The Architects the builders might create something unstable inefficient or maybe unlivable the same goes for data projects a data architect is like a house architect they design how your data will flow integrate and be accessed so as data Architects we make sure that the data warehouse is not only functioning but also scalable and easy to maintain and this is exactly what we will do now we will play the role of the data architect and we will start brainstorming and designing the architecture of the data warehouse so now I’m going to show you a sketch in order to understand what are the different approaches in order to design a data architecture and this phase of the projects usually is very exciting for me because this is my main role in data projects I am a data architect and I discuss a lot of different projects where we try to find out the best design for the projects all right so now let’s go now the first step of building a data architecture is to make very important decision to choose between four major types the first approach is to build a data warehouse it is very suitable if you have only structured data and your business want to build solid foundations for reporting and business intelligence and another approach is to build a data leak this one is way more flexible than a data warehouse where you can store not only structured data but as well semi and unstructured data we usually use this approach if you have mixed types of data like database tables locks images videos and your business want to focus not only on reporting but as well on Advanced analytics or machine learning but it’s not that organized like a data warehouse and data leaks if it’s too much unorganized can turns into Data swamp and this is where we need the next approach so the next one we can go and build data leak house so it is like a mix between data warehouse and data leak you get the flexibility of having different types of data from the data Lake but you still want to structure and organiz your data like we do in the data warehouse so you mix those two words into one and this is a very modern way on how to build data Architects and this is currently my favorite way of building data management system now the last and very recent approach is to build data Mish so this is a little bit different instead of having centralized data management system the idea now in the data Mish is to make it decentralized you cannot have like one centralized data management system because always if you say centralized then it means bottleneck so instead you have multiple departments and multiple domains where each one of them is building a data product and sharing it with others so now you have to go and pick one of those approaches and in this project we will be focusing on the data warehouse so now the question is how to build the data warehouse well there is as well four different approaches on how to build it the first one is the inone approach so again you have your sources and the first layer you start with the staging where the row data is landing and then the next layer you organize your data in something called Enterprise data Warehouse where you go and model the data using the third normal format it’s about like how to structure and normalize your tables so you are building a new integrated data model from the multiple sources and then we go to the third layer it’s called the data Mars where you go and take like small subset of the data warehouse and you design it in a way that is ready to be consumed from reporting and it focus on only one toque like for example the customers sales or products and after that you go and connect your bi tool like powerbi or Tableau to the data Mars so with that you have three layers to prepare the data before reporting now moving on to the next one we have the kle approach he says you know what building this Enterprise data warehouse it is wasting a lot of time so what we can do we can jump immediately from the stage layer to the final data marks because building this Enterprise data warehouse it is a big struggle and usually waste a lot of time so he always want you to focus and building the data marks quickly as possible so it is faster approach than Inon but with the time you might get chaos in the data Mars because you are not always focusing in the big picture and you might be repeating same Transformations and Integrations in different data Mars so there is like trade-off between the speed and consistent data warehouse now moving on to the third approach we have the Data Vault so we still have the stage and the data Mars but it says we still need this Central Data Warehouse in the middle but this middle layer we’re going to bring more standards and rules so it tells you to split this middle layer into two layers the row Vault and the business vault in the row Vault you have the original data but in the business Vault you have all the business rules and Transformations that prepares the data for the data Mars so Data Vault it is very similar to the in one but it brings more standards and rules to the middle layer now I’m going to go and add a fourth one that I’m going to call it Medallion architecture and this one is my favorite one because it is very easy to understand and to build so it says you’re going to go and build three layers bronze silver and gold the bronze layer it is very similar to the stage but we have understood with the time that the stage layer is very important because having the original data as it is it going to helps a lot by tracebility and finding issues then the next layer we have the silver layer it is where we do Transformations data cleansy but we don’t apply yet any business rules now moving on to the last layer the gold layer it is as well very similar to the data Mars but there we can build different typ type of objects not only for reporting but as well for machine learning for AI and for many different purposes so they are like business ready objects that you want to share as a data product so those are the four approaches that you can use in order to build a data warehouse so again if you are building a data architecture you have to specify which approach you want to follow so at the start we said we want to build a data warehouse and then we have to decide between those four approaches on how to build the data warehouse and in this project we will be using using The Medallion architecture so this is a very important question that you have to answer as the first step of building a data architecture all right so with that we have decided on the approach so we can go and Mark it as done the next step we’re going to go and design the layers of the data warehouse now there is like not 100% standard way and rules for each layer what you have to do as a data architect you have to Define exactly what is the purpose of each layer so we start with the bronze layer so we say it going to store row and unprocessed data as it is from the sources and why we are doing that it is for tracebility and debugging if you have a layer where you are keeping the row data it is very important to have the data as it is from the sources because we can go always back to the pron layer and investigate the data of specific Source if something goes wrong so the main objective is to have row untouched data that’s going to helps you as a data engineer by analyzing the road cause of issues now moving on to the silver layer it is the layer where we’re going to store clean and standardized data and this is the place where we’re going to do basic transformations in order to prepare the data for the final layer now for the good layer it going to contain business ready data so the main goal here is to provide data that could be consumed by business users and analysts in order to build reporting and analytics so with that we have defined the main goal for each layer now next what I would like to do is to to define the object types and since we are talking about a data warehouse in database we have here generally two types either a table or a view so we are going for the bronze layer and the silver layer with tables but for the gold layer we are going with the views so the best practice says for the last layer in your data warehouse make it virtual using views it going to gives you a lot of dynamic and of course speed in order to build it since we don’t have to make a load process for it and now the next step is that we’re going to go and Define the load method so in this project I have decided to go with the full load using the method of trating and inserting it is just faster and way easier so we’re going to say for the pron layer we’re going to go with the full load and you have to specify as well for the silver layer as well we’re going to go with the full load and of course for the views we don’t need any load process so each time you decide to go with tables you have to define the load methods with full load incremental loads and so on now we come to the very interesting part the data Transformations now for the pron layer it is the easiest one about this topic because we don’t have any transformations we have to commit ourself to not touch the data do not manipulate it don’t change anything so it’s going to stay as it is if it comes bad it’s going to stay bad in the bronze layer and now we come to the silver layer where we have the heavy lifting as we committed in the objective we have to make clean and standardized data and for that we have different types of Transformations so we have to do data cleansing data standardizations data normalizations we have to go and derive new columns and data enrichment so there are like bunch of trans transformation that we have to do in order to prepare the data our Focus here is to transform the data to make it clean and following standards and try to push all business transformations to the next layer so that means in the god layer we will be focusing on business Transformations that is needed for the consumers for the use cases so what we do here we do data Integrations between Source system we do data aggregations we apply a lot of business Logics and rules and we build a data model that is ready for for example business inions so here we do a lot of business Transformations and in the silver layer we do basic data Transformations so it is really here very important to make the fine decisions what type of transformations to be done in each layer and make sure that you commit to those rules now the next aspect is about the data modeling in the bronze layer and the silver layer we will not break the data model that comes from the source system so if the source system deliver five tables we’re going to have here like five tables and as well in the silver layer we will not go and D normalize or normalize or like make something new we’re going to leave it exactly like it comes from the source system because what we’re going to do we’re going to build the data model in the gold layer and here you have to Define which data model you want to follow are you following the star schema the snowflake or are you just making aggregated objects so you have to go and make a list of all data models types that you’re going to follow in the gold layer and at the end what you can specify in each layer is the target audience and this is of course very important decision in the bronze layer you don’t want to give access access to any end user it is really important to make sure that only data Engineers access the bronze layer it makes no sense for data analysts or data scientist to go to the bad data because you have a better version for that in the silver layer so in the silver layer of course the data Engineers have to have an access to it and as well the data analysts and the data scientist and so on but still you don’t give it to any business user that can’t deal with the row data model from the sources because for the business users you’re going to get a bit layer for them and that is the gold layer so the gold layer it is suitable for the data analyst and as well the business users because usually the business users don’t have a deep knowledge on the technicality of the Sero layer so if you are designing multiple layers you have to discuss all those topics and make clear decision for each layer all right my friends so now before we proceed with the design I want to tell you a secret principle Concepts that each data architect must know and that is the separation of concerns so what is that as you are designing an architecture you have to make sure to break down the complex system into smaller independent parts and each part is responsible for a specific task and here comes the magic the component of your architecture must not be duplicated so you cannot have two parts are doing the same thing so the idea here is to not mix everything and this is one of the biggest mistakes in any big projects and I have sewn that almost everywhere so a good data architect follow this concept this principle so for example if you are looking to our data architecture we have already done that so we have defined unique set of tasks for each layer so for example we have said in the silver layer we do data cleansing but in the gold layer we do business Transformations and with that you will not be allowing to do any business transformations in the silver layer and the same thing goes for the gold layer you don’t do in the gold layer any data cleansing so each layer has its own unique tasks and the same thing goes for the pron layer and the silver layer you do not allow to load data from The Source systems directly to the silver layer because we have decided the landing layer the first layer is the pron layer otherwise you will have like set of source systems that are loaded first to the pron layer and another set is skipping the layer and going to the silver and with that we have overlapping you are doing data inje in two different layers so my friends if you have this mindsets separation of concerns I promise you you’re going to be a data architect so think about it all right my friends so with that we have designed the layers of the data warehouse we can go and close it the next step we’re going to go to draw o and start drawing the data architecture so there is like no one standard on how to build a data architecture you can add your style and the way that you want so now the first thing that we have to show in data architecture is the different layers that we have the first layer is the source system layer so let’s go and take a box like this and make it a little bit bigger and I’m just going to go and make the design so I’m going to remove the fill and make the line dotted one and after dots I’m going to go and change maybe the color to something like this gray so now we have like a container for the first layer and then we have to go and add like a text on top of it so what I’m going to do I’m going to take another box let’s go and type inside it sources and I’m going to go and style it so I’m going to go to the text and make it maybe 24 and then remove the lines like this make it a little bit smaller and put it on top so this is the first layer this is where the data come from and then the data going to go inside a data warehouse so I’m just going to go and duplicate this one this one is the data warehouse all right so now the third layer what is going to be it’s going to be the consumers who will be consuming this data warehouse so I’m going to put another box and say this is the consume layer okay so those are the three containers now inside the data warehouse we have decided to build it using the Medan architecture so we’re going to have three layers inside the warehouse so I’m going to take again another box I’m going to call this one this is the bronze layer and now we have to go and put a design for it so I’m going to go with this color over here and then the text and maybe something like 20 and then make it a little bit smaller and just put it here and beneath that we’re going to have the component so this is just a title of a container so I’m going to have it like this this remove the text from inside it and remove the filling so this container is for the bronze layer let’s go and duplicate it for the next one so this one going to be the silver layer and of course we can go and change the coloring to gray because it is silver and as well the lines and remove the filling great and now maybe I’m going to make the font as bold all right now the third layer going to be the gold layer and we have to go and pick it color for that so style and here we have like something like yellow the same thing for the container I remove the filling so with that we are showing now the different layers inside our data warehouse now those containers are empty what we’re going to do we’re going to go inside each one of them and start adding contents so now in the sources it is very important to make it clear what are the different types of source system that you are connecting to the data warehouse because in real project there are like multiple types you might have a database API files CFA and here it’s important to show those different types in our projects we have folders and inside those folders We have CSV files so now what you have to do we have to make it clear in this layer that the input for our project is CSV file so it really depend how you want to show that I’m going to go over here and say maybe folder and then I’m going to go and take the folder and put it here inside and then maybe search for file more results and go pick one of those icons for example I’m going to go with this one over here so I’m going to make it smaller and add it on top of the folder so with that we make it clear for everyone seeing the architecture that the sources is not a database is not an API it is a file inside the folder so now very important here to show is the source systems what are the sources that is involved in the project so here what we’re going to do we’re going to go and give it a name for example we have one source called CRM B like this and maybe make the icon and we have another source called Erp so we going to go and duplicate it put it over here and then rename it Erp so now it is for everyone clear we have two sources for the this project and the technology is used is simply a file so now what we can do as well we can go and add some descriptions inside this box to make it more clear so what I’m going to do I’m going to take a line because I want to split the description from the icons something like this and make it gray and then below it we’re going to go and add some text and we’re going to say is CSV file and the next point and we can say the interface is simply files in folder and of course you can go and add any specifications and explanation about the sources if it is a database you can see the type of the database and so on so with that we made it in the data architecture clear what are the sources of our data warehouse and now the next step what we’re going to do we’re going to go and design the content of the bronze silver and gold so I’m going to start by adding like an icon in each container it is to show about that we are talking about database so what we’re going to do we’re going to go and search for database and then more result more results I’m going to go with this icon over here so let’s go and make it it’s bigger something like this maybe change the color of that so we’re going to have the bronze and as well here the silver and the gold so now what we’re going to do we’re going to go and add some arrows between those layers so we’re going to go over here so we can go and search for Arrow and maybe go and pick one of those let’s go and put it here and we can go and pick a color for that maybe something like this and adjust it so now we can have this nice Arrow between all the layers just to explain the direction of our architecture right so we can read this from left to right and as well between the gold layer and the consume okay so now what I’m going to do next we’re going to go and add one statement about each layer the main objective so let’s go and grab a text and put it beneath the database and we’re going to say for example for the bl’s layer it’s going to be the row data maybe make the text bigger so you are the row data and then the next one in the silver you are cleans standard data and then the last one for the gos we can say business ready data so with that we make the objective clear for each layer now below all those icons what we going to do we’re going to have a separator again like this make it like colored and beneath it we’re going to add the most important specifications of this layer so let’s go and add those separators in each layer okay so now we need a text below it let’s take this one here so what is the object type of the bronze layer it’s going to be a table and we can go and add the load methods we say this is patch processing since we are not doing streaming we can say it is a full load we are not doing incremental load so we can say here Tran and insert and then we add one more section maybe about the Transformations so we can say no Transformations and one more about the data model we’re going to say none as is and now what I’m going to do I’m going to go and add those specifications as well for the silver and gold so here what we have discussed the object type the load process the Transformations and whether we are breaking the data model or not the same thing for the gold layer so I can say with that we have really nice layering of the data warehouse and what we are left is with the consumers over here you can go and add the different use cases and tools that can access your data warehouse like for example I’m adding here business intelligence and Reporting maybe using poweri or Tau or you can say you can access my data warehouse in order to do atoc analyzes using the SQ queries and this is what we’re going to focus on the projects after we buil the data warehouse and as well you can offer it for machine learning purposes and of course it is really nice to add some icons in your architecture and usually I use this nice websites called Flat icon it has really amazing icons that you can go and use it in your architecture now of course we can go and keep adding icons and stuff to explain the data architecture and as well the system like for example it is very important here to say which tools you are using in order to build this data warehouse is it in the cloud are you using Azure data breaks or maybe snowflake so we’re going to go and add for our project the icon of SQL Server since we are building this data warehouse completely in the SQL Server so for now I’m really happy about it as you can see we have now a plan right all right guys so with that we have designed the data architecture using the drw O and with that we have done the last step in this epic and now with that we have a design for the data architecture and we can say we have closed this epic now let’s go to the next one we will start doing the first step to prepare our projects and the first task here is to create a detailed project plan all right my friends so now it’s clear for us that we have three layers and we have to go and build them so that means our big epic is going to be after the layers so here I have added three more epics so we have build bronze layer build silver layer and gold layer and after that I went and start defining all the different tasks that we have to follow in the projects so at the start will be analyzing then coding and after that we’re going to go and do testing and once everything is ready we’re going to go and document stuff and at the end we have to commit our work in the get repo all those epics are following the same like pattern in the tasks so as you can see now we have a very detailed project structure and now things are more cleared for us how we going to build the data warehouse so with that we are done from this task and now the next task we have to go and Define the naming Convention of the projects all right so now at this phase of the projects we usually Define the naming conventions so what is that it a set of rules that you define for naming everything in the projects whether it is a database schema tables start procedures folders anything and if you don’t do that at the early phase of the project I promise you chaos can happen because what going to happen you will have different developers in your projects and each of those developers have their own style of course so one developer might name a tabled Dimension customers where everything is lowercase and between them underscore and you have another developer creating another table called Dimension products but using the camel case so there is no separation between the words and the first character is capitalized and maybe another one using some prefixes like di imore categories so we have here like a shortcut of the dimension so as you can see there are different designs and styles and if you leave the door open what can happen in the middle of the projects you will notice okay everything looks inconsistence and you can define a big task to go and rename everything following specific role so instead of wasting all this time at this phase you go and Define the naming conventions and let’s go and do that so we will start with a very important decision and that is which naming convention we going to follow in the whole project so you have different cases like the camel case the Pascal case the Kebab case and the snake case and for this project we’re going to go with the snake case where all the letters of award going to be lowercase and the separation between wordss going to be an underscore for example a table name called customer info customer is lowercased info is as well lowercased and between them an underscore so this is always the first thing that you have to decide for your data project the second thing is to decide the language so for example I work in Germany and there is always like a decision that we have to make whether we use Germany or English so we have to decide for our project which language we’re going to use and a very important general rule is that avoid reserved words so don’t use a square reserved word as an object name like for example table don’t give a table name as a table so those are the general principles so those are the general rules that you have to follow in the whole project this applies for everything for tables columns start procedures any names that you are giving in your scripts now moving on we have specifications for the table names and here we have different set of rules for each layer so here the rule says Source system uncore entity so we are saying all the tables in the bronze layer should start first with the source system name like for example CRM or Erb and after that we have an underscore and then at the end we have the entity name or the table name so for example we have this table name CRM uncore so that means this table comes from the source system CRM and then we have the table name the entity name customer info so this is the rule that we’re going to follow in naming all tables in the pron layer then moving on to the silver layer it is exactly like the bronze because we are not going to rename anything we are not going to build any new data model so the naming going to be one to one like the bronze so it is exactly the same rules as the bronze but if we go to the gold here since we are building new data model we have to go and rename things and since as well we are integrating multi sources together we will not be using the source system name in the tables because inside one table you could have multiple sources so the rule says all the names must be meaningful business aligned names for the tables starting with the category prefix so here the rule says it start with category then underscore and then entity now what is category we have in the go layer different types of tables so we could build a table called a fact table another one could be a dimension a third type could be an aggregation or report so we have different types of tables and we can specify those types as a perect at the start so for example we are seeing here effect uncore sales so the category is effect and the table name called sales and here I just made like a table with different type of patterns so we could have a dimension so we say it start with the di imore for example the IM customers or products and then we have another type called fact table so it starts with fact underscore or aggregated table where we have the fair three characters like aggregating the customers or the sales monthly so as you can see as you are creating a naming convention you have first to make it clear what is the rule describe each part of the rule and start giving examples so with that we make it clear for the whole team which names they should follow so we talked here about the table naming convention then you can as well go and make naming convention for the columns like for example in the gold layer we’re going to go and have circuit keys so we can Define it like this the circuit key should start with a table name and then underscore a key like for example we can call it customer underscore key it is a surrogate key in the dimension customers the same thing for technical columns as a data engineer we might add our own columns to the tables that don’t come from the source system and those columns are the technical columns or sometimes we call them metadata columns now in order to separate them from the original columns that comes from the source system we can have like a prefix for that like for example the rule says if you are building any technical or metadata columns the column should start with dwore and then that column name for example if you want the metadata load date we can have dwore load dates so with that if anyone sees that column starts with DW we understand this data comes from a data engineer and we can keep adding rules like for example the St procedure over here if you are making an ETL script then it should should start with the prefix load uncore and then the layer for example the St procedure that is responsible for loading the bronze going to be called load uncore bronze and for the Silver Load uncore silver so those are currently the rules for the St procedure so this is how I do it usually in my projects all right my friends so with do we have a solid namey conventions for our projects so this is done and now the next with that we’re going to go to git and you will create a brand new repository and we’re going to prepare its structure so let’s go go all right so now we come to as well important step in any projects and that’s by creating the git repository so if you are new to git don’t worry about it it is simpler than it sounds so it’s all about to have a safe place where you can put your codes that you are developing and you will have the possibility to track everything happen to the codes and as well you can use it in order to collaborate with your team and if something goes wrong you can always roll back and the best part here once you are done with the project you can share your reposter as a part of your portfolio and it is really amazing thing if you are applying for a job by showcasing your skills that you have built a data warehouse by using well documented get reposter so now let’s go and create the reposter of the project now we are at the overview of our account so the first thing that you have to do is to go to the repos stories over here and then we’re going to go to this green button and click on you the first thing that we have to do is to give Theory name so let’s call it SQL data warehouse project and then here we can go and give it a description so for example I’m saying building a modern data warehouse with SQL Server now the next option whether you want to make it public and private I’m going to leave it as a public and then let’s go and add here a read me file and then here about the license we can go over here and select the MIT MIT license gives everyone the freedom of using and modifying your code okay so I think I’m happy with the setup let’s go and create the repost story and with that we have our brand new reposter now the next step that I usually do is to create the structure of the reposter and usually I always follow the same patterns in any projects so here we need few folders in order to put our files right so what I usually do I go over here to add file create a new file and I start creating the structure over here so the first thing is that we need data sets then slash and with that the repos you can understand this is a folder not a file and then you can go and add anything like here play holder just an empty file this just can to help me to create the folders so let’s go and commit so commit the changes and now if you go back to the main projects you can see now we have a folder called data sets so I’m going to go and keep creating stuff so I will go and create the documents placeholder commit the changes and then I’m going to go and create the scripts Place holder and the final one what I usually add is the the tests something like this so with that as you can see now we have the main folders of our repository now what I usually do the next with that I’m going to go and edit the main readme so you can see it over here as well so what we’re going to do we’re going to go inside the read me and then we’re going to go to the edit button here and we’re going to start writing the main information about our project this is really depend on your style so you can go and add whatever you want this is the main page of your repository and now as you can see the file name here ismd it stands for markdown it is just an easy and friendly format in order to write a text so if you have like documentations you are writing a text it is a really nice format in order to organize it structure it and it is very friendly so what I’m going to do at the start I’m going to give a few description about the project so we have the main title and then we have like a welcome message and what this reposter is about and in the next section maybe we can start with the project requirements and then maybe at the end you can say few words about the licensing and few words about you so as you can see it’s like the homepage of the project and the repository so once you are done we’re going to go and commit the changes and now if you go to the main page of the repository you can see always the folder and files at the start and then below it we’re going to see the informations from the read me so again here we have the welcome statement and then the projects requirements and at the end we have the licensing and about me so my friends that’s that’s it we have now a repost story and we have now the main structure of the projects and through the projects as we are building the data warehouse we’re going to go and commit all our work in this repository nice right all right so with that we have now your repository ready and as we go in the projects we will be adding stuff to it so this step is done and now the last step finally we’re going to go to the SQL server and we’re going to write our first scripts where we’re going to create a database and schemas all right now the first step is we have to go and create brand new database so now in order to do that first we have to switch to the database master so you can do it like this use master and semicolon and if you go and execute it now we are switched to the master database it is a system database in SQL Server where you can go and create other databases and you can see from the toolbar that we are now logged into the master database now the next step we have to go and create our new database so we’re going to say say create database and you can call it whatever you want so I’m going to go with data warehouse semicolon let’s go and execute it and with that we have created our database let’s go and check it from the object Explorer let’s go and refresh and you can see our new data warehouse this is our new database awesome right now to the next step we’re going to go and switch to the new database so we’re going to say use data warehouse and semicolon so let’s go and switch to it and you can see now now we are logged into the data warehouse database and now we can go and start building stuff inside this data warehouse so now the first step that I usually do is I go and start creating the schemas so what is the schema think about it it’s like a folder or a container that helps you to keep things organized so now as we decided in the architecture we have three layers bronze silver gold and now we’re going to go and create for each layer a schema so let’s go and do that we’re going to start with the first one create schema and the first one is bronze so let’s do it like this and a semicolon let’s go and create the first schema nice so we have new schema let’s go to our database and then in order to check the schemas we go to the security and then to the schemas over here and as you can see we have the bronze and if you don’t find it you have to go and refresh the whole schemas and then you will find the new schema great so now we have the first schema now what we’re going to do we’re going to go and create the others two so I’m just going to go and duplicate it so the next one going to be the silver and the third one going to be the golds so let’s go and execute those two together we will get an error and that’s because we are not having the go in between so after each command let’s have a go and now if I highlight the silver and gold and then execute it will be working the go in SQL it is like separator so it tells SQL first execute completely the First Command before go to the next one so it is just separator now let’s go to our schemas refresh and now we can see as well we have the gold and the silver so with this we have now a database we have the three layers and we can start developing each layer individually okay so now let’s go and commit our work in the git so now since it is a script and code we’re going to go to the folder scripts over here and then we’re going to go and add a new file let’s call it init database.sql and now we’re going to go and paste our code over here so now I have done few modifications like for example before we create the database we have to check whether the database exists this is an important step if you are recreating the database otherwise if you don’t do that you will get an error where it’s going going to say the database already exists so first it is checking whether the database exist then it drops it I have added few comments like here we are saying creating the data warehouse creating the schemas and now we have a very important step we have to go and add a header comment at the start of each scripts to be honest after 3 months from now you will not be remembering all the details of these scripts and adding a comment like this it is like a sticky note for you later once you visit this script again and it is as well very important for the other developers in the team because each time you open a scripts the first question going to be what is the purpose of this script because if you or anyone in the team open the file the first question going to be what is the purpose of these scripts why we are doing these stuff so as you can see here we have a comment saying this scripts create a new data warehouse after checking if it already exists if the database exists it’s going to drop it and recreate it and additionally it’s going to go and create three schemas bronze silver gold so that it gives Clarity what this script is about and it makes everyone life easier now the second reason why this is very important to add is that you can add warnings and especially for this script it is very important to add these notes because if you run these scripts what’s going to happen it’s going to go and destroy the whole database imagine someone open the script and run it imagine an admin open the script and run it in your database everything going to be destroyed and all the data will be lost and this going to be a disaster if you don’t have any backup so with that we have nice H our comment and we have added few comments in our codes and now we are ready to commit our codes so let’s go and commit it and now we have our scripts in the git as well and of course if you are doing any modifications make sure to update the changes in the Gs okay my friends so with that we have an empty database and schemas and we are done with this task and as well we are done with the whole epic so we have completed the project initialization and now we’re going to go to the interesting stuff we will go and build the bronze layer so now the first task is to analyze the source systems so let’s go all right so now the big question is how to build the bronze layer so first thing first we do analyzing as you are developing anything you don’t immediately start writing a code so before we start coding the bronze layer what we usually do is we have to understand the source system so what I usually do I make an interview with the source system experts and ask them many many questions in order to understand the nature of the source system that I’m connecting to the data warehouse and once you know the source systems then we can start coding and the main focus here is to do the data ingestion so that means we have to find a way on how to load the data from The Source into the data warehouse so it’s like we are building a bridge between the source and our Target system the data warehouse and once we have the code ready the next step is we have to do data validation so here comes the quality control it is very important in the bronze layer to check the data completeness so that means we have to compare the number of Records between the source system and the bronze layer just to make sure we are not losing any data in between and another check that we will be doing is the schema checks and that’s to make sure that the data is placed on the right position and finally we don’t have to forget about documentation and committing our work in the gits so this is the process that we’re going to follow to build the bronze layer all right my friends so now before connecting any Source systems to our data warehouse we have to make very important step is to understand the sources so how I usually do it I set up a meeting with the source systems experts in order to interview them to ask them a lot of stuff about the source and gaining this knowledge is very important because asking the right question will help you to design the correct scripts in order to extract the data and to avoid a lot of mistakes and challenges and now I’m going to show you the most common questions that I usually ask before connecting anything okay so we start first by understanding the business context and the ownership so I would like to understand the story behind the data I would like to understand who is responsible for the data which it departments and so on and then it’s nice to understand as well what business process it supports does it support the customer transactions the supply chain Logistics or maybe Finance reporting so with that you’re going to understand the importance of your data and then I ask about the system and data documentation so having documentations from the source is your learning materials about your data and it going to saves you a lot of time later when you are working and designing maybe new data models and as well I would like always to understand the data model for the source system and if they have like descript I of the columns and the tables it’s going to be nice to have the data catalog this can helps me a lot in the data warehouse how I’m going to go and join the tables together so with that you get a solid foundations about the business context the processes and the ownership of the data and now in The Next Step we’re going to start talking about the technicality so I would like to understand the architecture and as well the technology stack so the first question that I usually ask is how the source system is storing the data do we have the data on the on Prem like an SQL Server Oracle or is it in the cloud like Azure lws and so on and then once we understand that then we can discuss what are the integration capabilities like how I’m going to go and get the data do the source system offer apis maybe CFA or they have only like file extractions or they’re going to give you like a direct connection to the database so once you understand the technology that you’re going to use in order to extract the data then we’re going to Deep dive into more technical questions and here we can understand how to extract the data from The Source system and and then load it into the data warehouse so the first things that we have to discuss with the experts can we do an incremental load or a full load and then after that we’re going to discuss the data scope the historization do we need all data do we need only maybe 10 years of the data are there history is already in the source system or should we build it in the data warehouse and so on and then we’re going to go and discuss what is the expected size of the extracts are we talking here about megabytes gigabytes terabytes and this is very important to understand whether we have the right tools and platform to connect the source system and then I try to understand whether there are any data volume limitations like if you have some Old Source systems they might struggle a lot with performance and so on so if you have like an ETL that extracting large amount of data you might bring the performance down of the source system so that’s why you have to try to understand whether there are any limitations for your extracts and as well other aspects that might impact the performance of The Source system this is very important if they give you an access to the database you have to be responsible that you are not bringing the performance of the database down and of course very important question is to ask about the authentication and the authorization like how you going to go and access the data in the source system do you need any tokens Keys password and so on so those are the questions that you have to ask if you are connecting new source system to the data warehouse and once you have the answers for those questions you can proceed with the next steps to connect the sources to the that Warehouse all right my friends so with that you have learned how to analyze a new source systems that you want to connect to your data warehouse so this STP is done and now we’re going to go back to coding where we’re going to write scripts in order to do the data ingestion from the CSV files to the Bros layer and let’s have quick look again to our bronze layer specifications so we just have to load the data from the sources to the data warehouse we’re going to build tables in the bronze layer we are doing a full load so that means we are trating and then inserting the data there will be no data Transformations at all in the bronze layer and as well we will not be creating any data model so this is the specifications of the bronze layer all right now in order to create the ddl script for the bronze layer creating the tables of the bronze we have to understand the metadata the structure the schema of the incoming data and here either you ask the technical experts from The Source system about these informations or you can go and explore the incoming data and try to define the structure of your tables so now what we’re going to do we’re going to start with the First Source system the CRM so let’s go inside it and we’re going to start with the first table that customer info now if you open the file and check the data inside it you see we have a Header information and that is very good because now we have the names of the columns that are coming from the source and from the content you can Define of course the data types so let’s go and do that first we’re going to say create table and then we have to define the layer it’s going to be the bronze and now very important we have to follow the naming convention so we start with the name of the source system it is the CRM underscore and then after that the table name from The Source system so it’s going to be the costore info so this is the name of our first table in the bronze layer then the next step we have to go and Define of course the columns and here again the column names in the bronze layer going to be one to one exactly like the source system so the first one going to be the ID and I will go with the data type integer then the next one going to be the key invar Char and the length I will go with [Music] 50 and the last one going to be the create dates it’s going to be date so with that we have covered all the columns available from The Source system so let’s go and check and yes the last one is the create date so that’s it for the first table now semicolon of course at the end let’s go and execute it and now we’re going to go to the object Explorer over here refresh and we can see the first table inside our data warehouse amazing right so now next what you have to do is to go and create a ddl statement for each file for those two systems so for the CRM we need three ddls and as well for the other system the Erp we have as well to create three ddls for the three files so at the ends we’re going to have in the bronze ler Six Tables six ddls so now pause the video go create those ddls I will be doing the same as well and we will see you soon all right so now I hope you have created all those details I’m going to show you what I have just created so the second table in the source CRM we have the product informations and the third one is the sales details then we go to the second system and here we make sure that we are following the naming convention so first The Source system Erb and then the table name so the second system was really easy you can see we have only here like two columns and for the customers like only three and for the categories only four columns all right so after defining those stuff of course we have to go and execute them so let’s go and do that and then we go to the object Explorer over here refresh the tables and with that you can see we have six empty tables in the bronze layer and with that we have all the tables from the two Source systems inside our database but still we don’t have any data and you can see our naming convention is really nice you see the first three tables comes from the CRM Source system and then the other three comes from the Erb so we can see in the bronze layer the things are really splitted nicely and you can identify quickly which table belonged to which source system now there is something else that I usually add to the ddl script is to check whether the table exists before creating so for example let’s say that you are renaming or you would like to change the data type of specific field if you just go and run this Square you will get an error because the database going to say we have already this table so in other databases you can say create or replace table but in the SQL Server you have to go and build a tsql logic so it is very simple first we have to go and check whether the object exist in the database so we say if object ID and then we have to go and specify the table name so let’s go and copy the whole thing over here and make sure you get exactly the same name as a table name so there is see like space I’m just going to go and remove it and then we’re going to go and Define the object type so going to be the U it stands for user it is the user defined tables so if this table is not null so this means the database did find this object in the database so what can happen we say go and drop the table so the whole thing again and semicolon so again if the table exist in the database is not null then go and drop the table and after that go and created so now if you go and highlight the whole thing and then execute it it will be working so first drop the table if it exist then go and create the table from scratch now what you have to do is to go and add this check before creating any table inside our database so it’s going to be the same thing for the next table and so on I went and added all those checks for each table and what can happen if I go and execute the whole thing it going to work so with that I’m recreating all the tables in the bronze layer from the scratch now the methods that we’re going to use in order to load the data from the source to the data warehouse is the bulk inserts bulk insert is a method of loading massive amount of data very quickly from files like CSV files or maybe a text file directly into a database it’s is not like the classical normal inserts where it’s going to go and insert the data row by row but instead the PK insert is one operation that’s going to load all the data in one go into the database and that’s what makes it very fast so let’s go and use this methods okay so now let’s start writing the script in order to load the first table in the source CRM so we’re going to go and load the table customer info from the CSV file to the database table so the syntax is very simple we’re going to start to saying pulk insert so with that SQL understand we are doing not a normal insert we are doing a pulk insert and then we have to go and specify the table name so it is bronze. CRM cost info so now now we have to specify the full location of the file that we are trying to load in this table so now what we have to do is to go and get the path where the file is stored so I’m going to go and copy the whole path and then add it to the P insert exactly like where the data exists so for me it is in csql data warehouse project data set in the source CRM and then I have to specify the file name so it’s going to be the costore info. CSV you have to get it exactly like like the path of your files otherwise it will not be working so after the path now we come to the with CLA now we have to tell the SQL Server how to handle our file so here comes the specifications there is a lot of stuff that we can Define so let’s start with the very important one is the row header now if you check the content of our files you can see always the first row includes the Header information of the file so those informations are actually not the data it’s just the column names the ACT data starts from the second row and we have to tell the database about this information so we’re going to say first row is actually the second row so with that we are telling SQL to skip the first row in the file we don’t need to load those informations because we have already defined the structure of our table so this is the first specifications the next one which is as well very important and loading any CSV file is the separator between Fields the delimiter between Fields so it’s really depend on the file structure that you are getting from the source as you can see all those values are splitted with a comma and we call this comma as a file separator or a delimiter and I saw a lot of different csvs like sometime they use a semicolon or a pipe or special character like a hash and so on so you have to understand how the values are splitted and in this file it’s splitted by the comma and we have to tell SQL about this info it’s very important so we going to say fill Terminator and then we’re going to say it is the comma and basically those two informations are very important for SQL in order to be able to read your CSV file now there are like many different options that you can go and add for example tabe lock it is an option in order to improve the performance where you are locking the entire table during loading it so as SQL is loading the data to this table it going to go and lock the whole table so that’s it for now I’m just going to go and add the semicolon and let’s go and insert the data from the file inside our pron table let’s execute it and now you can see SQL did insert around 880,000 rows inside our table so it is working we just loaded the file into our data Bas but now it is not enough to just write the script you have to test the quality of your bronze table especially if you are working with files so let’s go and just do a simple select so from our new table and let’s run it so now the first thing that I check is do we have data like in each column well yes as you can see we have data and the second thing is do we have the data in the correct column this is very critical as you are loading the data from a file to a database do we have the data in the correct column so for example here we have the first name which of course makes sense and here we have the last name but what could happen and this mistakes happens a lot is that you find the first name informations inside the key and as well you see the last name inside the first name and the status inside the last name so there is like shifting of the data and this data engineering mistake is very common if you are working with CSV files and there are like different reasons why it happens maybe the definition of your table is wrong or the filled separator is wrong maybe it’s not a comma it’s something else or the separator is a bad separator because sometimes maybe in the keys or in the first name there is a comma and the SQL is not able to split the data correctly so the quality of the CSV file is not really good and there are many different reasons why you are not getting the data in the correct column but for now everything looks fine for us and the next step is that I go and count the rows inside this table so let’s go and select that so we can see we have 18,490 and now what we can do we can go to our CSV file and check how many rows do we have inside this file and as you can see we have 18,490 we are almost there there is like one extra row inside the file and that’s because of the header the first Header information is not loaded inside our table and that’s why always in our tables we’re going to have one less row than the original files so everything looks nice and we have done this step correctly now if I go and run it again what’s going to happen we will get dcat inside the bronze layer so now we have loaded the file like twice inside the same table which is not really correct the method that we have discussed is first to make the table empty and then load trate and then insert in order to do that before the bulk inserts what we’re going to do we’re going to say truncate table and then we’re going to have our table and that’s it with a semicolon so now what we are doing is first we are making the table empty and then we start loading from the scratch we are loading the whole content of the file inside the table and this is what we call full load so now let’s go and Mark everything together and execute and again if you go and check the content of the table you can see we have only 18,000 rows let’s go and run it again the count of the bronze layer you can see we still have the 18,000 so each time you run this script now we are refreshing the table customer info from the file into the database table so we are refreshing the bronze layer table so that means if there is like now any changes in the file it will be loaded to the table so this is how you do a full load in the bronze layer by trating the table and then doing the inserts and now of course what we have to do is to Bow the video and go and write WR the same script for all six files so let’s go and do [Music] that okay back so I hope that you have as well written all those scripts so I have the three tables in order to load the First Source system and then three sections in order to load the Second Source system and as I’m writing those scripts make sure to have the correct path so for the Second Source system you have to go and change the path for the other folder and as well don’t forget the table name on the bronze layer is different from the file name because we start always with the source system name with the files we don’t have that so now I think I have everything is ready so let’s go and execute the whole thing perfect awesome so everything is working let me check the messages so we can see from the message how many rows are inserted in each table and now of course the task is to go through each table and check the content so that means now we have really ni script in order to load the bronze layer and we will use this script in daily basis every day we have to run it in order to get a new content to the data warehouse and as you learned before if you have like a script of SQL that is frequently used what we can do we can go and create a stored procedure from those scripts so let’s go and do that it’s going to be very simple we’re going to go over here and say create or alter procedure and now we have to define the name of the Sol procedure I’m going to go and put it in the schema bronze because it belongs to the bronze layer so then we’re going to go and follow the naming convention the S procedure starts with load underscore and then the bronze layer so that’s it about the name and then very important we have to define the begin and as well the end of our SQL statements so here is the beginning and let’s go to the end and say this is the end and then let’s go highlight everything in between and give it one push with tab so with that it is easier to read so now next one we’re going to do we’re going to go and execute it so let’s go and create this St procedure and now if you want to go and check your St procedure you go to the database and then we have here folder called programmability and then inside we have start procedure so if you go and refresh you will see our new start procedure let’s go and test it so I’m going to go and have new query and what we’re going to do we’re going to say execute bronze. load bronze so let’s go and execute it and with that we have just loaded completely the pron layer so as you can see SQL did go and insert all the data from the files to the bronze layer it is way easier than each time running those scripts of course all right so now the next step is that as you can see the output message it is really not having a lot of informations the message of your ETL with s procedure it will not be really clear so that’s why if you are writing an ETL script always take care of the messaging of your code so let me show you a nice design let’s go back to our St procedure so now what we can do we can go and divide the message p based on our code so now we can start with a message for example over here let’s say print and we say what you are doing with this thir procedure we are loading the bronze ler so this is the main message the most important one and we can go and play with the separators like this so we can say print and now we can go and add some nice separators like for example the equals at the start and at the end just to have like a section so this is just a nice message at the start so now by looking to our code we can see that our code is splited into two sections the first section we are loading all the tables from The Source system CRM and the second section is loading the tables from the Erp so we can split the prints by The Source system so let’s go and do that so we’re going to say print and we’re going to say loading CRM tables this is for the first section and then we can go and add some nice separators like the one let’s take the minus and of course don’t forget to add semicolons like me so we can to have semicolon for each print same thing over here I will go and copy the whole thing because we’re going to have it at the start and as well at the end let’s go copy the whole thing for the second section so for the Erp it starts over here and we’re going to have it like this and we’re going to call it loading Erp so with that in the output we can see nice separation between loading each Source system now we go to the next step where we go and add like a print for each action so for example here we are Tran getting the table so we say print and now what we can do we can go and add two arrows and we say what we are doing so we are trating the table and then we can go and add the table name in the message as well so this is the first action that we are doing and we can go and add another print for inserting the data so we can say inserting data into and then we have the table name so with that in the output we can understand what SQL is doing so let’s go and repeat this for all other tables Okay so I just added all those prints and don’t forget the semicolon at the end so I would say let’s go and execute it and check the output so let’s go and do that and then maybe at the start just to have quick output execute our stored procedure like this so let’s see now if you check the output you can see things are more organized than before so at the start we are reading okay we are loading the bronze layer now first we are loading the source system CRM and then the second section is for the Erp and we can see the actions so we trating inserting trating inserting for each table and as well the same thing for the Second Source so as you can see it is nice and cosmetic but it’s very important as you are debugging any errors and speaking of Errors we have to go and handle the errors in our St procedure so let’s go and do that it’s going to be the first thing that we do we say begin try and then we go to the end of our scripts and we say before the last end we say end try and then the next thing we have to add the catch so we’re going to say begin catch and end catch so now first let’s go and organize our code I’m going to take the whole codes and give it one more push and as well the begin try so it is more organized and as you know the try and catch is going to go and execute the try and if there is like any errors during executing this script the second section going to be executed so the catch will be executed only if the SQL failed to run that try so now what we have to do is to go and Define for SQL what to do if there’s like an error in your code and here we can do multiple stuff like maybe creating a logging tables and add the messages inside this table or we can go and add some nice messaging to the output like very example we can go and add like a section again over here so again some equals and we can go and repeat it over here and then add some content in between so we can start with something like to say error Accord during loading bronze layer and then we can go and add many stuff like for example we can go and add the error message and here we can go and call the function error message and we can go and add as well for example the error number so error number and of course the output of this going to be in number but the error message here is a text so we have to go and change the data type so we’re going to do a cast as in VAR Char like this and then there is like many functions that you can add to the output like for example the error States and so on so you can design what can happen if there is an error in the ETL now what else is very important in each ETL process is to add the duration of each like step so for example I would like to understand how long it takes to load this table over here but looking to the output I don’t have any informations how long is taking to load my tables and this is very important because because as you are building like a big data warehouse the ATL process is going to take long time and you would like to understand where is the issue where is the bottleneck which table is consuming a lot of time to be loaded so that’s why we have to add those informations as well to the output or even maybe to protocol it in a table so let’s go and add as well this step so we’re going to go to the start and now in order to calculate the duration you need the starting time and the end time so we have to understand when we started loaded and when we ended loading the table so now the first thing is we have to go and declare the variables so we’re going to say declare and then let’s make one called start time and the data type of this going to be the date time I need exactly the second when it started and then another one for the end time so another variable end time and as well the same thing date time so with that we have declared the variables and the next step is to go and use them so now let’s go to the first table to the customer info and at the start we’re going to say set start time equal to get date so we will get the exact time when we start loading this table and then let’s go and copy the whole thing and go to the end of loading over here so we’re going to say set this time the end time equal as well to the get dates so with that now we have the values of when we start loading this table and when we completed loading the table and now the next step is we have to go and print the duration those informations so over here we can go and say print and we can go and have as again the same design so two arrows and we can say very simply load duration and then double points and space and now what we have to do is to calculate the duration and we can do that using the date and time function date diff in order to find the interval between two dates so we’re going to say plus over here and then use date diff and here we have to Define three arguments first one is the unit so you can Define second minute hours and so on so we’re going to go with a second and then we’re going to define the start of the interval it’s going to be the start time and then the last argument is going to be the end of the boundary it’s going to be the end time and now of course the output of this going to be in number that’s why we have to go and cast it so we’re going to say cast as enar Char and then we’re going to close it like this and maybe at the ends we’re going to say plus space seconds in order to have a nice message so again what we have done we have declared the two variables and we are using them at the start we we are getting the current date and time and at the end of loading the table we are getting the current date and time and then we are finding the differences between them in order to get the load duration and in this case we are just priting this information and now we can go of course and add some nice separator between each table so I’m going to go and do it like this just few minuses not a lot of stuff so now what we have to do is to go and add this mechanism for each table in order to measure the speed of the ETL for each one of [Music] them okay so now I have added all those configurations for each table and let’s go and run the whole thing now so let’s go and edit the stor procedure this and we’re going to go and run it so let’s go and execute so now as you can see we have here one more info about the load durations and it is everywhere I can see we have zero seconds and that’s because it is super fast of loading those informations we are doing everything locally at PC so loading the data from files to database going to be Mega fast but of course in real projects you have like different servers and networking between them and you have millions of rods in the tables of course the duration going to be not like 0 seconds things going to be slower and now you can see easily how long it takes to load each of your tables and now of course what is very interesting is to understand how long it takes to load the whole pron lier so now your task is is as well to print at the ends informations about the whole patch how long it took to load the bronze [Music] layer okay I hope we are done now I have done it like this we have to Define two new variables so the start time of the batch and the end time of the batch and the first step in the start procedure is to get that date and time informations for the first variable and exactly at the end the last thing that we do in the start procedure we’re going to go and get the date and time informations for the end time so we say again set get date for the patch in time and then all what you have to do is to go and print a message so we are saying loading bronze layer is completed and then we are printing total load duration and the same thing with a date difference between the patch start time and the end time and we are calculating the seconds and so on so now what you have to do is to go and execute the whole thing so let’s go and refresh the definition of the S procedure and then let’s go and execute it so in the output we have to go to the last message and we can see loading pron layer is completed and the total load duration is as well 0 seconds because the execution time is less than 1 seconds so with that you are getting now a feeling about how to build an ETL process so as you can see the data engineering is not all about how to load the data it’s how to engineer the whole pipeline how to measure the speed of loading the data what can happen happen if there’s like an error and to print each step in your ETL process and make everything organized and cleared in the output and maybe in the logging just to make debugging and optimizing the performance way easier and there is like a lot of things that we can add we can add the quality measures and stuff so we can add many stuff to our ETL scripts to make our data warehouse professional all right my friends so with that we have developed a code in order to load the pron layer and we have tested that as well and now in the next step we we’re going to go back to draw because we want to draw a diagram about the data flow so let’s go so now what is a data flow diagram we’re going to draw a Syle visual in order to map the flow of your data where it come froms and where it ends up so we want just to make clear how the data flows through different layers of your projects and that’s help us to create something called the data lineage and this is really nice especially if you are analyzing an issue so if you have like multiple layers and you don’t have a real data lineage or flow it’s going to be really hard to analyze the scripts in order to understand the origin of the data and having this diagram going to improve the process of finding issues so now let’s go and create one okay so now back to draw and we’re going to go and build the flow diagram so we’re going to start first with the source system so let’s build the layer I’m going to go and remove the fill dotted and then we’re going to go and add like a box saying sources and we’re going to put it over here increase the size 24 and as well without any lines now what do we have inside the sources we have like folder and files so let’s go and search for a folder icon I’m going to go and take this one over here and say you are the CRM and we can as well increase the size and we have another source we have the Erp okay so this is the first layer let’s go and now have the bronze layer so we’re going to go and grab another box and we’re going to go and make the coloring like this and instead of Auto maybe take the hatch maybe something like this whatever you know so rounded and then we can go and put on top of it like the title so we can say you are the bronze layer and increase as well the size of the font so now what you’re going to do we’re going to go and add boxes for each table that we have in the bronze layer so for example we have the sales details we can go and make it little bit smaller so maybe 16 and not bold and we have other two tables from the CRM we have the customer info and as well the product info so those are the three tables that comes from the CRM and now what we’re going to do we’re going to go and connect now the source CRM with all three tables so what we going to do we’re going to go to the folder and start making arrows from the folder to the bronze layer like this and now we have to do the same thing for the Erp source so as you can see the data flow diagram shows us in one picture the data lineage between the two layers so here we can see easily those three tables actually comes from the CRM and as well those three tables in the bronze layer are coming from the Erp I understand if we have like a lot of tables it’s going to be a huge Miss but if you have like small or medium data warehouse building those diagrams going to make things really easier to understand how everything is Flowing from the sources into the different layers in your data warehouse all right so with that we have the first version of the data flow so this step is done and the final step is to commit our code in the get repo okay so now let’s go and commit our work since it is scripts we’re going to go to the folder scripts and here we’re going to have like scripts for the bronze silver and gold that’s why maybe it makes sense to create a folder for each layer so let’s go and start creating the bronze folder so I’m going to go and create a new file and then I’m going to say pron slash and then we can have the DL script of the pron layer dot SQL so now I’m going to go and paste the edal codes that we have created so those six tables and as usual at the start we have a comment where we are explaining the purpose of these scripts so we are saying these scripts creates tables in the pron schema and by running the scripts you are redefining the DL structure of the pron tables so let’s have it like that and I’m going to go and commit the changes all right so now as you can see inside the scripts we have a folder called bronze and inside it we have the ddl script for the bronze layer and as well in the pron layer we’re going to go and put our start procedure so we’re going to go and create a new file let’s call it proc load bronze. SQL and then let’s go and paste our scripts and as usual I have put it at the start an explanation about the sord procedure so we are seeing this St procedure going to go and load the data from the CSV files into the pron schema so it going go and truncate first the tables and then do a pulk inserts and about the parameters this s procedure does not accept any parameter or return any values and here a quick example how to execute it all right so I think I’m happy with that so let’s go and commit it all right my friends so with that we have committed our code into the gch and with that we are done building the pron layer so the whole is done now we’re going to go to the next one this one going to be more advanced than the bronze layer because the there will be a lot of struggle with cleaning the data and so on so we’re going to start with the first task where we’re going to analyze and explore the data in the source systems so let’s go okay so now we’re going to start with the big question how to build the silver layer what is the process okay as usual first things first we have to analyze and now the task before building anything in the silver layer we have to go and explore the data in order to understand the content of our sources once we have it what we’re going to do we will be starting coding and here the transformation that we’re going to do is data cleansing this is usually process that take really long time and I usually do it in three steps the first step is to check first the data quality issues that we have in the pron layer so before writing any data Transformations first we have to understand what are the issues and only then I start writing data transformations in order to fix all those quality issues that we have in the bronze and the last step once I have clean results what we’re going to do we’re going to go and inserted into the silver layer and those are the three faces that we will be doing as we are writing the code for the silver layer and the third step once we have all the data in the server layer we have to make sure that the data is now correct and we don’t have any quality issues anymore and if you find any issues of course what you going to do we’re going to go back to coding we’re going to do the data cleansing and again check so it is like a cycle between validating and coding once the quality of the silver layer is good we cannot skip the last phase where we going to document and commit our work in the Gs and here we’re going to have two new documentations we’re going to build the data flow diagram and as well the data integration diagram after we understood the relationship between the sources from the first step so this is the process and this is how we going to build the server layer all right so now exploring the data in the pron layer so why it is very important because understanding the data it is the key to make smart decisions in the server layer it was not the focus in the BR layer to understand the content of the data at all we focused only how to get the data to the data warehouse so that’s why we have now to take a moment in order to explore and understand the tables and as well how to connect them what are the relationship between these tables and it is very important as you are learning about a new source system is to create like some kind of documentation so now let’s go and explore the sources okay so now let’s go and explore them one by one we can start with the first one from the CRM we have the customer info so right click on it and say select top thousand rows and this is of course important if you have like a lot of data don’t go and explore millions of rows always limit your queries so for example here we are using the top thousands just to make sure that you are not impacting the system with your queries so now let’s have a look to the content of this table so we can see that we have here customer informations so we have an ID we have a key for the customer we have first name last name my Ral status gender and the creation date of the customer so simply this is a table for the customer customer information and a lot of details for the customers and here we have like two identifiers one it is like technical ID and another one it’s like the customer number so maybe we can use either the ID or the key in order to join it with other tables so now what I usually do is to go and draw like data model or let’s say integration model just to document and visual what I am understanding because if you don’t do that you’re going to forget it after a while so now we go and search for a shape let’s search for table and I’m going to go and pick this one over here so here we can go and change the style for example we can make it rounded or you can go make it sketch and so on and we can go and change the color so I’m going to make it blue then go to the text make sure to select the whole thing and let’s make it bigger 26 and then what I’m going to do for those items I’m just going to select them and go to arrange and maybe make it 40 something like this so now what we’re going to do we’re going to just go and put the table name so this is the one that we are now learning about and what I’m going to do I’m just going to go and put here the primary key I will not go and list all the informations so the primary key was the ID and I will go and remove all those stuff I don’t need it now as you can see the table name is not really friendly so I can go and bring a text and put it here on top and say this is the customer information just to make it friendly and do not forget about it and as well going to increase the size to maybe 20 something like this okay with that we have our first table and we’re going to go and keep exploring so let’s move to the second one we’re going to take the product information right click on it and select the top thousand rows I will just put it below the previous query query it now by looking to this table we can see we have product informations so we have here a primary key for the product and then we have like key or let’s say product number and after that we have the full name of the product the product costs and then we have the product line and then we have like start and end well this is interesting to understand why we have start and ends let’s have a look for example for those three rows all of those three having the same key but they have different IDs so it is the same product but with different costs so for 2011 we have the cost of 12 then 2012 we have 14 and for the last year 2013 we have 13 so it’s like we have like a history for the changes so this table not only holding the current affirmations of the product but also history informations of the products and that’s why we have those two dates start and end now let’s go back and draw this information over here so I’m just going to go and duplicate it so the name of this table going to be the BRD info and let’s go and give it like a short description current and history products information something like this just to not forget that we have history in this table and here we have as well the PRD ID and there is like nothing that we can use in order to join those two tables we don’t have like a customer ID here or in the other table we don’t have any product ID okay so that’s it for this table let’s jump to the third table and the last one in the CRM so let’s go and select I just made other queries as well short so let’s go and execute so what do you have over here we have a lot of informations about the order the sales and a lot of measures order number we have the product key so this is something that we can use in order to join it with the product table we have the customer ID we don’t have the customer key so here we have like ID and here we have key so there’s like two different ways on how to join tables and then we have here like dates the order dates the shipping date the due date and then we have the sales amount the quantity and the price so this is like an event table it is transactional table about the orders and sales and it is great table in order to connect the customers with the products and as well with the orders so let’s document this new information that we have so the table name is the sales details so we can go and describe it like this transactional records about sales and orders and now we have to go and describe how we can connect this table to the other two so we are not using the product ID we are using the product key and now we need a new column over here so you can hold control and enter or you can go over here and add a new row and the other row is going to be the customer ID so now for the the customer ID it is easy we can gr and grab an arrow in order to connect those two tables but for the product key we are not using the ID so that’s why I’m just going to go and remove this one and say product key let’s have here again a check so this is a product key it’s not a product ID and if we go and check the old table the products info you can see we are using this key and not the primary key so what we’re going to do now we will just go and Link it like this and maybe switch those two tables so I will put the customer below just perfect it looks nice okay so let’s keep moving let’s go now to the other source system we have the Erp and the first one is ARB cost and we have this cryptical name let’s go and select the data so now here it’s small table and we have only three informations so we have here something called C and then we have something I think this is the birthday and the gender information so we have here male female and so on so it looks again like the customer informations but here we have like extra data about the birthday and now if you go and compare it to the customer table that we have from the other source system let’s go and query it you can see the new table from the Erb don’t have IDs it has actually the customer number or the key so we can go and join those two tables using the customer key let’s go and document this information so I will just go and copy paste and put it here on the right side I will just go and change the color now since we are now talking about different Source system and here the table name going to be this one and the key called C ID now in order to join this table with the customer info we cannot join it with the customer ID we need the customer key that’s why here we have to go and add a new row so contrl enter and we’re going to say customer key and then we have to go and make a nice Arrow between those two keys so we’re going to go and give it a description customer information and here we have the birth dates okay so now let’s keep going we’re going to go to the next one we have the Erp location let’s go and query this table so what do you have over here we have the CID again and as you can see we have country informations and this is of course again the customer number and we have only this information the country so let’s go and docment this information this is the customer location table name going to be like this and we still have the same ID so we have here still the customer ID and we can go and join it using the customer key and we have to give it the description locate of customers and we can say here the country okay so now let’s go to the last table and explore it we have the Erp PX catalog so let’s go and query those informations so what do we have here we have like an ID a category a subcategory and the maintenance here we have like either yes and no so by looking to this table we have all the categories and the subcategories of the products and here we have like special identifier for those informations now the question is how to join it so I would like to join it actually with the product informations so let’s go and check those two tables together okay so in the products we don’t have any ID for the categories but we have these informations actually in the product key so the first five characters of the product key is actually the category ID so we can use this information over here in order to join it with the categories so we can go and describe this information like this and then we have to go and give it a name and then here we have the ID and the ID could be joined using the product key so that means for the product information we don’t need at all the product ID the primary key all what we need is the product key or the product number and what I would like to do is like to group those informations in a box so let’s go grab like any boxes here on the left side and make it bigger and then make the edges a little bit smaller let’s remove move the fill and the line I will make a dotted line and then let’s grab another box over here and say this is the CRM and we can go and increase the size maybe something like 40 smaller 35 bold and change the color to Blue and just place it here on top of this box so with that we can understand all those tables belongs to the source system CRM and we can do the same stuff for the right side as well now of course we have to go and add the description here so it’s going to be the product categories all right so with that we have now clear understanding how the tables are connected to each others we understand now the content of each table and of course it can to help us to clean up the data in the silver layer in order to prepare it so as you can see it is very important to take time understanding the structure of the tables the relationship between them before start writing any code all right so with that we have now clear understanding about the sources and with that we have as well created a data integration in the dro so with that we have more understanding about how to connect the sources and now in the next two task we will go back to SQL where we’re going to start checking the quality and as well doing a lot of data Transformations so let’s go okay so now let’s have a quick look to the specifications of the server layer so the main objective to have clean and standardized data we have to prepare the data before going to the gold layer and we will be building tables inside the silver layer and the way of loading the data from the bronze to the silver is a full load so that means we’re going to trate and then insert and here we’re going to have a lot of data Transformations so we’re going to clean the data we’re going to bring normalizations standardizations we’re going to derive new columns we will be doing as well data enrichment so a lot of things to be done in the data transformation but we will not be building any new data model so those are the specifications and we have to commit ourself to this scope okay so now building the ddl script for the layer going to be way easier than the bronze because the definition and the structure of each table in the silver going to be identical to the bronze layer we are not doing anything new so all what you have to do is to take the ddl script from the bronze layer and just go and search and replace for the schema I’m just using the notepad++ for the scripts so I’m going to go over here and say replace the bronze dots with silver dots and I’m going to go and replace all so with that now all the ddl is targeting the schema silver layer which is exactly what we need all right now before we execute our new ddl script for the silver we have to talk about something called the metadata columns they are additional columns or fields that the data Engineers add to each table that don’t come directly from the source systems but the data Engineers use it in order to provide extra informations for each record like we can add a column called create date is when the record was loaded or an update date when the the record got updated or we can add the source system in order to understand the origin of the data that we have or sometimes we can add the file location in order to understand the lineage from which file the data come from those are great tool if you have data issue in your data warehouse if there is like corrupt data and so on this can help you to track exactly where this issue happens and when and as well it is great in order to understand whether I have Gap in my data especially if you are doing incremental mod it is like putting labels on everything and you will thank yourself later when you start using them in hard times as you have an issue in your data warehouse so now back to our ddl scripts and all what you have to do is to go and do the following so for example for the first table I will go and add at the end one more extra column so it start with the prefix DW as we have defined in the naming convention and then underscore let’s have the create dates and the data tabe going to be date time to and now what we can do is we can go and add a default value for it I want the database to generate these informations automatically we don’t have to specify that in any ETL scripts so which value it’s going to be the get datee so each record going to be inserted in this table will get automatically a value from the current date and time so now as you can see the naming convention it is very important all those columns comes from the source system and only this one column comes from the data engineer of the data warehouse okay so that’s it let’s go and repeat the same thing for all other tables so I will just go and add this piece of information for each ddl all right so I think that’s it all what you have to do is now to go and execute the whole ddl script for the silver layer let’s go into that all right perfect there’s no errors let’s go and refresh the tables on the object Explorer and with that as you can see we have six tables for the silver layer it is identical to the bronze layer but we have one extra column for the metadata all right so now in the server layer before we start writing any data Transformations and cleansing we have first to detect the quality issues in the pron without knowing the issues we cannot find solution right we will explore first the quality issues only then we start writing the transformation scripts so let’s [Music] go okay so now what we’re going to do we’re going to go through all the tables over the bronze layer clean up the data and then insert it to the server layer so let’s start with the first table the first bronze table from The Source CRM so we’re going to go to the bronze CRM customer info so let’s go and query the data over here now of course before writing any data and Transformations we have to go and detect and identify the quality issues of this table so usually I start with the first check where we go and check the primary key so we have to go and check whether there are nulls inside the primary key and whether there are duplicates so now in order to detect the duplicates in the primary key what we have to do is to go and aggregate the primary key if we find any value in the primary key that exist more than once that means it is not unique and we have duplicates in the table so let’s go and write query for that so what we’re going to do we’re going to go with the customer ID and then we’re going to go and count and then we have to group up the data so Group by based on the primary key and of course we don’t need all the results we need only where we have an issue so we’re going to say having counts higher than one so we are interested in the values where the count is higher than one so let’s go and execute it now as you can see we have issue in this table we have duplicates because all those IDs exist more than one in the table which is completely wrong we should have the primary key unique and you can see as well we have three records where the primary key is empty which is as well a bad thing now there is an issue here if we have only one null it will not be here at the result so what I’m going to do I’m going to go over here and say or the primary key is null just in case if we have only one null I’m still interested to see the results so if I go and run it again we’ll get the same results so this is equality check that you can do on the table and as you can see it is not meeting the expectation so that means we have to do something about it so let’s go and create a new query so here what we’re going to do we can to start writing the query that is doing the data transformation and the data cleansing so let’s start again by selecting the [Music] data and excuse it again so now what I usually do I go and focus on the issue so for example let’s go and take one of those values and I focus on it before start writing the transformation so we’re going to say where customer ID equal to this value all right so now as you can see we have here the issue where the ID exist three times but actually we are interested only on one of them so the question is how to pick one of those usually we search for a timestamp or date value to help us so if you check the creation date over here we can understand that this record this one over here is the newest one and the previous two are older than it so that means if I have to go and pick one of those values I would like to get the latest one because it holds the most fresh information so what we have to do is we have to go and rank all those values based on the create dates and only pick the highest one so that means we need a ranking function and for that in scale we have the amazing window functions so let’s go and do that we will use the function row number over and then Partition by and here we have to divide the table by the customer ID so we’re going to divide it by the customer ID and in order now to rank those rows we have to sort the data by something so order by and as we discussed we want to sort the data by the creation date so create date and we’re going to sort it descending so the highest first then the lowest so let’s go and do that and now we’re going to go and give it the name flag last so now let’s go and executed now the data is sorted by the creation date and you can see over here that this record is the number one then the one that is older is two and the oldest one is three of course we are interested in the rank number one now let’s go and moove the filter and check everything so now if you have a look to the table you can see that on the flag we have everywhere like one and that’s because the those primary Keys exist only one but sometimes we will not have one we will have two three and so on if there’s like duplicates we can go of course and do a double check so let’s go over here and say select star from this query we’re going to say where flag last is in equal to one so let’s go and query it and now we can see all the data that we don’t need because they are causing duplicates in the primary key and they have like an old status so what we’re going to do we’re going to say equal to one and with that we guarantee that our primary key is unique and each value exist only once so if I go and query it like this you will see we will not find any duplicate inside our table and we can go and check that of course so let’s go and check this primary key and we’re going to say and customer ID equal to this value and you can see it exists now only once and we are getting the freshest data from this key so with that we have defined like transformation in order to remove any D Kates okay so now moving on to the next one as you can see in our table we have a lot of values where they are like string values now for these string values we have to check the unwanted spaces so now let’s go and write a query that’s going to detect those unwanted spaces so we’re going to say select this column the first name from our table bronze customer information so let’s go and query it now by just looking to the data it’s going to be really hard to find those unwanted spaces especially if they are at the end of the world but there is a very easy way in order to detect those issues so what we’re going to do we’re going to do a filter so now we’re going to say the first name is not equal to the first name after trimming the values so if you use the function trim what it going to do it’s going to go and remove all the leading and trailing spaces so the first name so if this value is not equal to the first name after trimming it then we have an issue so it is very simple let’s go and execute it so now in the result we will get the list of all first names where we have spaces either at the start or at the end so again the expectation here is no results and the same thing we can go and check something else like for example the last name so let’s go and do that over here and here let’s go and execute it we see in the result we have as well customers where they have like space in their last name which is not really good and we can go and keep checking all the string values that you have inside the table so for example the gender so let’s go and check that and execute now as you can see we don’t have any results that means the quality of the gender is better and we don’t have any unwanted spaces so now we have to go and write transformation in order to clean up those two columns now what I’m going to do I’m just going to go and list all the column in the query instead of the star all right so now I have a list of all the columns that I need and now what we have to do is to go to those two columns and start removing The Unwanted spaces so we’ll just use the trim it’s very simple and give it a name of course the same name and we will trim as well the last name so let’s go and query this and with that we have cleaned up those two colums from any unwanted spaces okay so now moving on we have those two informations we have the marital status and as well the gender if you check the values inside those two columns as you can see we have here low cardinality so we have limited numbers of possible values that is used inside those two columns so what we usually do is to go and check the data consistency inside those two columns so it’s very simple what we’re going to do we’re going to do the following we’re going to say distinct and we’re going to check the values let’s go and do that and now as you can see we have only three possible values either null F or M which is okay we can stay like this of course but we can make a rule in our project where we can say we will not be working with data abbreviations we will go and use only friendly full names so instead of having an F we’re going to have like a full word female and instead of M we’re going to have like male and we make it as a rule for the whole project so each time we find the gender informations we try to give the full name of it so let’s go and map those two values to a friendly one so we’re going to go to the gender of over here and say case when and we’re going to say the gender is equal to F then make it a female and when it is equal to M then M it to male and now we have to make decision about the nulls as you can see over here we have nulls so do we want to leave it as a null or we want to use always the value unknown so with that we are replacing the missing values with a standard default value or you can leave it as a null but let’s say in our project that we are replacing all the missing value with a default value so let’s go and do that we going to say else I’m going to go with the na not available or you can go with the unknown of course so that’s for the gender information like this and we can go and remove the old one and now there is one thing that I usually do in this case where sometimes what happens currently we are getting the capital F and the capital M but maybe in the the time something changed and you will get like lower M and lower F so just to make sure in those cases we still are able to map those values to the correct value what we’re going to do we’re going to just use the function upper just to make sure that if we get any lowercase values we are able to catch it so the same thing over here as well and now one more thing that you can add as well of course if you are not trusting the data because we saw some unwanted spaces in the first name and the last name you might not trust that in the future you will get here as well unwanted spaces you can go and make sure to trim everything just to make sure that you are catching all those cases so that’s it for now let’s go and excute now as you can see we don’t have an m and an F we have a full word male and female and if we don’t have a value we don’t have a null we are getting here not available now we can go and do the same stuff for the Merial status you can see as well we have only three possibil ities the S null and an M we can go and do the same stuff so I will just go and copy everything from here and I will go and use the marital status I just remove this one from here and now what are the possible values we have the S so it’s going to be single we have an M for married and we have as well a null and with that we are getting the not available so with that we are making as well data standardizations for this column so let’s go and execute it now as you can see we don’t have those short values we have a full friendly value for the status and as well for the gender and at the same time we are handling the nulls inside those two columns so with that we are done with those two columns and now we can go to the last one that create date for this type of informations we make sure that this column is a real date and not as a string or barar and as we defined it in the data type it is a date which is completely correct so nothing to do with this column and now the next step is that we’re going to go and write the insert statement so how we’re going to do it we’re going to go to the start over here and say insert into silver do SRM customer info now we have to go and specify all the columns that should be inserted so we’re going to go and type it so something like this and then we have the query over here let’s go and execute it so let’s do that so with that we have inserted clean data inside the silver table so now what we’re going to do we’re going to go and take all the queries that we have used used in order to check the quality of the bronze and let’s go and take it to another query and instead of having bronze we’re going to say silver so this is about the primary key let’s go and execute it perfect we don’t have any results so we don’t have any duplicates the same thing for the next one so the silver and it was for the first name so let’s go and check the first name and run it as you can see there is no results it is perfect we don’t have any issues you can of course go and check the last name and run it again we don’t have any result over here and now we can go and check those low cardinality columns like for example the gender let’s go and execute it so as you can see we have the not available or the unknown male and female so perfect and you can go and have a final look to the table to the silver customer info let’s go and check that so now we can have a look to all those columns as you can see everything looks perfect and you can see it is working this metadata information that we have added to the table definition now it says when we have inserted all those three cords to the table which is really amazing information to have a track and audit okay so now by looking to the script we have done different types of data Transformations the first one is with the first name and the last name here we have done trimming removing unwanted spaces this is one of the types of data cleansing so we remove unnecessary spaces or unwanted characters to to ensure data consistency now moving on to the next transformation we have this casewin so what we have done here is data normalization or we call it sometimes data standardization so this transformation is type of data cleansing where we can map coded values to meaningful userfriendly description and we have done the same transformation as well to the agender another type of transformation that we have done as well in the same case when is that we have handled the missing values so instead of nulls we can have not available so handling missing data is as well type of data cleansing where we are filling the blanks by adding for example a default value so instead of having an empty string or a null we’re going to have a default value like the not available or unknown another type of data and Transformations that we have done in this script is we have removed the duplicates so removing duplicates is as well type of data cleansing where we ensure only one record for each primary key by identifying and retaining only the most relevant role to ensure there is no duplicates inside our data and as we are removing the duplicates of course we are doing data filtering so those are the different types of data Transformations that we have done in this script all right moving on to the second table in the bronze layer from the CRM we have the product info and of course as usual before we start writing any Transformations we have to search for data quality issues and we start with the first one we have to check the primary key so we have to check whether we have duplicates or nulls inside this key so what you have to do we have to group up the data by the primary key or check whether we have nulls so let’s go and execute it so as you can see everything is safe we don’t have dcat or nulls in the primary key now moving on to the next one we have the product key here we have in this column a lot of informations so now what you have to do is to go and split this string into two informations so we are deriving new two columns so now let’s start with the first one is the category ID the first five characters they are actually the category ID and we can go and use the substring function in order to extract part of a string it needs three arguments the first one going to be the column that we want to extract from and then we have to define the position where to extract and since the first part is on the left side we going to start from the first position and then we have to specify the length so how many characters we want to extract we need five characters so 1 2 3 4 five so that’s set for the category ID category ID let’s go and execute it now as you can see we have a new column called the category ID and it contains the first part of the string and in our database from the other source system we have as well the category ID now we can go and double check just in order to make sure that we can join data together so we’re going to go and check the ID from the pron table Erp and this can be from the category so in this table we have the category ID and you can see over here those are the IDS of the category and in the C layer we have to go and join those two tables but here we still have an issue we have here an underscore between the category and the subcategory but in our table we have actually a minus so we have to replace that with an underscore in order to have matching informations between those two tables otherwise we will not be able to join the tables so we’re going to use the function replace and what we are replacing we are replacing the m with an underscore something like this and if you go now and execute it we will get an underscore exactly like the other table and of course we can go and check whether everything is matching by having very simple query where we say this new information not in and then we have this nice subquery so we are trying to find any category ID that is not available in the second table so let’s go and execute it now as you can see we have only one category that is not matching we are not finding it in this table which is maybe correct so if you go over here you will not find this category I just make it a little bit bigger so we are not finding this one category from this table which is fine so our check is okay okay so with that we have the first part now we have to go and extract the second part and we’re going to do the same thing so we’re going to use the substring and the three argument the product key but this time we will not start cutting from the first position we have to be in the middle so 1 2 2 3 4 5 6 7 so we start from the position number seven and now we have to define the length how many characters to be extracted but if you look over here you can see that we have different length of the product keys it is not fixed like the category ID so we cannot go and use specified number we have to make something Dynamic and there is Trick In order to do that we can to go and use the length of the whole column with that we make sure that we are always getting enough characters to be extra Ed and we will not be losing any informations so we will make it Dynamic like this we will not have it as a fixed length and with that we have the product key so let’s go and execute it as you can see we are now extracting the second part from this string now why we need the product key we need it in order to join it with another table called sales details so let’s go and check the sales details so let me just check the column name it is SLS product key so from bronze CRM sales let’s go and check the data over here and it looks wonderful so actually we can go and join those informations together but of course we can go and check that so we’re going to say where and we’re going to take our new column and we’re going to say not in the subquery just to make sure that we are not missing anything so let’s go and execute so it looks like we have a lot of products that don’t have any orders well I don’t have a nice feelings about it let’s go and try something like this one here and we say where LS BRD key like this value over here so I’ll just cut the last three just to search inside this table so we really don’t have such a keys let me just cut the second one so let’s go and search for it we don’t have it as well so anything that starts with the FK we don’t have any order with the product where it starts with the F key so let’s go and remove it but still we are able to join the tables right so if I go and say in instead of not in so with that you are able to match all those products so that means everything is fine actually it’s just products that don’t have any orders so with that I’m happy with this transformation now moving on to the next one we have here the name of the product we can go and check whether there is unwanted spaces so let’s go to our quality checks make sure to use the same table and we’re going to use the product name and check whether we find any unmatching after trimming so let’s go and do it well it looks really fine so we don’t have to trim anything this column is safe now moving on to the next one we have the costs so here we have numbers and we have to check the quality of the numbers so what we can do we can check whether we have nulls or negative numbers so negative costs or negative prices which is not really realistic depend on the business of course so let’s say in our business we don’t have any negative costs so it’s going to be like this let’s go and check whether is something less than zero or whether we have costs that is null so let’s go and check those informations well as you can see we don’t have any negative values but we have nulls so we can go and handle that by replacing the null with a zero of course if the business allow that so in SQL server in order to replace the null with a zero we have a very nice function called is null so we are saying if it is null then replace this value with a zero it is very simple like this and we give it a name of course so let’s go and execute it and as you can see we don’t have any more nulls we have zero which is better for the calculations if you are later doing any aggregate functions like the average now moving on to the next one we have the product line This is again abbreviation of something and the cardinality is low so let’s go and check all possible values inside this column so we’re just going to use the distinct going to be BRD line so let’s go and execute it and as you can see the possible values are null Mr rst and again those are abbreviations but in our data warehouse we have decided to give full nice names so we have to go and replace those codes those abbreviations with a friendly value and of course in order to get those informations I usually go and ask the expert from the The Source system or an expert from the process so let’s start building our case win and then let’s use the upper and as well the trim just to make sure that we are having all the cases so the BRD line is equal to so let’s start with the first value the M then we will get the friendly value it’s going to be Mountain then to the next one so I will just copy and paste here if it is an R then it is rods and another one for let me check what do we have here we have Mr and then s the S stands for other sales and we have the T so let’s go and get the T so the T stands for touring we have at the end an else for unknown not available so we don’t need any nulls so that’s it and we’re going to name it as before so product line so let’s remove the old one and let’s execute it and as you can see we don’t have here anymore those shortcuts and the abbreviations we have now full friendly value but I will go and have here like capital O it looks nicer so that we have nice friendly value now by looking to this case when as you can see it is always like we are mapping one value to another value and we are repeating all time upper time upper time and so on we have here a quick form in the case when if it is just a simple mapping so the syntax is very simple we say case and then we have the column so we are evaluating this value over here and then we just say when without the equal so if it is an M then make it Mountain the same thing for the next one and so so with that we have the functions only once and we don’t have to go and keep repeating the same function over and over and this one only if you are mapping values but if you have complex conditions you can do it like this but for now I’m going to stay with the quick form of the case wi it looks nicer and shorter so let’s go and execute it we will get the same results okay so now back to our table let’s go to the last two columns we have the start and end date so it’s like defining an interval we have start and end so let’s go and check the quality of the start and end dates we’re going to go and say select star from our bronze table and now we’re going to go and search it like this we are searching for the end date that is smaller than the starts so PRT start dates so let’s let’s go and query this so you can see the start is always like after the end which makes no sense at all so we have here data issue with those two dates so now for this kind of data Transformations what I usually do is I go and grab few examples and put it in Excel and try to think about how I’m going to go and fix it so here I took like two products this one and this one over here and for that we have like three rows for each one of them and we have this situation over here so the question now how we going to go and fix it I will go and make like a copy of one solution where we’re going to say it’s very simple let’s go and switch the start date with the end date so if I go and grab the end dates and put it at the starts things going to look way nicer right so we have the start is always younger than the end but my friends the data now makes no sense because we say it starts from 2007 and ends by 2011 the price was 12 but between 2018 and 2012 we have 14 which is not really good because if you take for example the year 2010 for 2010 it was 12 and at the same time 14 so it is really bad to have an overlapping between those two dates it should start from 2007 and end with 11 and then start febe from 12 and end with something else there should be no overlapping between years so it’s not enough to say the start should be always smaller than the end but as well the end of the first history should be younger than the start of the next records this is as well a rule in order to have no overlapping this one has no start but has already an end which is not really okay because we have always to have a starts each new record in historization has to has a start so for this record over here this is as well wrong and of course it is okay to have the start without an end so in this scenario it’s fine because this indicate this is the current informations about the costs so again this solution is not working at all so now for for the solution to what we can say let’s go and ignore completely the end date and we take only the start dates so let’s go and paste it over here but now we go and rebuild the end date completely from the start date following the rules that we have defined so the rule says the end of date of the current records comes from the start date from the next records so here this end date comes from this value over here from the next record so that means we take the next start date and put it at the end date for the previous records so with that as you can see it is working the end date is higher than the start dates and as well we are making sure this date is not overlapping with the next record but as well in order to make it way nicer we can subtract it with one so we can take the previous day like this so with that we are making sure the end date is smaller than the next start now for the next record this one over here the end date going to come from the next start date so we will take this one for here and put it as an end Ag and subtract it with one so we will get the previous day so now if you compare those two you can see it’s still higher than the start and if you compare it with the NY record this one over here it is still smaller than the next one so there is no overlapping and now for the last record since we don’t have here any informations it will be a null which is totally fine so as you can see I’m really happy with this scenario over here of course you can go and validate this with an exp from The Source system let’s say I’ve done that and they approved it and now I can go and clean up the data using this New Logic so this is how I usually brainstorm about fixing an issues if I have like a complex stuff I go and use Excel and then discuss it with the expert using this example it’s way better than showing a database queries and so on it just makees things easier to explain and as well to discuss so now how I usually do it I usually go and make a focus on only the columns that I need and take only one two scenarios while I’m building the logic and once everything is ready I go and integrate it in the query so now I’m focusing only on these columns and only for these products so now let’s go and build our logic now in SQL if you are at specific record and you want to access another information from another records and for that we have two amazing window functions we have the lead and lag in this scenario we want to access the next records that’s why we have to go with the function lead so let’s go and build it lead and then what do we need we need the lead or the start date so we want the start date of the next records and then we say over and we have to partition the data so the window going to be focusing on only one product which is the product key and not the product ID so we are dividing the data by product key and of course we have to go and sort the data so order by and we are sorting the data by the start dates and ascending so from the lowest to the highest and let’s go and give it another name so as let’s say test for example just to test the data so let’s go and execute and I think I missed something here it say Partition by so let’s go and execute again and now let’s go and check the results for the first partition over here so the start is 2011 and the end is 2012 and this information came from the next record so this data is moved to the previous record over here and the same thing for this record so the end date comes from the next record so our logic is working and the last record over here is null because we are at the end of the window and there is no next data that’s why we will get null and this is perfect of course so it looks really awesome but what is missing is we have to go and get the previous day and we can do that very simply using minus one we are just subtracting one day so we have no overlapping between those two dates and the same thing for those two dates so as you can see we have just buil a perfect end date which is way better than the original data that we got from the source system now let’s take this one over here and put it inside our query so we don’t need the end H we need our new end dat we just remove that test and execute now it looks perfect all right now we are not done yet with those two dates actually we are saying all time dates because we don’t have here any informations about the time always zero so it makes no sense to have these informations inside our data so what we can do we can do a very simple cast and we make this column as a date instead of date time so this is for the first one and as well for the next one as dates so let’s try that out and as you can see it is nicer we don’t have the time informations of course we can tell the source systems about all those issues but since they don’t provide the time it makes no sense to have date and time okay so it was a long run but we have now cleaned product informations and this is way nicer than the original product information that we got from the source CRM so if you grab the ddl of the server table you can see that we don’t have a category ID so we have product ID and product key and as well those two columns we just change the data type so it’s date time here but we have changed that to a date so that means we have to go and do few modifications to the ddl so what we going to do we’re going to go over here and say category ID and I will be using the same data type and for the start and end this time it’s going to be date and not date and time so that’s it for now let’s go ah and execute it in order to repair the ddl and this is what happen in the silver layer sometimes we have to adjust the metadata if the quality of the data types and so on is not good or we are building new derived informations in order later to integrate the data so it will be like very close to the bronze layer but with few modifications so make sure to update your ddl scripts and now the next step is that we’re going to go and insert the data into the table and now the next step we’re going to go and insert the result of this query that is cleaning up the bronze table into the silver table so as we’ done it before insert into silver the product info and then we have to go and list all the columns I’ve just prepared those columns so with that we can go and now run our query in order to insert the data so now as you can see SQL did insert the data and the very important step is now to check the quality of the silver table so we go back to our data quality checks and we go switch to the silver so let’s check the primary key there is no issues and we can go and check for example here the the trims there is as well no issue and now let’s go and check the costs it should not be negative or null which is perfect let’s go and check the data standardizations as you can see they are friendly and we don’t have any nulls and now very interesting the order of the dates so let’s go and check that as you can see we don’t have any issues and finally what I do I go and have a final look to the silver table and as we can see everything is inserted correctly in the correct color colums so all those columns comes from the source system and the last one is automatically generated from the ddl indicate when we loaded this table now let’s sit back and have a look to our script what are the different types of data Transformations that we have done here is for example over here the category ID and the product key we have derived new columns so it is when we create a new column based on calculations or transformations of an existing one so sometimes we need columns only for analytics and we cannot each time go to the source system and ask them to create it so instead of that we derive our own columns that we need for the analytics another transformation we have is that is null over here so we are handling here missing information instead of null we’re going to have a zero and one more transformation we have over here for the product line we have done here data normalization instead of having a code value we have a friendly value and as well we have handled the missing data for example over here instead of having a null we’re going to have not available all right moving on to another data transformation we have done data type casting so we are converting the data type from one to another and this considered as well to be a data transformation and now moving on to the last one we are doing as well data type casting but what’s more important we are doing data enrichment this type of transformation it’s all about adding a value to your data so we are adding a new relevant data to our data sets so those are the different types of data Transformations that we have done for this table okay so let’s keep going we have the sales details and this is the last table in the CRM so what do you have over here we have the order number and this is a string of course we can go and check whether we have an issue with the unwanted spaces so we can search whether we’re going to find something so we can say trim and something like this and let’s go and execute it so we can see that we don’t have any unwanted spaces that means we don’t have to transform this column so we can leave it as it is now the next two columns they are like keys and ideas is in order to connect it with the other tables as we learned before we are using the product key in order to connect it with the product informations and we are connecting the customer ID with the customer ID from the customer info so that means we have to go and check whether everything is working perfectly so we can go and check the Integrity of those columns where we say the product key Nots in and then we make a subquery and this time we can work with the silver layer right so we can say the product key from Silver do product info so let’s go and query this and as you can see we are not getting any issue that means all the product keys from the sales details can be used and connected with the product info the same thing we can go and check the Integrity of the customer ID and we can use not the products we can go to the customer info and the name was CST ID so let’s go and query that and the same thing we don’t have here any issues so that means we can go and connect the sales with the customers using the customer ID and we don’t have to do any Transformations for it so things looks really nice for those three columns now we come to the challenging one we have here the dates now those dates are not actual dates they are integer so those are numbers and we don’t want to have it like this we would like to clean that up we have to change the data type from integer to a DAT now if you want to convert an integer to a date we have to be careful with the values that we have inside each of those columns so now let’s check the quality for example of the order dates let’s say where order dates is less than zero for example something negative well we don’t have any negative values which is good let’s go and check whether we have any zeros well this is bad so we have here a lot of zeros now what we can do we can replace those informations with a null we can use of course the null IF function like this we can say null if and if it is zero then make it null so let’s execute it and as you can see now all those informations are null now let’s go and check again the data so now this integer has the years information at the start then the months and then the day so here we have to have like 1 2 3 4 5 so the length of each number should be H and if the length is less than eight or higher than eight then we have an issue let’s go and check that so we’re going to say or length sales order is not equal to eight that means less or higher let’s go and execute it now let’s go and check the results over here and those two informations they don’t look like dates so we cannot go and make from these informations a real dates they are just bad data and of course you can go and check the boundaries of a DAT like for example it should not be higher than for example let’s go and get this value 2050 and then I need for the month and the date so let’s go and execute it and if we just remove those informations just to make sure so we don’t have any date that is outside of the boundaries that you have in your business or you go for example and say the boundary should be not less than depend when your business started maybe something like this we are getting of course those values because they are less than n but if you have values around these dates you will get it as well in the query so we can go and add the rests so all those checks like validate the column that has date informations and it has the data type integer so again what are the issues over here we have zeros and sometimes we have like strange numbers that cannot be converted to a dates so let’s go and fix that in our query so we can say case when the sales order the order date is equal to zero or of the order date is not equal to 8 then null right we don’t want to deal with those values they are just wrong and they are not real dates otherwise we say else it’s going to be the order dates now what we’re going to do we’re going to go and convert this to a date we don’t want this as an integer so how we can do that we can go and cast it first to varar because we cannot cast from integer to date in SQL Server first you have to convert it to a varar and then from varar you go to a dates well this is how we do it in scq server so we cast it first to a varar and then we cast it to a date like this that’s it so we have end and we are using the same column name so this is how we transform an integer to a date so let’s go and query this and as you can see the order date now is a real date it is not a number so we can go and get rid of the old column now we have to go and do the same stuff for the shipping dates so we can go over here and replace everything with the shipping date and let’s go query well as you can see the shipping date is perfect we don’t have any issue with this column but still I don’t like that we found a lot of issues with the order dates so what we’re going to do just in case this happens for the shipping date in the future I will go and apply the same rules to the shipping dates oh let’s take the shipping date like this and if you don’t want to apply it now you have always to build like quality checks that runs every day in order to detect those issues and once you detect it then you can go and do the Transformations but for now I’m going to apply it right away so that is for the shipping date now we go to the due date and we will do the same test let’s go and execute it and as well it is perfect so still I’m going to apply the same rules so let’s get the D everywhere here in the query just make sure you don’t miss anything here so let’s go and execute now perfect as you can see we have the order date shipping date and due date and all of them are date and don’t have any wrong data inside those columns now still there is one more check that we can do and is that the order date should be always smaller than the shipping date or the due date because it’s makes no sense right if you are delivering an item without an order so first the order should happen then we are shipping the items so there is like an order of those dates and we can go and check that so we are checking now for invalid date orders where we going to say the order date is higher than the shipping date or we are searching as well for an order where the order date date is higher than the due dates so we going to have it like this due dates so let’s go and check well that’s really good we don’t have such a mistake on the data and the quality looks good so the order date is always smaller than the shipping date or the due dates so we don’t have to do any Transformations or cleanup okay friends now moving on to the last three columns we have the sales quantity and the price all those informations are connected to each others so we have a business rule or calculation it says the sales must be equal to quantity multiplied by the price and all sales quantity and price informations must be positive numbers so it’s not allowed to be negative zero or null so those are the business rules and we have to check the data consistency in our table does all those three informations following our rules so we’re going to start first with our rule right so we’re going to say if the sales is not equal to quantity multiplied by the price so we are searching where the result is not matching our expectation and as well we can go and check other stuff like the nulls so for example we can say or sales is null or quantity is null and the last one for the price and as well we can go and check whether they are negative numbers or zero so we can go over here and say less or equal to zero and apply it for the other columns as well so with that we are checking the calculation and as well we are checking whether we have null0 Z or negative numbers let’s go and check our informations I’m going to have here A distinct so let’s go and query it and of course we have here bad data but we can go and sort the data by the sales quantity and the price so let’s do it now by looking to the data we can see in the sales we have nulls we have negative numbers and zeros so we have all bad combinations and as well we have here bad calculations so as you can see the price here is 50 the quantity is one but the sales is two which is not correct and here we have as well wrong calculations here we have to have a 10 and here nine or maybe the price is wrong and by looking to the quantity now you can see we don’t have any nulls we don’t have any zeros or negative numbers so the quantity looks better than the sales and if you look to the prices we have nulls we have negatives and yeah we don’t have zeros so that means the quality of the sales and the price is wrong the calculation is not working and we have these scenarios now of course how I do it here I don’t go and try now to transform everything on my own I usually go and talk to an expert maybe someone from the business or from the source system and I show those scenarios and discuss and usually there is like two answers either they going to tell me you know what I will fix it in my source so I have to live with it there is incoming bad data and the bad data can be presented in the warehouse until the source system clean up those issues and the other answer you might get you know what we don’t have the budget and those data are really old and we are not going to do anything so here you have to decide either you leave it as it is or you say you know what let’s go and improve the quality of the data but here you have to ask for the experts to support you solving these issues because it really depend on their rules different rules makes different Transformations so now let’s say that we have the following rules if the sales informations are null or negative or zero then use the calculation the formula by multiplying the quality with the price and now if the prices are wrong for example we have here null or zero then go and calculate it from the sales and a quantity and if you have a price that is a minus like minus 21 a negative number then you have to go and convert it to a 21 so from a negative to a positive without any calculations so those are the rules and now we’re going to go and build the Transformations based on those rules so let’s do it step by step I will go over here and we’re going to start building the new sales so what is the rule Sals case when of course as usual if the sales is null or let’s say the sales is negative number or equal to zero or another scenario we have a sales information but it is not following the calculation so we have wrong information in the sales so we’re going to say the sales is not equal to the quantity multiplied by the price but of course we will not leave the price like this by using the function APS the absolute it’s going to go and convert everything from negative to a positive then what we have to do is to go and use the calculation so so it’s going to be the quantity multiplied by the price so that means we are not using the value that come from the source system we are recalculating it now let’s say the sales is correct and not one of those scenarios so we can say else we will go with the sales as it is that comes from the source because it is correct it’s really nice let’s go and say an end and give it the same name I will go and rename the old one here as an old value and the same for the price the quantity will not T it because it is correct so like this and now let’s go and transform the prices so again as usual we go with case wi so what are the scenarios the price is null or the price is less or equal to zero then what we’re going to do we’re going to do the calculation so it going to be the sales divided by the quantity the SLS quantity but here we have to make sure that we are not dividing by zero currently we don’t have any zeros in the quantity but you don’t know future you might get a zero and the whole code going to break so what you have to do is to go and say if you get any zero replace it with a null so null if if it is zero then make it null so that’s it now if the price is not null and the price is not negative or equal to zero then everything is fine and that’s why we’re going to have now the else it’s going to be the price as it is from The Source system so that’s it we’re going to say end as price so I’m totally happy with that let’s go and execute it and check of course so those are the old informations and those are the new transformed cleaned up informations so here previously we have a null but now we have two so two multiply with one we are getting two so the sales is here correct now moving on to the next one we have in the sales 40 but the price is two so two multiplied with one we should get two so the new sales is correct it is two and not 40 now to the next one over here the old sales is zero but if you go and multiply the four with the quantity you will get four so the sales here is not correct that’s why in the new sales we have it correct as a four and let’s go and get a minus so in this case we have a minus which is not correct so we are getting the price multiplied with one we should get here a nine and this sales here is correct now let’s go and get a scenario where the price is a null like this here so we don’t have here price but we calculated from the sales and the quantity so we divided the 10 by two and we have five so the new price is better and the same thing for the minuses so we have here minus 21 and in the output we have 21 which is correct so for now I don’t see any scenario where the data is wrong so everything looks better than before and with that we have applied the business rules from the experts and we have cleaned up the data in the data warehouse and this is way better than before because we are presenting now better data for analyzes and Reporting but it is challenging and you have exactly to understand the business so now what we’re going to do we’re going to go and copy those informations and integrate it in our query so instead of sales we’re going to get our new calculation and instead of the price we will get our correct calculation and here I’m missing the end let’s go and run the whole thing again so with that we have as well now cleaned sales quantity and price and it is following our business rules so with that we are done cleaning up the sales details The Next Step we’re going to go and inserted to the sales details but we have to go and check again the ddl so now all what you have to do is to compare those results with the ddl so the first one is the order number it’s fine the product key the customer ID but here we have an issue all those informations now are date and not an integer so we have to go and change the data type and with that we have better data type than before then the sales quantity price it is correct let’s go and drop the table and create it from scratch again and don’t forget to update your ddl script so that’s it for this and we’re going to go now and insert the results into our silver table say details and we have to go and list now all the columns I have already prepared the list of all the columns so make sure that you have the correct order of the columns so let’s go now and insert the data and with that and with that we can see that the SQL did insert data to our sales details but now very important is to check the health of the silver table so what we going to do instead here of bronze we’re going to go and switch it to Silver so let’s check over here so here always the order is smaller than the shipping and the due date which is really nice but now I’m very interested on the calculations so here we’re going to switch it from bronze to Silver and I’m going to go and get rid of all those calculations because we don’t need it this and now let’s see whether we have any issue well perfect our data is following the business rules we don’t have any nulls negative values zeros now as usual the last step the final check we will just have a final look to the table so we have the order number the product key the customer ID the three dates we have have the sales quantity and the price and of course we have our metadata column everything is perfect so now by looking to our code what are the different types of data Transformations that we are doing so in those three columns we are doing the following so at the start we are handling invalid data and this is as well type of transformation and as well at the same time we are doing data type casting so we are changing it to more correct data type and if you are looking to the sales over here then what we are doing over here is we are handling the missing data and as well the invalid data by deriving the column from already existing one and it is as well very similar for the price we are handling as well the invalid data by deriving it from specific calculation over here so those are the different types of data Transformations that you have done in these scripts all right now let’s keep moving to the next our system we have the customer AZ 12 so here we have we have like only three columns and let’s start with the ID first so here again we have the customers informations and if we go and check again our model you can see that we can connect this table with the CRM table customer info using the customer key so that means we have to go and make sure that we can go and connect those two tables so let’s go and check the other table we can go and check of course the silver layer so let’s query it and we can query both of the tables now we can see there is here like exract characters that are not included in the customer key from the CRM so let’s go and search for example for this customer over here where C ID like so we are searching for customer has similar ID now as you can see we are finding this customer but the issue is that we have those three characters in as there is no specifications or explanation why we have the nas so actually what we have to do is to go and remove those informations we don’t need it so let’s again check the data so it looks like the old data have an Nas at the start and then afterward we have new data without those three characters so we have to clean up those IDs in order to be able to connect it with other tables so we’re going to do it like this we’re going to start with the case wiin since we have like two scenarios in our data so if the C ID is like the three characters in as so if the ID start with those three characters then we’re going to go and apply transformation function otherwise eyes it’s going to stay like it is so that’s it so now we have to go and build the transformation so we’re going to use substring and then we have to define the string it’s going to be the C ID and then we have to define the position where it start cutting or extracting so we can say 1 2 3 and then four so we have to define the position number four and then we have to define the string how many characters should be extracted I will make it Dynamic so I will go with the link I will not go and count how much so we’re going to say the C ID so it looks good if it’s like an as then go and extract from the CID at the position number four the rest of the characters so let’s go and execute it and I’m missing here a comma again where we don’t have any Nas at the start and if you scroll down you can see those as well are not affected so with that we have now a nice ID to be joined with other table of course we can go and test it like this where and then we take the whole thing the whole transformation and say not in we remove of course the alas name we don’t need it and then we make very simple substring select distinct CST key the customer key from the silver table can be silver CRM cost info so that’s it let’s go and check so as you can see it is working fine so we are not able to find any unmatching data between the customer info from ERB and the CRM but of course after the transformation if you don’t use the transformation so if I just remove it like this we will find a lot of unmatching data so this means our transformation is working perfectly and we can go and remove the original value so that’s it for the First Column okay now moving on to the next field we have the birthday of their customers so the first thing to do is to check the data type it is a date so it’s fine it is not an integer or a string so we don’t have to convert anything but still there is something to check with the birth dates so we can check whether we have something out of range so for example we can go and check whether we have really old dates at the birth dates so let’s take 1900 and let’s say 24 and we can take the first date of the month so let’s go and check that well it looks like that we have customers that are older than a 100 Year well I don’t know maybe this is correct but it sounds of course strange to bit of the business of course this is Creed and he is in charge of something that is correct say hi to the kids hi kids yay and then we can go and check the other boundary where it is almost impossible to have a customer that the birthday is in the future so we can say birth date is higher than the current dates like this so let’s go and query this information well it will not work because we have to have like an or between them and now if we check the list over here we have dates that are invalid for the birth dates so all those dates they are all birthday in the future and this is totally unacceptable so this is an indicator for bad data quality of course you can go and report it to the source system in order to correct it so here it’s up to you what to do with those dates either leave it as it is as a bad data or we can go and clean that up by replacing all those dates with a null or maybe replacing only the one that is Extreme where it is 100% is incorrect so let’s go and write the transformation for that as usual we’re going to start with case whenn per dates is larger than the current date and time then null otherwise we can have an else where we have the birth dat as it is and then we have an end as birth date so let’s go and excuse it and with that we should not get any customer we the birthday in the future so that’s it for the birth dates now let’s move to the next one we have the gender now again the gender informations is localities so we have to go and check all the possible values inside this column so in order to check all the possible values we’re going to use select distinct gen from our table so let’s go and execute it and now the data doesn’t look really good so we have here a null we have an F we have here an empty string we have male female and again we have the m so this is not really good what we going to do we’re going to go and clean up all those informations in order to have only three values male female and not available so we’re going to do it like this we’re going to say case when and now we’re going to go and trim the values just to make sure there is like no empty spaces and as well I’m going to go and use the upper function just to make sure that in the future if we get any lower cases and so on we are covering all the different scenarios so case this is in F4 let’s say female then make it as female and we can go and do the same thing for the male like this so if it is an M or a male make sure it is capital letters because here we are using the upper then it is a male otherwise all other scenarios it should be not available so whether it is an empty string or nulls and so on so we have to have an end of course as gen so now let’s go and test it and check whether we have covered everything so you can see the m is now male the empty is not available the f is female the empty string or maybe spaces here is not available female going to stay as it is and the same for the male so with that we are covering all the scenarios and we are following our standards in the project so I’m going to go and cut this and put it in our original query over here so let’s go and execute the whole thing and with that we have cleaned up all those three columns now the question is did we change anything in the ddl well we didn’t change anything we didn’t introduce any new column or change any data type so that means the next step is we’re going to go and insert it in the server layer so as usual we’re going to say here insert into silver Erp the customer and then we’re going to go and list all the column names so C ID birth dat and the gender all right so let’s go and execute it and with that we can see it inserted all the data and of course the very important step as the next is to check that data quality so let’s go back to our query over here and change it from bronze to Silver so let’s go and check the silver layer well of course we are getting those very old customers but we didn’t change that we only change the birthday that is in the future and we don’t see it here in the results so that means everything is clean so for the next one let’s go and check the different genders and as you can see we have only those three values and of course we can go and take a final look to our table so you can see the C ID here the birth date the gender and then we see our metadata column and everything looks amazing so that’s it what are the different types of data Transformations that we have done first with the ID what you have done we have handled inv valid values so we have removed this part where it is not needed and the same thing goes for the birth dates we have handled as well invalid values and then for the last one for the gender we have done data normalizations by mapping the code to more friendly value and as well we have handled the missing values so those are the types that we have done in this code okay moving on to the second table we have the location informations so we have Erp location a101 so now here the task is easy because we have only two columns and if you go and check the integration model we can find our table over here so we can go and connect it together with the customer info from the other system using the CI ID with the customer key so those two informations must be matching in order to join the tables so that means we have to go and check the data so let’s go and select the data CST key from let’s go and get the silver Data customer info so let’s now if you go and check the result you can see over here that we have an issue with the CI ID there is like a minus between the characters and the numbers but the customer ID the customer number we don’t have anything that splits the characters with the numbers so if you go and join those two informations it will not be working so what we have to do we have to go and get rid of this minus because it is totally unnecessary so let’s go and fix that it’s going to be very simple so what we’re going to do we’re going to say C ID so we’re going to go and search for the m and replace it with nothing it’s very simple like this so let’s go and quer it again and with that things looks very similar to each others and as well we can go and query it so we’re going to say where our transformation is not in then we can go and use this as a subquery like this so let’s go and execute it and as you can see we are not finding any unmatching data now so that means our transformation is working and with that we can go and connect those two tables together so if I take take the transformation away you can see that we will find a lot of unmatching data so the transformation is okay we’re going to stay with it and now let’s speak about the countries now we have here multiple values and so on what I’m going to do this is low cardinality and we have to go and check all possible values inside this column so that means we are checking whether the data is consistent so we can do it like this distinct the country from our table I’m just going to go and copy it like this and as well I’m going to go s the data by the country so let’s go and check the informations now you can see we have a null we have an empty string which is really bad and then we have a full name of country and then we have as well an abbreviation of the countries well this is a mix this is not really good because sometimes we have the E and sometimes we have Germany and then we have the United Kingdom and then for the United States we have like three versions of the same information which is as well not really good so the quality of the is not really good so let’s go and work on the transformation as usual we’re going to start with the case win if trim country is equal to D then we’re going to transform it to Germany and the next one it’s going to be about the USA so if trim country is in so now let’s go and get those two values the US and the USA so us and USA then it’s going to be the United States States states so with that we have covered as well those three cases now we have to talk about the null and the empty string so we’re going to say when trim country is equal to empty string or country is null then it’s going to be not available otherwise I would like to get the country as it is so trim country just to make sure that we don’t have any leading or trailing spaces so that’s it let’s go and say this is the country so it is working and the country information is transformed and now what I’m going to do I’m going to take the whole new transformation and compare it to the old one let me just call this as old country and let’s go and query it so now we can check those value State as before so nothing did change the de is now Germany the empty string is not available the null the same thing and the United Kingdom State as like it’s like before and now we have one value for all those information so it’s only the United States so it looks perfect and with that we have cleaned as well the second column so with that we have now clean results and now the question did we change anything in the ddl well we haven’t changed anything both of them are varar so we can go now immediately and insert it into our table so insert into silver customer location and here we have to specify the columns it’s very simple the ID and the country so let’s go and execute it and as you can see we got now inserted all those values of course as a next we go and double check those informations I would just go and remove all those stuff as well here and instead of bronze let’s go with the silver so as you can see all the values of the country looks good and let’s have a final look to the table so like this so we have the IDS without the separator we have the countries and as well our metadata information so with that we have cleaned up the data for the location okay so now what are the different types of data transformation that we have done here is first we have handled invalid values so we have removed the minus with an empty string and for the country we have done data normalization so we have replaced codes with friendly values and as well at the same time we have handled missing values by replacing the empty string and null with not available and one more thing of course we have removed the unwanted spaces so those are the different types of transformation that we have done for this table okay guys now keep the energy up keep the spirit up we have to go and clean up the last table in the bronze layer and of course we cannot go and Skip anything we have to check the quality and to detect all the errors so now we have a table about the categories for the products and here we have like four columns let’s go and start with the first one the ID as you can see in our integration model we can connect this table together with the product info from the CRM using the product key and as as you remember in the silver layer we have created an extra column for that in the product info so if you go and select those data you can see we have a column called category ID and this one is exactly matching the ID that we have in this table and we have done the testing so this ID is ready to be used together with the other table so there is nothing to do over here and now for the next columns they are string and of course we can go and check whether there are any unwanted spaces so we are checking for The Unwanted spaces is so let’s go and check select star from and we’re going to go and get the same table like this here and first we are checking the category so the category is not equal to the category after trimming The Unwanted spaces so let’s go and execute it and as you can see we don’t have any results so there are no unwanted spaces let’s go and check the other column for example the subcategory the next one so let’s get the subcategory and the under query as well we don’t have anything so that means we don’t have unwanted spaces for the subcategory let’s go now and check the last column so I will just copy and paste now let’s get the maintenance and let’s go and execute and as well no results perfect we don’t have any unwanted spaces inside this table so now the next step is that we’re going to go and check the data standardizations because all those columns has low cardinality so what we’re going to do we’re going to say select this thing let’s get the cat category from our table I’ll just copy and paste it and check all values so as you can see we have the accessories bikes clothing and components everything looks perfect we don’t have to change anything in this column let’s go and check the subcategory and if you scroll down all values are friendly and nice as well nothing to change here and let’s go and check the last column the maintenance perfect we have only two values yes and no we don’t have any nulls so my friends that means this table has really nice data quality and we don’t have to clean up anything but still we have to follow our process we have to go and load it from the bronze to the silver even if we didn’t transform anything so our job is really easy here we’re going to go and say insert into silver dots Erp PX and so on and we’re going to go and Define The Columns so it’s going to be the ID the category sub category maintenance so that’s it let’s go and insert the data now as usual what we’re going to do we’re going to go and check the data so silver Erp PX let’s have a look all right so we can see the IDS are here the categories the subcategories the maintenance and we have our meta column so everything is inserted correctly all right so now I have all those queries and the insert statements for all six tables and now what is important before inserting any data we have to make sure that we are trating and emptying the table because if you run this qu twice what’s going to happen you will be inserting duplicates so first truncate the data and then do a full load insert all data so we’re going to have one step before it’s like the bronze layer we’re going to say trate table and then we will be trating the silver customer info and only after that we have to go and insert the data and of course we can go and give this nice information at the start so first we are truncating the table and then inserting so if I go and run the whole thing so let’s go and do it it will be working so if I can run it again we will not have any duplicates so we have to go and add this tip before each insert so let’s go and do that all right so I’m done with all tables so now let’s go and run everything so let’s go and execute it and we can see in the messaging everything working perfectly so with that we made all tables empty and then we inserted the data so perfect with that we have a nice script that loads the silver layer but of course like the bronze layer we’re going to put everything in one stored procedure so let’s go and do that we’ll go to the beginning over here and say create or alter procedure and we’re going to put it in the schema silver and using the naming convention load silver and we’re going to go over here and say begin and take the whole code end it is long one and give it one push with a tab and then at the end we’re going to say and perfect so we have our s procedure but we forgot here the US with that we will not have any error let’s go and execute it so the thir procedure is created if you go to the programmability and you will find two procedures load bronze and load silver so now let’s go and try it out all what you have to do is now only to execute the Silver Load silver so let’s execute the start procedure and with that we will get the same results this thir procedure now is responsible of loading the whole silver layer now of course the messaging here is not really good because we have learned in the bronze layer we can go and add many stuff like handling the error doing nce messaging catching the duration time so now your task is to pause the video take this thir procedure and go and transform it to be very similar to the bronze layer with the same messaging and all the add-ons that we have added so pause the video now I will do it as well offline and I will see you soon okay so I hope you are done and I can show you the results it’s like the bronze layer we have defined at the star few variables in order to catch the duration so we have the start time the end time patch start time and Patch end time and then we are printing a lot of stuff in order to have like nice messaging in the outut so at the start we are saying loading the server layer and then we start splitting by The Source system so loading the CRM tables and I’m going to show you only one table for now so we are setting the timer so we are saying start time get the dat date and time informations to it then we are doing the usual we are truncating the table and then we are inserting the new informations after cleaning it up and we have this nice message where we say load duration where we are finding the differences between the start time and the end time using the function dat diff and we want to show the result in the seconds so we are just printing how long it took to load this table and we’re going to go and repeat this process for all the tables and of course we are putting everything in try and Cat so the SQL going to go and try to execute the tri part and if there are any issues the SQL going to go and execute the catch and here we are just printing few information like the error message the error number and the error States and we are following exactly the same standard at the bronze layer so let’s go and execute the whole thing and with that we have updated the definition of the S procedure let’s go now and execute it so execute silver do load silver so let’s go and do that it went very fast like few than 1 second again because we are working on local machine loading the server layer loading the CRM tables and we can see this nice messaging so it start with trating the table inserting the data and we are getting the load duration for this table and you will see that everything is below 1 second and that’s because at in real project you will get of course more than 1 second so at the end we have low duration of the whole silver layer and now I have one more thing for you let’s say that you are changing the design of this thr procedure for the silver layer you are adding different types of messaging or maybe are creating logs and so on so now all those new ideas and redesigns that you are doing for the silver layer you have always to think about bringing the same changes as well in the other store procedure for the pron layer so always try to keep your codes following the same standards don’t have like one idea in One S procedure and an old idea in another one always try to maintain those scripts and to keep them all up to date following the same standards otherwise it can to be really hard for other developers to understand the cause I know that needs a lot of work and commitments but this is your job to make everything following the best practices and following the same naming convention and standards that you put for your projects so guys now we have very nice two ETL scripts one that loads the pron layer and another one for the server layer so now our data bear house is very simple all what you have to do is to run first the bronze layer and with that we are taking all the data from the CSV files from the source and we put it inside our data warehouse in the pron layer and with that we are refreshing the whole bronze layer once it’s done the next step is to run the start procedure of the servey layer so once you executed you are taking now all the data from the bronze layer transforming it cleaning it up and then loading it to the server layer and as you can see the concept is very simple we are just moving the data from one layer another layer with different tasks all right guys so as you can see in the silver layer we have done a lot of data Transformations and we have covered all the types that we have in the data cleansing so we remove duplicates data filtering handling missing data invalid data unwanted spaces casting the data types and so on and as well we have derived new columns we have done data enrichment and we have normalized a lot of data so now of course what we have not done yet business rules and logic data aggregations and data integration this is for the next layer all right my friends so finally we are done cleaning up the data and checking the quality of our data so we can go and close those two steps and now to the next step we have to go and extend the data flow diagram so let’s go okay so now let’s go and extend our data flow for the silver layer so what I’m going to do I’m just going to go and copy the whole thing and put it side by side to the bronze layer and let’s call it silver layer and the table names going to stay as before because we have like one to one like the bronze layer but what we’re going to do we’re going to go and change the coloring so I’m going to go and Mark everything and make it gray like silver and of course what is very important is to make the lineage so I’m going to go now from the bronze and take an arrow and put it to the server table and now with that we have like a lineage between three layers and you are checking this table the customer info you can understand aha this comes from the bronze layer from the customer info and as well this comes from the source system CRM so now you can see the lineage between different layers and without looking to any scripts and so on in one picture you can understand the whole projects so I don’t have to explain a lot of stuff by just looking to this picture you can understand how the data is Flowing between sources bronze layer silver layer and to the gold layer of course later so as you can see it looks really nice and clean all right so with that we have updated the data flow next we’re going to go and commit our work in the get repo so let’s go okay so now let’s go and commit our scripts we’re going to go to the folder scripts and here we have a server layer if you don’t have it of course you can go and create it so first we’re going to go and put the ddl scripts for the server layer so let’s go and I will paste the code over here and as usually we have this comment at the header explaining the purpose of this scripts so let’s go and commit our work work and we’re going to do the same thing for the start procedure that loads the silver layer so I’m going to go over here I have already file for that so let’s go and paste that so we have here our stored procedures and as usual at the start we have as well so this script is doing the ETL process where we load the data from bronze into silver so the action is to truncate the table first and then insert transformed cleans data from bronze to Silver there are no parameters at all and this is how you can use the start procedure okay so we’re going to go and commit our work and now one more thing that we want to commit in our project all those quaries that you have built to check the quality of the server layer so this time we will not put it in the scripts we’re going to go to the tests and here we’re going to go and make a new file called quality checks silver and inside it we’re going to go and paste all the queries that we have filled I just here reorganize them by the tables so here we can see all the checks that we have done during the course and at the header we have here nice comments so here we are just saying that this script is going to check the quality of the server layer and we are checking for nulls duplicates unwanted spaces invalid date range and so on so that each time you come up with a new quality check I’m going to recommend you to share it with the project and with other team in order to make it part of multiple checks that you do after running the atls so that’s it I’m going to go and put those checks in our repo and in case I come up with new check I’m going to go and update it perfect so now we have our code in our repository all right so with that our code is safe and we are done with the whole epic so we have build the silver layer now let’s go and minimize it and now we come to my favorite layer the gold layer so we’re going to go and build it the first step as usual we have to analyze and this time we’re going to explore the business objects so let’s go all right so now we come to the big question how we going to build the gold layer as usual we start with analyzing so now what we’re going to do here is to explore and understand what are the main business objects that are hidden inside our source system so as you can see we have two sources six files and here we have to identify what are the business objects once we have this understanding then we can start coding and here the main transformation that we are doing is data integration and here usually I split it into three steps the first one we’re going to go and build those business objects that we have identified and after we have a business object we have to look at it and decide what is the type of this table is it a dimension is it a fact or is it like maybe a flat table so what type of table that we have built and the last step is of course we have now to rename all the columns into something friendly and easy to understand so that our consumers don’t struggle with technical names so once we have all those steps what we’re going to do it’s time to validate what we have created so what we have to do the new data model that we have created it should be connectable and we have to check that the data integration is done correctly and once everything is fine we cannot skip the last step we have to document and as well commit our work in the git and here we will be introducing new type of documentations so we’re going to have a diagram about the data model we’re going to build a data dictionary where we going to describe the data model and of course we can extend the data flow diagram so this is our process those are the main steps that we will do in order to build the gold layer okay so what is exactly data modeling usually usually the source system going to deliver for you row data an organized messy not very useful in its current States but now the data modeling is the process of taking this row data and then organize it and structure it in meaningful way so what we are doing we are putting the data in a new friendly and easy to understand objects like customers orders products each one of them is focused on specific information and what is very important is we’re going to describe the relationship between those objects so by connecting them using lines so what you have built on the right side we call it logical data model if you compare to the left side you can see the data model makes it really easy to understand our data and the relationship the processes behind them now in data modeling we have three different stages or let’s say three different ways on how to draw a data model the first stage is the conceptual data model here the focus is only on the entity so we have customers orders products and we don’t go in details at all so we don’t specify any columns or attributes inside those boxes we just want to focus what are the entities that we have and as well the relationship between them so the conceptual data model don’t focus at all on the details it just gives the big picture so the second data model that we can build is The Logical data model and here we start specifying what are the different columns that we can find in each entity like we have the customer ID the first name last name and so on and we still draw the relationship between those entities and as well we make it clear which columns are the primary key and so on so as you can see we have here more details but one thing we don’t describe a lot of details for each column and we are not worry how exactly we going to store those tables in the database the third and last stage we have the physical data model this is where everything gets ready before creating it in the database so here you have to add all the technical details like adding for each column the data types and the length of each data type and many other database techniques and details so again if if you look to the conceptual data model it gives us the big picture and in The Logical data model we dive into details of what data we need and the physical layer model prepares everything for the implementation in the database and to be honest in my projects I only draw the conceptual and The Logical data model because drawing and building the physical data model needs a lot of efforts and time and there are many tools like in data bricks they automatically generate those models so in this project what we’re going to do we’re going to draw The Logical data model for the gold layer all right so now for analytics and specially for data warehousing and business intelligence we need a special data model that is optimized for reporting and analytics and it should be flexible scalable and as well easy to understand and for that we have two special data models the first type of data model we have the star schema it has a central fact table in the middle and surrounded by Dimensions the fact table contains transactions events and the dimensions contains descriptive informations and the relationship between the fact table in the middle and the dimensions around it forms like a star shape and that’s why we call it star schema and we have another data model called snowflake schema it looks very similar to the star schema so we have again the fact in the middle and surrounded by Dimensions but the big difference is that we break the dimensions into smaller subdimensions and the shape of this data model as you are extending the dimensions it’s going to look like a snowflake so now if you compare them side by side you can see that the star schema looks easier right so it is usually easy to understand easy to query it is really perfect for analyzes but it has one issue with that the dimension might contain duplicates and your Dimensions get bigger with the time now if you compare to the snowflake you can see the schema is more complex you so you need a lot of knowledge and efforts in order to query something from the snowflake but the main advantage here comes with the normalization as you are breaking those redundancies in small tables you can optimize the storage but to be honest who care about the storage so for this project I have chose to use the star schema because it is very commonly used perfect for reporting like for example if you’re using power pii and we don’t have to worry about the storage so that’s why we going to adapt this model to build our gold layer okay so now one more thing about those data models is that they contain two types of tables fact and dimensions so when I I say this is a fact table or a dimension table well the dimension contains descriptive informations or like categories that gives some context to your data for example a product info you have product name category subcategories and so on this is like a table that is describing the product and this we call it Dimension but in the other hand we have facts they are events like transactions they contain three important informations first you have multiple IDs from multiple dimensions then we have like the informations like when the transaction or the event did happen and the third type of information you’re going to have like measures and numbers so if you see those three types of data in one table then this is a fact so if you have a table that answers how much or how many then this is a fact but if you have a table that answers who what where then this is a dimension table so this is what dimension and fact tables all right my friends so so far in the bronze layer and in the silver layer we didn’t discuss anything about the business so the bronze and silver were very technical we are focusing on data Eng gestion we are focusing on cleaning up the data quality of the data but still the tables are very oriented to the source system now comes the fun part in the god layer where we’re going to go and break the whole data model of the sources so we’re going to create something completely new to our business that is easy to consume for business reporting and analyzes and here it is very very important to have a clear understanding of the business and the processes and if you don’t know it already at this phase you have really to invest time by meeting maybe process experts the domain experts in order to have clear understanding what we are talking about in the data so now what we’re going to do we’re going to try to detect what are the business objects that are hidden in the source systems so now let’s go and explore that all right now in order to build a new data model I have to understand first the original data model what are the main business objects that we have how things are related to each others and this is very important process in building a new model so now what I usually do I start giving labels to all those tables so if you go to the shapes over here let’s go and search for label and if you go to more icons I’m going to go and take this label over here so drag and drop it and then I’m going to go and increase maybe the size of the font so let’s go with 20 and bold just make it a little bit bigger so now by looking to this data model we can see that we have a bradu for informations in the CRM and as well in the ARP and then we have like customer informations and transactional table so now let’s focus on the product so the product information is over here we have here the current and the history product informations and here we have the categories that’s belong to the products so in our data model we have something called products so let’s go and create this label it’s going to be the products and so let’s go and give it a color to the style let’s Pi for example the red one now let’s go and move this label and put it beneath this table over here that I have like a label saying this table belongs to the objects called products now I’m going to do the same thing for the other table over here so I’m going to go and tag this table to the product as well so that I can see easily which tables from the sources does has informations about the product business object all right now moving on we have here a table called customer information so we have a lot of information about the customer we have as well in the ARB customer information where we have the birthday and the country so those three tables has to do with the object customer so that means we’re going to go and label it like that so let’s call it customer and I’m going to go and pick different color for that let’s go with the green so I will tag this table like this and the same thing for the other tables so copy tag the second table and the third table now it is very easily for me to see which table to belong to which business objects and now we have the final table over here and only one table about the sales and orders in the ARB we don’t have any informations about that so this one going to be easy let’s call it sales and let’s move it over here and as well maybe change the color of that to for example this color over here now this step is very important by building any data model in the gold layer it gives you a big picture about the things that you are going to module so now the next step with that we’re going to go and build those objects step by step so let’s start with the first objects with our customers so here we we have three tables and we’re going to start with the CRM so let’s start with this table over here all right so with that we know what are our business objects and this task is done and now in The Next Step we’re going to go back to SQL and start doing data Integrations and building completely new data model so let’s go and do that now let’s have a quick look to the gold layer specifications so this is the final stage we’re going to provide data to be consumed by reporting and Analytics and this time we will not be building tables we will be using views so that means we will not be having like start procedure or any load process to the gold layer all what you are doing is only data transformation and the focus of the data transformation going to be data integration aggregation business logic and so on and this time we’re going to introduce a new data model we will be doing star schema so those are the specifications for the gold layer and this is our scope so this time we make sure that we are selecting data from the silver layer not from the bronze because the bronze has bad data quality and the server is everything is prepared and cleaned up in order to build the good layer going to be targeting the server layer so let’s start with select star from and we’re going to go to the silver CRM customer info so let’s go and hit execute and now we’re going to go and select the columns that we need to be presented in the gold layer so let’s start selecting The Columns that we want we have the ID the key the first name I will not go and get the metadata information this only belongs to the Silver Perfect the next step is that I’m going to go and give this table an ilas so let’s go and call it CI and I’m going to make sure that we are selecting from this alas because later we’re going to go and join this table with other tables so something like this so we’re going to go with those columns now let’s move to the second table let’s go and get the birthday information so now we’re going to jump to the other system and we have to join the data by the CI ID together with the customer key so now we have to go and join the data with another table and here I try to avoid using the inner join because if the other table doesn’t have all the information about the customers I might lose customers so always start with the master table and if you join it with any other table in order to get informations try always to avoid the inner join because the other source might not have all the customers and if you do inner join you might lose customers so iend to start from the master table and then everything else is about the lift join so I’m going to say Lift join silver Erp customer a z12 so let’s give it the ls CA and now we have to join the tables so it’s going to be by C from the first table it going to be the customer key equal to ca and we have the CI ID now of course we’re going to get matching data because we checked the silver layer but if we haven’t prepared the data in the silver layer we have to do here preparation step in order to join Jo the tables but we don’t have to do that because that was a preep in the silver layer so now you can see the systematic that we have in this pron silver gold so now after joining the tables we have to go and pick the information that we need from the second table which is the birth dat so B dat and as well from this table there is another nice information it is the gender information so that’s all what we need from the second table let’s go and check the third table so the third table is about the location information the countries and as well we connect the tables by the C ID with the key so let’s go and do that we’re going to say as well left join silver Erp location and I’m going to give it the name LA and then we have to join while the keys the same thing it’s going to be CI customer key equal to La a CI ID again we have prepared those IDs and keys in the server layer so the joint should be working now we have to go and pick the data from the second table so what do we we have over here we have the ID the country and the metadata information so let’s go and just get the country perfect so now with that we have joined all the three tables and we have picked all the columns that we want in this object so again by looking over here we have joined this table with this one and this one so with that we have collected all the customer informations that we have from the two Source systems okay so now let’s go and query in order to make sure that we have everything correct and in order to understand that your joints are correct you have to keep your eye in those three columns so if you are seeing that you are getting data that means you are doing the the joints correctly but if you are seeing a lot of nulls or no data at all that means your joints are incorrect but now it looks for me it is working and another check that I do is that if your first table has no duplicates what could happen is that after doing multiple joints you might now start getting dgates because the relationship between those tables is not clear one to one you might get like one to many relationship or many to many relationships so now the check that I usually do at this stage advance I have to make sure that I don’t have duplicates from their results so we don’t have like multiple rows for the same customer so in order to do that we go and do a quick group bu so we’re going to group by the data by the customer ID and then we do the counts from this subquery so this is the whole subquery and then after that we’re going to go and say Group by the customer ID and then we say having counts higher than one so this query actually try to find out whether we have any duplicates in the primary key so let’s go and executed we don’t have any duplicate and that means after joining all those tables with the customer info those tables didn’t didn’t cause any issues and it didn’t duplicate my data so this is very important check to make sure that you are in the right way all right so that means everything is fine about the D Kates we don’t have to worry about it now we have here an integration issue so let’s go and execute it again and now if you look to the data we have two sources for the gender informations one comes from the CRM and another where come from the Erp so now the question is what are we going to do with this well we have to do data integration so let me show you how I do it first I go and have a new query and then I’m going to go and remove all other stuff and I’m going to leave only those two informations and use it distinct just to focus on the integration and let’s go and execute it and maybe as well to do an order bu so let’s do one and two let’s go and execute it again so now here we have all the scenarios and we can see sometimes there is a matching so from the first table we have female and the other table we have as well female but sometimes we have an issue like those two tables are giving different informations and the same thing over here so this is as well an issue different informations another scenario where we have a from the first table like here we have the female but in the other table we have not available well this is not a problem so we can get it from the first table but we have as well the exact opposite scenario where from the first table the data is not available but it is available from the second table and now here you might wonder why I’m getting a null over here we did handle all the missing data in the silver layer and we replace everything with not available so why we are still getting a null this null doesn’t come directly from the tables it just come because of joining tables so that means there are customers in the CRM table that is not available in the Erb table and if there is like no match what’s going to happen we will get a null from scel so this null means there was no match and that’s why we are getting this null it is not coming from the content of the tables and this is of course an issue but now the big issue what can happen for those two scenarios here we have the data but they are different and here again we have to ask the experts about it what is the master here is it the CRM system or the ARP and let’s say from their answer going to say the master data for the customer information is the CRM so that means the CRM informations are more accurate than the Erp information and this is only about the customers of course so for this scenario where we have female and male then the correct information is the female from the First Source system the same goes over here and here we have like male and female then the correct one is is the mail because this Source system is the master okay so now let’s go and build this business rule we’re going to start as usual with the case wi so the first very important rule is if we have a data in the gender information from the CRM system from the master then go and use it so we’re going to go and check the gender information from the CRM table so customer gender is not equal to not available so that means we have a value male or female let me just have here a comma like this then what going to happen go and use it so we’re going to use the value from the master CRM is the master for gender info now otherwise that means it is not available from the CRM table then go and use and grab the information from the second table so we’re going to say ca gender but now we have to be careful this null over here we have to convert it to not available as well so we’re going to use the Calis so if this is a null then go and use the not available like this so that’s it let’s have an end let me just push this over here so let’s go and call it new chin for now let’s go and excute it and let’s go and check the different scenarios all those values over here we have data from the CRM system and this is as well represented in the new column but now for the second parts we don’t have data from the first system so we are trying to get it from the second system so for the first one is not available and then we try to get it from the Second Source system so now we are activating the else well it is null and with that the CIS is activated and we are replacing the null with not available for the second scenario as well the first system don’t have the gender information that’s why we are grabbing it from the second so with that we have a female and then the third one the same thing we don’t have information but we get it from the Second Source system we have the mail and the last one it is not available in in both Source systems that’s why we are getting not available so with that as you can see we have a perfect new column where we are integrating two different Source system in one and this is exactly what we call data integration this piece of information it is way better than the source CRM and as well the source ARP it is more rich and has more information and this is exactly why we Tred to get data from different Source system in order to get rich information in the data warehouse so do we have a nice logic and as you can see it’s way easier to separate it in separate query in order first to build the logic and then take it to the original query so what I’m going to do I’m just going to go and copy everything from here and go back to our query I’m going to go and delete those informations the gender and I will put our new logic over here so a comma and let’s go and execute so with that we have our new nice column now with that we have very nice objects we don’t have delates and we have integrated data together so we took three three tables and we put it in one object now the next step is that we’re going to go and give nice friendly names the rule in the gold layer that to use friendly names and not to follow the names that we get from The Source system and we have to make sure that we are following the rules by the naming conventions so we are following the snake case so let’s go and do it step by step for the first one let’s go and call it the customer ID and then the next one I will get rid of using keys and so on I’m going to go and call it customer number because those are customer numbers then for the next one we’re going to call it first name without using any prefixes and the next one last name and we have here marital status so I will be using the exact name but without the prefix and here we just going to call it gender and this one we going to call it create date and this one birth dat and the last one going to be the country so let’s go and execute it now as you can see the names are really friendly so we have customer ID customer numbers first name last name material status gender so as you can see the names are really nice and really easy to understand now the next step I’m going to think about the order of those columns so the first two it makes sense to have it together the first name last name then I think the country is very important information so I’m going to go and get it from here and put it exactly after the last name it’s just nicer so let’s go and execute it again so the first name last name country it’s always nice to group up relevant columns together right so we have here the status of the gender and so on and then we have the CATE date and the birth date I think I’m going to go and switch the birth date with the CATE date it’s more important than the CATE dates like this and here not forget a comma so execute again so it looks wonderful now comes a very important decision about this objects is it a fact table or a dimension well as we learned Dimensions hold descriptive information about an object and as you can see we have here a descriptions about the customers so all those columns are describing the customer information and we don’t have here like transactions and events and we don’t have like measures and so on so we cannot say this object is a fact it is clearly a dimension so that’s why we’re going to go and call this object the dimension customer now there is one thing that if you creating a new dimension you need always a primary key for the dimension of course we can go over here and the depend on the primary key that we get from The Source system but sometimes you can have like Dimensions where you don’t have like a primary key that you can count on so what we have to do is to go and generate a new primary key in the data warehouse and those primary Keys we call it surrogate keys serate keys are system generated unique identifier that is assigned to each record to make the record unique it is not a business key it has no meaning and no one in the business knows about it we only use it in order to connect our data model and in this way we have more control on how to connect our data model and we don’t have to depend all way on the source system and there are different ways on how to generate surrogate Keys like defining it in the ddl or maybe using the window function row number in this data warehouse I’m going to go with a simple solution where we’re going to go and use the window function so now in order to generate a Sur key for this Dimension what we’re going to do it is very simple so we’re going to say row number over and here if we have to order by something you can order by the create date or the customer ID or the customer number whatever you want but in this example I’m going to go and order by the customer ID so we have to follow the naming convention that’s all surate keys with the key at the end as a suffix so now let’s go and query those informations and as you can see at the start we have a customer key and this is a sequence we don’t have here of course any duplicates and now this sgate key is generated in the data warehouse and we going to use this key in order to connect the data model so now with that our query is ready and the last step is that we’re going to go and create the object and as we decided all the objects in the gold layer going to be a virtual one so that means we’re going to go and create a view so we’re going to say create View gold. dim so follow damic convention stand for the dimension and we’re going to have the customers and then after that we have us so with that everything is ready let’s go and excuse it it was successful let’s go to the Views now and you can see our first objects so we have the dimension customers in the gold layer now as you know me in the next of that we’re going to go and check the quality of this new objects so let’s go and have a new query so select star from our view temp customers and now we have to make sure that everything in the right position like this and now we can do different checks like the uniqueness and so on but I’m worried about the gender information so let’s go and have a distinct of all values so as you can see it is working perfectly we have only female male and not available so that’s it with that we have our first new dimension okay friends so now let’s go and build the second object we have the products so as you can see product information is available in both Source systems as usual we’re going to start with the CRM informations and then we’re going to go and join it with the other table in order to get the category informations so those are the columns that we want from this table now we come here to a big decision about this objects this objects contains historical informations and as well the current informations now of course depend on the requirement whether you have to do analysis on the historical informations but if you don’t have such a requirements we can go and stay with only the current informations of the products so we don’t have to include all the history in the objects and it is anyway as we learned from the model over here we are not using the primary key we are using the product key so now what we have to do is to filter out the historical data and to stay only with the current data so we’re going to have here aware condition and now in order to select the current data what we’re going to do we’re going to go and Target the end dates if the end date is null that means it is a current data let’s take this example over here so you can see here we have three record for the same product key and for the first two records we have here an information in the end dates because it is historical informations but the last record over here we have it as a null and that’s because this is the current information it is open and it’s not closed yet so in order to select only the current informations it is very simple we’re going to say BRD in dat is null so if you go now and execute it you will get only the current products you will not have any history and of course we can go and add comment to it filter out all historical data and this means of course we don’t need the end date in our selection of course because it is always a null so with that we have only the current data now the next step that we have to go and join it with the product categories from the Erp and we’re going to use here the ID so as usual the master information is the CRM and everything else going to be secondary that’s why I use the Live join just to make sure I’m not losing I’m not filtering any data because if there is no match then we lose data so let’s join silver Erp and the category so let’s call it PC and now what we’re going to do we’re going to go and join it using the key so PN from the CRM we have the category ID equal to PC ID and now we have to go and pick columns from the second table so it’s going to be the PC we have the category very important PC we have the subcategory and we can go and get the maintenance so something like this let’s go and query and with that we have all those columns comes from the first table and those three comes from the second so with that we have collected all the product informations from the two Source systems now the next step is we have to go and check the quality of these results and of course what is very important is to check the uniqueness so what we’re going to do we’re going to go and have the following query I want to make sure that the product key is unique because we’re going to use it later in order to join the table with the sales so from and then we have to have group by product key and we’re going to say having counts higher than one so let’s go and check perfect we don’t have any duplicates the second table didn’t cause any duplicates for our join and as well this means we don’t have historical data and each product is only one records and we don’t have any duplicates so I’m really happy about that so let’s go in query again now of course the next step do we have anything to integrate together do we have the same information twice well we don’t have that the next step is that we’re going to go and group up the relevant informations together so I’m going to say the product ID then the product key and the product name are together so all those three informations are together and after that we can put all the category informations together so we can have the category ID the category itself the subcategory let me just query and see the results so we have the product ID key name and then we have the category ID name and the subcategory and then maybe as well to put the maintenance after the subcategory like this and I think the product cost and the line can start could stay at the end so let me just check so those three four informations about the category and then we have the cost line and the start date I’m really happy with that the next step we’re going to go and give n names friendly names for those columns so let’s start with the first one this is the product ID the next one going to be the product number we need the key for the surrogate key later and then we have the product name and after that we have the category ID and the category and this is the subcategory and then the next one going to stay as it is I don’t have to rename it the next one going to be the cost and the line and the last one will be the start dates so let’s go and execute it now we can see very nicely in the output all those friendly names for the columns and it looks way nicer than before I don’t have even to describe those informations the name describe it so perfect now the next big decision is what do we have here do we have a effect or Dimension what do you think well as you can see here again we have a lot of descriptions about the products so all those informations are describing the business object products we don’t have like here transactions events a lot of different keys and ideas so we don’t have really here a facts we have a dimension each row is exactly describing one object describing one products that’s why this is a dimension okay so now since this is a dimension we have to go and create a primary key for it well actually the surrogate key and as we have done it for the customers we’re going to go and use the window function row number in order to generate it over and then we have to S the data I will go with the start dates so let’s go with the start dates and as well the product key and we’re going to gra it a name products key like this so let’s go and execute it with that we have now generated a primary key for each product and we’re going to be using it in order to connect our data model all right now the next step we does we’re going to go and build the view so we’re going to say create view we’re going to say go and dimension products and then ask so let’s go and create our objects and now if you go and refresh the views you will see our second object the second dimension so we have here in the gold layer the dimension products and as usual we’re going to go and have a look to this view just to make sure that everything is fine so them products so let’s execute it and by looking to the data everything looks nice so with that we have now two dimensions all right friends so with that we have covered a lot of stuff so we have covered the customers and the products and we are left with only one table where we have the transactions the sales and for the sales information we have only data from the CRM we don’t have anything from the Erp so let’s go and build it okay so now I have all those informations and now of course we have only one table we don’t have to do any Integrations and so on and now we have to answer the big question do we have here a dimension or a fact well by looking to those details we can see transactions we can see events we have a lot of dates informations we have as well a lot of measures and metrics and as well we have a lot of IDs so it is connecting multiple dimensions and this is exactly a perfect setup for effects so we’re going to go and use those informations as effects and of course as we learned effect is connecting multiple Dimensions we have to present in this fact the surrogate keys that comes from the dimensions so those two informations the product key and the customer ID those informations comes from the searce system and as we learned we want to connect our data model using the surate keys so what we’re going to do we’re going to replace those two informations with the surate keys that we have generated and in order to do that we have to go and join now the two dimensions in order to get the surate key and we call this process of course data lookup so we are joining the tables in order only to get one information so let’s go and do that we will go with the lift joint of course not to lose any transaction so first we’re going to go and join it with the product key now of course in the silver layer we don’t have any ciruit Keys we have it in the good layer so that means for the fact table we’re going to be joining the server layer together with the gold layer so gold dots and then the dimension products and I’m going to just call it PR and we’re going to join the SD using the product key together with the product number [Music] from the dimension and now the only information that we need from the dimension is the key the sget key so we’re going to go over here and say product key and what I’m going to do I’m going to go and remove this information from here because we don’t need it we don’t need the original product key from The Source system we need the circuit key that we have generated in our own in this data warehouse so the same thing going to happen as well for the customer so gold Dimension customer again again we are doing here a look up in order to get the information on SD so we are joining using this ID over here equal to the customer ID because this is a customer ID and what we’re going to do the same thing we need the circuit key the customer key and we’re going to delete the ID because we don’t need it now we have the circuit key so now let’s go and execute it and now with that we have in our fact table the two keys from the dimensions and now this can help us to connect the data model to connect the facts with the dimensions so this is very necessary Step Building the fact table you have to put the surrogate keys from the dimensions in the facts so that was actually the hardest part building the facts now the next step all what you have to do is to go and give friendly names so we’re going to go over here and say order number then the surrogate keys are already friendly so we’re going to go over here and say this is the order date and the next one going to be shipping date and then the next one due date and the sales going to be I’m going to say sales amount the quantity and the final one is the price so now let’s go and execute it and look to the results so now as you can see the columns looks very friendly and now about the order of the columns we use the following schema so first in the fact table we have all the surrogate keys from the dimensions then second we have all the dates and at the end you group up all the measures and the matrics at the end of The Facts so that’s it for the query for the facts now we can go and build it so we’re going to say create a view gold in the gold layer and this time we’re going to use the fact underscore and we’re going to go and call it sales and then don’t forget about the ass so that’s it let’s go and create it perfect now we can see the facts so with that we have three objects in the gold layer we have two dimensions and one and facts and now of course the next step with this we’re going to go and check the quality of the view so let’s have a simple select fact sales so let’s execute it now by checking the result you can see it is exactly like the result from the query and everything looks nice okay so now one more trick that I usually do after building a fact is try to connect the whole data model in order to find any issues so let’s go and do that we will do just simple left join with the dimensions so gold Dimension customers C and we will use the [Music] keys and then we’re going to say where customer key is null so there is no matching so let’s go and execute this and with that as you can see in the results we are not getting anything that means everything is matching perfectly and we can do as well the same thing with the products so left join C them products p on product key and then we connect it with the facts product key and then we going to go and check the product key from the dimension like this so we are checking whether we can connect the facts together with the dimension products let’s go and check and as you can see as well we are not getting anything and this is all right so with that we have now SQL codes that is tested and as well creating the gold layer now in The Next Step as you know in our requirements we have to make clear documentations for the end users in order to use our data model so let’s go and draw a data model of the star schema so let’s go and draw our data model let’s go and search for a table and now what I’m going to do I’m going to go and take this one where I can say what is the primary key and what is the for key and I’m going to go and change little bit the design so it’s going to be rounded and let’s say I’m going to go and change to this color and maybe go to the size make it 16 and then I’m going to go and select all the columns and make it as well 16 just to increase the size and then go to our range and we can go and increase it 39 so now let’s go and zoom in a little bit for the first table let’s go and call it gold Dimension customers and make it a little bit bigger like this and now we’re going to go and Define here the primary key it is the customer key and what else we’re going to do we’re going to go and list all the columns in the dimension is little bit annoying but the results going to be awesome so what do we we have the customer ID we have the customer number and then we have the first name now in case you want a new rows so you can hold control and enter and you can go and add the other columns so now pause the video and then go and create the two Dimensions the customers and the products and add all the columns that you have built in the [Music] view welcome back so now I have those two Dimensions the third one one going to be the fact table now for the fact table I’m going to go with different color for example the blue and I’m going to go and put it in the middle something like this so we’re going to say gold fact sales and here for that we don’t have primary key so we’re going to go and delete it and I have to go and add all The Columns of the facts so order number products key customer key okay all right perfect now what we can do we can go and add the foreign key information so the product key is a foreign key key for the products so you’re going to say fk1 and the customer key going to be the foreign key for the customers so fk2 and of course you can go and increase the spacing for that okay so now after we have the tables the next step in data modeling is to go and describe the relationship between these tables this is of course very important for reporting and analytics in order to understand how I’m going to go and use the data model and we have different types of relationships we have one to one one too many and in Star schema data model the relationship between the dimension and the fact is one too many and that’s because in the table customers we have for a specific customer only one record describing the customer but in the fact table the customer might exist in multiple records and that’s because customers can order multiple times so that’s why in fact it is many and in the dimension side it is one now in order to see all those relationships we’re going to go to the menu to the left side and as you can see we have here entity relations and now you have different types of arrows so here for example we have zero to many one one to many one to one and many different types of relations so now which one we going to take we’re going to go and pick with this one so it says one mandatory so that means the customer must exist in the dimension table too many but it is optional so here we have three scenarios the customer didn’t order anything or the customer did order only once or the customer did order many things so that’s why in the fact table it is optional so we’re going to take this one and place it over here so we’re going to go and connect this part to the customer Dimension and the many parts to the facts well actually we have to do it on the customers so with that we are describing the relationship between the dimensions and fact with one to many one is mandatory for the customer Dimension and many is optional to the facts so we have the same story as well for the products so the many part to the facts and the one goes to the products so it’s going to look like this each time you are connecting new dimension to the fact table it is usually one too many relationship so you can go and add anything you want to this model like for example a text like explaining something for example if you have some complicated calculations and so on you can go and write this information over here so for example we can say over here sales calculation we can make it a little bit smaller so let’s go with 18 so we can go and write here the formula for that so sales equal quantity multipli with a price and make this a little bit bigger so it is really nice info that we can add it to the data model and even we can go and Link it to the column so we can go and take this arrow for example with it like this and Link it to the column and with that you have as well nice explanation about the business rule or the calculation so you can go and add any descriptions that you want to the data model just to make it clear for anyone that is using your data model so with that you don’t have only like three tables in the database you have as well like some kind of documentations and explanation in one Blick we can see how the data model is built and how you can connect the tables together it is amazing really for all users of your data model all right so now with that we have really nice data model and now in The Next Step we’re going to go and create quickly a data catalog all right great so with that we have a data model and we can say we have something called a data products and we will be sharing this data product with different type of users and there’s something that’s every every data product absolutely needs and that is the data catalog it is a document that can describe everything about your data model The Columns the tables maybe the relationship between the tables as well and with that you make your data product clear for everyone and it’s going to be for them way easier to derive more insights and reports from your data product and what is the most important one it is timesaving because if you don’t do that what can happen each consumer each user of your data product will keep asking you the same question questions about what do you mean with this column what is this table how to connect the table a with the table B and you will keep repeating yourself and explaining stuff so instead of that you prepare a data catalog a data model and you deliver everything together to the users and with that you are saving a lot of time and stress I know it is annoying to create a data catalog but it is Investments and best practices so now let’s go and create one okay so now in order to do that I’ve have created a new file called Data catalog in the folder documents and here what we’re going to do is very St straightforwards we’re going to make a section for each table in the gold layer so for example we have here the table dimension customers what you have to do first is to describe this table so we are saying it stores details about the customers with the demographics and Geographics data so you give a short description for the table and then after that you’re going to go and list all your columns inside this table and maybe as well the data type but what is way important is the description for each column so you give a very short description like for example here the gender of the customer now one of the best practices of describing a column is to give examples because you can understand quickly the purpose of the columns by just seeing an example right so here we are seeing we can find inside it a male female and not available so with that the consumer of your table can immediately understand uhhuh it will not be an M or an F it’s going to be a full friendly value without having them to go and query the content of the table they can understand quickly the purpose of the column so with that we have a full description for all the columns of our Dimension the same thing we’re going to do for the products so again a description for the table and as well a description for each column and the same thing for the facts so that’s it with that you have like data catalog for your data product at the code layer and with that the business user or the data analyst have better and clear understanding of the content of your gold layer all right my friends so that’s all for the data catalog in The Next Step we’re going to go back to Dro where we’re going to finalize the data flow diagram so let’s go okay so now we’re going to go and extend our data flow diagram but this time for the gold layer so now let’s go and copy the whole thing from the silver layer and put it over here side by side and of course we’re going to go and change the coloring to the gold and now we’re going to go and rename stuff so this is the gold layer but now of course we cannot leave those tables like this we have completely new data model so what do we have over here we have the fact sales we have dimension customers and as well we have Dimension products so now what I’m going to do I’m going to go and remove all those stuff we have only three tables and let’s go and put those three tables somewhere here in the center so now what you have to do is to go and start connecting those stuff I’m going to go with this Arrow over here direct connection and start connecting stuff so the sales details goes to the fact table maybe put the fact table over here and then we have the dimension customer this comes from the CRM customer our info and we have two tables from the Erp it comes from this table as well and the location from the Erp now the same thing goes for the products it comes from the product info and comes from the categories from the Erp now as you can see here we have cross arrows so what we going to do we can go and select everything and we can say line jumps with a gap and this makes it a little bit like Pitter individual for the arrows so now for example if someone asks you where the data come from for the dimension products you can open this diagram and tell them okay this comes from the silver layer we have like two tables the product info from the CRM and as well the categories from the Erp and those server tables comes from the pron layer and you can see the product info comes from the CRM and the category comes from the Erp so it is very simple we have just created a full data lineage for our data warehouse from the sources into the different layers in our data warehouse and data lineage is is really amazing documentation that’s going help not only your users but as well the developers all right so with that we have very nice data flow diagram and a data lineage all right so we have completed the data flow it’s really feel like progress like achievement as we are clicking through all those tasks and now we come to the last task in building the data warehouse where we’re going to go and commit our work in the get repo okay so now let’s put our scripts in the project so we’re going to go to the scripts over here we have here bronze silver but we don’t have a gold so let’s go and create a new file we’re going to have gold/ and then we’re going to say ddl gold. SQL so now we’re going to go and paste our views so we have here our three views and as usual at the start we going to describe the purpose of the views so we are saying create gold views this script can go and create views for the code layer and the code layer represent the final Dimension and fact tables the star schema each view perform Transformations and combination data from the server layer to produce business ready data sets and those us can be used for analytics and Reporting so that it let’s go and commit it okay so with that as you can see we have the PRS the silver so we have all our etls and scripts in the reposter and now as well for the gold layer we’re going to go and add all those quality checks that we have used in order to validate the dimensions and facts so we’re going to go to The Taste over here and we’re going to go and create a new file it’s going to be quality checks gold and the file type is SQL so now let’s go and paste our quality checks so we have the check for the fact the two dimensions and as well an explanation about the script so we are validating the integrity and the accuracy of the gold layer and here we are checking the uniqueness of the circuit keys and whether we are able to connect the data model so let’s put that as well in our git and commit the changes and in case we come up with a new quality checks we’re going to go and add it to our script here so those checks are really important if you are modifying the atls or you want to make sure that after each ATL those script SC should run and so on it is like a quality gate to make sure that everything is fine in the gold layer perfect so now we have our code in our repo story okay friends so now what you have to do is to go and finalize the get repo so for example all the documentations that we have created during the projects we can go and upload them in the docs so for example you can see here the data architecture the data flow data integration data model and so on so with that each time you edit those pages you can commit your work and you have likey version of that and another thing that you can do is that you go to the read me like for example over here I have added the project overview some important links and as well the data architecture and a little description of the architecture of course and of course don’t forget to add few words about yourself and important profiles in the different social medias all right my friends so with that we have completed our work and as well closed the last epek building the gold layer and with that we have completed all the faces of building a data warehouse everything is 100% And this feels really nice all right my friends so if you’re still here and you have built with me the data warehouse then I can say I’m really proud of you you have built something really complex and amazing because building a data warehouse is usually a very complex data projects and with that you have not only learned SQL but you have learned as well how we do a complex data projects in real world so with that you have a real knowledge and as well amazing portfolio that you can share with others if you are applying for a job or if you are showcase that you have learned something new and with that you have experienced different rules in the project what the data Architects and the data Engineers do in complex data projects so that was really an amazing journey even for me as I’m creating this project so now in the next and with that you have done the first type of data analytics projects using SQL the data warehousing now in The Next Step we’re going to do another type of projects the exploratory data analyzes Eda where we’re going to understand and explore our data sets if you like this video and you want me to create more content like this I’m going to really appreciate it if you support the channel by subscribing liking sharing commenting all those stuff going to help the Channel with the YouTube algorithm and as well my content going to reach to the others so thank you so much for watching and I will see you in the next tutorial bye

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog

  • Under Your Skin: The O’Malley Family, Book 1 by SHANNYN SCHROEDER

    Under Your Skin: The O’Malley Family, Book 1 by SHANNYN SCHROEDER

    This source presents excerpts from “Under Your Skin (The O’Malley Family Book 1).” It centers around the lives and relationships of the O’Malley family, specifically focusing on themes of pregnancy, family dynamics, and personal struggles. The narrative appears to follow multiple characters, such as Norah and Kai, as they navigate complex situations involving family, work, and unexpected pregnancies. There also seems to be an overarching narrative, though not specifically stated in the book description, involving criminal behavior. The characters’ interactions are portrayed with a focus on their emotions and internal conflicts as they negotiate their individual challenges. The story seems to take place in the Boston and Chicago areas.

    Under Your Skin: The O’Malley Family Book 1 – Study Guide

    Key Themes

    • Family Dynamics: The complex relationships between the O’Malley siblings, their parents, and extended family members, marked by both love and conflict.
    • Responsibility and Burden: The weight of responsibility each character carries, particularly in relation to caring for family members.
    • Second Chances: Opportunities for redemption and self-improvement are themes woven into the story, especially for characters like Kai and Tommy.
    • Personal Growth: Characters evolve as they confront their pasts and make choices about their futures.
    • Love and Relationships: The various forms love takes, including familial love, romantic love, and friendship, and how these relationships affect the characters.

    Chapter Summaries

    • Chapter One: Introduces the O’Malley family, specifically focusing on Tommy and his return to Chicago after time in rehab. Kai is shown to be running the tattoo parlor.
    • Chapter Two: Introduces Norah’s pregnancy and Jimmy’s reaction. We see Norah’s strained relationship with her father and interactions with Moira.
    • Chapter Five: Focuses on Kai taking care of his mother and his internal conflict. It also introduces Jaleesa’s physical therapy.
    • Chapter Six: Explores Kai and Norah’s interactions and their respective burdens. Norah’s conversation with Kevin reveals family tensions.
    • Chapter Seven: Touches upon Norah’s cravings and discomfort during pregnancy. Kai is shown taking care of his mother.
    • Chapter Eight: Norah navigates her pregnancy and book club responsibilities.
    • Chapter Nine: Kai takes care of Norah when she goes to the hospital, demonstrating their growing bond.
    • Chapter Ten: Centers on Norah’s reaction to Kai’s poker game and their evolving relationship.
    • Chapter Twelve: Features tension between Kai and Norah.
    • Chapter Thirteen: Features a sexual encounter between Kai and Norah.
    • Chapter Fifteen: Norah and Kai’s intimacy is revisited.
    • Chapter Sixteen: Kai continues his tattoo work while struggling with his feelings for Norah.
    • Chapter Seventeen: Explores Kai’s complicated situation and tension with Rooster.
    • Chapter Eighteen: Focuses on Sean’s birthday party and the family gathering, which reveals underlying tensions.

    Character Relationships

    • Norah & Kai: An evolving relationship marked by attraction, shared burdens, and emotional vulnerability. They seem to support one another.
    • Tommy & Kai: Brotherly relationship, shaped by shared history and a need for support. Kai keeps Tommy on a relatively straight path after rehab.
    • Norah & Jimmy: Siblings who clearly care for one another, even if Jimmy struggles with the circumstances of Norah’s pregnancy.
    • Kai & His Mother: Kai is very dedicated to his mother.

    Quiz

    1. Describe Kai O’Malley’s profession and a key aspect of his personality.
    2. What major life change is Norah experiencing in the novel, and how is she handling it?
    3. What is Tommy’s recent history and how does his brother Kai play a role in Tommy’s life?
    4. What are some of the main issues or concerns that Kai’s mother deals with?
    5. Describe the dynamic between Norah and her brother Jimmy.
    6. What significant decision does Norah make about the baby, and what are her motivations?
    7. What activity does Kai participate in during his leisure time, and what do we learn about his past from it?
    8. How does the novel portray the themes of family loyalty and obligation within the O’Malley family?
    9. What services do Kai and Norah separately provide for family members?
    10. Describe the nature of Kai and Norah’s eventual relationship.

    Quiz – Answer Key

    1. Kai is a tattoo artist who runs his own shop, Ink Envy. He is portrayed as someone trying to do what’s best for his family, and has had struggles that he is trying to overcome.
    2. Norah is pregnant and facing the challenges of unplanned pregnancy as a single woman. She demonstrates bravery in the face of her unplanned situation.
    3. Tommy has recently been through rehab, is still struggling with past mistakes and trying to find his place. Kai provides guidance and support, to help him stay on the right track.
    4. Kai’s mother is a single woman who appears to have limited mobility. He takes care of her in the mornings and makes sure she is safe while she is in the house all day.
    5. Norah and Jimmy seem to have a strong sibling bond and have one another’s best interests at heart. Jimmy seems to want to do what is best for his sister.
    6. Norah makes the decision to put her baby up for adoption in the hopes of a better life for her. Her decision is hard for her, but she stands by it.
    7. Kai plays poker, often in the basement of his house. It’s revealed that the game provides an escape, in the presence of old friends, but that the presence of an ex-gangbanger is disruptive.
    8. The O’Malley family shows strong loyalty and obligation, evident in their willingness to support one another through thick and thin. The family always seems to pull together, although their methods of support vary.
    9. Kai is dedicated to being a tattoo artist in his shop and providing for his mother. Norah provides care to her, but also acts as a resource of advice and assistance to her brothers, in times of need.
    10. Kai and Norah develop an intimate relationship. The novel explores the complicated nature of their romance.

    Essay Questions

    1. Discuss the role of responsibility and burden in shaping the lives and choices of the O’Malley siblings.
    2. Analyze how the setting of Chicago contributes to the overall mood and themes of Under Your Skin.
    3. Explore the significance of art, particularly tattooing, in the novel and its connection to character development.
    4. Compare and contrast the different types of love depicted in the novel and their impact on the characters’ lives.
    5. Examine the theme of second chances and how characters like Tommy and Kai seek redemption and personal growth.

    Glossary of Key Terms

    • Ink Envy: The name of Kai’s tattoo parlor, representing his profession and artistic expression.
    • Rehab: A facility or program designed to help individuals recover from addiction, as experienced by Tommy.
    • Adoption: The legal process by which a child is permanently placed with a family other than their biological parents, which is part of Norah’s storyline.
    • Poker: A card game that serves as a leisure activity and social outlet for Kai and his friends, also tied to aspects of his past.
    • Home Healthcare: The provision of medical and personal care services in a patient’s home, relevant to Kai’s mother’s needs.
    • Single Motherhood: The experience of raising a child without a partner, a central aspect of Norah’s initial situation.
    • Family Dynamics: The patterns of interaction and relationships between family members, a key focus of the novel.
    • Responsibility: The obligation or duty to care for or be accountable for someone or something, a recurring theme for the characters.
    • Redemption: The act of making amends for past mistakes or wrongdoings, sought by characters like Tommy and Kai.
    • Personal Growth: The process of improving oneself through learning, experience, and self-reflection, evident in the characters’ journeys.

    Under Your Skin: The O’Malley Family, Book 1

    Okay, I will analyze the provided text excerpts from “Under Your Skin (The O’Malley Family Book 1)” and create a detailed briefing document, highlighting the main themes, important ideas, and including relevant quotes.

    Briefing Document: “Under Your Skin (The O’Malley Family Book 1)”

    Overview:

    The provided excerpts introduce the O’Malley family, focusing on the complex relationships between siblings, particularly Norah, Kai, Tommy, and Jimmy, as well as their mother, Lani. The story revolves around themes of family loyalty, responsibility, unexpected pregnancy, and the challenges of navigating adulthood while carrying the weight of past experiences. The characters grapple with difficult decisions, family secrets, personal growth, and attempts to forge their own paths.

    Main Themes and Ideas:

    • Family Dynamics and Loyalty: The O’Malley siblings exhibit a strong, albeit often turbulent, bond. They support each other but also clash frequently, revealing a deep-seated history of shared experiences and expectations.
    • Example: Several interactions highlight the siblings’ willingness to intervene in each other’s lives, even when unwanted. Norah often finds herself helping her brothers.
    • Unexpected Pregnancy and Adoption: Norah’s unexpected pregnancy and subsequent exploration of adoption are central to the excerpts. The excerpts show how everyone around Norah is affected by her decision. The family members start talking to adoption agencies and are trying to find a suitable family for the baby.
    • Personal Growth and Responsibility: Characters, especially Kai and Norah, are shown grappling with their individual responsibilities. Kai is dealing with the financial strains of running his own business. Norah confronts the need to make significant life choices related to her pregnancy.
    • Example: Norah makes decisions about the adoption based on the best family for the baby.
    • Past Trauma and its Lingering Effects: There is a sense of a shared family history that continues to impact the characters’ present lives. The family seem to have gone through hardship and tragedy.
    • Complex Relationships: There are several complex relationships discussed in this excerpt. Norah is navigating her relationships with multiple men who are trying to help her, including Kai, Tommy, and Jimmy.

    Key Characters and Plot Points:

    • Norah: Pregnant, independent, and grappling with the decision of whether to keep the baby or pursue adoption. She is a central figure around whom much of the plot revolves. “Maybe she was a chicken because she not only asked him to do it, but she would actually let him.”
    • Kai: A tattoo artist, seems to be the most responsible sibling and is helping Norah with her choices.
    • Tommy: Involved in hockey and seems to be an emotional support for the family. He seems to be closest to Kai.
    • Jimmy: Seems supportive, but he also faces his own personal issues.
    • Lani: The mother. It was hard to believe that barely two months ago she’d gotten out of the hospital with her knee replacement.”

    Quotes Illustrating Key Themes:

    • On Family: “Besides, the fact that maybe kill me if I didn’t?”
    • On unexpected situations: “”You’re talking like a crazy woman. She’s pregnant with another man’s child.” “Is that man around? I think not or she wouldn’t have spent her day with me.”
    • On adoption decisions:”I want someone who wants my little girl. I want them to be from this area so I can see her. I want two parents. Definitely”

    Possible Conflicts and Questions Raised:

    • How will Norah’s adoption decision impact her relationships with her family and potential adoptive parents?
    • Can Kai manage to overcome his past and present challenges and find a stable path forward?

    Overall Tone:

    The excerpts convey a tone that blends humor, tenderness, and underlying tension. The characters’ interactions are often laced with wit and sarcasm, but there’s also a sense of vulnerability and genuine care beneath the surface.

    This briefing document summarizes the core themes, characters, and potential conflicts presented in the provided excerpts from “Under Your Skin (The O’Malley Family Book 1)”.

    Under Your Skin: O’Malley Family FAQs

    FAQ: Under Your Skin (The O’Malley Family Book 1)

    • What is the central conflict or challenge that Norah faces?
    • Norah is dealing with an unplanned pregnancy and is struggling to figure out her next steps. She is also figuring out if adoption may be the best path forward for herself and the child. She also has to deal with a variety of strong opinions from her family.
    • How is Kai’s artistic ability presented in the story?
    • Kai is depicted as a talented tattoo artist. His work at Ink Envy is sought after, and the narrative highlights his skill in both designing and executing tattoos.
    • What role does family play in the characters’ lives?
    • Family is a dominant theme, with close-knit sibling relationships and strong familial expectations influencing the characters’ decisions and behaviors. The O’Malley family is very involved in each others’ lives, even when it may not be wanted.
    • How does the story portray the challenges of adulthood?
    • The characters grapple with issues like unplanned pregnancy, career aspirations, financial struggles, and complicated romantic relationships, reflecting the complexities and uncertainties of early adulthood.
    • What is Ink Envy, and why is it significant?
    • Ink Envy is the tattoo shop where Kai works. It serves as both his workplace and a space where the characters interact and their stories unfold. The tattoo shop is where Kai is able to be artistically productive, as well as support himself financially.
    • What are the key traits of the O’Malley brothers, and how do they differ?
    • The O’Malley brothers—Tommy, Jimmy, and Kai—each possess distinct personalities. Tommy seems to be the responsible caretaker, Jimmy provides support and commentary, and Kai is focused on his art and working.
    • How are themes of independence and dependence explored in the story?
    • The characters navigate a balance between asserting their independence and relying on family for support, demonstrating the tension between self-reliance and interconnectedness. Norah has moments of being highly independent, and then other moments when she seeks the love and support of her family.
    • What is the significance of the book’s title, “Under Your Skin”?
    • The title, “Under Your Skin,” could have multiple meanings. It refers literally to the art of tattooing, but it also symbolizes the way that family history, relationships, and emotions permeate and shape the characters’ identities and experiences. It is a reference to how close the O’Malley family is to each other.

    Pregnancy Anxieties in “Under Your Skin”

    Some characters in “Under Your Skin (The O’Malley Family Book 1)” experience anxieties related to pregnancy.

    Examples of pregnancy anxieties:

    • Avery is worried about how her body will change.
    • Avery is concerned that her hormones are affecting her negatively.
    • Norah is scared about the possibility of having twins.
    • Norah expresses concern about the changes in her life as a result of the pregnancy.
    • Norah worries about how her family will adjust and whether she will have the support she needs.
    • Norah reflects on whether she is ready to be a mother.
    • Moira reflects on the beginning of her pregnancy.

    O’Malley Family Dynamics: Pregnancy, Relationships, and Conflict

    The source text reveals a complex web of family dynamics, including those influenced by pregnancy and its related anxieties. Various relationships and interactions within the O’Malley family are depicted:

    • Sibling Relationships: The source text illustrates sibling relationships. For example, Norah has brothers, and their interactions range from supportive to overprotective. There are tensions and caring moments between siblings.
    • Parent-Child Dynamics: The text refers to parent-child dynamics, showing the complexities and potential for conflict. Characters reflect on their relationships with their parents, and the impact their parents had on their lives.
    • Extended Family: Interactions with extended family members, like aunts and cousins, also shape the family dynamic. The O’Malley family appears very involved in each others’ lives.
    • Impact of Pregnancy on Family Dynamics: Pregnancy is a central theme that influences family relationships. The characters discuss and debate the impact of unplanned pregnancies. The family members respond differently to the pregnancies. Some family members are supportive, while others are judgmental or concerned. The impending arrival of a new baby also stirs up anxieties and prompts reflections on family history and future.
    • Family Support and Conflict: The source text also highlights instances of family members supporting each other through difficult times. However, there are conflicts and disagreements within the family. These conflicts sometimes stem from differing opinions about how to handle pregnancies or other life challenges.
    • Loyalty and Protection: Despite the conflicts, there is a strong sense of family loyalty and a willingness to protect one another. Siblings rally to support each other, and parents want the best for their children.
    • Changing Roles: The source shows the changing roles within the family as members navigate new relationships, pregnancies, and personal growth. Characters grapple with their identities as parents, siblings, and individuals within the family.

    Personal Growth and Relationships: Navigating Life’s Challenges

    The characters in the source text experience personal growth as they navigate complex relationships, pregnancies, and various life challenges.

    Aspects of personal growth depicted in the source text:

    • Overcoming Past Trauma: Characters grapple with past traumas and work towards healing and moving forward.
    • Identity and Self-Discovery: Characters reflect on their identities and strive toward self-discovery. They consider their roles within the family and as individuals.
    • Changing Relationships: Characters navigate changing relationships and the evolving roles of family members.
    • Taking Responsibility: Some characters make an effort to take responsibility for their actions and decisions.
    • Emotional Maturity: The source text shows characters developing emotional maturity through introspection and self-reflection. They learn to understand their feelings and motivations.
    • Letting Go: Characters learn to let go of past grievances, forgive others, and move forward.
    • Confronting difficult situations: Characters confront difficult situations and make tough choices. They show resilience in the face of adversity.

    Under Your Skin: Relationship Struggles in the O’Malley Family

    In “Under Your Skin (The O’Malley Family Book 1),” characters experience relationship struggles stemming from various sources such as family dynamics, personal growth challenges, and pregnancy anxieties.

    Relationship struggles include:

    • Impact of Family Dynamics: Characters experience relationship struggles stemming from family dynamics. For example, siblings’ involvement in each other’s lives can lead to tension. Differing opinions on handling pregnancies can also cause conflict among family members.
    • Personal Growth Challenges: Characters’ individual journeys of self-discovery and healing from past traumas can create friction in relationships. Differing levels of emotional maturity or commitment to taking responsibility can also lead to misunderstandings and disagreements.
    • Pregnancy-Related Anxieties: The anxieties surrounding pregnancy, such as concerns about body image and the future, can strain relationships. The source text shows characters grappling with unplanned pregnancies and the adjustments required.

    Under Your Skin: Purpose, Relationships, and Growth

    The characters in “Under Your Skin (The O’Malley Family Book 1)” grapple with finding purpose while navigating relationship struggles, family dynamics, personal growth, and pregnancy anxieties.

    Examples of characters finding purpose:

    • Taking Responsibility: Characters strive to take responsibility for their actions and decisions, suggesting a search for purpose through accountability and maturity.
    • Confronting Difficult Situations: Characters confront difficult situations and make tough choices, indicating they find purpose by facing adversity and demonstrating resilience.
    • Personal Growth and Self-Discovery: Characters reflect on their identities and consider their roles within their families and as individuals, indicating a journey toward finding purpose through understanding themselves.
    • Supporting Family: Despite conflicts, a strong sense of family loyalty and a willingness to protect one another is present, suggesting that characters find purpose in supporting and caring for their families.
    • Defining Relationships: Characters navigate changing relationships and evolving roles within their families, showing they seek purpose by adapting to new dynamics and defining their place within them.
    • Healing from Trauma: Characters grapple with past traumas and work toward healing and moving forward, implying they find purpose in overcoming adversity and seeking a better future.

    By Amjad Izhar
    Contact: amjad.izhar@gmail.com
    https://amjadizhar.blog