building web applications in php
Getting Started with Web Application using PHP & MySQL | Tutorials
PHP is a programming language used to create dynamic contents with the database. Basically, PHP is used to develop Web Applications. In this Tutorial, we’re going to Develop a very simple Web Application & we’ll add features in our application in next parts of the tutorial. Here’s the Table of Content for this Tutorial series.
This Tutorial is for beginners. So, for keeping the things simple we’ll not use any PHP Framework. We’ll use Object-Oriented PHP for creating our Web Application.
We’re going to create an Application to manage Doctors, Nurses etc & I’m going to give our application a name “Medibed”.
If you’re interested in creating Web Services using PHP. Here’s my article on Web Services in PHP
This Tutorial is designed using Object Oriented PHP. So, you must have a basic knowledge of Object Oriented Concepts in PHP before following this series. Here’s a quick overview of all those OOP Concepts.
Now, Let’s start our Tutorial.
Pre-requisites
Before starting this Tutorial, you must have a basic knowledge of PHP, MySQL, HTML, CSS, & JQuery to customize your application. We’ll use MySQL for creating Database for our Application & an Admin Template for creating interactive User Interfaces.
There are many Free Templates Available, for this Tutorial, I’m going to use This Beautiful Admin Template by almasaeed.
Setting up Server
To work on your local system you need to have PHP & MySQL installed on your system. So, the first step is to have a server to run our application. I’m going to install XAMPP because It installs both PHP & MySQL for us.
Run your server, go to your “htdocs” Folder inside “XAMPP” Forder & create a new folder there as “medibed”
Creating Database
It’s time to create a database for our Web Application.
I’m going to use very simple Hospital Database with 4 Tables, “doctors”, “nurses”, “patients” & “admins”.
You can use the database of your Web or Mobile App for which you are developing your Application.
Here’s the Database I’m going to use with the name “hospital_db”
& here’s the SQL script for this database
Database Script
Save the Above SQL Script in a file as “hospital_db.sql”.
Go to http://localhost/phpmyadmin, create a database as “hospital_db” & import the SQL File in your Database.
Now our database is ready & the next step is to set up our Server & AdminLTE Template for our Application.
Setting Up Template
First, you need to download AdminLTE Template. So download or clone AdminLTE & Unzip AdminLTE folder.
You’ll see these files & folders.
For keeping our project clean you need to copy & paste only Two Folders “bower_components” & “dist” from here to the folder we have created earlier with the name “medibed”.
Let start by creating a Layout Page for our Application.
Now create a new file as “master.php” at the root folder of your Folder & paste this code.
This is our master/layout page. We’ll load the content of all other pages inside this master page.
Let’s test our master page.
Create a new Folder as “Doctor” at the root of our project & inside this folder create a new file with the name “index.php”
Now, your “medibed” folder should look like this.
Add the Code below Inside your “index.php”
Now, open your browser & go to this URL => http://localhost/medibed/doctor
In the Next part of this Tutorial, we’ll perform CRUD operations using this beautiful Template.
Comment If you have any question or find any difficulty. I’m here to solve your problem.
You might be interested in:
Recommended Training – Treehouse

Treehouse is an online training service that teaches web design, web development and app development with videos, quizzes and interactive coding exercises.
Treehouse’s mission is to bring technology education to those who can’t get it, and is committed to helping its students find jobs. If you’re looking to turn coding into your career, you should consider Treehouse.
Disclosure of Material Connection: Some of the links in the post above are “affiliate links.” This means if you click on the link and purchase the item, we will receive an affiliate commission. Regardless, we only recommend products or services we use personally and believe will add value to our readers.
Top 10 Free PHP and MySQL Courses for Web Development
Best and Free PHP and MySQL courses from Udemy, Coursera, Pluralsight, and Educative
If you want to build web applications in a quick time then there is no better technology than PHP and MySQL.
People may tell you to learn Java, Angular, React, JavaScript, Python or whatever but they are not as easy as PHP and you will take longer to develop your web application or startup than using PHP.
PHP and MySQL are incredibly powerful open source technologies that allow programmers and web developers to create functional websites and apps that go way beyond basic HTML.
PHP is specially created to generate interactive and dynamic websites and also known as server-side scripting language while MySQL is one of the leading relational databases along with Oracle and Microsoft SQL Server.
While it may seem intimidating to create a website using PHP and MySQL, especially for someone who has no experience in coding, it’s not that difficult. With the right guidance and resources like books and courses, you can put together a PHP MySQL website in a week or so.
I have been sharing a lot of free resources in the past starting from Java, Spring, Eclipse, Maven, Linux, and several other key technologies important for programmers and web developers, so when a request comes to me for suggesting some free courses and books learn PHP and MySQL, I thought of this article.
I started my search with Udemy and Coursera because they are my go-to place for learning nowadays. I was a nerd before, I loved learning from books but ever since I have started learning from online courses, I have never looked back.
This article is a result of that short research, I am going to share some of the best but free online courses you can join to learn PHP and MySQL by yourself.
10 Best and FREE PHP and MySQL Courses for Web Developers
As I told you guys before, I found learning from Online courses much better than books, even though books still have a place to learn a topic in-depth, to a quick start, and get going, nothing beats online training courses.
Most of these free courses are from respected authors and training institutes which made them free for promotional purposes but they have good and structured content. You can use them to learn PHP and MySQL by yourself at the comfort of your office and home and free of cost.
1. PHP for Beginners — Become a PHP Master — CMS Project
This is simply the best course to learn PHP from scratch and if you have to choose one course, buy this one. This is a comprehensive course, but the instructor breaks it down pretty well where you are not overwhelmed. This course is very in-depth. Support was top-notch whenever I needed it.
This is a project-based course and there is a lot of practice exercises. Every section inside this course has a practice lecture at the end, reinforcing everything with went over in the lectures. I also created a small application you will be able to download to help you practice PHP. To top it off, we will build an awesome CMS like WordPress, Joomla, or Drupal.
I have learned a lot and already have been able to apply what I learned with clients. The instructor is very easy to follow and pleasant to listen to. Highly recommend this course and looking forward to other courses from Edwin. Bravo!
Developing Web Applications with PHP
Because PHP is a mature, and well-adopted language, many modern developers are developing web applications, web components, and websites with PHP.
In fact, 79% of all websites — including commercial e-commerce sites, banking sites, and social platforms — are written in PHP.
Whether you are a beginner or advanced PHP developer — or an IT manager — consider this your guide for learning what you need to know about developing web applications with PHP.
Read along or jump to one of the following sections:
Learn the Basics about PHP
PHP is an open source scripting language that can be used to write websites and any kind of web-based application and service. Wikipedia, Vimeo, Etsy, Mailchimp, Yahoo, WordPress, Flickr, and Magento are just a few of the commercial web apps written in the language.
Why is PHP so popular for developing web applications? PHP:
Read this blog, What Is PHP?, to learn more about PHP — including the meaning of the acronym and the language’s history — and to see a code example.
PHP applications run on a PHP server, such as Zend Server. To learn about PHP application servers, read this blog, PHP Server Basics.
PHP scripts use PHP functions to perform tasks. You can take advantage of the numerous built-in functions in PHP, or write your own. Read this blog, What Is a PHP Function?, for more information.
Global organizations in all industries are continuing to scale their PHP applications and develop new ones. To get a broader view of how organizations are using PHP, read this white paper, The Shifting Landscape of PHP Report.
Deploying Web Applications
Managing a PHP Application Server
When it comes to choosing a PHP application server, you have options. You can:
Options for Running Zend Server
In addition to running Zend Server on-premises, you can also run it as a cloud service in Amazon Cloud Services (AWS), Microsoft Azure, or Google Cloud.
Explore your options for running Zend Server in AWS by reading these blogs:
Using the PHP Application Magento for an E-Commerce Site?
If you are interested in using Magento for an e-commerce site — or if you are already using the platform — you can save time and money by using Zend Server. Understand how by exploring these resources:
Just Want to Use the Zend Server Debugger for your PHP Applications?
Laravel Homestead + Zend: The Best Boxed Gift
PHP Versions, Updates, and Upgrades
As an open source project, the public PHP community maintains PHP releases, including security patches and bug fixes, for two years from the initial release date. For an additional (third) year beyond the initial release, the community provides security updates only. You can manually download and install these updates, or you can opt for automated updates by using ZendPHP Enterprise or Zend Server.
Which Releases Are Supported Today?
Today, the organization provides comprehensive support for the current version, which is PHP 7.4. Organizations can get long-term support for PHP 5.6 and 7.1, which are no longer supported by the community, from Zend. You can read more in this blog, Use PHP 7 or PHP 5? Get the Long-Term Support That You Need.
What If You Are Running PHP 5.6 or PHP 7.1?
Today, many global organizations are running heavily trafficked, mission-critical websites on PHP 5.6 and 7.1. However, as this blog explains, running a supported version of PHP is critical for many reasons, including security.
Read this white paper, Maximize Performance and Mitigate Risk with PHP 7
Save Time and Money When It Comes to PHP Upgrades
Companies who are struggling to find the time and resources to manage an upgrade have options. The following documents explain how you can keep your PHP releases current and save time and money:
PHP 7.4
PHP 7.4 is the most current release. These resources detail the new capabilities it gives developers:
Developing Web Applications with PHP and the Laminas Framework (formerly Zend Framework)
Even though PHP is easy to learn, you can accelerate your development and minimize application errors by using a PHP framework. One of the most widely used frameworks is Laminas, which is an open source project formerly called Zend Framework.
The Laminas community manages and supports the framework. However, if you use it for corporate solutions, you can get long-term support for Laminas from Zend.
These resources provide general information about Laminas:
If you are using Zend Framework 3, get detailed information about using it in these documents:
Developing Web Applications with PHP: More Advanced Concepts
As you begin to create applications and services using PHP, it is important to understand PHP extensions, the PHP Foreign Function Interface (FFI), and best practices for security.
Using PHP Extensions and PHP FFI
PHP developers can use PHP extensions and a foreign function interface to add capabilities to their applications. To learn more about these advanced PHP capabilities, explore these resources:
Improving the Security of Your PHP Code
Websites and other public-facing web-based applications and services are particularly vulnerable to hackers because they are accessible via browsers. This is why it’s critical to follow PHP best practices for ensuring security.
It’s also helpful to understand how the community manages security issues in the PHP engine, and how you can use these same principles to improve the security of your web applications. Explore these resources for more information:
Many organizations also face added data protection challenges, especially in heavily regulated industries such as financial services and healthcare. Whether your applications have stringent security requirements or not, explore these blogs to learn about cryptography and how to protect personally identifiable information:
Speeding Application Performance
While development models have evolved dramatically over the past decade, many applications are still using traditional synchronous models, which slow performance. You can improve the speed of your PHP applications by writing code that can multi-task using the asynchronous model.
Why You Should Use Asynchronous PHP
Accelerate Your Apps with Tools in Zend Server
Another way you can speed up application performance — and improve insight into performance — is to use built-in tools in Zend Server. Read these resources to learn more:
Improving Development Efficiency
For more than a decade, companies have been improving the efficiency of development teams and bringing better products to market, faster, by adopting continuous integration workflows. Read how DevOps and continuous delivery can dramatically save time and improve quality:
Developing Web Applications with PHP on the IBM I Platform
Companies that use the IBM i platform can create modern, web-based applications that run natively on IBM i by using PHP. In addition to using IBM i data stores, PHP services can also use existing IBM i application logic.
Zend Server runs on IBM i. As a result, IBM i users can gain all the benefits of the PHP application server including the built-in tools for automated debugging, monitoring, and deployment.
Learn More about PHP Development on IBM i
Explore these resources to see how IBM i users can innovate and make use of their existing systems:
Get Started on PHP Development
Want to Try Zend Server?
Start your free 30-day trial of Zend Server today.
Building web applications in php
Welcome to the PHP MVC framework
This is a simple MVC framework for building web applications in PHP. It’s free and open-source.
It was created for the Write PHP like a pro: build an MVC framework from scratch course. The course explains how the framework is put together, building it step-by-step, from scratch. If you’ve taken the course, then you’ll already know how to use it. If not, please follow the instructions below.
Starting an application using this framework
See below for more details.
The Router translates URLs into controllers and actions. Routes are added in the front controller. A sample home route is included that routes to the index action in the Home controller.
Routes are added with the add method. You can add fixed URL routes, and specify the controller and action, like this:
Or you can add route variables, like this:
In addition to the controller and action, you can specify any parameter you like within curly braces, and also specify a custom regular expression for that parameter:
You can also specify a namespace for the controller:
Controllers respond to user actions (clicking on a link, submitting a form etc.). Controllers are classes that extend the Core\Controller class.
Controllers are stored in the App/Controllers folder. A sample Home controller included. Controller classes need to be in the App/Controllers namespace. You can add subdirectories to organise your controllers, so when adding a route for these controllers you need to specify the namespace (see the routing section above).
Controller classes contain methods that are the actions. To create an action, add the Action suffix to the method name. The sample controller in App/Controllers/Home.php has a sample index action.
Controllers can have before and after filter methods. These are methods that are called before and after every action method call in a controller. Useful for authentication for example, making sure that a user is logged in before letting them execute an action. Optionally add a before filter to a controller like this:
To stop the originally called action from executing, return false from the before filter method. An after filter is added like this:
Views are used to display information (normally HTML). View files go in the App/Views folder. Views can be in one of two formats: standard PHP, but with just enough PHP to show the data. No database access or anything like that should occur in a view file. You can render a standard PHP view in a controller, optionally passing in variables, like this:
The second format uses the Twig templating engine. Using Twig allows you to have simpler, safer templates that can take advantage of things like template inheritance. You can render a Twig template like this:
A sample Twig template is included in App/Views/Home/index.html that inherits from the base template in App/Views/base.html.
Models are used to get and store data in your application. They know nothing about how this data is to be presented in the views. Models extend the Core\Model class and use PDO to access the database. They’re stored in the App/Models folder. A sample user model class is included in App/Models/User.php. You can get the PDO database connection instance like this:
Web server configuration
Signup for the course here and understand how this framework is built from scratch, putting it all together step by step.
About
A simple PHP model-view-controller framework, built step-by-step as part of the «Write PHP like a pro: build an MVC framework from scratch» course on Udemy.
Создание web приложения на PHP с иcпользованием Firebird и Laravel
Привет Хабр!
В прошлой статье я рассказывал о пакете для поддержки СУБД Firebird в фреймворке Laravel. На этот раз мы рассмотрим процесс создания web приложения с использованием СУБД Firebird на языке PHP с использованием Laravel.
Обзор драйверов для работы с Firebird
Обзор расширения Firebird/Interbase
Расширение Firebird/Interbase появилось раньше и является наиболее проверенным. Для установки расширения Firebird/Interbase в конфигурационном файле php.ini необходимо раскомментировать строку
или для UNIX подобных систем строку
Это расширение требует, чтобы у вас была установлена клиентская библиотека fbclient.dll/gds32.dll (для UNIX подобных систем fbclient.so) соответствующей разрядности.
| Замечание для пользователей Win32/Win64 Для работы этого расширения системной переменной Windows PATH должны быть доступны DLL-файлы fbclient.dll или gds32.dll. Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому расширению требуются следующие файлы в переменной PATH: fbclient.dll или gds32.dll. |
В Linux это расширение в зависимости от дистрибутива можно установить одной из следующих команд (необходимо уточнить поддерживаемые версии, возможно, необходимо подключить сторонний репозиторий):
Это расширение использует процедурный подход к написанию программ. Функции с префиксом ibase_ могут возвращать или принимать в качестве одного из параметров идентификатор соединения, транзакции, подготовленного запроса или курсора (результат SELECT запроса). Этот идентификатор имеет тип resource. Все выделенные ресурсы необходимо освобождать, как только они больше не требуются. Я не буду описывать каждую из функций подробно, вы можете посмотреть их описание по ссылке, вместо этого приведу несколько небольших примеров с комментариями.
Вместо функции ibase_connect вы можете применять функцию ibase_pconnect, которая создаёт так называемые постоянные соединения. В этом случае при вызове ibase_close соединение не закрывается, все связанные с ней ресурсы освобождаются, транзакция по умолчанию подтверждается, другие виды транзакций откатываются. Такое соединение может быть использовано повторно в другой сессии, если параметры подключения совпадают. В некоторых случаях постоянные соединения могут значительно повысить эффективность вашего веб приложения. Это особенно заметно, если затраты на установку соединения велики. Они позволяют дочернему процессу на протяжении всего жизненного цикла использовать одно и то же соединение вместо того, чтобы создавать его при обработке каждой страницы, которая взаимодействует с SQL-сервером. Этим постоянные соединения напоминают работу с пулом соединений. Подробнее о постоянных соединениях вы может прочитать по ссылке.
Многие ibase функции позволяют не передавать в них идентификатор соединения (транзакции, подготовленного запроса). В этом случае эти функции используют идентификатор последнего установленного соединения (начатой транзакции). Я не рекомендую так делать, в особенности, если ваше веб приложение может использовать более одного подключения.
Функция ibase_query выполняет SQL запрос и возвращает идентификатор результата или true, если запрос не возвращает набор данных. Эта функция помимо идентификатора подключения (транзакции) и текста SQL запроса может принимать переменное число аргументов в качестве значений параметров SQL запроса. В этом случае наш пример выглядит следующим образом:
Очень часто параметризованные запросы используются многократно с различным набором значений параметров, в этом случае для повышения производительности рекомендуется использовать подготовленные запросы. В этом случае сначала необходимо сначала получить идентификатор подготовленного запроса с помощью функции ibase_prepare, а затем выполнять подготовленный запрос с помощью функции ibase_execute.
Подготовленные запросы гораздо чаще используются, когда необходима массовая заливка данных.
По последнему примеру можно увидеть один из недостатков этого расширения, а именно, функции с переменным числом аргументов не очень удобны для параметризованных запросов. Этот недостаток проявляется особенно ярко, если вы пытаетесь написать универсальный класс для исполнения любых запросов. Гораздо удобнее было бы, если параметры можно было передавать одним массивом. Конечно, существуют обходные пути вроде вот такого:
Расширение Firebird/Interbase не работает с именованными параметрами запроса.
По умолчанию расширение Firebird/Interbase автоматически стартует транзакцию по умолчанию после подключения. Транзакцию по умолчанию подтверждается при закрытии соединения функцией ibase_close. Её можно подтвердить или откатить раньше, если вызвать методы ibase_commit или ibase_rollback передав в них идентификатор соединения, или не передавая ни чего (если вы используете единственное соединение.)
Если вам необходимо явное управление транзакциями, то необходимо стартовать транзакцию с помощью функции ibase_trans. Если параметры транзакции не указаны, то транзакция будет начата с параметрами IBASE_WRITE | IBASE_CONCURRENCY | IBASE_WAIT. Описание констант для задания параметров транзакции можно найти по ссылке php.net/manual/ru/ibase.constants.php. Транзакцию необходимо завершать с помощью метода ibase_commit или ibase_rollback передавая в эти функции идентификатор транзакции. Если вместо этих функций использовать функции ibase_commit_ret или ibase_rollback_ret, то транзакция будет завершаться как COMMIT RETAIN или ROLLBACK RETAIN.
Умолчательные параметры транзакции подходят для большинства случаев. Дело в том что соединение с базой данных, как и все связанные с ним ресурсы существуют максимум до конца работы PHP скрипта. Даже если вы используете постоянные соединения, то все связанные ресурсы будут освобождены после вызова функции ibase_close. Несмотря на сказанное, настоятельно рекомендую завершать все выделенные ресурсы явно, вызывая соответствующие ibase_ функции.
Пользоваться функциями ibase_commit_ret и ibase_rollback_ret настоятельно не рекомендую, так как это не имеет смысла. COMMIT RETAIN и ROLLBACK RETAIN были введены для того, чтобы в настольных приложениях сохранять открытыми курсоры при завершении транзакции.
ibase функции не бросают исключение в случае возникновения ошибки. Часть функций возвращают false, если произошла ошибка. Обращаю ваше внимание, что результат сравнивать с false необходимо строгим оператором сравнения ===. Потенциально ошибка может возникнуть поле вызова любой ibase функции. Текст ошибки можно узнать с помощью функции ibase_errmsg. Код ошибки можно получить с помощью функции ibase_errcode.
Расширение Firebird/Interbase позволяет взаимодействовать с сервером Firebird не только посредством SQL запросов, но и используя Service API (см. функции ibase_service_attach, ibase_service_detach, ibase_server_info, ibase_maintain_db, ibase_db_info, ibase_backup, ibase_restore). Эти функции позволяют получить информацию о сервере Firebird, сделать резервное копирование, восстановление или получить статистику. Эта функциональность требуется в основном для администрирования БД, поэтому мы не будем рассматривать её подробно.
Расширение Firebird/Interbase так же поддерживает работу с событиями Firebird (см. функции ibase_set_event_handler, ibase_free_event_handler, ibase_wait_event).
Обзор расширения PDO (драйвер Firebird)
Расширение PDO предоставляет обобщённый интерфейс для доступа к различным типам БД. Каждый драйвер базы данных, в котором реализован этот интерфейс, может представить специфичный для базы данных функционал в виде стандартных функций расширения.
PDO и все основные драйверы внедрены в PHP как загружаемые модули. Чтобы их использовать, требуется их просто включить, отредактировав файл php.ini следующим образом:
Этот шаг необязателен для версий PHP 5.3 и выше, так как для работы PDO больше не требуются DLL.
Далее нужно выбрать DLL конкретных баз данных и либо загружать их во время выполнения функцией dl(), либо включить их в php.ini после php_pdo.dll. Например:
Эти DLL должны лежать в директории extension_dir. Драйвер pdo_firebird требует, чтобы у вас была установлена клиентская библиотека fbclient.dll/gds32.dll (для UNIX подобных систем fbclient.so) соответствующей разрядности.
В Linux это расширение в зависимости от дистрибутива можно установить одной из следующих команд (необходимо уточнить поддерживаемые версии, возможно, необходимо подключить сторонний репозиторий):
Соединения устанавливаются автоматически при создании объекта PDO от его базового класса. Конструктор класса принимает аргументы для задания источника данных (DSN), а также необязательные имя пользователя и пароль (если есть). Четвёртым аргументом можно передать массив специфичных для драйвера настроек подключения в формате ключ=>значение.
Установив свойство \PDO::ATTR_ERRMODE в значение \PDO::ERRMODE_EXCEPTION, мы установили режим, при котором любая ошибка, в том числе и ошибка при подключении к БД, будет возбуждать исключение \PDOException. Работать в таком режиме гораздо удобнее, чем проверять наличие ошибки после каждого вызова ibase_ функций.
| Для того чтобы PDO использовал постоянные соединения необходимо в конструктор PDO в массиве свойств передать PDO::ATTR_PERSISTENT => true. |
Метод query выполняет SQL запрос и возвращает результирующий набор в виде объекта \PDOStatement. В этот метод помимо SQL запросы вы можете передать способ возвращения значений при фетче. Это может быть столбец, экземпляр заданного класса, объект. Различные способы вызова вы можете посмотреть по ссылке http://php.net/manual/ru/pdo.query.php.
Если необходимо выполнить SQL запрос, не возвращающий набор данных, то вы можете воспользоваться методом exec, который возвращает количество задействованных строк. Этот метод не обеспечивает выполнение подготовленных запросов.
Если в запросе используются параметры, то необходимо пользоваться подготовленными запросами. В этом случае вместо метода query необходимо вызвать метод prepare. Этот метод возвращает объект класса \PDOStatement, который инкапсулирует в себе методы для работы с подготовленными запросами и их результатами. Для выполнения запроса необходимо вызвать метод execute, который может принимать в качестве аргумента массив с именованными или неименованными параметрами. Результат выполнения селективного запроса можно получить с помощью методов fetch, fetchAll, fetchColumn, fetchObject. Методы fetch и fetchAll могут возвращать результаты в различном виде: ассоциативный массив, объект или экземпляр определённого класса. Последнее довольно часто используется в MVC паттерне при работе с моделями.
Пример использования именованных параметров.
Для поддержки именованных параметров PDO производит предобработку запроса и заменяет параметры вида :paramname на «?», сохраняя при этом массив соответствия между именем параметра и номерами его позиций в запросе. По этой причине оператор EXECUTE BLOCK не будет работать, если внутри него используются переменные маркированные двоеточием. На данный момент нет никакой возможности заставить работать PDO с оператором EXECUTE BLOCK иначе, например, задать альтернативный префикс параметров, как это сделано в некоторых компонентах доступа.
Передать параметры в запрос можно и другим способом, используя так называемое связывание. Метод bindValue привязывает значение к именованному или неименованному параметру. Метод bindParam привязывает переменную к именованному или неименованному параметру. Последний метод особенно полезен для хранимых процедур, которые возвращают значение через OUT или IN OUT параметр (в Firebird механизм возврата значений из хранимых процедур другой).
Нумерация неименованных параметров в методах bindParam и bindValue начинается с 1.
По умолчанию PDO автоматически подтверждает транзакцию после выполнения каждого SQL запроса, если вам необходимо явное управление транзакциями, то необходимо стартовать транзакцию с помощью метода \PDO::beginTransaction. По умолчанию транзакция стартует с параметрами CONCURRENCY | WAIT | READ_WRITE. Завершить транзакцию можно методом \PDO::commit или \PDO::rollback.
К сожалению метод beginTransaction не предоставляет возможности изменить параметры транзакции, однако вы можете сделать хитрый трюк, задав параметры транзакции оператором SET TRANSACTION.
Ниже представлена сводная таблица возможностей различных драйверов для работы с Firebird.
| Возможность | Расширение Firebird/Interbase | PDO |
|---|---|---|
| Парадигма программирования | Функциональная | Объектно-ориентированная |
| Поддерживаемые БД | Firebird, Interbase, Yaffil и другие клоны Interbase. | Любая БД, для которой существует PDO драйвер, в том числе Firebird. |
| Работа с параметрами запросов | Только неименованные параметры, работать не очень удобно, поскольку используется функция с переменным числом аргументов. | Есть возможность работать как с именованными, так и неименованными параметрами. Работать очень удобно, однако некоторые возможности Firebird (оператор EXECUTE BLOCK) не работают. |
| Обработка ошибок | Проверка результата функций ibase_errmsg, ibase_errcode. Ошибка может произойти после вызова любой ibase функции при этом исключение не будет возбуждено. | Есть возможность установить режим, при котором любая ошибка приведёт к возбуждению исключения. |
| Управление транзакциями | Даёт возможность задать параметры транзакции. | Не даёт возможность задать параметры транзакции. Есть обходной путь через выполнение оператора SET TRANSACTION. |
| Специфичные возможности Interbase/Firebird | Есть возможность работать с расширениями Service API (backup, restore, получение статистики и т.д.), а также с событиями базы данных. | Не позволяет использовать специфичные возможности, с которыми невозможно работать, используя SQL. |
Из приведённой таблицы видно, что большинству фреймворков гораздо удобнее пользоваться PDO.
Выбор фреймворка для построения WEB приложения
Небольшие web сайты можно писать, не используя паттерн MVC. Однако чем больше становится ваш сайт, тем сложнее его поддерживать, особенно если над ним работает не один человек. Поэтому при разработке нашего web приложения сразу договоримся об использовании этого паттерна.
Установка Laravel и создание проекта
Прежде чем устанавливать Laravel вам необходимо убедится, что ваше системное окружение соответствует требованиям.
Самый простой способ установить composer под windows – это скачать и запустить инсталлятор Composer-Setup.exe. Инсталлятор установит Composer и настроит PATH, так что вы можете вызвать Composer из любой директории в командной строке.
Если необходимо установить Composer вручную, то необходимо запустить
Этот скрипт осуществляет следующие действия:
Подробнее об установке composer смотри здесь.
Теперь устанавливаем сам Laravel:
Если установка прошла успешно, то приступаем к созданию каркаса проекта.
Ждём завершения, после чего у нас будет создан каркас проекта. Описание структуры каталогов можно найти в документации по Laravel. Нас будут интересовать следующие каталоги:
В секции require добавьте требуемые пакеты следующим образом:
Теперь можно запустить обновление пакетов командой (запускать надо в корне веб приложения)
После выполнения этой команды новые пакеты будут установлены в ваше приложение. Теперь можно приступить к настройке. Для начала выполним команду
которая создаст дополнительные файлы конфигурации для пакета zofe/rapyd.
В файле config/app.php добавим два новых провайдера. Для этого добавим две новых записи в ключ providers
Теперь перейдём к файлу config/databases.conf, который содержит настройки подключения к базе данных. Добавим в ключ connections следующие строки
Поскольку мы будем использовать наше подключение в качестве подключения по умолчанию, установим следующее
В файле конфигурации config/rapid.php изменим отображение дат так, чтобы они были в формате принятом в России:
Первоначальная настройка закончена, теперь мы можем приступить непосредственно к написанию логики web приложения.
Создание моделей
Фреймворк Laravel поддерживает ORM Eloquent. ORM Eloquent — красивая и простая реализация паттерна ActiveRecord для работы с базой данных. Каждая таблица имеет соответствующий класс-модель, который используется для работы с этой таблицей. Модели позволяют читать данные из таблиц и записывать данные в таблицу.
Создадим модель заказчиков, для упрощения этого процесса в Laravel есть artisan команда.
Этой командой мы создаём шаблон модели. Теперь изменим нашу модель так, чтобы она выглядела следующим образом:
По аналогии создадим модель товаров – Product.
Теперь создадим модель для шапки счёт-фактуры.
В этой модели можно заметить несколько дополнительных функций. Функция customer возвращает заказчика связанного со счёт фактурой через поле CUSTOMER_ID. Для осуществления такой связи используется метод belongsTo, в который передаются имя класса модели и имя поле связи. Функция lines возвращают позиции счёт-фактуры, которые представлены коллекцией моделей InvoiceLine (будет описана далее). Для осуществления связи один ко многим в функции lines используется метод hasMany, в который передаётся имя класса модели и поле связи. Подробнее о задании отношений между сущностями вы можете почитать в разделе Отношения документации Laravel.
Функция pay осуществляет оплату счёт фактуры. Для этого вызывается хранимая процедура SP_PAY_FOR_INVOICE. В неё передаётся идентификатор счёт фактуры. Значение любого поля (атрибута модели) можно получить из свойства attributes. Вызов хранимой процедуры осуществляется с помощью метода executeProcedure. Этот метод доступен только при использовании расширения sim1984/laravel-firebird.
Теперь создадим модель для позиций счёт фактуры.
В этой модели есть функция product, которая возвращает продукт (модель App/Product), указанный в позиции счёт фактуры. Связь осуществляется по полю PRODUCT_ID с помощью метода belongsTo.
В этой модели мы переопределили операции insert, update и delete так, чтобы они выполнялись, используя хранимые процедуры. Эти хранимые процедуры помимо собственно операций вставки, редактирования и удаления пересчитывают сумму в шапке накладной. Этого можно было бы и не делать, но тогда пришлось бы выполнять в одной транзакции модификацию нескольких моделей. Как это сделать будет показано далее.
Теперь немного поговорим о том, как работать с моделями в Laravel для выборки, вставки, редактирования и удаления данных. Laravel оперирует данными с помощью конструктора запросов. Полное описание синтаксиса и возможностей этого конструктора вы можете найти по ссылке. Например, для получения всех строк поставщиков вы можете выполнить следующий запрос
Этот конструктор запросов является довольно мощным средством для построения и выполнения SQL запросов. Вы можете выполнять также фильтрация, сортировку и соединения таблиц, например
Однако гораздо удобнее работать с использованием моделей. Описание моделей Eloquent ORM и синтаксиса запроса к ним можно найти по ссылке laravel.ru/docs/v5/eloquent. Так для получения всех элементов коллекции поставщиков необходимо выполнить следующий запрос
Следующий запрос вернёт первые 20 поставщиков отсортированных по алфавиту.
Для сложных моделей связанные отношения или коллекции отношений могут быть получены через динамические атрибуты. Например, следующий запрос вернёт позиции счёт-фактуры с идентификатором 1.
Добавление записей осуществляется через создание экземпляра модели, инициализации его свойств и сохранение модели с помощью метода save.
Для изменения запись её необходимо найти, изменить необходимые атрибуты и сохранить методом save.
Для удаления записи её необходимо найти и вызвать метод delete.
Удалить запись по ключу можно и гораздо быстрее с помощью метода destroy. В этом случае можно удалить модель не получая её экземпляр.
Существуют и другие способы удаления записей, например «мягкое» удаление. Подробно о способах удаления вы можете прочитать по ссылке.
Теперь поговорим немного о транзакциях. Что это такое я рассказывать не буду, а лишь покажу, как их можно использовать совместно с Eloquent ORM.
Всё что находится в функции обратного вызова, которая является аргументом метода transaction, выполняется в рамках одной транзакции.
Создание контроллеров и настройка маршрутизации
Фреймворк Laravel имеет мощную подсистему маршрутизации. Вы можете отображать ваши маршруты, как на простые функции обратного вызова, так и на методы контроллеров. Простейшие примеры маршрутов выглядят вот так
В первом случае мы регистрируем обработчик GET запроса для корня сайта, во втором – для POST запроса с маршрутом /foo/bar.
Вы можете зарегистрировать маршрут сразу на несколько типов HTTP запросов, например
Из маршрута можно извлекать часть адреса и использовать его в качестве параметров функции-обработчика
Параметры маршрута всегда заключаются в фигурные скобки. Подробнее о возможности настройки маршрутизации вы можете посмотреть в документации глава «Маршрутизация». Маршруты настраиваются в файле app/Http/routes.php в Laravel 5.2 и routes/wep.php в Laravel 5.3.
Вместо того чтобы описывать обработку всех запросов в едином файле маршрутизации, мы можем организовать её использую классы Controller, которые позволяют группировать связанные обработчики запросов в отдельные классы. Контроллеры хранятся в папке app/Http/Controllers.
Все Laravel контроллеры должны расширять базовый класс контроллера App\Http\Controllers\Controller, присутствующий в Laravel по умолчанию. Подробнее о написании контроллеров вы можете почитать в документации в главе HTTP-Контроллеры.
Напишем наш первый контроллер.
Теперь необходимо связать методы контроллера с маршрутом. Для этого в routes.php (web.php) необходимо внести строку
Здесь имя контроллера отделено от имени метода символом @.
Для быстрого построения интерфейса с сетками и диалогами редактирования будем использовать пакет «zofe/rapyd». Мы его уже подключили ранее. Классы пакета zofe/rapyd берут на себя построение типичных запросов к моделям Eloquent ORM. Изменим контроллер заказчиков так, чтобы он выводил данные в сетку (grid), позволял производить их фильтрацию, а также добавлять, редактировать и удалять записи через диалоги редактирования.
Laravel по умолчанию использует шаблонизатор blade. Функция view находит необходимый шаблон в директории resources/views, делает необходимые замены в нём и возвращает текст HTML страницы. Кроме того, она передаёт в него переменные, которые становятся доступными в шаблоне. Описание синтаксиса шаблонов blade вы можете найти в документации в разделе Шаблонизатор Blade.
Шаблон для отображения заказчиков выглядит следующим образом:
Этот шаблон сам унаследован от шаблона master, кроме того он подключает шаблон menu. Меню довольно простое, состоит из трёх пунктов Заказчики, Продукты и Счёт фактуры.
В шаблоне master подключаются css стили и JavaScript файлы с библиотеками.
Шаблон редактора заказчика customer_edit выглядит следующим образом
Контроллер товаров сделан аналогично контроллеру поставщиков.
Контроллер счёт фактур является более сложным. В него добавлена дополнительная функция оплаты счёта. Оплаченные счёт фактуры подсвечиваются другим цветом. При просмотре счёт фактуры отображаются так же её позиции. Во время редактирования счёт фактуры есть возможность редактировать и её позиции. Далее я приведу текст контроллера с подробными комментариями.
Редактор счёт фактур имеет не стандартный для zofe/rapyd вид, поскольку нам необходимо выводить сетку с позициями счёт фактур. Для этого мы изменили шаблон invoice_edit следующим образом.
Теперь, когда все контроллеры написаны, изменим маршруты так, чтобы наш сайт на стартовой странице открывал список счёт фактур. Напоминаю, что маршруты настраиваются в файле app/Http/routes.php в Laravel 5.2 и routes/wep.php в Laravel 5.3.
Здесь маршрут /invoice/pay/
Напоследок приведу несколько скриншотов получившегося веб приложения.









