Translate

Поиск по этому блогу

среда, 11 октября 2017 г.

Как выйти из редактора VIM

Как выйти из vim редактора - это самый "больной вопрос" тех, кто не побоялся освоить это, достаточно полезное, приложение.
Ответов масса, но мне подошел именно такой.
Привожу его сразу, чтобы вас не утомлять - последовательно нажимать ESC : w q Enter - выход с сохранением

В некоторых случаях срабатывает - ESC : x Enter

ESC : q! Enter — выход без сохранения

Для терпеливых, о простой работе с этим редактором и Node.js
Последовательность действий при создании, сохранении и запуска файла в node.js из командной строки Bash.
  1. Проверить что раскладка ENG
  2. В нужной папке нажимаем пр клавишей и “Открыть Bash здесь”
  3. vim temp.js (temp.js - название файла который будет создан в той папке где вы открыли Bash)
  4. Для начала ввода нажимаем a и вводите код:
    Например:
     
    var a = 1;
    var b = 2;
    var sum = a + b;
    console.log(sum);
    
  5. Последовательно нажимаем ESC : w q Enter
  6. В консоле набираем node temp.js
Кстати, весь список команд теперь у вас всегда под рукой - https://vim.rtorr.com/. Есть русский перевод.

Vim Cheat Sheet


Ты не одинок!


В мае вопрос "Как выйти из vim?" отпраздновал свой юбилейный миллионный просмотр.


Чаще всего сложности с тем, чтобы покинуть Vim, возникают у фронт-енд разработчиков — то есть тех, которые преимущественно просматривают тэги JQuery, CSS и AngularJS. За ними следом идут разработчики на Microsoft (C# и SQL Server) и мобильные разработчики (Android и iOS). Они работают по большей части с интегрированными средами разработки (Visual Studio, Eclipse, Xcode и так далее), а не простыми текстовыми редакторами, поэтому неудивительно, что они более склонны угодить в Vim случайно, чем открыть его умышленно.

Разработчики, которые реже всего заходят в тупик, пишут на C, C++, Python и Ruby. Этот список, на мой взгляд, вполне закономерен: он представляет собой смесь низкоуровневых и скриптовых языков, которые обычно предполагают простой текстовый редактор без графической оболочки. Соответственно, у тех, кто работает с этими языками, достаточно опыта, чтобы выйти из Vim, не прибегая к помощи Google.

И еще раз :

ESC :q! Enter — выход без сохранения
ESC :wq Enter или ESC :x Enter — выход с сохранением


Да и приятности с плюшками - ниже шпаргалка для работы с vim

Файл настройки: ~/.vimrc
Можно редактировать файлы через сеть, например
:e ://user@host/path/to/the/file.txt
:Ex или :e ./ - файловый менеджер

== Основы ==
hjkl                      перемещение в разные стороны
i                         режим вставки
I                         добавление в начало строки
a                         режим добавления
A                         добавление в конец строки
o                         добавить строку сразу за текущей
O                         добавить строку перед текущей
R                         писать поверх имеющегося текста
u, :u[ndo]                отмена предыдущего действия (undo)
CTR-R, :red[o]            отмена отмены предыдущего действия (redo)
dd                        вырезать (удалить) строку
cc                        удалить и начать редактирование
yy                        копировать строку
p                         вставить из буфера обмена
d                      удалить n+1 строку
y                      скопировать n+1 строку
ESC                       перейти в режим просмотра
DEL                       удалить следующий символ
:                      перейти на строку #n
%                         перейти к парной скобке
:e **/filename.c          редактировать файл (с поиском по имени)
:w [fname]                записать изменения
:wa                       сохранить изменения во всех файлах
:q                        выйти из редактора
:q!                       выйти из редактора, не сохраняя изменения
:color              выбор цветовой схемы. цветвые схемы:
                            /usr/local/share/vim/vim72/colors/*.vim
:pwd                      текущий каталог
:cd [path]                перейти в другой каталог
:!команда                 выполнить команду - man, git, и так далее
                            стрелочками веерх и вниз можно автодополнять
                            команды и искать по истории
CTR+p или CTR+n           автоматическое дополнение текста
                            (в режиме редактирования)
CTR+r,=,            вставить выражение, например 5*2 - 3
                            (в режиме редактирования)
CTR+u, CTR+d              Page Up / Page Down
CTR+y, CTR+e              Перемотка вверх/вниз без движения курсора               

== Подсветка синтаксиса ==
:syntax on                включить подсветку
:syntax off               выключить подсветку (по умолчанию)

== Перенос строк ==
:set wrap                 разрешить word wrap (по умолчанию)
:set nowrap               запретить word wrap

== Печать ==
:ha[rdcopy]                   распечатать документ
:set printoptions=duplex:off  отключить двустороннюю печать

== Сворачивание ==
zc                        свернуть блок
zo                        развернуть блок
zM                        закрыть все блоки
zR                        открыть все блоки
za                        инвертирование
zf                        см :set foldmethod=manual
:set foldenable           включить свoрачивание
:set foldmethod=syntax    сворачивание на основе синтаксиса
:set foldmethod=indent    сворачивание на основе отступов
:set foldmethod=manual    выделяем участок с помощью v и говорим zf
:set foldmethod=marker    сворачивание на основе маркеров в тексте
:set foldmarker=bigin,end задаем маркеры начала и конца блока

== Маркеры ==
ma                        установить локальный маркер a
mB                        установить глобальный маркер B
`c                        перейти к локальному маркеру c
`0                        вернуться на позицию, на которой закончили
                            работу при закрытии vim
:marks                    просмотр маркеров
set viminfo='1000,f1      маркеры пишутся в ~/.viminfo, восстанавливаясь
                            при следующем запуске vim. маркер " хранит
                            последнюю позицию курсора в файле
== Сессии ==
mksession file.session    сохранить текущую сессию
source file.session       восстановить ранее сохраненную сессию

== Макросы ==
qa                        записать макрос с именем a
q                         в режиме записи макроса: закончить запись
@a                        выполнить макрос с именем a
@@                        повторить последний макрос

== Регистры ==
"ayy                      скопировать строку в регистр a
"bdd                      вырезать строку и поместить в регистр b
"С2d                      вырезать три строки и дописать в конец
                            регистра C
:reg [name1][name2][...]  просмотреть содержимое регистров

== Выделение ==
v + hjkl                  выделение текста
SHIFT + v                 выделить строку
CTR + v                   выделение прямоугольника
p                         вставить
y                         копировать
d                         удалить
gu                        к нижнему регистру
gU                        к верхнему регистру

== Отступы ==
[#]>                      сдвинуть выделенное вправо
[#]<                      сдвинуть выделенное влево
[#]>>                     сдвинуть строку вправо
[#]<<                     сдвинуть строку влево
set tabstop=#             для табуляции используется # пробелов
set shiftwidth=#          в командах отступа используется # пробелов 
set [no]expandtab         заменять ли табуляцию на соответствующее
                            число пробелов

== Поиск и замена в файле ==
/Выражение               поиск выражения в файле
\cВыражение              поиск без учета регистра
n                        следующее совпадение
N                        предыдущее совпадение
:%s/foo/bar/gi           замена строк, см http://eax.me/regular-expr/

== Поиск по всему проекту ==
:vimgrep /EXPR/ **/*.c   поиск по регулярному выражению
:copen                   показать все найденные места
:close                   скрыть все найденные места
:cn                      переход к следующему результату
:cp                      переход к предыдущему результату

== Нумерация строк ==
:set number              включить нумерацию строк
:set nonumber            отключить нумерацию строк

== Работа с вкладками (a.k.a табами) ==
:tabnew [fname]          создать таб
:tabs                    вывести список табов
:tabn                    следующий таб
:tabp                    предыдущий таб
gt                    перейти на таб #n
gt                       следующий таб
gT                       предыдущий таб
:tabm +1                 переместить таб вперед на одну позицию
:tabm -1                 переместить таб назад на одну позицию
:tabm 2                  переместить таб на заданную позицию
                           (нумерация начинается с нуля)

== Работа с окнами ==
:split                   горизонтальное разбиение
:vsplit                  вертикальное разбиение
Ctr+W, затем
  с                      закрыть окно
  +-                     изменение высоты текущего окна
  <>                     изменение ширины текущего окна
  =                      установить равный размер окон
  hjkl или стрелочки     перемещение между окнами

== Проверка орфографии ==
    mkdir -p ~/.vim/spell
    cd ~/.vim/spell
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl

:set spell spelllang=ru,en       включить проверку орфографии
:set nospell                     выключить проверку орфографии
]s                               следующее слово с ошибкой
[s                               предыдущее слово с ошибкой
z=                               замена слова на альтернативу из списка
zg                               good word
zw                               wrong word
zG                               ignore word

== Работа с кодировкой ==
e ++enc=<имя кодировки>         Редактирование файла в ??? кодировке
w ++enc=<имя кодировки>         Сохранить файл в новой кодировке
set fileencodings=utf-8,koi8-r  Список автоматически определяемых
                                  кодировок в порядке убывания
                                  приоритета

== Другое ==
:set [no]wildmenu          При авто-дополнении в командной строке над
                             ней выводятся возможные варианты
:set list                  Отображать табуляцию и переводы строк
q:                         История команд
.                          Повторение последней команды

Данная информация была любезно предоставлена сайтом - "Записки программиста"

                                                                                                                                                             

среда, 13 сентября 2017 г.

Создание сайта на PHP. Часть 1.

Схема работы сайта

Запос пользователя в адресной строке поступает в Front Controller где он обрабатывается с помощью роутера (маршрутизатора) в соответсвии с нашими маршрутами (роутами) прописанными в отдельном файле. Здесь же определяется какой контроллер и какой его метод (экшен) будет обрабатывать данный запрос. Уже назначенный контролер будет взаимодействовать с БД (базой данных) для получения необходимой информации и вызывать соответствующий файл представления (вид) для передачи пользователю запрашиваемой информации.

Для того, чтобы понять как это работает, лучше всего представить все в виде такой схемы:





Создаем файловую структуру сайта:

Папки:

  1. controller
  2. config
  3. components
  4. model
  5. views

Файлы:

  • index.php
  • .htaccess




Сразу приведу файл .htaccess полностью. Его нужно создать раньше, если вы работаете на OpenServer
DirectoryIndex index.php

AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteRUle ^(.*)$ index.php


index.php
<?php

// FRONT COTROLLER

// 1. Общие настройки

ini_set('display_errors', 1);
error_reporting(E_ALL);

// 2. Подключение файлов системы

define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/Router.php');

// 3. Установка соединения с БД


// 4. Вызов Router

$router = new Router();
$router->run();



В общих настройках мы задали отображение ошибок. Это нужно нам. но не посетителям, поэтому при завершении работ с сайтом, отладке и размещении на хосте, эти строки нам нужно будет изменить. Эта информация может испугать законопослушных и неопытных посетителей сайта, или может быть использована злоумышленниками для взлома сайта.


Для подключения мы используем полный путь на диске, который мы получаем с помощью функции dirname() и псевдо константы __FILE__.


Для проверки содержимого константы ROOT(полный путь от корня файловой системы), мы можем вывести переменную ROOT следующим образом:


еcho ROOT;

Сразу после строк создания константы ROOT и подключения файла Router.php -
define('ROOT', dirname(__FILE__));
require_once(ROOT . '/components/Router.php'); 

еcho ROOT;


Соединения с БД на этом этапе мы выполнять не будем и вернемся к нему позже.

Вызов роутера можно добавить сейчас или сразу после описания нашего ротера я следующем шаге. Он будет заключаться в создании экземпляра класса Роутер - $router = new Router() и запуске метода run() - $router->run();;

Коль скоро мы подключили файл Router.php, то нам остается его создать в папке components

B нем пропишем следующий строки :
<?php

class Router {

private $routes;//создаем массив в кот. хранятся наши маршруты

public function __constructor(){

}
public function run() {
    echo "It is file Roter.php";//Это для проверки подключения файла
}
}


Теперь, если мы откроем наш сайт, то увидим строки - It is file Roter.php -. Это говорит о том. что все подключено и правильно работает

Таким образом мы запустили наш Router и передали ему управление



Router

Первое с чего нам следует начать - маршруты (роуты). Они будут храниться в отдельном файле. Это очень удобно.

В папке config создадим для этого файл routes.php

Здесь мы и разместим наши роуты в виде массива:

routes.php

<?php
return array(
	'news' => 'news/index', // actionIndex in NewsController
	'products' => 'product/list', // actionList in ProductController
);


Роуты представляют собой пару в массиве.Запрос (то что пользователь набирает в адресной строке браузера) - Например: 'news' и строка - 'news/index', которая содержит имя контроллера news (первая часть), и имя экшена index(функции обработчика запроса) - вторая часть.

Этот код - 'news' => 'news/index' показывает, что будет вызван метод - actionIndex в контроллере - NewsController


Здесь мы сами решаем, какой метод и какой контроллер будет обрабатывать наш запрос. Делаем это мы на этапе разработки нашего сайта.


Теперь наша задача заставить наш Router прочитать маршруты и помнить их на время выполнения кода.


Специально для этого мы создали переменную private $routes; и конструктор public function __construct(), в котором мы прочитаем и запомним роуты.


В конструкторе пишем две строки:

$routesPath = ROOT.'/config/routes.php';
$this->routes = include($routesPath);

В первой - $routesPath = ROOT.'/config/routes.php'; мы указываем путь к роутам. Она состоит из пути к базовой директории ROOT и пути к созданному файлу.


Во второй строке мы присваиваем свойству routes -$this->routes массив, который хранится в файле routes.php

Теперь в наше свойство попадет нужный нам массив.

Для того чтобы проверить все ли у нас подключилось и правильно работает мы в методе run() сделаем распечатку массива : print_r($this->routes);

Получим такое сообщение на сайте :
Array ( [news] => news/index [products] => product/list ) It is file Router.php


Я буду выводить в тексте промежуточные состояния файла.

Все конечные версии вы можете посмотреть на Гугл Диске


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    public function run() {
        print_r($this->routes);
        echo "It is file Router.php";
    }
}

ЗАДАЧА 3

Теперь нам нужно реализовать метод run(). Это та часть, которая отвечает за анализ запроса и передачу управления

  1. Получение запроса
  2. Проверить наличие такого запроса в файле routes.php
  3. Если найдется совпадение. то определить какой контроллер и экшен будут обрабатывать это запрос
  4. Подключить файл, который содержит класс-контроллер
  5. Создать объект этого класса контроллер и вызвать нужный метод

Теперь по порядку:

Получение запроса


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    public function run() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        $uri = trim($_SERVER['REQUEST_URI'], '/');
        }
        echo $uri;
    }
}



Здесь мы из супер глобального массива $_SERVER по ключу 'REQUEST_URI' получаем нужную строке запроса

Теперь идем на наш сайт и в строке запроса дописываем /news/ - например. Или любое другое значение. Нажимаем Enter и видим значение из строки на нашем сайте.





Теперь, для того, чтобы сделать наш код понятнее и красивее, мы можем вынести этот код в отдельный метод - private function getURI(),а вызов сделаем из функции run() таким образом - $uri = $this->getURI();



Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;
       
    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
//Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        echo $uri;
    }
}

Метод getURI() мы сделали приватным, тем самым применили инкапсуляцию, потому как обращаться к этому методу мы планируем только из класса Роутер

Еще раз проверяем. Должно все работать точно так же как и в прошлый раз.

Проверить наличие такого запроса в файле routes.php

Теперь нам нужно найти такую строку запроса, которая содержится в переменной - $uri в наших маршрутах в файле -routes.php

Файл Router.php на данный момент полностью:
foreach ($this->routes as $uriPattern => $path) {
            echo "
$uriPattern -> $path"; }


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            echo "
$uriPattern -> $path"; } } }

Здесь для каждого маршрута $this->routes, который находится в нашем массиве,мы помещаем в переменную -$uriPattern строку запросов из роутов файла- routes.php(левая часть до => знака), а в переменную $path - путь обработчика


Перезагружаем страницу и видим:





Теперь мы будем сравнивать строку запроса $uri с данными которые содержатся в роутах- $uriPattern

Это легко сделать используя функцию preg_match() Для этого мы передаем в нее строку запроса - $uri и данные из наших роутов - $uriPattern

Для проверки выводим +. То есть если наш запрос в адресной строке будет совпадать с роутами то увидим на странице +.
 if(preg_match("~$uriPattern~", $uri)) {
                echo '+';
            }
        }

Сохранили изменения в файле. Заходим на сайт, перезагружаем и получаем:





Причем, если теперь вы введете в строку запроса значение несоответствующее нашим роутам ('news' => 'news/index','products' => 'product/list' ), то ничего не увидите на сайте.

То есть, пока что наш роутер готов обработать два запроса - news и products по определенному правилу.

Обратите внимание, что в качестве разделителей в патерне "~$uriPattern~" я использовал тильду, так как в нашем патерне могут содержаться слэши- '/' например при таком адресе страницы (' news/archive' => 'news/archive'). Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                echo '+';
            }
        }
    }
}

Итак, если условие соблюдается. то в переменной $path будут находиться имя контроллера и экшена. Чтобы в этом убедиться вам нужно заменить + в выводе echo на переменную $path - вот так: echo $path;

Идем на страницу сайта, вводим запрос (существующий) и получаем:





Определяем какой контроллер и экшен обрабатывают запрос

Мы можем это получить с помощью функции - explode(), чтобы разделить строку на две части

Результат вы можете увидеть на скриншоте, а код файла Router.php ниже





Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                $segments = explode('/', $path);
                echo '
';
                print_r ($segments);
                echo '
'; } } } }


В результате мы получили два элемента, первый относящийся к контроллеру и второй к экшену

Теперь мы можем получить имя контроллера:

$controllerName = array_shift($segments).'Controller';

Здесь мы используем функцию array_shift(), она получает первый элемент из массива $segments и удаляет его. К этому значению мы добавляем слово 'Controller', поскольку мы приняли за систему такое именование конроллеров.


теперь нам остается сделать заглавной первую букву в названии контроллера функцией :


$controllerName = ucfirst($controllerName);
И теперь можно сохранить и проверить наш сайт.



Таким образом мы получили контроллер. Точно так же мы получаем и наш экшен, с той лишь разницей, что экшен имеет свой стиль наименований (с добавление вначале слова action, чтобы отличать их от других методов класса.


$actionName = 'action'.ucfirst((array_shift($segments)));



Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                $segments = explode('/', $path);

                $controllerName = array_shift($segments).'Controller';
                $controllerName = ucfirst($controllerName);
                $actionName = 'action'.ucfirst((array_shift($segments)));
                    echo $controllerName.'
'.$actionName; } } } }


Да, кстати, теперь самое время добавить в папку controllers новые файлы ArticleController.php , NewsController.php и ProductController.php


Теперь нам сталось подключить нужный класс, создать его экземпляр и вызвать для определенного класса свой метод.


Вначале нам нужно создать наши контроллеры.


И вот теперь самое время добавить в папку controllers новые файлы ArticleController.php , NewsController.php и ProductController.php

Содержимое файлов NewsController.php и ProductController.php и ArticleController.php это соответствующий класс и один метод, который пустой и просто возвращает - true



NewsController.php
<?php

class NewsController {
	public function actionIndex()
		{
			return true;
		}

		
}




ProductController.php
<?php

class ProductController
{


		public function actionList()
		{
			return true;
		}


}


ArticleController.php
&jt;?php

class ArticleController
{


		public function actionList()
		{
			return true;
		}


}



Продолжаем работать над файлом Router.php и далее нам нужно подключить файл класса контроллера. Так как мы уже знаем его имя - $controllerName и используем определенный подход к названию фалов в папке контролеров, то сделать это очень просто вот таким кодом:



$controllerFile = ROOT . '/controllers/' .$controllerName. '.php';
				if (file_exists($controllerFile)) {
					include_once($controllerFile);
				}

В этой части кода $controllerFile = ROOT . '/controllers/' .$controllerName. '.php'; мы определяем файл который необходимо подключить. Для этого мы прописываем путь к нему используя имя класса


Далее мы непосредственно подключаем его, предварительно проверяя существует ли он?



if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                } 


Все необходимые действия в виде анализа запроса и подключения нужного файла мы выполнили


Создаем объект класса контрллера - $controllerObject = new $controllerName;. Вместо имени класса мы подставляем переменную, которая содержит строку с именем этого класса.


Далее для этого объекта $controllerObject мы вызываем метод $actionName(), точно так же мы используем переменную, которая содержит строку с названием нужного метода. В наших методах в файлах контолерах, мы писали return true для того, чтобы мы могли передать это значение определенной переменной - $result. В рузельтате, если метод сработал, то мы сможем об этом узнать и оборвать весь цикл - if ($result != null) { break; }. , который ищет совпадения в наших маршрутах.



$controllerObject = new $controllerName;
				$result = $controllerObject->$actionName();
				if ($result != null) {
					break;
				}



Теперь наша система практически готова. Осталось добавить несколько штрихов в наши методы контроллеров и проверим ее на работоспособность. Например в NewsController.php (перед return true) - echo "NewsController.php actionIndex ";





Это позволило нам убедиться, что зaпущенн нужный нам метод. Точно тоже мы проделаем и с другим контроллером


Теперь если мы зайдем по другому адресу, мы получим уже совсем другой контроллер с новым экшеном. Если мы зайдем по адресу, которого нет в таблице наших маршрутов (роутах) то мы не получим ничего.





Все файлы проекта можно посмотреть на Гугл Диске

Далее Модель, Представление и усовершенствования класса Роутер

                                                                                                                                                             

среда, 9 августа 2017 г.

Laravel Начало работы (1)

Установка фреймворка Laravel на OpenServer

Идем на сайт - laravel.com.Перед началом работы стоит проверить версию рнр (должна быть PHP >= 5.6.4). Для проверки версии зайдите в Настройки - > Модули OpenServer.
После этого, скопируйте ссылку на официальном сайте и откройте командную строку, как показано на картинке ниже. Можно использовать КС вашей операционной системы, но я пользуюсь от OpenServer. Для того, чтобы убедиться, что у вас установлен composer, нужно ввести composer в КС и нажать Enter. Если он не установлен, то его следует установить самостоятельно.
Далее нам нужно перейти в диреторию domains.Для этого используем команду cd c:\OpenServer\domains (путь к папке - c:\OpenServer\domains - измените, если он у вас отличается).
Далее введите скопированную команду в КС. Можно изменить название конечной папки установки (blog) на любое другое.
composer create-project --prefer-dist laravel/laravel blog

Нажмите Enter и дождитесь окончания установки.
Из всей структуры файлов, нас сейчас интересует .env На картинке он обведен красным. Открываем его в вашем текстовом редакторе.

Вверху второй абзац :-) Это то, что нам следует изменить, введя свои данные:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=minilaravel
- здесь имя вашей Базы Данных
DB_USERNAME=root - ваше имя пользователя
DB_PASSWORD= - ваш пароль (если нет, то оставить пустое место)
Теперь, если зайти на ваш сайт по адресу, то мы попадем не на главную страницу, а увидим список файлов. Чтобы это исправить, можно создать специальные настройки для OpenServer или в корневой директории вашего сайта создать отдельный файл .htaccess (подчеркнут красным на картинке выше). В него нужно прописать следующее:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$l [L]
Для настроек на локальном сервере - перейдите в Настройки -> Домены и Укажите имя вашего доена в первой графе, а во второй выберете папку public, как показано на картинке ниже.
Нажмете кнопку Добавить
Теперь при переходе на сайт посетители будут попадать на главную страницу сайта
                                                                                                                                                             

вторник, 8 августа 2017 г.

Создание Базы Данных на OpenServer

При изучении PHP по книгам и руководствам часто возникают проблемы с созданием базы данных (далее - БД) при работе с OpenSrver. Я решил рассмотреть этот вопрос по шагам. И так, приступаем!
  1. Открываем КС - командную строку и переходим в директорию БД OpenServer
    cd C:\OpenServer\modules\database\MariaDB-5.5\bin
    Соединяемся с БД - mysql -u root
    Получаем подтверждение об установленном соединении или повторяем все с начала.

  2. Для просмотра уже существующих БД набираем SHOW DATABASES;

  3. Для работы и перехода к существующей БД - набираемuse name_database;name_database - имя уже существующей БД.ИЛИ создаем новую БД с помощью команды CREATE DATABASE name_database;
    набираемuse name_database; для работы с вновь созданной базой данных

  4. Создаем таблицу в нашей БД, следующей командой:
    CREATE TABLE `aliens_abduction` (
    `first_name` VARCHAR(30) ,
    `last_name` VARCHAR(30) ,
    `whеп_it_hаррепеd` varchar(30) ,
    `hоw_lопg` VARCHAR(30) ,
    `how_many` VARCHAR(30) ,
    `alien_description` VARCHAR(lOO) ,
    `what_they_did` VARCHAR(lOO) ,
    `fang_spotted` VARCHAR(lO) ,
    `other` VARCHAR(lOO) ,
    `email` VАRСНАR(50)
    ) ;
    При наборе использовал Гравис - одинарная кавычка (буква Ё в англ раскладке)

  5. Для того, чтобы добавить данные в новую таблицу:
    INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, how_many, alien_description, what_they_did, fang_spotted, other, email)
    VALUES ('Салли', 'Джонс', '3 дня назад', '1 день' ,'четыре', 'зеленые с шестью щупальцами', 'мы просто разговаривали и играли с со6акой' , ' да', ' возможно, я видела вашу собаку, свяжитесь со мной','sally@mail.com');

  6. Для того, чтобы посмотреть все данные в таблице набираем:
    SELECT * FROM aliens_abduction



Теперь нам осталось сделать так, чтобы данные в таблицу добавлялись автоматически рнр-сценарием


  1. На OpenServer в папке domains у нас есть папка с нашим сайтом mysite. Внутри нее есть два файла report.html и report.php.

    report.html


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Aliens Abducted Me - Report an Abduction</title>
      <link rel="stylesheet" type="text/css" href="style.css" />
    </head>
    <body>
      <h2>Aliens Abducted Me - Report an Abduction</h2>
    
      <p>Share your story of alien abduction:</p>
      <form method="post" action="report.php">
        <label for="firstname">First name:</label>
        <input type="text" name="firstname" /><br />
        <label for="lastname">Last name:</label>
        <input type="text" name="lastname" /><br />
        <label for="email">What is your email address?</label>
        <input type="text" name="email" /><br />
        <label for="whenithappened">When did it happen?</label>
        <input type="text" name="whenithappened" /><br />
        <label for="howlong">How long were you gone?</label>
        <input type="text" name="howlong" /><br />
        <label for="howmany">How many did you see?</label>
        <input type="text" name="howmany" /><br />
        <label for="aliendescription">Describe them:</label>
        <input type="text" name="aliendescription" size="32" /><br />
        <label for="whattheydid">What did they do to you?</label>
        <input type="text" name="whattheydid" size="32" /><br />
        <label for="fangspotted">Have you seen my dog Fang?</label>
        Yes <input name="fangspotted" type="radio" value="yes" />
        No <input name="fangspotted" type="radio" value="no" /><br />
        <img src="fang.jpg" width="100" height="175"
          alt="My abducted dog Fang." /><br />
        <label for="other">Anything else you want to add?</label>
        <textarea name="other"></textarea><br />
        <input type="submit" value="Report Abduction" name="submit" />
      </form>
    </body>
    </html>
    
    


    report.php


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Aliens Abducted Me - Report an Abduction</title>
    </head>
    <body>
      <h2>Aliens Abducted Me - Report an Abduction</h2>
    
    <?php
      $first_name = $_POST['firstname'];
      $last_name = $_POST['lastname'];
      $when_it_happened = $_POST['whenithappened'];
      $how_long = $_POST['howlong'];
      $how_many = $_POST['howmany'];
      $alien_description = $_POST['aliendescription'];
      $what_they_did = $_POST['whattheydid'];
      $fang_spotted = $_POST['fangspotted'];
      $email = $_POST['email'];
      $other = $_POST['other'];
    
      $dbc = mysqli_connect('localhost', 'root', '', 'aliendatabase')
        or die('Error connecting to MySQL server.');
    
      $query = "INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, " .
        "how_many, alien_description, what_they_did, fang_spotted, other, email) " .
        "VALUES ('$first_name', '$last_name', '$when_it_happened', '$how_long', '$how_many', " .
        "'$alien_description', '$what_they_did', '$fang_spotted', '$other', '$email')";
    
      $result = mysqli_query($dbc, $query)
        or die('Error querying database.');
    
      mysqli_close($dbc);
    
      echo 'Thanks for submitting the form.<br />';
      echo 'You were abducted ' . $when_it_happened;
      echo ' and were gone for ' . $how_long . '<br />';
      echo 'Number of aliens: ' . $how_many . '<br />';
      echo 'Describe them: ' . $alien_description . '<br />';
      echo 'The aliens did this: ' . $what_they_did . '<br />';
      echo 'Was Fang there? ' . $fang_spotted . '<br />';
      echo 'Other comments: ' . $other . '<br />';
      echo 'Your email address is ' . $email;
    ?>
    
    </body>
    </html>
    
    

  2. Для соединения с уже созданной базой данных мы создали переменную с запросом:
    $dbc = mysqli_connect('localhost', 'root', '', 'aliendatabase') or die('Error connecting to MySQL server.');
    Первый параметр -localhost остается без изменений, затем идет имя пользователя (в моем случае - root), пароля нет - '' и имя БД - aliendatabase

  3. В следующей перменной мы поместили все действия с данными (куда попадет тот или иной параметр введенный пользователем)
    $query = "INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, " . "how_many, alien_description, what_they_did, fang_spotted, other, email) " . "VALUES ('$first_name', '$last_name', '$when_it_happened', '$how_long', '$how_many', " . "'$alien_description', '$what_they_did', '$fang_spotted', '$other', '$email')";
  4. Запрос к БД - $result = mysqli_query($dbc, $query) or die('Error querying database.');

  5. РНР-функция die () прерывает ход выполнения сценария и выводит сообщение о коде, который выполнить не удалось. Хотя это и не раскрывает всех причин неудачи в подробностях, функция die () все же сообщает нам: что-то случилось и необходимо принимать меры по решению проблемы. Если что-то не так с одним из четырех аргументов, необходимых для соединения функции mysqli_connect ( ) , или сервер баз данных не может быть найден, функция die () останавливает ход выполнения сценария и выводит сообщение об ошибке, которое передается ей в качестве аргумента в скобках.

  6. Функции mysqli_query () необходимо передать в качестве аргумента SQL-запрос в виде РНР-строки (значения переменной $query), для того чтобы произвести добавление данных о похищении космическими пришельцами.

  7. После всего закрываем БД - mysqli_close($dbc);

Более подробно о работе с базой данных смотрите мой пост —Введение в MySQL
                                                                                                                                                             

среда, 31 мая 2017 г.

Добавление файлов в существующий репозиторий GitHub

Вот то что я делал: Для начала я переместил все нужные файлы в папку, с которой уже отправлял файлы на этот репозиторий. Затем ввел последовательно следующие команды:
  1. git add .
  2. git commit -m""
  3. git status
  4. git push shared master
  5. git clone https://github.com/YaroslavW/templates.git
  6. git push https://github.com/YaroslavW/templates.git master


Результат всех действий на фото ниже:



В итоге все мои файлы оказались в нужном репозитории.

Иногда, требуется ввести и такую последовательность (пример c сайта "Тостер")

git init
git remote add origin https://github.com/splincode/unitrack.git
git checkout -b master
git clone https://github.com/splincode/unitrack.git
git add .
git config --global user.name 'splincode'
git config --global user.email 'omaxphp@yandex.com'
git config --global color.diff 'auto'
git config --global color.status 'auto'
git config --global color.branch 'auto'
git commit -m "Комментарий для коммита"
git push https://github.com/splincode/unitrack.git master

Если вы уже добавили сайт в репозиторий, но вспомнили, что забыли приложить к нему (скриншот например - site.jpg), то тогда последовательность действий следующая:


  1. git add site.jpg
  2. git commit -m'Your text for commit'
  3. git push
Материалы по Git, которые могут быть вам интересны:


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.


Удачного кодирования!                                                                                                                                                              

Телеграм канал - Full Stack JavaScript Developer
Помочь проекту (любая валюта). DONATE

вторник, 30 мая 2017 г.

Git - добавление репозитория на GitHub

Допустим, что у нас есть папка проекта на нашем компьютере, в которой находятся файлы html, css, js и прочие. наша задача сделать некоторые изменения в наших файлах, сохранит их и разместить наш проект на GitHub




  1. Переходим к папке проекта и нажимаем на нее правой кнопкой мыши. Вызываем Git Bash
  2. В нем делаем инициализацию репозитория - git init
  3. Добавляем наш проект в этот репозиторий (пока что все в Git)git add .
  4. Делаем первый коммит git commit -m"Первый коммит"
  5. Смотрим статус нашего проектаgit status

  6. Все изменения на панели - здесь :



  7. Теперь делаем изменения в нашем проекте. Например, мы добавим что-то в файл index.html
  8. Проверяем статус нашего проекта git status Видим, что изменения есть в файле index.html (отмечены красным).
  9. Делаем добавление наших файлов git add .
  10. Делаем второй коммит git commit -m"Второй коммит"
  11. Проверяем статус проекта git status - показывает что все чисто - см фото ниже :




  12. Теперь что -то удалим из файла и что-то добавим. Это важно сделать, для того, чтобы потом можно было увидеть разницу в изменениях (удаление, добавление), когда мы выложим проект на GitHub
  13. .
  14. Повторяем все снова -пункты 7, 8, 9.
  15. Теперь создаем пустой репозиторий на GitHub. Называем его - все равно как. Нас интересуют только две ссылки На фото ниже они отмечены красными стрелками. Они для каждого проекта свои и их нужно взять при создании репозитория.








  16. Добавляем их по очереди нажимая клавишу Enter
  17. Пришло время перейти в репозиторий и убедиться что все файлы добавлены. Там же мы можем увидеть и наши коммиты. Нажав на них мы сможем посмотреть, как изменялись наши файлы. Добавления - (+)выделены зеленым, а удаления красным (-)

Материалы по Git, которые могут быть вам интересны:


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.Пишите мне - kolesnikovy70 почта gmail.com


Удачного кодирования!                                                                                                                                                              

Телеграм канал - Full Stack JavaScript Developer
Помочь проекту (любая валюта). DONATE

понедельник, 29 мая 2017 г.

Git - Клонирование репозитория GitHub на компьютер

  1. Заходим на сайт GitHub, выбираем интересующий нас репозиторий и получаем ссылку.
  2. На компьютере создаем новую пустую папку. Щелкаем правой кнопкой мыши и выбираем Git Bash Here
  3. В открывшемся окне Git Bash пишем git clone вставляем здесь ссылку (пр.кнопкой мыши - "Paste")
  4. Нажимаем Enter и ждем когда все файлы репозитория GitHub будут скопированы в вашу вновь созданную папку.
Материалы по Git, которые могут быть вам интересны:


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.


Удачного кодирования!                                                                                                                                                              

Телеграм канал - Full Stack JavaScript Developer
Помочь проекту (любая валюта). DONATE

воскресенье, 28 мая 2017 г.

Введение в MySQL

Работать с MySQL можно тремя основными способами: используя командную строку, применяя веб-интерфейс наподобие phpMyAdmin и задействуя такой язык программирования, как PHP.


Более подробно о работе с базой данных смотрите мой пост —Создание Базы Данных на OpenServer

Начало работы с интерфейсом командной строки


Далее все только для пользователей Windows

Чтобы войти в интерфейс командной строки MySQL, следует выбрать команду Пуск-> Выполнить и в окне запуска ввести команду CMD, после чего нажать клавишу  Enter. В результате будет вызвано командное окно Windows. Находясь в этом окне, нужно ввести следующую команду (внося в нее соответствующие коррективы):

"C:\Program Files\Zend\MySQL55\bin\mysql" -u root
"C:\Program Files (x86)\Zend\MySQL55\bin\mysql" -u root

У меня для доступа к DB OpenServer было, например так:


Эта команда предписывает MySQL зарегистрировать вас как пользователя root без пароля. Теперь вы должны оказаться в среде MySQL и сможете приступить к вводу команд. Чтобы убедиться в том, что все работает должным образом, введи- те следующую команду, результат выполнения которой должен быть похож на показанный на картинку выше:
SHOW databases;
Я подключался к уже существующей базе, но у вас не должно быть трудностей, если вы пользуетесь OpenServer или Zend Server Free Edition WAMP

Отмена команды


Если, набрав часть команды, вы решили, что ее вообще не следует выполнять, то ни в коем случае не пользуйтесь сочетанием  Ctr+C ! Оно закроет программу. Вместо нее можно ввести символы \c и нажать клавишу  Enter. Порядок использования этой пары символов показан в примере

 Отмена ввода строки
бессмысленная для mysql строка \c

Ниже привел неполный список часто встречающихся команд:
Команды MySQL




Создание базы данных


Для создания новой базы данных по имени publications:
CREATE DATABASE publications;

При успешном выполнении команды будет выведено сообщение, пока не имеющее для нас особого смысла, — Query OK, 1 row affected (0.38 sec) (Запрос выполнен, обработана 1 строка за 0,38 с), но вскоре все станет на свои места. После создания базы данных с ней нужно будет работать, поэтому даем следующую команду:

USE publications;

Теперь должно быть выведено сообщение об изменении текущей базы данных (Database changed), и после этого база будет готова к продолжению работы со сле дующими примерами.

Организация доступа пользователей


Cоздадим пользователя, который получит доступ только к новой базе данных publications и ко всем ее объектам, и введем для этого следующую команду (заменив в ней имя пользователя jim и пароль mypasswd выбранными вами именем и паролем):

GRANT ALL ON publications.* TO 'jim'@'localhost'
 IDENTIFIED BY 'mypasswd';


Эта команда предоставляет пользователю jim@localhost полный доступ к базе данных publications при использовании пароля mypasswd. Работоспособность этой установки можно проверить, если ввести команду quit для выхода из системы, а затем перезапустить MySQL, воспользовавшись прежним способом запуска, но вместо -u root -p набрав -u jim -p или применив в этой строке созданное вами имя пользователя.

Создание таблицы


В данный момент вы должны находиться в системе MySQL, обладать всеми (ALL) правами. Осталось включить базу данных в работу, набрав следующую команду (и заменив publications именем своей базы данных, если оно у нее другое):


USE publications;


Теперь набираем построчно команды:
CREATE TABLE classics (
 author VARCHAR(128),
 title VARCHAR(128),
 type VARCHAR(16),
 year CHAR(4)) ENGINE MyISAM;


Чтобы проверить факт создания новой таблицы, наберите команду: DESCRIBE classics;

Данные будут отображаться в виде таблицы.

Я не буду останавливаться на типах данных. О них много написано и вы всегда можете посмотреть их в справочниках или книгах. Замечу, что использование типов данных будет влиять на производительность и возможности поиска. Поэтому, лучше все спланировать заранее.
Остановлюсь только на очень важном - AUTO_INCREMENT

Тип данных AUTO_INCREMENT


Иногда нужно обеспечить уникальность каждой строки, имеющейся в базе данных. В вашей программе это можно сделать за счет тщательной проверки вводимых дан- ных и обеспечения их различия хотя бы в одном из значений в любых двух строках. Но такой подход не защищен от ошибок и работает только в конкретных обстоятельствах. Например, в таблице один и тот же автор может появляться несколько раз. Точно так же, скорее всего, будет повторяться год издания и т. д. В таком случае гарантировать отсутствие продублированных строк будет довольно трудно.

В общем виде эта проблема решается за счет специально выделенного для этой цели дополнительного столбца.
Cначала нужно представить вам тип данных с автоприращением — AUTO_INCREMENT. В соответствии с названием столбца, которому назначен этот тип данных, его содержимому будет устанавливаться значение на единицу большее, чем значение записи в этом же столбце в предыдущей вставленной строке.

Можно добавлять новый столбец по имени id к таблице classics и придавать ему свойства автоприращения.
Добавление столбца id с автоприращением

ALTER TABLE classics ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY;

В нашем примере добавляется столбец по имени id, имеющий следующие характеристики.
 INT UNSIGNED — делает столбец способным принять целое число, достаточно большое для того, чтобы в таблице могло храниться более 4 млрд записей.
    
  • NOT NULL — обеспечивает наличие значения в каждой записи столбца. Многие программисты используют его в поле NULL, чтобы показать отсутствие в нем какого-либо значения. Но тогда могут появляться дубликаты, противоречащие самому смыслу существования этого столбца. Поэтому появление в нем значения NULL запрещено.
  • 
  • AUTO_INCREMENT — заставляет MySQL установить для этого столбца уникальное значение в каждой строке, как было описано ранее. Фактически мы не управляем значением, которое будет появляться в каждой строке этого столбца, но это и не нужно: все, о чем мы беспокоимся, — гарантия уникальности этого значения.
  • 
  • KEY — столбец с автоприращением полезно использовать в качестве ключа, поскольку вы будете стремиться искать строки на основе значений этого столбца.
Теперь каждая запись будет иметь уникальное число в столбце id, для первой записи это будет начальное число 1, а счет других записей будет вестись по нарастающей. Как только будет вставлена новая строка, в ее столбец id будет автоматически записано следующее по порядку число.

Этот столбец можно не добавлять после создания таблицы, а сразу включить в нее, слегка изменив формат команды CREATE

CREATE TABLE classics (
 author VARCHAR(128),
 title VARCHAR(128),
 type VARCHAR(16),
 year CHAR(4),
 id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY) ENGINE MyISAM;


Если хочется проверить, был ли добавлен столбец, нужно посмотреть имеющиеся в таблице столбцы и типы данных, воспользовавшись следующей командой:
DESCRIBE classics;

Для удаление столбца id:

ALTER TABLE classics DROP id;

Добавление данных к таблице


Многократно используя одну и ту же форму команды INSERT.
Заполнение таблицы classics
INSERT INTO classics(author, title, type, year)
 VALUES('Mark Twain','The Adventures of Tom Sawyer','Fiction','1876');
INSERT INTO classics(author, title, type, year)
 VALUES('Jane Austen','Pride and Prejudice','Fiction','1811');
INSERT INTO classics(author, title, type, year)
 VALUES('Charles Darwin','The Origin of Species','Non-Fiction','1856');
INSERT INTO classics(author, title, type, year)
 VALUES('Charles Dickens','The Old Curiosity Shop','Fiction','1841');
INSERT INTO classics(author, title, type, year)
 VALUES('William Shakespeare','Romeo and Juliet','Play','1594');


После каждой второй строки вы должны увидеть сообщение об успешной обработке запроса — Query OK. Как только будут введены все строки, наберите следующую команду, которая отобразит содержимое таблицы:

SELECT * FROM classics;
Результат должен быть похож на этот:


Переименование таблиц


Переименование таблиц, как и любые другие изменения ее структуры или метаданных, осуществляются посредством команды ALTER. Поэтому, чтобы, к примеру, изменить имя таблицы classics на pre1900, воспользуйтесь следующей командой:

ALTER TABLE classics RENAME pre1900;

Для того, чтобы вернуть таблице ее прежнее имя, нужно будет ввести следующую команду:

ALTER TABLE pre1900 RENAME classics;

Изменение типа данных столбца


Для изменения типа данных столбца также используется команда ALTER, но в этом случае вместе с ней применяется ключевое слово MODIFY. Поэтому для изменения типа данных столбца year с CHAR(4) на SMALLINT (для которого потребуется только 2 байта памяти, что способствует экономии дискового пространства) нужно ввести следующую команду:

ALTER TABLE classics MODIFY year SMALLINT;

После этого, если для MySQL есть смысл конвертировать тип данных, система автоматически изменит данные, сохраняя их значение. В данном случае она заменит каждое строковое значение сопоставимым с ним целым числом, пока строку можно будет распознать как отображение целого числа

Добавление нового столбца


Предположим, что таблица создана и заполнена большим объемом данных и тут выяснилось, что нужен еще один столбец. Не стоит расстраиваться. Посмотрите, как можно добавить к таблице новый столбец pages, который будет использоваться для хранения количества страниц, имеющихся в книге:
ALTER TABLE classics ADD pages SMALLINT UNSIGNED;
Эта команда добавляет новый столбец по имени pages, в котором используется тип данных UNSIGNED SMALLINT, подходящий для хранения значений вплоть до 65 535. Этого наверняка более чем достаточно для любой когда-либо изданной книги!
И если запросить у MySQL описание обновленной таблицы, воспользовавшись показанной далее командой DESCRIBE, то можно будет увидеть внесенные в нее изменения:
DESCRIBE classics;




Переименование столбца


Посмотрев еще раз на рис. 8.5, можно заметить, что наличие в таблице столбца type может привести к путанице, поскольку такое же имя используется MySQL для идентификации типа данных. Но это не проблема — изменим имя этого столбца на category:

ALTER TABLE classics CHANGE type category VARCHAR(16);

Обратите внимание на добавление VARCHAR(16) в конце этой команды. Это связано с тем, что ключевое слово CHANGE требует указания типа данных даже в том случае, если вы не собираетесь его изменять, и VARCHAR(16) — тот самый тип данных, который был указан при создании столбца type.

Удаление столбца


Поразмыслив, можно прийти к выводу, что столбец pages, в котором хранится количество страниц, не представляет для этой базы данных особой ценности, поэтому его можно удалить, используя ключевое слово DROP:

ALTER TABLE classics DROP pages;


Удаление таблицы


Удалить таблицу очень просто. Достаточно ввести такой код:
DROP TABLE имя таблицы;

Для тренировки, вы можете создать новую таблицу, посмотреть ее и удалить следующей последовательностью строк кода в КС:

CREATE TABLE disposable(trash INT);
DESCRIBE disposable;
DROP TABLE disposable;
SHOW tables;


Индексы

По мере роста таблицы, поиск в базе данных будет все более затрудняться. Для этого есть смысл создать "картотеку".

Создание индекса


Добавление индексов к таблице classics
ALTER TABLE classics ADD INDEX(author(20));
ALTER TABLE classics ADD INDEX(title(20));
ALTER TABLE classics ADD INDEX(category(4));
ALTER TABLE classics ADD INDEX(year);
DESCRIBE classics;


Использование команды CREATE INDEX


Индекс можно добавить не только командой ALTER TABLE, но и командой CREATE INDEX.
Эти две команды являются равнозначными, за исключением того, что CREATE INDEX не может использоваться для создания индекса типа первичного ключа — PRIMARY KEY
Эти две команды эквивалентны
ALTER TABLE classics ADD INDEX(author(20));
CREATE INDEX author ON classics (author(20));

Добавление индексов при создании таблиц


Чтобы добавить индекс, не нужно выжидать какое-то время после создания таблицы. Это может отнять много времени, поскольку добавление индекса к большой таблице — длительный процесс. Поэтому рассмотрим команду, создающую таблицу classics с уже имеющимися индексами.

Создание таблицы classics с индексами
CREATE TABLE classics (
 author VARCHAR(128),
 title VARCHAR(128),
 category VARCHAR(16),
 year SMALLINT,
 INDEX(author(20)),
 INDEX(title(20)),
 INDEX(category(4)),
 INDEX(year)) ENGINE MyISAM;


Первичные ключи


Здесь стоит вспомнить о AUTO_INCREMENT где рассматривался создаваемый столбец id с автоприращением, он может быть использован в качестве первичного ключа для этой таблицы.
Но мы решили пойти другим путем.
B этом наборе данных каждый год имеет уникальное значение, поэтому для идентификации каждой обновляемой строки можно воспользоваться столбцом year.

Заполнение столбца isbn данными и использование первичного ключа
ALTER TABLE classics ADD isbn CHAR(13);
UPDATE classics SET isbn='9781598184891' WHERE year='1876';
UPDATE classics SET isbn='9780582506206' WHERE year='1811';
UPDATE classics SET isbn='9780517123201' WHERE year='1856';
UPDATE classics SET isbn='9780099533474' WHERE year='1841';
UPDATE classics SET isbn='9780192814968' WHERE year='1594';
ALTER TABLE classics ADD PRIMARY KEY(isbn);
DESCRIBE classics;




Чтобы создать первичный ключ при создании таблицы classics, можно воспользоваться командой И в этом случае, если вы хотите испробовать эту команду в работе, нужно заменить имя classics в строке 1 каким-нибудь другим, а затем удалить проверочную таблицу.
Создание таблицы classics с первичным ключом
CREATE TABLE classics (
 author VARCHAR(128),
 title VARCHAR(128),
 category VARCHAR(16),
 year SMALLINT,
 isbn CHAR(13),
 INDEX(author(20)),
 INDEX(title(20)),
 INDEX(category(4)),
 INDEX(year),
 PRIMARY KEY (isbn)) ENGINE MyISAM;


Создание индекса FULLTEXT


В отличие от обычного индекса, имеющийся в MySQL индекс FULLTEXT позволяет осуществлять сверхбыстрый поиск целых столбцов текста. Он сохраняет каждое слово каждой строки данных в специальном индексе, в котором можно вести поиск, используя «естественный язык» наподобие того, что применяется в поисковом механизме.

Рассмотрим некоторые особенности индексов FULLTEXT, о которых нужно знать.
    
  • Индексы FULLTEXT могут применяться только с таблицами типа MyISAM, использующими исходное ядро (механизм хранения) MySQL (MySQL поддерживает как минимум десять различных ядер). Если нужно привести таблицу к типу MyISAM, можно применить команду MySQL:
    ALTER TABLE tablename ENGINE = MyISAM;
  • 
  • Индексы FULLTEXT могут создаваться только для столбцов с типами данных CHAR, VARCHAR и TEXT.
  • 
  • Определение индекса FULLTEXT может быть дано в инструкции CREATE TABLE при создании таблицы или добавлено позже с использованием инструкции ALTER TABLE (или CREATE INDEX).
  • 
  • Намного быстрее будет загрузить большие наборы данных в таблицу, не имеющую индекса FULLTEXT, а затем создать индекс, чем загружать их в таблицу, у которой уже имеется индекс FULLTEXT.
Чтобы создать индекс FULLTEXT, примените его к одной или нескольким записям, в котором индекс FULLTEXT добавляется к двум столбцам — author и title, принадлежащим таблице classics (этот индекс является дополнением к тем, что уже были созданы, и не влияет на их работу).

Добавление индекса FULLTEXT к таблице classics
ALTER TABLE classics ADD FULLTEXT(author,title);
Теперь в этой паре столбцов можно вести поиск с использованием индекса FULLTEXT. Такая возможность могла бы проявиться в полную силу, если бы вы могли теперь ввести весь текст этих книг в базу данных (учитывая, что они не защищены авторскими правами), тогда они были бы полностью доступны для поиска.

Создание запросов к базе данных MySQL


Итак, мы создали базу данных MySQL и таблицы, заполнили их данными и добавили к ним индексы, чтобы ускорить поиск. Теперь настало время посмотреть, как именно ведется этот поиск и какие для этого имеются команды и спецификаторы.

SELECT


Oсновной синтаксис имеет следующий вид:
SELECT что-нибудь FROM имя_таблицы;

Этим что-нибудь, как вы уже видели, может быть символ звездочки (*), означающий «каждый столбец», вместо него можно указать какие-нибудь конкретные столбцы. В примере 8.16 показано, как выбрать только автора и название (author и title) и только название и ISBN.
Две разные инструкции SELECT
SELECT author,title FROM classics;
SELECT title,isbn FROM classics;


SELECT COUNT


Другой заменой параметра что-нибудь является функция COUNT, которая может быть использована множеством способов. В примере 8.17 она отображает количество строк в таблице за счет передачи ей в качестве параметра символа звездочки (*), означающего «все строки». В соответствии с вашими ожиданиями будет возвращено число 5, поскольку в таблицу внесены сведения о пяти книгах.

Подсчет количества строк
SELECT COUNT(*) FROM classics;

SELECT DISTINCT


Этот спецификатор (и его синоним DISTINCTROW) позволяет исключать множество записей, имеющих одинаковые данные.Например авторов.

Давайте создадим запись с таким же автором, а потом отсортируем

Дублирование данных
INSERT INTO classics(author, title, category, year, isbn)
 VALUES('Charles Dickens','Little Dorrit','Fiction','1857','9780141439969');


Команда SELECT со спецификатором DISTINCT и без него
SELECT author FROM classics;
SELECT DISTINCT author FROM classics;


DELETE


Когда нужно удалить строку из таблицы, применяется команда DELETE. Ее синтаксис похож на синтаксис команды SELECT, он позволяет сузить диапазон удаляемой информации до конкретной строки или строк путем использования таких спецификаторов, как WHERE и LIMIT.
Теперь, если вы вводили команду, и изучали работу спецификатора DISTINCT, нужно удалить Little Dorrit путем ввода команды,

Удаление новой записи
DELETE FROM classics WHERE title='Little Dorrit';


WHERE


Ключевое слово WHERE позволяет сузить диапазон действия запроса, возвращая толь- ко те данные, в отношении которых конкретное выражение возвращает истинное значение.

Использование ключевого слова WHERE
SELECT author,title FROM classics WHERE author="Mark Twain";
SELECT author,title FROM classics WHERE isbn="9781598184891 ";


При проведении поисковых операций можно также осуществлять проверку на соответствие шаблону, для чего применяется спецификатор LIKE, позволяющий вести поиск в разных частях строк. Этот спецификатор должен использоваться с символом % до или после некоторого текста. Если его поместить до текста, это будет означать «что-нибудь до», а если после текста — «что-нибудь после».

Использование спецификатора LIKE
SELECT author,title FROM classics WHERE author LIKE "Charles%";
SELECT author,title FROM classics WHERE title LIKE "%Species";
SELECT author,title FROM classics WHERE title LIKE "%and%";


Символ % будет также соответствовать пустому месту в той позиции, которую он занимает. Иными словами, он может соответствовать пустой строке.

LIMIT


Ограничение диапазона выводимых строк
Спецификатор LIMIT позволяет выбрать количество выводимых в запросе строк и место, с которого таблица начнет их возвращать. Когда передается один параметр, он указывает MySQL начать действие спецификатора с верхней части результатов и вернуть только то количество строк, которое задано этим параметром. Если передать спецификатору два параметра, то первый укажет смещение относительно начала результатов, которое MySQL должна учесть при их отображении, а второй укажет, сколько строк нужно вывести. Можно представить, что первый параметр сообщает: «Нужно пропустить это количество результатов, ведя счет сверху».

Ограничение количества возвращаемых результатов
SELECT author,title FROM classics LIMIT 3;
SELECT author,title FROM classics LIMIT 1,2;
SELECT author,title FROM classics LIMIT 3,1;


MATCH...AGAINST


Конструкция MATCH...AGAINST может быть применена к столбцу, для которого был создан индекс FULLTEXT (см. выше пункт «Создание индекса FULLTEXT»). Используя эту конструкцию, можно вести поиск, применяя в качестве критерия элементы обычного языка, как при работе с поисковыми механизмами Интернета. В отличие от конструкций WHERE...= или WHERE...LIKE, конструкция MATCH...AGAINST позволяет вводить в поисковый запрос несколько слов и проверять на их наличие все слова в столбцах, имеющих индекс FULLTEXT. Индексы FULLTEXT нечувствительны к регистру букв, поэтому неважно, какой именно регистр используется в ваших запросах.

Использование конструкции MATCH...AGAINST с индексами FULLTEXT
SELECT author,title FROM classics
 WHERE MATCH(author,title) AGAINST('and');
SELECT author,title FROM classics
 WHERE MATCH(author,title) AGAINST('old shop');
SELECT author,title FROM classics
 WHERE MATCH(author,title) AGAINST('tom sawyer');


MATCH...AGAINST...IN BOOLEAN MODE


При желании придать своим запросам с конструкцией MATCH...AGAINST более широкие возможности нужно воспользоваться булевым режимом. Это изменение выражается в том, что стандартный запрос по индексу FULLTEXT ведет поиск любой комбинации искомых слов, не требуя наличия всех этих слов в тексте. Наличие отдельного слова в столбце приводит к тому, что поисковая операция возвращает строку. Булев режим позволяет также ставить впереди искомых слов знак + или, чтобы показать, что они должны быть включены или исключены. Если обычный булев режим требует «искать присутствие любого из этих слов», то знак «плюс» означает, что «это слово обязательно должно присутствовать, иначе строку возвращать не нужно». Знак «минус» означает, что «этого слова быть не должно, а если оно присутствует, то строку возвращать не нужно».

Использование MATCH...AGAINST...IN BOOLEAN MODE
SELECT author,title FROM classics
 WHERE MATCH(author,title)
 AGAINST('+charles -species' IN BOOLEAN MODE);
SELECT author,title FROM classics
 WHERE MATCH(author,title)
 AGAINST('"origin of"' IN BOOLEAN MODE);


Как, наверное, и ожидалось, первый запрос вернет только запись о книге The Old Curiosity Shop Чарльза Диккенса. Запись о книге Чарльза Дарвина игнорируется, поскольку из результата должна быть исключена любая строка, содержащая слово species.

UPDATE...SET


Эта конструкция позволяет обновлять содержимое поля. Если нужно изменить содержимое одного или нескольких полей, сначала следует сузить область действия запроса до того поля или полей, которые будут подвергаться изменениям, практически тем же способом, который применялся в команде SELECT. Использование UPDATE...SET
UPDATE classics SET author='Mark Twain (Samuel Langhorne Clemens)'
 WHERE author='Mark Twain';
UPDATE classics SET category='Classic Fiction'
 WHERE category='Fiction';


В первом запросе, действие которого затрагивает только одну строку, к литературному псевдониму Mark Twain добавляется настоящее имя писателя — Samuel Langhorne Clemens, заключенное в скобки. А вот второй запрос воздействует на три столбца, поскольку он заменяет все появления слова Fiction в столбце category термином Classic Fiction.

ORDER BY


Спецификатор ORDER BY позволяет отсортировать возвращаемые результаты по одному или нескольким столбцам в возрастающем или в убывающем порядке.

Использование ORDER BY
SELECT author,title FROM classics ORDER BY author;
SELECT author,title FROM classics ORDER BY title DESC;


Первый запрос возвращает издания, отсортированные по авторам в возрастающем алфавитном порядке (этот режим используется по умолчанию), а второй возвращает их отсортированными по названию в убывающем порядке.

Если нужно отсортировать все столбцы по авторам, а затем в убывающем порядке по году издания (чтобы сначала стояли самые последние), нужно ввести следующий запрос:

SELECT author,title,year FROM classics ORDER BY author,year DESC;


Можно также указать порядок сор- тировки этого столбца по возрастанию и в явном виде, в результате будут получены аналогичные результаты:

SELECT author,title,year FROM classics ORDER BY author ASC,year DESC;


GROUP BY


Точно так же, как и при использовании ORDER BY, можно сгруппировать результаты, возвращаемые запросом, с помощью спецификатора GROUP BY, который больше всего подходит для извлечения информации о группе данных. Например, если нужно узнать, сколько изданий каждой категории присутствует в таблице classics, можно ввести запрос

SELECT category,COUNT(author) FROM classics GROUP BY category;


Объединение таблиц


Управление несколькими таблицами, содержащими различные виды информации в одной базе данных, считается вполне обычным делом. Рассмотрим, к при- меру, таблицу клиентов — customers, для которой нужно обеспечить возможность использования перекрестных ссылок с приобретенными ими книгами из таблицы classics. Чтобы создать эту новую таблицу и поместить в нее информацию о трех клиентах и их покупках, введите команды :

Создание и заполнение таблицы customers
CREATE TABLE customers (
 name VARCHAR(128),
 isbn VARCHAR(13),
 PRIMARY KEY (isbn)) ENGINE MyISAM;
Глава 8. Введение в MySQL
225
INSERT INTO customers(name,isbn)
 VALUES('Joe Bloggs','9780099533474');
INSERT INTO customers(name,isbn)
 VALUES('Mary Smith','9780582506206');
INSERT INTO customers(name,isbn)
 VALUES('Jack Wilson','9780517123201');
SELECT * FROM customers;




Разумеется, в настоящей таблице, содержащей сведения о покупателях, будут присутствовать также адреса, номера телефонов, адреса электронной почты и т. д., но на данном этапе изучения они для нас не представляют интереса. При создании новой таблицы следует обратить внимание на то, что у нее есть кое-что общее с таблицей classics: столбец под названием isbn. Поскольку его предназначение в обеих таблицах совпадает (ISBN всегда является ссылкой на одну и ту же книгу), этот столбец можно использовать для связывания двух таблиц вместе в едином запросе.
Объединение двух таблиц в одном запросе SELECT
SELECT name,author,title from customers,classics
 WHERE customers.isbn=classics.isbn;




Видите, как этот запрос искусно связал вместе обе таблицы, чтобы продемонстрировать книги из таблицы classics, приобретенные покупателями из таблицы customers?

NATURAL JOIN


Используя NATURAL JOIN, можно сократить количество вводимого текста и сделать запросы немного более понятными. В этом виде объединения участвуют две таблицы, в которых автоматически объединяются столбцы с одинаковыми именами. Для получения тех же результатов, можно ввести следующий запрос:
SELECT name,author,title FROM customers NATURAL JOIN classics;

JOIN...ON


Если нужно указать столбец, по которому следует объединить две таблицы, используется конструкция JOIN...ON, благодаря которой можно получить те же результаты:
SELECT name,author,title FROM customers
 JOIN classics ON customers.isbn=classics.isbn;


Использование ключевого слова AS


Можно сократить количество вводимого текста и улучшить читаемость запроса за счет создания псевдонимов с помощью ключевого слова AS. После имени таблицы нужно поставить AS, а затем используемый псевдоним. Следующий код идентичен по своей работе коду, приведенному выше:
SELECT name,author,title from
 customers AS cust, classics AS class WHERE cust.isbn=class.isbn;


Использование логических операторов


Для дальнейшего сужения пространства выбора в запросах MySQL, использующих ключевое слово WHERE, можно также задействовать логические операторы AND, OR и NOT. В примере ниже, показаны варианты применения каждого из них, но их можно использовать в любых сочетаниях.

Использование логических операторов
SELECT author,title FROM classics WHERE
 author LIKE "Charles%" AND author LIKE "%Darwin";
SELECT author,title FROM classics WHERE
 author LIKE "%Mark Twain%" OR author LIKE "%Samuel Langhorne Clemens%";
SELECT author,title FROM classics WHERE
 author LIKE "Charles%" AND author NOT LIKE "%Darwin";


Первый запрос выбран потому, что Чарльз Дарвин может фигурировать в некоторых строках под своим полным именем — Чарльз Роберт Дарвин. А запрос возвращает сведения о книгах, для которых значение столбца author начинается с Charles и заканчивается Darwin. Второй запрос ищет книги, принадлежащие перу Марка Твена, используя для этого либо литературный псевдоним — Mark Twain, либо настоящее имя писателя — Samuel Langhorne Clemens. Третий запрос возвращает книги с авторами, чье имя Charles, а фамилия не Darwin.

Функции MySQL


Стремление применять функции MySQL при таком обилии достаточно мощных функций PHP может вызвать недоумение. Ответ предельно прост: функции MySQL работают с данными непосредственно в самой базе. А при использовании PHP приходится сначала извлекать строку данных из MySQL, выполнять обработку, а затем выдавать первоначально задуманный запрос к базе данных. Применение встроенных функций MySQL не только существенно сокращает время обработки сложных запросов, но и упрощает сами запросы. При желании подробные сведения обо всех доступных строковых функциях и функциях даты и времени можно найти по следующим адресам:

                                                                                                                                                             


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.Пишите мне - kolesnikovy70 почта gmail.com