Работа с базами данных в PHP, функции для работы с базами данных

Функции PHP для работы с базами данных



Список всех функций с расширением MySQLi: php.net


SQL - это язык запросов, который позволяет общаться с базами данных, то есть, выбирать информацию от туда, либо записывать информацию туда.

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



Алгоритм работы с базами данных

Подключение к базе данных

Установка кодировки соединения

Запрос к базе данных

Добавление новых данных (INSERT)

Обновление данных (UPDATE)

Удаление данных (DELETE)

Выборка данных (SELECT)



Наиболее необходимые функции для работы с базами данных (Процедурный интерфейс).


mysqli_connect()- открывает новое соединение с MySQL сервером. Возвращает объект, представляющий подключение к серверу MySQL.

mysqli_connect_error() - возвращает описание последней ошибки подключения. Сообщение об ошибке. NULL, если ошибка отсутствует.

mysqli_set_charset() - устанавливает кодировку.

mysqli_query()- выполняет запрос к базе данных. Возвращает FALSE в случае неудачи. В случае успешного выполнения запросов SELECT mysqli_query() вернет объект mysqli_result. Для остальных успешных запросов mysqli_query() вернет TRUE.

mysqli_error()- возвращает строку с описанием последней ошибки.

mysqli_fetch_all()(mysqli_fetch_array())- выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба.

mysqli_fetch_assoc()- извлекает результирующий ряд в виде ассоциативного массива. Возвращает ассоциативный массив, соответствующий результирующей выборке или NULL, если других рядов не существует.

mysqli_num_rows()- получает число рядов (число строк) в результирующей выборке.

mysqli_affected_rows()- получает число строк, затронутых предыдущей операцией MySQL. Возвращает число строк, затронутых последним INSERT, UPDATE, REPLACE или DELETE запросом. Целое число, больше нуля, означает количество затронутых или полученных строк. Ноль означает, что запросом вида UPDATE не обновленно ни одной записи, или что ни одна строка не соответствует условию WHERE в запросе, или что запрос еще не был выполнен. Значение -1 указывает на то, что запрос вернул ошибку.

mysqli_real_escape_string() - Экранирует специальные символы в строке, используемой в SQL-запросе, принимая во внимание кодировку соединения.



Алгоритм работы с базами данных




- подключение к серверу MySQL , за это отвечает функция mysqli_connect();

- далее отправить какой-нибудь запрос на сервер (mysqli_query()), например, на выборку информации, на изменение информации, добавление информации ;

- получить в приемленной форме информацию из базы данных и, получив эту информацию, ее можно использовать.


Создадим базу данных.

Практически на любом хостинге есть специальная пограмма для работы с базами данных, для их управления и называется она - phpMyAdmin.

Создадим базу данных gb , которая будет состоять из одной таблицы - gb .


База данных gb:


mysql1



Таблица gb:


mysql2



В нашей таблице будет четыре колонки (четыре поля): поле для ввода имени - name , поле для ввода текста - text , поле для ввода даты - date и еще одно поле, которое будет нумеровать ряды - поле id (индификатор) - по нему легко получить доступ к той или иной записи.


Структура таблицы gb:


- для поля id выбираем:

тип ------- INT (целое число),

атрибуты ------- UNSIGNED (без знака),

индекс ------- PRIMARY ,

A_l(AUTO_INCREMENT) - ставим галочку . (Увеличение значения id на единицу автоматически)


- для поля name:

тип ------- VARCHAR ,

длина/значения ------- 255


- для поля text:

тип ------- TEXT .


- для поля date:

тип ------- TIMESTAMP,

По умолчанию ------- CURRENT_TIMEST (Сервер автоматически будет заполнять это поле текущем временем)


Структура таблицы gb:


mysql3



Структура таблицы готова и мы можем ее сохранить:


mysql4



Запишем в нее данные из файла gb.txt из раздела " Практика создания гостевой книги ".


Обзор таблицы gb:


mysql5



Подключение к базе данных




mysqli_connect()




Функция mysqli_connect()  (php.net )

- открывает новое соединение с MySQL-сервером. Возвращает объект, представляющий подключение к серверу MySQL.

Чтобы подключиться к базе данных мы функции mysqli_connect() должны передать несколько параметров:

- имя сервера (host )
- имя пользователя, который подключается к базе данных ( username )
- его пароль ( passwd )
- имя базы данных ( dbname )


Чтобы увидеть ошибки в читабельной форме необходимо применить функцию -


mysqli_connect_error()




- она возвращает описание последней ошибки подключения. Вернет NULL , если ошибка отсутствует.

Текст ошибки желательно выводить по условию if(!db) - если нет подключения, тогда мы выведем текст ошибки mysqli_connect_error(), и завершим дальнейшее выполнение скрипта - die .

Чтобы вывести свой текст ошибки мы добавляем условие: если не удалось подключиться к базе данных - завершаем работу и выводим сообщение: or die('Ошибка соединения с БД') ;


Создадим файл index.php и в него запишем:


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
//echo mysqli_connect_error();

// если нет подключения, тогда мы выведем текст ошибки mysqli_connect_error(), и завершим дальнейшее выполнение скрипта - die
if (! $db ) die (mysqli_connect_error());
//var_dump($db); // смотрим, что получилось
?>



- в переменную $db будет возвращаться объект соединения (или подключения) (или указатель на открытое соединение)

- первым параметром укажем 127.0.0.1 (или - localhost );
- вторым параметром укажем имя пользователя - root ;
- третьим параметром укажем пароль - у нас будет пустая строка '' ;
- четвертым параметром укажем имя базы данных - у нас будет gb .
- знак собаки ( @ ) - подавляет ошибки, то есть не выводит их на экран.

Если мы не установили подключение, то получаем false , а не объект подключения.



Установка кодировки соединения




С помощью функции -


mysqli_set_charset()




- устанавливаем кодировку соединения.

- первым параметром передаем указатель открытого соединения - $db ;
- вторым параметром - желаемую кодировку "utf8" ("utf8" - записываем без тире!!! )
- or die - или умри и выведи на экран: 'Не установлена кодировка'


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
//echo mysqli_connect_error();

// если нет подключения, тогда мы выведем текст ошибки mysqli_connect_error(), и завершим дальнейшее выполнение скрипта - die
if (! $db ) die (mysqli_connect_error());
//var_dump($db); // смотрим, что получилось

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');
?>




Запрос к базе данных




С помощью функции -


mysqli_query()




- выполняем запрос к базе данных.

В случае неудачи - вернет FALSE. (Это позволяет использовать условие if).

В случае успешного выполнения запроса на выборку SELECT функция mysqli_query()- вернет объект mysqli_result .

Для остальных успешных запросов эта функция вернет TRUE .



Добавление новых данных (INSERT)




Добавим новые данные в нашу таблицу - пишем SQL-запрос на вставку данных:
В переменную $insert запишем:
INSERT INTO - (вставить в);
gb - (имя таблицы);
name, text - поля, в которые мы будем добавлять данные (поля id и date сервер заполняет автоматически);
VALUES - значения - 'Оля', 'ПРИВЕТ! ПРИВЕТ!' (строковые данные - записываем в кавычках);

Запрос готов и мы его можем выполнять:
В переменную $res_insert вернем результат работы функции mysqli_query().
- первым параметром функция принимает индификатор соединения - $db ;
- вторым параметром - сам запрос, сохраненный в переменную $insert (можно записывать не сохраняя в переменную: "INSERT INTO ......" ).

- проверяем выполнение запроса: если запрос успешно отработал выводим 'Ok' , если нет - выводим 'Error'.


С помощью функции -


mysqli_error()




- выводим строку с описанием последней ошибки (если она есть),

в качестве параметра передаем ей указатель на подключение - $db .

- второй способ посмотреть ошибку - вывести сам запрос (его мы можем скопировать и попробовать выполнить через вкладку SQL).


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
if (! $db ) die (mysqli_connect_error());

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');

// Запрос к базе данных (добавим новые данные в нашу таблицу)
// готовим запрос
$insert = "INSERT INTO gb (name, text) VALUES ('Оля', 'ПРИВЕТ! ПРИВЕТ!')" ;
// выполняем запрос
$res_insert = mysqli_query( $db , $insert );

// проверяем выполнение запроса
if ( $res_insert ) echo 'Ok' ;
else echo 'Error' ;

// выводим строку с описанием последней ошибки (если она есть)
echo mysqli_error( $db );

// второй способ посмотреть ошибку - вывести сам запрос
echo $insert;
?>



Обновим страницу и обновим таблицу - появляется новая запись в таблице gb:


mysql6




Обновление данных (UPDATE)




Пишем SQL-запрос на обновление данных.
В переменную $update запишем наш запрос:

UPDATE gb - (обновление gb),
SET text - (в поле text),
CONCAT (text, '|||') - объединеняем строковые значения text и '|||',
WHERE id > 4 - где id > 4,
or die - или умри и,
mysqli_error($db) - выведи ошибку.


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
if (! $db ) die (mysqli_connect_error());

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');

// Запрос к базе данных (обновляем данные в нашей таблице)
// готовим запрос
$update = "UPDATE gb SET text = CONCAT (text, '|||') WHERE id > 4" ;
// выполняем запрос
$res_update = mysqli_query( $db , $update ) or die (mysqli_error( $db ));
?>



результат выполнения запроса:


mysql7




Удаление данных (DELETE)




Пишем SQL-запрос на удаление данных.
В переменную $delete запишем наш запрос:

DELETE FROM gb - удалить из gb,
WHERE id = 5 - где id = 5,


С помощью функции -


mysqli_affected_rows()




- узнаем число строк, затронутых в процессе предыдущего запроса. В качестве параметра передаем ей указатель на подключение - $db


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
if (! $db ) die (mysqli_connect_error());

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');

// Запрос к базе данных (удаляем данные в нашей таблице)
// готовим запрос
$delete = "DELETE FROM gb WHERE id = 5";
// выполняем запрос
$res_delete = mysqli_query( $db , $delete );

// узнаем число строк, затронутых в процессе предыдущего запроса (1 или 0 или -1)
echo mysqli_affected_rows( $db );
?>



Обновим страницу и обновим таблицу, получим результат - пятой записи в таблице нет.


mysql8



Если в результате удаления записи образуется зазор в поле id , например: 1,2,3,...5,6, то пытаться сдвинуть номера, чтобы они шли по порядку, нельзя. За полем id следит сервер и в его работу вмешиваться нельзя. Это поле имеет первичный ключ - сервер следит за его уникальностью и каждый следующий номер больше на единицу предыдущего. Эти номера часто используются для выборки данных и сдвиг нумерации может привести к путанице с ссылками.



Выборка данных (SELECT)




Пишем SQL-запрос на выборку данных.

В переменную $res запишем наш запрос:


SELECT - выбрать,
* - все,
FROM gb - из таблицы gb.


Вариант 1.

Получение массива данных с помощью функции:


mysqli_fetch_all()




- В переменной $res будет содержаться объект mysqli_result , проще говоря, некая
ссылка на эти данные. С помощью функции mysqli_fetch_all() по этой ссылке получим
необходимые данные в массив $date . В качестве параметра эта функция принимает
результирующий набор $res . Для указания типа получаемого массива применяются константы.


Константы функции mysqli_fetch_all(): php.net


Константа MYSQLI_NUM (по умолчанию) позволяет получить нумерованный массив.

Константа MYSQLI_ASSOC позволяет вместо нумерованного получить ассоциативный массив.

Константа MYSQLI_BOTH позволяет получить оба массива.


Чтобы получить нужные нам поля, их просто нужно перечислить, например:
"SELECT name, text, date FROM gb" .

Если нужно сортировать в обратном порядке, используется команда:
ORDER BY id DESC , где id - поле, по которому будем сортировать.


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


mysqli_num_rows()




- в качестве параметра она принимает сам результирующий запрос $res .


Далее мы можем пройти в цикле foreach по массиву $date и вывести то, что нам нужно.


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// функция для удобного просмотра массивов
function print_arr( $arr ){
echo '<pre>' . print_r( $arr , true ) . '</pre>' ;
}
// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
if (! $db ) die (mysqli_connect_error());

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');

// Запрос к базе данных (выбираем данные из нашей таблицы)
// выполняем запрос
$res = mysqli_query( $db , "SELECT name, text, date FROM gb ORDER BY id DESC" );

// смотрим, сколько рядов было выбранно (4)
echo mysqli_num_rows( $res );

// получаем данные в ассоциативный массив
$date = mysqli_fetch_all( $res , MYSQLI_ASSOC);
// распечатаем массив $date
print_arr ( $date );
//var_dump($date);

// пройдемся в цикле по массиву $date и выведем полученные данные
foreach ( $date as $item ){
echo "Name: { $item [ 'name' ]} <br>" ;
echo "Text: { $item [ 'text' ]} <br>" ;
echo "Date: { $item [ 'date' ]} <br>" ;
echo '<hr>' ;
}
?>
выведет:
4
Name: Ваня
Text: Hello!
Date: 2019-05-21 22:26:04
Name: Петя
Text: )))))!
Date: 2019-05-21 22:03:41
Name: Вася
Text: Привет! Это второе сообщение!!
Date: 2019-05-21 21:52:24
Name: Андрей
Text: Привет! Это первое сообщение!
Date: 2019-05-21 21:51:39



Вариант 2.

Получение массива данных с помощью функции:


mysqli_fetch_assoc()




- эта функция извлекает результирующий ряд в виде ассоциативного массива.


Создадим массив $date2 = []; - мы его будем формировать самостоятельно.
Далее мы будем использовать функцию mysqli_fetch_assoc(), которая получает только текущую строку данных. Чтобы получить все строки необходимо по результатам пройти в цикле: while($row = mysqli_fetch_assoc($res)) . В переменную $row мы получим результат работы функции mysqli_fetch_assoc($res) , параметром в которой будет результирующий набор данных $res.

Чтобы убедиться, что данные есть, распечатаем переменную $row: print_arr($row).
Далее в переменную $date2 по ключу $row['id'] положим массив $row.
Распечатаем переменную $date2.

Далее пройдемся в цикле foreach по массиву $date2 и выведем полученные данные.


Файл index.php


-- файл index.php --

<?php
header ( "Content-type: text/html; charset=utf-8" );
error_reporting (- 1 );

// функция для удобного просмотра массивов
function print_arr( $arr ){
echo '<pre>' . print_r( $arr , true ) . '</pre>' ;
}
// Подключение к базе данных
$db = @mysqli_connect( '127.0.0.1', 'root', '', 'gb' ) or die ( 'Ошибка соединения с БД' );
if (! $db ) die (mysqli_connect_error());

// Установка кодировки соединения
mysqli_set_charset ( $db , "utf8" ) or die ( 'Не установлена кодировка');

// Запрос к базе данных (выбираем данные из нашей таблицы)
// выполняем запрос
$res = mysqli_query( $db , "SELECT id, name, text, date FROM gb ORDER BY id DESC" );

// создадим массив
$date2 = [];

// Далее мы будем использовать функцию mysqli_fetch_assoc(), которая получает только текущую строку данных
// В переменную $row мы получим результат работы функции mysqli_fetch_assoc($res)
// Чтобы получить все строки необходимо по результатам пройти в цикле while
while ($row = mysqli_fetch_assoc($res )){
//print_arr($row);
// в переменную $date2 по ключу $row['id'] положим массив $row
$date2[$row['id']] = $row ;
}
print_arr($date2);

// пройдемся в цикле по массиву $date2 и выведем полученные данные
foreach ($date2 as $item ){
// на каждой итерации получаем:
echo "Name: {$item ['name']} <br>";
echo "Text: {$item ['text']} <br>";
echo "Date: {$item ['date']} <br>";
echo '<hr>';
}
?>
- в результате распечатки print_arr($date2) получим:
Array
(
[4] => Array
(
[id] => 4
[name] => Ваня
[text] => Hello!
[date] => 2019-05-21 22:26:04
)
[3] => Array
(
[id] => 3
[name] => Петя
[text] => )))))!
[date] => 2019-05-21 22:03:41
)
[2] => Array
(
[id] => 2
[name] => Вася
[text] => Привет!
Это второе сообщение!!
[date] => 2019-05-21 21:52:24
)
[1] => Array
(
[id] => 1
[name] => Андрей
[text] => Привет!
Это первое сообщение!
[date] => 2019-05-21 21:51:39
)
)
- здесь в качестве ключей нумерация начинается не с нуля, а с единицы.

- в результате выполнения цикла foreach получим:
Name: Ваня
Text: Hello!
Date: 2019-05-21 22:26:04
Name: Петя
Text: )))))!
Date: 2019-05-21 22:03:41
Name: Вася
Text: Привет! Это второе сообщение!!
Date: 2019-05-21 21:52:24
Name: Андрей
Text: Привет! Это первое сообщение!
Date: 2019-05-21 21:51:39




mysqli_real_escape_string()




- эта функция экранирует специальные символы в строке для использования в SQL-выражении .
- первым параметром принимает индификатор соединения - $db
- вторым параметром - строку, которую требуется экранировать - $str .
Возвращает экранированную строку.


Файл index.php


-- файл index.php --

<?php
...
...
...

// создадим строку с апострофом
$str = "d'Artanian";
// вернем в переменную $str, обработанную функцией нашу же переменную $str
$str = mysqli_real_escape_string($db , $str );

// Запрос к базе данных (добавим новые данные в нашу таблицу - строку с апострофом)
$query = "INSERT INTO gb (name, text) VALUES ( $str , 'Имя с апострофом')"; // готовим запрос
mysqli_query ($db , $query ) or die(mysqli_error($db )); // выполняем запрос

// Запрос к базе данных (выбираем данные из нашей таблицы)
$res = mysqli_query( $db , "SELECT name, text, date FROM gb ORDER BY id DESC" ); // выполняем запрос

$date = mysqli_fetch_all($res , MYSQLI_ASSOC); // получаем данные в ассоциативный массив

// пройдемся в цикле по массиву $date и выведем полученные данные
foreach ( $date as $item ){
echo "Name: { $item [ 'name' ]} <br>" ;
echo "Text: { $item [ 'text' ]} <br>" ;
echo "Date: { $item [ 'date' ]} <br>" ;
echo '<hr>' ;
}
?>
выведет:
Name: d'Artanian
Text: Имя с апострофом
Date: 2019-05-26 21:51:08
...
...
...



d'Artanian успешно вставился в таблицу gb


mysql9






Наверх Наверх