php mysql запрос к базе данных mysql php
PHP: простой запрос к базе данных MySQL, форма и кнопка
Начало работы с базами данных на PHP может показаться довольно сложным делом, если сразу пытаться «съесть слона» и делать слишком сложные запросы. Начнем с самого базового простого запроса к базе данных, чтобы понять общий принцип. Рабочий код, который можно скопировать, находится в конце поста.
Примеры:
1) вывести и напечатать одно значение из базы данных MySQL на PHP, в нашем примере мы будем извлекать имя седьмого игрока;
2) сделать на сайте форму (выпадающий список) с кнопкой, чтобы отправить выбранное значение из формы в программу и получить нужные данные из базы данных MySQL.
Этапы подключения к базе данных MySQL
Подключения к базе данных MySQL — простой пример запроса на PHP
ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);
$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);
$query1 = «SELECT Name FROM igroki WHERE N=’7′»;
$record = mysqli_fetch_array($result);
echo «
»; //Это разделитель html
// Перебор нескольких значений:
echo «All players:
Создание кнопки на сайте для получения значений из базы данных MySQL
К тому коду, который вам уже известен — базовый запрос к БД — осталось добавить html-код кнопки через тег (позволяет создавать на сайте интерактивные элементы и отправлять данные на сервер).
Чтобы внутри формы появилась кнопка вводим action — можно пустой ( action=» ), чтобы при нажатии загружалась эта же программа, либо можно в кавычках указать ссылку на другой файл с кодом, который запустится при нажатии кнопки (например, action=’submit.php’ ).
Важно присвоить форме select name — любое имя, на которое затем можно ссылаться в программе).
if (isset($_POST[‘submit’]))
<
echo »
«;
>
ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);
Создание формы (выпадающий список) с кнопкой на сайте
Научившись обращаться к базе данных и делать простые кнопки, пришло время сделать форму на сайте в виде выпадающего списка (dropdown menu) и связанную кнопку, которую пользователь может нажать, чтобы выбрать значение, отправить запрос в БД и получить результаты на экране монитора.
На сайте выпадающее меню создается с помощью форм, которые могут быть типа POST ( method=’POST’ ) или GET ( method=’GET’ ).
Чтобы создать выпадающее меню с кнопкой, используется html-тег формы с выбором вариантов через теги:
( option value — это значение, которое будет записано в переменную при выборе этого пункта, а Seven и Eight — это то, что показывается пользователю на сайте в выпадающем меню);
Пример кода для выпадающего меню с кнопкой методом POST
ᅠ
Создав форму с кнопкой, нам теперь надо уметь получать пользовательский выбор. Если пользователь нажмет кнопку выбора варианта, то программа должна понимать это. Давайте научим компьютер общаться с пользователем. Для этого создам условие с проверкой нажатия кнопки — если кнопка была нажата ( isset в PHP проверяет, есть ли у переменной значение, отличное от null), то сделай запрос к базе данных и напечатай то, что выбрал пользователь.
Этот код очень похож на то, что мы уже писали в начале этого поста, создавая простой запрос к БД.
Получение выбора пользователя после нажатия кнопки на сайте — напечатать одно значение из базы данных (имя седьмого игрока)
ᅠ
Cоздание формы (выпадающий список) с кнопкой, отправляющей запрос к базе данных MySQL на html + PHP с выводом результатов на сайте
ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);
$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);
Рабочий PHP код для копирования с примерами
Рабочий код, который можно скопировать — останется вставить свои данные для подключения к базе MySQL и все заработает:
Php mysql запрос к базе данных mysql php
Пример #1 Выполнение запросов
Буферизация результатов запроса
После выполнения запроса результаты можно либо получить сразу, либо считать строку за строкой с сервера. Буферизация набора результатов на стороне клиента позволяет серверу как можно раньше высвободить ресурсы, связанные с результатами запроса. Проще говоря, клиенты медленно используют наборы результатов. Поэтому рекомендуется использовать буферизованные наборы результатов. mysqli::query() объединяет выполнение запроса и буферизацию набора результатов.
PHP-приложения могут свободно оперировать данными внутри буферизованных результирующих наборов. Быстрая навигация по строкам наборов обусловлена тем, что наборы полностью располагаются в памяти клиента. Следует помнить, что зачастую обработка результатов на клиенте проще, нежели средствами сервера.
Пример #2 Навигация по строкам буферизованной результирующей таблицы
Результат выполнения данного примера:
Небуферизованные результирующие наборы
Если клиентские ресурсы ограничены, и в тоже время не требуется поддерживать низкую нагрузку на сервер, можно использовать не буферизованные результирующие наборы. Навигация по таким таблицам невозможна, потому что так или иначе должны быть обработаны все строки набора.
Пример #3 Навигация по строкам небуферизованной результирующей таблицы
Типы данных значений в результирующей таблице
Пример #4 Текстовый протокол по умолчанию возвращает строки
Результат выполнения данного примера:
Пример #5 Получение исходных типов данных в приложении
Выполнение запросов в MySQL
Итак, разобрались со структурой таблиц. Теперь давайте поработаем с данными в таблицах.
Добавление данных в таблицу
Для добавления данных используется запрос INSERT. Синтаксис:
Давайте вставим в нашу таблицу users несколько пользователей:
После этого мы увидим информацию об успешно выполненных запросах на добавление записей
Запрос данных из таблицы
Данные из таблиц получают с помощью запроса SELECT.
Самый простой запрос, позволяющий просмотреть записи таблицы, выглядит так:
Звездочка означает взять все столбцы таблицы.
Если нам не нужен в результате id, можно написать так:
LIMIT и OFFSET
Для ограничения выдачи используется ключевое слово LIMIT. Выведем только первые 2 записи.
Для того, чтобы выполнить смещение на 2 записи, нужно использовать ключевое слово OFFSET.
Таким образом мы пропустили 2 первые записи и ограничили выборку двумя следующими записями.
Чтобы вывести следующие 2 нужно увеличить смещение еще на 2, изменив значение OFFSET:
С помощью OFFSET и LIMIT реализуется пагинация записей.
DISTINCT
Давайте сделаем запрос только с именами:
Сейчас мы видим, что в таблице у нас несколько повторяющихся имён: Иван и Ольга.
Чтобы оставить только разные имена в результате запроса используется ключевое слово DISTINCT (переводится с английского как «индивидуальный», «отдельный»).
Условия в запросах
Если нужно отфильтровать значения по какому-то условию, используется WHERE. Например:
Используя операторы AND и OR можно задать несколько условий.
С помощью ключевого слова NOT можно инвертировать условие:
Сортировка
Для сортировки значений используется ключевое слово ORDER BY. По умолчанию ORDER BY делает сортировку в порядке возрастания (ASC).
Если нужно отсортировать в обратном порядке нужно добавить ключевое слово DESC:
Группировка
Результаты запроса можно сгруппировать по одному или нескольким столбцам. В итоге строки, содержащие одинаковые по группируемым столбцам значения, как бы «схлопнутся» в агрегированные значения. Пример такого запроса:
В результате мы видим, что строки с одинаковыми именами схлопнулись в одну. Но вопрос в том, почему, например, имени «Иван» в выдаче соответствуют именно и email=x1@php.zone. Ответ: это просто случайность! Если мы видим перед собой «сгруппированную» строку, рядом с которой выводятся поля, по которым группировка не выполнялась, то в эти поля попадет случайное значение одной из сгруппированных строк.
То есть вот у нас было 3 строки с именем «Иван».
После группировки по полю «name» в результате нашего запроса в столбце name всегда будет «Иван». А вот по остальным столбцам, по которым группировка не производилась, будет случайное значение одной из этих строк. Это очень важно запомнить, что это значение случайное, и в другой раз там может быть уже другое.
Агрегирующие функции
Агрегирующие функции можно также использовать внутри ORDER BY. К примеру, можно отсортировать имена по количеству вхождений по убыванию.
Другие наиболее часто используемые агрегирующие функции:
Функция | Действие, выполняемое над сгруппированными данными |
---|---|
COUNT() | Подсчет количества строк |
SUM() | Подсчет суммы значений |
AVG() | Вычисление среднего значения |
MIN() | Определение минимального значения |
MAX() | Определение максимального значения |
HAVING
А если мы захотим вывести только имена, встречающиеся в базе более одного раза? Давайте попробуем сделать это с помощью WHERE:
В ответ мы получим ошибку:
Invalid use of group function
Так произошло потому что группировка выполняется после WHERE, таким образом агрегирующей функции внутри WHERE просто ещё не с чем работать, отсюда и ошибка.
Как нам быть? К счастью, для фильтрации строк ПОСЛЕ выполнения группировки есть ключевое слово HAVING.
Теперь сделаем то, что хотели.
Поиск по шаблону
Или начинающиеся с любой буквы, дальше имеющие сочетание «ле», и заканчивающиеся как угодно:
На этом с выборкой значений пока остановимся. Хотя это еще не все возможности, лучше будет сначала закрепить эти основы. А пока рассмотрим запросы для изменения данных в таблицах.
Изменение данных
Изменить данные в таблице можно с помощью запроса UPDATE. В запросе UPDATE так же можно использовать условия используя ключевое слово WHERE. А еще в нем присутствует слово SET, с помощью которого определяются новые значения.
Обновим почту у пользователя с >
Запросим теперь эту запись:
Как видим, всё успешно обновилось
Удаление данных из базы
Для удаления используется запрос DELETE. И тут та же тема с WHERE:
Связь с базами данных MySQL
Краткое введение в MySQL
Система MySQL представляет собой сервер, к которому могут подключаться пользователи удаленных компьютеров.
Для работы с базами данных удобно пользоваться средством phpMyAdmin, входящее в комплект Web-разработчика: Open Server. Здесь можно создать новую базу данных, создать новую таблицу в выбранной базе данных, заполнить таблицу данными, а также добавлять, удалять и редактировать данные.
В MySQL определены три базовых типа данных: числовой, дата и время и строчный. Каждая из этих категорий подразделяется на множество типов. Основные из них:
Тип | Описание |
---|---|
INT | Целое число |
TINYINT | Маленькое целое число (-127 до 128 или от 0 до 255) |
FLOAT | Вещественное число с плавающей точкой |
DATE | Дата. Отображается в виде ГГГГ-ММ-ДД |
TIME | Время. Отображается в виде ЧЧ:ММ:СС |
DATETIME | Дата и время. Отображается в виде ГГГГ-ММ-ДДЧЧ:ММ:СС |
YEAR[(2|4)] | Год. Можно определить двух- или четырехциферный формат |
CHAR(M) | Строка фиксированной длины М (M |
Тип | Описание |
NOT NULL | Все строки таблицы должны иметь значение в этом атрибуте. Если не указано, поле может быть пустым (NULL) |
AUTO_INCREMENT | Специальная возможность MySQL, которую можно задействовать в числовых столбцах. Если при вставке строк в таблицу оставлять такое поле пустым, MySQL автоматически генерирует уникальное значение идентификатора. Это значение будет на единицу больше максимального значения, уже существующего в столбце. В каждой таблице может быть не больше одного такого поля. Столбцы с AUTO_INCREMENT должны быть проиндексированными |
PRIMARY KEY | Столбец является первичным ключом для таблицы. Данные в этом столбце должны быть уникальными. MySQL автоматически индексирует этот столбец |
UNSIGNED | После целочисленного типа означает, что его значение может быть либо положительным, либо нулевым |
COMMENT | Название столбца таблицы |
Создание новой базы данных MySQL осуществляется при помощи SQL-команды CREATE DATABASE.
Создание новой таблицы осуществляется при помощи SQL-команды CREATE TABLE. Например, таблица books для книжного магазина будет содержать пять полей: ISBN, автор, название, цена и количество экземпляров: Чтобы избежать сообщения об ошибке, если таблица уже есть необходимо изменить первую строчку, добавив фразу «IF NOT EXISTS»:
Для создания автообновляемого поля с текущей датой типа TIMESTAMP или DATETIME используйте следующую конструкцию:
Добавление данных в эту таблицу осуществляется при помощи SQL-команды INSERT. Например:
Для извлечения данных из таблицы служит оператор SELECT. Он извлекает данные из базы, выбирая строки, которые отвечают заданному критерию поиска. Оператор SELECT сопровождает немалое количество опций и вариантов использования.
Символ * означает, что необходимы все поля. Например:
Для получения доступа только к некоторому полю следует указать его имя в инструкции SELECT. Например:
Чтобы получить доступ к подмножеству строк в таблице, следует указать критерий выбора, который устанавливает конструкция WHERE. Например, чтобы выбрать имеющиеся в наличии недорогие книги о PHP, надо составить запрос: % Соответствует любому количеству символов, даже нулевых
_ Соответствует ровно одному символу
Для того, чтобы строки, извлеченные по запросу, перечислялись в определенном порядке, используется конструкция ORDER BY. Например:
По умолчанию порядок сортировки идет по возрастанию. Изменить порядок сортировки на обратный можно с помощью ключевого слова DESC:
Сортировать можно и по нескольким столбцам. Вместо названий столбцов можно использовать их порядковые номера:
Для изменения ранее записанных в таблицу значений нужно воспользоваться командой UPDATE. Например, цену всех книг повысили на 10%:
Конструкция WHERE ограничит работу UPDATE определенным строками. Например:
Для удаления строк из базы данных используется оператор DELETE. Ненужные строки указываются при помощи конструкции WHERE. Например, какие-то книги проданы:
Если нужно удалить все записи
Для полного удаления таблицы используется:
Связь PHP с базой данных MySQL
Поработав с phpMyAdmin над созданием базы данных, можно приступить к подключению этой базы данных к внешнему Web-интерфейсу.
Для подключения к серверу базы данных в PHP есть функция mysql_connect( ). Ее аргументы: имя компьютера, имя пользователя и пароль. Эти аргументы можно опустить. По умолчанию имя компьютера = localhost, тогда имя пользователя и пароль не требуется. Если PHP используется в сочетании с сервером Apache, то можно воспользоваться функцией mysql_pconnect(). В этом случае соединение с сервером не исчезает после завершения работы программы или вызова функции mysql_close(). Функции mysql_connect() и mysql_pconnect() возвращают идентификатор подключения, если все прошло успешно. Например:
После того, как соединение с сервером MySQL установлено, нужно выбрать базу данных. Для этого используется функция mysql_select_db(). Ее аргумент: имя базы данных. Функция возвращает true, если указанная база данных существует и доступ к ней возможен. Например:
Для добавления, удаления, изменения и выбора данных нужно сконструировать и выполнить запрос SQL. Для этого в языке PHP существует функция mysql_query(). Ее аргумент: строка с запросом. Функция возвращает идентификатор запроса.
Пример 1
При каждом выполнении примера 1 в таблицу будет добавляться новая запись, содержащая одни и те же данные. Разумеется имеет смысл добавлять в базу данные, введенные пользователем.
В примере 2.1 приведена HTML-форма для добавления новых книг в базу данных.
Пример 2.1
Результаты заполнения этой формы передаются в insert_book.php.
Пример 2.2
В примере 2.2 введенные строковые данные обработаны функцией addslashes(). Эта функция добавляет обратные слеши перед одинарными кавычками (‘), двойными кавычками («), обратным слешем (\) и null-байтом. Дело в том, что по требованиям систаксиса запросов баз данных такие символы дожны заключаться в кавычки.
Для определения количества записей в результате запроса используется функция mysql_num_rows().
Все записи результата запроса можно просмотреть в цикле. Перед этим с помощью функции mysql_fetch_[] для каждой записи получают ассоциативный массив.
В примере 3.1 приведена HTML-форма для поиска определенных книг в базе данных.
Пример 3.1
Результаты заполнения этой формы передаются в search_book.php.
Пример 3.2
Альтернативный вариант
Использование механизма транзакций
Использование механизма транзакция на примере как передать деньги от одного человека другому
SELECT … FOR UPDATE
Если Вы запускаете несколько процессов, которые делают select запрос к одной и той же таблице, то они могут выбрать одну и ту же запись одновременно.
Чтобы избежать вышеупомянутой ситуации необходимо выполнить не просто SELECT запрос, а его расширенную версию, о которой многие и не подозревают: SELECT … FOR UPDATE.
Таким образом, при выполнении данного запроса, все затронутые записи в базе данных будут заблокированы до завершения сеанса работы с БД или до момента обновления данных записей. Другой скрипт не сможет выбрать заблокированные записи до тех пор, пока не наступит одно из упомянутых условий.
Однако не всё так просто. Вам нужно выполнить ещё несколько условий. Во-первых, ваша таблица должна быть создана на основе архитектуры InnoDB. В противном случае блокировка просто не будет срабатывать. Во-вторых, перед выполнением выборки необходимо отключить авто-коммит запроса. Т.е. другими словами автоматическое выполнение запроса. После того как вы укажите UPDATE запрос, необходимо будет ещё раз обратиться к базе и закоммитить изменения с помощью команды COMMIT:
Представьте что у нас есть 2 записи в таблице. Мы запускаем два параллельных скрипта с данным содержанием. В результате, первый процесс, который сможет достучаться до базы сделает выборку записи и сразу же заменит значение в поле locked на 1. В результате второй скрипт проигнорирует первую запись. В данном случае, даже если скрипты достучались бы до БД одновременно, второй скрипт всё равно не смог бы выбрать первую запись, т.к. при выборке первым процессом она будет заблокирована.
Работа с MySQL в PHP
PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.
Что такое mysqli?
mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
Функция mysqli connect: соединение с MySQL
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
Базовый синтаксис функции mysqli_connect() :
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL и проверка на ошибки:
Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: ‘. ’.
Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.
Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.
Функция insert id: как получить идентификатор добавленной записи
Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
Чтение записей
В этом примере показано, как вывести все существующие города из таблицы cities:
Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.
Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.
Как получить сразу все записи в виде двумерного массива
Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
Перепишем пример с показом существующих городов с её использованием: